| #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(); }
 }
 
 
 
 
 |