標(biāo)題: 單片機(jī)獨(dú)立按鍵狀態(tài)機(jī)源程序 [打印本頁]

作者: 練氏    時(shí)間: 2017-11-4 11:36
標(biāo)題: 單片機(jī)獨(dú)立按鍵狀態(tài)機(jī)源程序
分享一個(gè)獨(dú)立按鍵控制的狀態(tài)機(jī)程序,賺點(diǎn)幣。    有詳細(xì)的注解,請(qǐng)看附錄

單片機(jī)源程序如下:
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint  unsigned int
  4. sbit LED = P1^0;//繼電器(P1.0)接口定義 P1口的其他口可以接LED,也可以接LED,反正效果一樣

  5. /**************************************/
  6. /**************定時(shí)器中斷**************/
  7. /**************************************/
  8. void Timer0_init()
  9. {
  10.         TMOD = 0x01;//定時(shí)器定時(shí)模式,16位定時(shí)
  11.         TH0  = 0xf8;//設(shè)定定時(shí)器初值2ms
  12.         TL0  = 0xcc;
  13.         TR0  = 1;//開啟定時(shí)器
  14.         ET0  = 1;//定時(shí)器中斷
  15.         EA   = 1;//總中斷  
  16. }

  17. /**************************************/
  18. /*********狀態(tài)機(jī)按鍵掃描函數(shù)***********/
  19. /*********返回值: 按鍵碼值************/
  20. /**************************************/
  21. uchar Key_Scan(void)
  22. {
  23.         static uchar State_Cnt=0;//靜態(tài)變量,用于改變狀態(tài)過程
  24.         uchar Key_State = 0;//用于存儲(chǔ)鍵值碼
  25.         switch(State_Cnt)
  26.         {
  27.                 case 0x00:P3 = 0x0f;//先往P3(1到4獨(dú)立按鍵)口送0000 1111
  28.                 if(P3 != 0x0f)//有無按鍵被按下
  29.                 {
  30.                         State_Cnt = 0x01;//改變狀態(tài)
  31.                         break;                           
  32.                 }
  33.                 case 0x01:
  34.                 if(P3 != 0x0f)//經(jīng)過定時(shí)器延時(shí)后,再次判斷按鍵是否按下
  35.                 {
  36.                         State_Cnt = 0x02;//改變狀態(tài)
  37.                         Key_State = P3;//把鍵值保存下來
  38.                         P3 = 0x0f;//恢復(fù)P3,以便下次按下重新保存鍵值
  39.                         break;
  40.                 }
  41.                 else
  42.                 {
  43.                         State_Cnt = 0x00;//改變狀態(tài)
  44.                         break;
  45.                 }
  46.                 case 0x02:
  47.                 if(P3 == 0x0f)//判斷按鍵釋放
  48.                 {
  49.                         State_Cnt = 0x00;//改變狀態(tài)
  50.                         break;
  51.                 }
  52.                 default:break;
  53.         }
  54.         return Key_State;//返回鍵值
  55. }

  56. /**************************************/
  57. /************按鍵功能函數(shù)**************/
  58. /***********參數(shù):按鍵鍵碼*************/
  59. /**************************************/
  60. void Display_Key(uchar key_value)
  61. {
  62.         switch(key_value)
  63.         {
  64.                 case 0x0e:LED = 1;break;//鍵值改變時(shí),做出相應(yīng)的動(dòng)作(用戶自定義動(dòng)作)
  65.                 case 0x0d:LED = 0;break;
  66.                 case 0x0b:P1  = 0x00;break;
  67.                 case 0x07:P1  = 0xff;break;
  68.         }
  69. }

  70. void main()
  71. {
  72.         Timer0_init();
  73.         while(1);
  74. }

  75. /************定時(shí)器0中斷函數(shù)**************/
  76. void Timer0() interrupt 1
  77. {
  78.         static Time_Counter = 0;//定義變量,以便計(jì)數(shù)
  79.         TH0 = 0xf8;//重新放入中斷初值
  80.         TL0 = 0xcb;
  81.         Time_Counter++;//中斷一次,值加1
  82.         if(Time_Counter == 5)//累計(jì)10ms的延時(shí),以便消抖
  83.         {
  84.                 Time_Counter = 0;
  85.                 Display_Key(Key_Scan());//按鍵按下,鍵值碼送入函數(shù),以便做相應(yīng)動(dòng)作

  86.         …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
狀態(tài)機(jī)按鍵程序.rar (14.62 KB, 下載次數(shù): 86)




作者: bhjyqjs    時(shí)間: 2018-2-9 18:14
很好的狀態(tài)機(jī)處理鍵盤例程
作者: ldh119    時(shí)間: 2020-5-2 16:09
程序不錯(cuò),但是有點(diǎn)小問題。case 0x01:       if(P3 != 0x0f) 。。。。。
這個(gè)不能說明是同一個(gè)按鍵產(chǎn)生的狀態(tài),所以有肯能會(huì)誤判。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1