新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 凌陽61單片機(jī)之按鍵無延時消抖(采用狀態(tài)機(jī)編程思想

凌陽61單片機(jī)之按鍵無延時消抖(采用狀態(tài)機(jī)編程思想

作者: 時間:2016-11-23 來源:網(wǎng)絡(luò) 收藏
無延時消抖在另一篇博文已經(jīng)有詳細(xì)的說明,這里不再贅述。
在學(xué)習(xí)FPGA時,覺得狀態(tài)機(jī)這種編程思想非常好,可以很充分地利用CPU的資源。
大的單片機(jī)工程,或者實(shí)時性較強(qiáng)的工程,采用狀態(tài)機(jī)編程思想可以很好解決一些問題,例如:
鍵盤掃描,蜂鳴器報(bào)警,LED燈閃爍等等。
下面是小弟昨晚用狀態(tài)機(jī)編程思想寫的基于凌陽61單片機(jī)之下,按鍵無延時消抖程序。
程序的按鍵還是有點(diǎn)小抖動,主要是因?yàn)橹鞒绦驁?zhí)行的任務(wù)少,跳入鍵盤掃描時間短。
現(xiàn)在才發(fā)現(xiàn)C里面的枚舉類型可以用來干嘛、、、
放于狀態(tài)機(jī)這塊剛剛好。
#include "SPCE061A.H"
enum State {Init, Press, Free};
enum State Key_State; //按鍵狀態(tài)
unsigned char Key_Press; //按鍵值
void Keyscan(void)
{
switch (Key_State)
{
case Init : // 按鍵初始態(tài)
if((*P_IOA_Data & 0x0007) != 0)
{
Key_State = Press; // 鍵被按下,但需要確認(rèn)是否是干擾
}
break;
case Press : // 按鍵確認(rèn)態(tài)
if((*P_IOA_Data & 0x0007) != 0) //如有鍵按下則不是干擾,判斷鍵值
{
//判斷是哪一個按鍵被按下
if( (*P_IOA_Data & 0x0001) != 0 ); //第一個鍵被按下
{
*P_IOB_Data = ~*P_IOB_Data;
}
if( (*P_IOA_Data & 0x0003) != 0 ); //第二個鍵被按下
{
*P_IOB_Data = ~*P_IOB_Data;
}
if( (*P_IOA_Data & 0x0007) != 0 ); //第三個鍵被按下
{
*P_IOB_Data = ~*P_IOB_Data;
}
Key_State = Free; // 狀態(tài)轉(zhuǎn)換到鍵釋放態(tài)
}
else
{
Key_State = Init; // 按鍵已抬起,屬于干擾,轉(zhuǎn)換到按鍵初始態(tài)
}
break;
case Free :
if((*P_IOA_Data & 0x0007) == 0) //判斷按鍵是否釋放
{
Key_State = Init; //如果按鍵釋放,轉(zhuǎn)換到按鍵初始態(tài)
}
break;
}
}
void Board_Init(void)
{
//設(shè)置A口為帶下拉電阻的輸入 IO初始化開始
*P_IOB_Dir=0xFFFF; //output
*P_IOB_Attrib=0xFFFF;
*P_IOB_Data=0xFFFF;
Key_Press = 1;
Key_State = 0;
}
int main()
{
Board_Init();
while(1)
{
Keyscan();
*P_Watchdog_Clear = C_WDTCLR;
}
return 0;
}



評論


技術(shù)專區(qū)

關(guān)閉