|
|
給你改了一下,詳細(xì)注釋,能夠滿足你的要求。
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit key =P1^0;
- sbit LED1=P1^1;
- sbit LED2=P1^2;
- sbit LED3=P1^3;
- uchar count=0;//計(jì)數(shù)變量
- uchar keystay=0;//中間變量
- bit sign=0;//按鍵操作標(biāo)志
- void Timer0Init() //10毫秒@12.000MHz
- {
- TMOD= 0x01; //設(shè)置定時(shí)器模式
- TL0 = 0xF0; //設(shè)置定時(shí)初值
- TH0 = 0xD8; //設(shè)置定時(shí)初值
- TR0 = 1; //定時(shí)器0開始計(jì)時(shí)
- EA = 1; //開總中斷
- ET0 = 1; //開T0中斷
- }
- void keyscan()//放在中斷里
- {
- if(!key)//鍵按下
- {
- count++;
- if(count>=2)//20ms防抖
- {
- sign=1;//按鍵操作標(biāo)志1
- if(count>131)
- count=131;//防止溢出
- }
- }
- else//鍵松手
- {
- if(sign==1)
- {
- sign=0;//按鍵操作標(biāo)志清0
- keystay=count;//保存計(jì)數(shù)值
- }
- count=0;//計(jì)數(shù)清0
- }
- }
- void Judge(uint num)
- {
- if(num>2 && num<=50) //20~500ms 短按
- {
- LED1=0;
- LED2=1;
- LED3=1;
- keystay=0;//中間變量清0
- }
- else if(num>50 && num<=130)//500~1300ms 略長按
- {
- LED2=0;
- LED1=1;
- LED3=1;
- keystay=0;//中間變量清0
- }
- else if(num>130)//1.3s以上 長按
- {
- LED3=0;
- LED1=1;
- LED2=1;
- keystay=0;//中間變量清0
- }
- }
- void main()
- {
- Timer0Init();
- while(1)
- {
- if(keystay!=0)//如果按鍵有效操作
- {
- Judge(keystay);
- }
- }
- }
- void interrupt_timer0()interrupt 1
- {
- TL0 = 0xF0; //設(shè)置定時(shí)初值
- TH0 = 0xD8; //設(shè)置定時(shí)初值
- keyscan();
- }
復(fù)制代碼 |
|