狀態(tài)機(jī)方式按鍵掃描單片機(jī)程序
/*-----------狀態(tài)機(jī)方式按鍵掃描-----------*/
/*------------外部晶振為 12MHz-----------*/
/*--------最后修改2011.02.26--------------*/
#include "STC12C5620AD.H"
#include "Key_Scan.H"
#define Key_Mask 0x0f //屏蔽不用的按鍵,不用的按鍵用0屏蔽
/********************** 聲明外部變量**************************/
extern uchar Work_Mode; //From Main.c
/********************** 按鍵掃描讀取**************************/
uchar Key_Scan(void)
{
static uchar Key_State=0; //定義按鍵狀態(tài)
uchar Key_Press;
uchar Key_Return=0x00; //定義按鍵返回的鍵值
Key_Press=Key_Input&Key_Mask;//讀按鍵I/O電平
switch(Key_State)
{
case 0: // 按鍵初始態(tài)
if (Key_Press!=Key_Mask)
Key_State=1; // 鍵被按下,狀態(tài)轉(zhuǎn)換到鍵確認(rèn)態(tài)
break;
case 1: // 按鍵確認(rèn)態(tài)
if (Key_Press==Key_Input&Key_Mask)
{
Key_Return=Key_Press; // 按鍵仍按下且鍵值鍵值,按鍵確認(rèn)輸出
BEEP_DRV=1; // 驅(qū)動(dòng)蜂鳴器
Key_State=2;// 狀態(tài)轉(zhuǎn)換到鍵釋放態(tài)
}
else
Key_State=0;// 按鍵已抬起或改變,并轉(zhuǎn)換到按鍵初始態(tài)
break;
case 2:
if (Key_Press==Key_Mask)
{
Key_State=0;//按鍵已釋放,轉(zhuǎn)換到按鍵初始態(tài)
BEEP_DRV=0;// 關(guān)閉蜂鳴器
}
else
if(Work_Mode==1)
{
Key_Return=Key_Press|0x09; // 只有調(diào)臺(tái)模式并且只有>>| 和 |<< 才能連按
BEEP_DRV=0;// 關(guān)閉蜂鳴器
}
else
BEEP_DRV=0;// 關(guān)閉蜂鳴器
break;
}
return Key_Return;
}
評(píng)論