專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

狀態(tài)機(jī)方式按鍵掃描單片機(jī)程序

作者:佚名   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2013年06月23日   【字體:

這是從http://www.torrancerestoration.com/bbs/dpj-19294-1.html 這個(gè)單片機(jī)做的收音機(jī)里面截取出來的一個(gè)子程序,完整的代碼和原理圖可從原帖下載.

                 /*-----------狀態(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;
}

關(guān)閉窗口

相關(guān)文章