這是從http://www.zg4o1577.cn/bbs/dpj-19294-1.html 這個單片機做的收音機里面截取出來的一個子程序,完整的代碼和原理圖可從原帖下載.
/*-----------狀態機方式按鍵掃描-----------*/
/*------------外部晶振為 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; //定義按鍵狀態
uchar Key_Press;
uchar Key_Return=0x00; //定義按鍵返回的鍵值
Key_Press=Key_Input&Key_Mask; //讀按鍵I/O電平
switch(Key_State)
{
case 0: // 按鍵初始態
if (Key_Press!=Key_Mask)
Key_State=1; // 鍵被按下,狀態轉換到鍵確認態
break;
case 1: // 按鍵確認態
if (Key_Press==Key_Input&Key_Mask)
{
Key_Return=Key_Press; // 按鍵仍按下且鍵值鍵值,按鍵確認輸出
BEEP_DRV=1; // 驅動蜂鳴器
Key_State=2; // 狀態轉換到鍵釋放態
}
else
Key_State=0; // 按鍵已抬起或改變,并轉換到按鍵初始態
break;
case 2:
if (Key_Press==Key_Mask)
{
Key_State=0; // 按鍵已釋放,轉換到按鍵初始態
BEEP_DRV=0; // 關閉蜂鳴器
}
else
if(Work_Mode==1)
{
Key_Return=Key_Press|0x09; // 只有調臺模式并且只有>>| 和 |<< 才能連按
BEEP_DRV=0; // 關閉蜂鳴器
}
else
BEEP_DRV=0; // 關閉蜂鳴器
break;
}
return Key_Return;
}