#include<reg52.h>                 //库文件 
#define uchar unsigned char//宏定义无符号字符型 
#define uint unsigned int  //宏定义无符号整型 
/******************************************************************** 
                            初始定义 
*********************************************************************/ 
sbit P3_2=P3^2; 
sbit P3_3=P3^3; 
unsigned char keycnt=0; 
unsigned char tcnt=0; //键值判断 
bit sjz=0; //产生三角波时用到的标志 
void delayl() //延时子程序 
{ unsigned char i,j; 
for(i=20;i>0;i--) 
for(j=248;j>0;j--); } 
void KEY() //按键扫描程序 
{ 
if(P3_2==0) 
{ 
delayl(); //延时跳过按下时的抖动 
if(P3_2==0) 
{                       
keycnt=0; //定时器产生锯齿波标志 
TR0=0; //暂时停止波形输出 
TH0=0x256-40; //对TH0 TL0 赋值 
TL0=0x256-40; 
TR0=1; //开始定时,产生锯齿波 
while(P3_2==0); //如果一直按着键,则等待松键开 
delayl(); //延时跳过松开后的抖动 
} } 
if(P3_3==0) 
{ 
delayl(); //延时跳过按下时的抖动 
if(P3_3==0) 
{ 
keycnt=1; //定时器产生三角波标志 
TR0=0; //暂时停止波形输出 
TH0=0x256-40; //对TH0 TL0 赋值 
TL0=0x256-40; 
TR0=1; //开始定时 产生三角波 
} 
while(P3_2==0); //如果一直按着键,则等待松键开 
delayl(); //延时跳过松开后的抖动 
} 
} //请注意写程序时的格式规范,此处是为了节省纸张 
void t0(void) interrupt 1 using 0 //定时中断服务函数 
{ 
if(keycnt==0) //产生锯齿波 
{ 
P0=tcnt; 
tcnt=+0x0a; //步进0.2V/一次中断 
if(tcnt==0xfb) 
{tcnt=0;} 
} 
if(keycnt==1) //产生三角波 
{ if(sjz==0) 
{P0=tcnt; 
tcnt=+0x0a;//步进0.2V/一次中断 
if(tcnt==0xfa) 
{sjz=1;} 
} 
if(sjz==1) 
{ 
P0=tcnt; 
tcnt=-0x0a; 
if(tcnt==0)                      
{sjz=0;} 
} 
} 
} 
void main(void) 
{ 
TMOD=0x02; //定时器工作在方式2 
ET0=1; 
EA=1; 
while(1) 
{ KEY(); } 
} 
 
 
 
 |