|
給你一個(gè)短、中、長(zhǎng)按鍵示例,具體任務(wù)自行完善。有詳細(xì)注釋,不難理解。
- #include<reg52.h>
- sbit LED1=P1^0;
- sbit LED2=P1^1;
- sbit LED3=P1^2;
- sbit key=P1^7;
- void Timer0Init() //10毫秒@12.000MHz
- {
- TMOD= 0x01; //設(shè)置定時(shí)器模式
- TL0 = 0xF0; //設(shè)置定時(shí)初值
- TH0 = 0xD8; //設(shè)置定時(shí)初值
- TR0 = 1; //定時(shí)器0開(kāi)始計(jì)時(shí)
- EA = 1; //開(kāi)總中斷
- ET0 = 1; //開(kāi)T0中斷
- }
- //按鍵掃描
- void keyscan()
- {
- static unsigned int time=0; //計(jì)數(shù)變量
- static bit key_sign=0; //按鍵狀態(tài)標(biāo)志
- if(!key) //按鍵按下
- {
- time++;
- if(time>300)
- time=301; //防止溢出
- if(time>1 && key_sign==0) //10ms消抖
- key_sign=1; //確認(rèn)按鍵按下
- if(time==300) //判斷按下3s有效
- LED3=~LED3; //任務(wù)3
- }
- else //沒(méi)有按或按下后松手
- {
- if(key_sign==1)//判斷是按鍵按下后松手
- {
- key_sign=0;
- if(time<100)//小于1s判斷短按
- LED1=~LED1;//任務(wù)1
- if(time>=100 && time<300)//大于1s有效
- LED2=~LED2;//任務(wù)2
- }
- time=0;
- }
- }
- //主函數(shù)
- void main()
- {
- Timer0Init();//定時(shí)器初始化函數(shù)
- while(1)
- {
- //其它任務(wù)
- }
- }
- //T0中斷服務(wù)函數(shù)
- void Timer0Interrupt() interrupt 1
- {
- TL0 = 0xF0; //設(shè)置定時(shí)初值
- TH0 = 0xD8; //設(shè)置定時(shí)初值
- keyscan(); //按鍵掃描
- }
復(fù)制代碼 |
|