久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4546|回復: 2
打印 上一主題 下一主題
收起左側

基于狀態機的單個按鍵長按,短按實現復用

[復制鏈接]
跳轉到指定樓層
樓主
ID:183476 發表于 2017-4-11 11:23 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
開博第一文。希望再次記錄學習的過程。    鍵掃描,單片機里面再基礎不過的程序了。但對于初學者來說,用好按鍵也不是一件簡單的事情。在毛老師的介紹下,第一次知道了狀態機的思想也可以用于單片機的程序設計,感覺很是新奇。看了老師給發的幾個文檔后對狀態機編程的概念有了一些初步的認識,于是試著用狀態機的思想寫了一個實現單個按鍵長按短按的小程序。
   貼個代碼試試....
  
//文件名:單個按鍵的復用
//作者:CWM
//修改日期:2011-06-15
//版本:V1.0
//功能描述:基于狀態機的思想 實現單個按鍵的復用
//根據按鍵持續時間的不同,在數碼管上分別顯示0 1 2 3四個數字
001 #include <reg52.h>
002
003 #define key_state_0 0 //表示沒有按下
004 #define key_state_1 1 //表示按鍵按下
005 #define key_state_2 2 //計時1
006 #define key_state_3 3 //計時2
007 #define key_state_4 4 //計時3
008 sbit KEY=P1^0;
009 sbit LED=P1^1;
010 unsigned char code LED7Code[] = {~0x3F,~0x06,~0x5B,~0x4F,
011 ~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F,
012 ~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71};//數碼管碼值表
013
014 int key_stime_counter,time_counter;//中斷計時用
015 bit time_1s_ok,key_stime_ok; //時間標志
016
017 void system_Ini()
018 {
019     TMOD|= 0x00;
020     TH1=0x1c;//12.000M
021     TL1=0x18;//定時器1工作在方式0下 定時1ms   
022     IE = 0x8A;   
023     TR1  = 1;
024 }
025
026 char read_key()
027 {
028     static char key_state=0,key_time=0;
029     static char key_press,key_return=0;
030    
031     key_press=KEY;
032     switch(key_state)
033     {
034         case key_state_0://無按鍵按下
035             if(!key_press) key_state=key_state_1;
036             break;
037         case key_state_1: //有按鍵按下
038             if(!key_press)
039             {
040                 key_state=key_state_2;
041                 key_time=0;
042             }
043             else
044             {
045                 key_state=key_state_0;
046                 //key_return=0;
047             }
048             break;
049         case key_state_2://計時1
050             if(key_press)//按鍵松開
051             {
052                  key_state=key_state_0;
053             }
055             else if(++key_time>=10)
056             {
057                 key_state=key_state_3;//計時滿一秒
058                 key_time=0;
059                 key_return=1;//輸出1 數碼管顯示1
060             }
061             break;
062         case key_state_3://計時2
063             if(key_press) //按鍵松開
064             {
065                 key_state=key_state_2;//此時按鍵已經持續了一秒了 故數碼管仍然顯示1
066                 //key_return=1;
067             }   
068             else if(++key_time>=10)
069             {
070                 key_state=key_state_4;//此時已經按鍵持續超過2秒
071                 key_time=0;
072                 key_return=2;//數碼管顯示2
073             }
074             break;
075         case key_state_4:
076             if(key_press)
077             {
078                 key_state=key_state_3;//此時按鍵已經持續了二秒了 故數碼管仍然顯示2
079                 //key_return=2;
080             }   
081             else if(++key_time>=10)
082             {
083                 key_state=key_state_0;//按鍵松開
084                 key_time=0;
085                 key_return=3;//數碼管顯示3
086             }
087             break;
088     }
089     return key_return;
090 }
091
092
093 void main()
094 {
095     int result;
096     system_Ini();
097     while(1)
098     {
099         if(key_stime_ok)
100         {
101             key_stime_ok=0;
102             switch(read_key())
103             {
104                 case 0:
105                 P0 = LED7Code[0&0x7f;//無按鍵或者按鍵時間少于1s 顯示0
106                 break;
107                 case 1:
108                 P0 = LED7Code[1&0x7f;//按鍵時間大于1s 顯示1
109                 break;
110                 case 2:
111                 P0 = LED7Code[2&0x7f;//按鍵時間大于2s 顯示2
112                 break;
113                 case 3:
114                 P0 = LED7Code[3&0x7f;//按鍵時間大于3s 顯示3
115                 break;
116                 default:break;   
117             
118             }
119         }
120     }   
121
122 }
123
124 void Timer1(void) interrupt 3
125 {
126
127     TH1 = 0x1c;//12.000
128     TL1 = 0x18;
129     if(++key_stime_counter>=10)//到達10ms
130     {
131         key_stime_counter=0;
132         key_stime_ok=1;
133    
134     }
135 }

比較凌亂的說...
只是作為一個學習過程的記錄吧!沒什么技術含量。


評分

參與人數 1黑幣 +5 收起 理由
botgs + 5 贊一個!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:4150 發表于 2017-7-29 10:58 | 只看該作者
謝謝樓主的分享
回復

使用道具 舉報

板凳
ID:914666 發表于 2021-12-12 17:14 | 只看該作者
51hei有你更精彩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品99久久久久久www | 国产激情片在线观看 | 91激情电影| 国产91久久精品一区二区 | 免费h在线| 欧美中国少妇xxx性高请视频 | 欧美日韩久久精品 | 在线免费观看成人 | 欧美久久国产 | 国产欧美在线观看 | 亚洲电影第1页 | 国产精品久久久久免费 | 日韩在线欧美 | 久久久久电影 | 麻豆一区一区三区四区 | 国产小视频在线 | 久久99精品国产 | 欧美日韩视频在线第一区 | 蜜臀久久99精品久久久久久宅男 | 亚洲精品一二三区 | 欧美日韩专区 | 国产精品久久久久久久久久妞妞 | 欧美日韩精品免费观看 | 国产一区二区免费 | 日韩在线观看一区二区三区 | 91视频日本 | av中文字幕网 | 欧美中文一区 | 秋霞国产 | 精品国产一区二区三区性色av | 自拍偷拍第一页 | 久久久一区二区三区 | 国产精品成人在线 | 日韩不卡视频在线 | 中文字幕在线看人 | 日韩一区二区福利视频 | 精品国产乱码久久久久久果冻传媒 | 午夜视频在线播放 | 欧美精品一区二区三区四区 在线 | 国产精品不卡一区二区三区 | 久久久国产精品一区 |