欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
有限狀態機單片機獨立按鍵處理程序
[打印本頁]
作者:
bhjyqjs
時間:
2018-11-7 08:40
標題:
有限狀態機單片機獨立按鍵處理程序
不要誤會,雖然叫簡化版,功能可一點也不簡化啊。
程序每10ms調用一次按鍵掃描程序,由狀態機控制程序流程,在按鍵未確認前,一旦檢測到高電平,說明按鍵為抖動或干擾,自動退回初始狀態,杜絕虛假按鍵動作。整個按鍵處理過程最長30ms,按鍵按下即執行,全部由定時中斷完成,釋放主程序。
按鍵動作干脆利落,爽!抖動?那就是一個傳說!
之所以定時中斷為2ms,是考慮到2ms定時可以作為其他應用的定時基準。
單片機程序源碼如下:
/***************************************************
工程名 :獨立按鍵(狀態機)控制 LED_簡化版
作者:老芹
本例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(); //檢測按鍵
void Timer0_Init(); //定時器初始化
bit key;
void main()
{
Timer0_Init();
while(1)
{
}
}
void KEY_Scan() //檢測按鍵
{
static uchar KeyStatus = 0; //按鍵狀態
switch (KeyStatus)
{
case 0: //初始狀態下,KeyStatus=0
if(K1==0) //如果有鍵按下轉到下一狀態;否則是干擾,直接退回初始狀態
KeyStatus++;
break;
case 1:
if(K1==0) //鍵仍然按下
{
key = !key;
KeyStatus++; //轉到下一狀態,等待按鍵釋放
}
else
KeyStatus = 0; //是干擾,退回初始狀態
break;
case 2:
if(K1==0) //鍵仍然按下
break;
else //鍵松開
KeyStatus = 0; //退回初始狀態
break;
}
}
void Timer0_Init() //定時器初始化
{ //2毫秒@11.0592MHz
AUXR |= 0x80; //定時器時鐘1T模式
TMOD &= 0xF0; //設置定時器模式
TL0 = 0x9A; //設置定時初值
TH0 = 0xA9; //設置定時初值
TF0 = 0; //清除TF0標志
TR0 = 1; //定時器0開始計時
ET0 =1;
EA = 1;
}
void Timer0() interrupt 1 //定時器中斷
{ //16位自動重裝模式,無需重賦初值
static uchar i;
if(key) //按鍵按下,LED點亮
LED=0; //點亮LED
else
LED=1; //關閉LED
if(i==0) //每10Ms調用按鍵掃描程序一次
KEY_Scan();
i++;
if(i==5)
i=0;
}
復制代碼
作者:
怪怪愛玩
時間:
2018-11-9 11:02
我仔細研究一下,謝謝樓主
作者:
怪怪愛玩
時間:
2018-11-9 11:19
剛剛試了,確實非常好用,得好好研究一下,謝謝樓主
作者:
維超
時間:
2018-11-9 18:46
如果加入按鍵長按呢用起來不是更爽
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1