|
不要誤會(huì),雖然叫簡(jiǎn)化版,功能可一點(diǎn)也不簡(jiǎn)化啊。
程序每10ms調(diào)用一次按鍵掃描程序,由狀態(tài)機(jī)控制程序流程,在按鍵未確認(rèn)前,一旦檢測(cè)到高電平,說明按鍵為抖動(dòng)或干擾,自動(dòng)退回初始狀態(tài),杜絕虛假按鍵動(dòng)作。整個(gè)按鍵處理過程最長(zhǎng)30ms,按鍵按下即執(zhí)行,全部由定時(shí)中斷完成,釋放主程序。
按鍵動(dòng)作干脆利落,爽!抖動(dòng)?那就是一個(gè)傳說!
之所以定時(shí)中斷為2ms,是考慮到2ms定時(shí)可以作為其他應(yīng)用的定時(shí)基準(zhǔn)。
單片機(jī)程序源碼如下:
- /***************************************************
- 工程名 :獨(dú)立按鍵(狀態(tài)機(jī))控制 LED_簡(jiǎn)化版
- 作者:老芹
- 本例Key接P1.4
- ***************************************************/
- #include "STC15F2K60S2.H"
- #define uchar unsigned char
- #define uint unsigned int
- sbit K1 = P1^4; //定義按鍵
- sbit LED = P0^0;
- void KEY_Scan(); //檢測(cè)按鍵
- void Timer0_Init(); //定時(shí)器初始化
- bit key;
-
- void main()
- {
- Timer0_Init();
- while(1)
- {
- }
- }
- void KEY_Scan() //檢測(cè)按鍵
- {
- static uchar KeyStatus = 0; //按鍵狀態(tài)
- switch (KeyStatus)
- {
- case 0: //初始狀態(tài)下,KeyStatus=0
- if(K1==0) //如果有鍵按下轉(zhuǎn)到下一狀態(tài);否則是干擾,直接退回初始狀態(tài)
- KeyStatus++;
- break;
- case 1:
- if(K1==0) //鍵仍然按下
- {
- key = !key;
- KeyStatus++; //轉(zhuǎn)到下一狀態(tài),等待按鍵釋放
- }
- else
- KeyStatus = 0; //是干擾,退回初始狀態(tài)
- break;
- case 2:
- if(K1==0) //鍵仍然按下
- break;
- else //鍵松開
- KeyStatus = 0; //退回初始狀態(tài)
- break;
- }
-
- }
- void Timer0_Init() //定時(shí)器初始化
- { //2毫秒@11.0592MHz
- AUXR |= 0x80; //定時(shí)器時(shí)鐘1T模式
- TMOD &= 0xF0; //設(shè)置定時(shí)器模式
- TL0 = 0x9A; //設(shè)置定時(shí)初值
- TH0 = 0xA9; //設(shè)置定時(shí)初值
- TF0 = 0; //清除TF0標(biāo)志
- TR0 = 1; //定時(shí)器0開始計(jì)時(shí)
- ET0 =1;
- EA = 1;
- }
- void Timer0() interrupt 1 //定時(shí)器中斷
- { //16位自動(dòng)重裝模式,無需重賦初值
- static uchar i;
- if(key) //按鍵按下,LED點(diǎn)亮
- LED=0; //點(diǎn)亮LED
- else
- LED=1; //關(guān)閉LED
-
- if(i==0) //每10Ms調(diào)用按鍵掃描程序一次
- KEY_Scan();
- i++;
- if(i==5)
- i=0;
- }
復(fù)制代碼
|
評(píng)分
-
查看全部評(píng)分
|