找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 80094|回復(fù): 153
打印 上一主題 下一主題
收起左側(cè)

狀態(tài)機按鍵掃描,看懂了會增長你的功力。。。。

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:69862 發(fā)表于 2014-12-14 21:19 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 xiao_yp2014 于 2016-1-21 14:37 編輯

大家好!我叫肖亞平,從小熱愛上了電子技術(shù),讀書時陰差陽錯的選擇了電子這方面的專業(yè),學(xué)習(xí)電子技術(shù)。對于我的理解來說,學(xué)校里面學(xué)到的技術(shù)不是全部實用,但是必須有用,所以一直奮斗在前線。我對學(xué)習(xí)總結(jié)出一句話“壓力不是有人努力,而是比你牛X N倍的人依然在努力
說在前面:
              做單片機開發(fā)少不了的就是通過按鍵和單片機交流,按鍵是單片機交流的一個橋梁,所以狀態(tài)機按鍵掃描猶如嵌入式一樣的火爆,在網(wǎng)上一搜一大把,一說起按鍵,學(xué)了單片機的人都知道有個叫做“狀態(tài)機掃描的方法”,這個方法確實比其它的按鍵方法要好得多,我記得在星期五的一個下午,一個網(wǎng)友叫我?guī)退{(diào)一個程序,他當(dāng)時說按下按鍵顯示就不顯示了,我一想,按鍵肯定有問題,我打開程序一看,里面居然還有像這樣的語句存在“ while(!Key); ”這明顯是給自己找麻煩,給CPU挖陷阱嘛,下面分享一個狀態(tài)機的按鍵掃描方法,據(jù)說這種方法是實時最高的,今天我也是親自試過,確定如此。





程序如下:main.c
  1. /********************************************************************************************
  2. 名    稱:狀態(tài)機按鍵掃描
  3. 功    能:運用狀態(tài)機思想,實現(xiàn)按下按鍵LED點亮,再按一下LED燈熄滅。
  4. 作    者:肖亞平
  5. 創(chuàng)建時間:2014年12月14日
  6. 修改時間:
  7. 備    注:
  8. **************************************************************************************************/
  9. #include<reg52.h>                 //頭文件
  10. #include"Key_State.h"         //按鍵掃描頭文件

  11. sbit Led = P0^7;                 //LED燈輸出

  12. unsigned char Key_Number = 0; //按鍵值

  13. /********************************************************************************************
  14. 函數(shù)名稱:主程序
  15. 功    能:程序執(zhí)行的入口
  16. 返 回 值:無
  17. 時    間:2014-12-14        
  18. 備    注:
  19. **************************************************************************************************/
  20. void main()
  21. {
  22.    while(1)
  23.    {
  24.        Key_Number = read_key();        //調(diào)用按鍵掃描函數(shù),取得按鍵值,10MS調(diào)用一次,這里我沒有計時

  25.            if(Key_Number == 1)                //按鍵返回值是1
  26.            {
  27.               Led = ~Led;                        //LED燈取反
  28.            }
  29.    }
  30. }
復(fù)制代碼

Key_State.c
  1. #include<reg52.h>

  2. sbit key_sr1 = P1^6;  // 按鍵輸入口

  3. #define key_state_0        0   //按鍵的初始狀態(tài)
  4. #define key_state_1        1   //按鍵按下的狀態(tài)
  5. #define key_state_2        2   //按鍵釋放的狀態(tài)

  6. /********************************************************************************************
  7. 函數(shù)名稱:按鍵掃描程序
  8. 功    能:檢測按鍵,并返回按鍵值
  9. 返 回 值:key_press
  10. 時    間:2014-12-14        
  11. 備    注:
  12. **************************************************************************************************/
  13. unsigned char read_key(void)
  14. {
  15.     static char key_state = 0;     //按鍵的狀態(tài)
  16.     unsigned char key_press;       //按鍵是否被按下
  17.         unsigned char key_return = 0;  //按鍵返回值
  18.     key_press = key_sr1;         // 讀按鍵I/O電?
  19.    
  20.     switch (key_state)
  21.     {
  22.         case key_state_0:                 // 按鍵初始態(tài)
  23.                 if (!key_press)
  24.                 {
  25.                                 key_state = key_state_1;// 鍵被按下,狀態(tài)轉(zhuǎn)換到鍵確認(rèn)態(tài)
  26.                         }
  27.                         break;
  28.                                 
  29.         case key_state_1:                   // 按鍵確認(rèn)態(tài)
  30.             if (!key_press)
  31.             {
  32.                 key_return = 1;         // 按鍵仍按下,按鍵確認(rèn)輸出為“1”
  33.                 key_state = key_state_2;// 狀態(tài)轉(zhuǎn)換到鍵釋放態(tài)
  34.             }
  35.             else
  36.             {
  37.                                 key_state = key_state_0; // 按鍵已抬起,轉(zhuǎn)換到按鍵初始態(tài)
  38.                         }
  39.             break;
  40.                                 
  41.         case key_state_2:
  42.             if (key_press)
  43.                         {
  44.                             key_state = key_state_0;//按鍵已釋放,轉(zhuǎn)換到按鍵初始態(tài)
  45.             }
  46.             break;
  47.    }
  48. return key_return;                            //返回按鍵值
  49. }
復(fù)制代碼

Key_State.h
  1. #ifndef __Key_State_H__
  2. #define __Key_State_H__

  3. unsigned char read_key(void);

  4. #endif
復(fù)制代碼


Key_State.zip (34.43 KB, 下載次數(shù): 1414)   

程序在這里下載


低調(diào),低調(diào)才是最牛逼的炫耀。。。。。。
由于水平能力有限,紕漏之處,不望各位讀者指出。。。。。。




評分

參與人數(shù) 4黑幣 +51 收起 理由
陳潤源home + 10 謝謝肖哥,師弟又學(xué)到東西了
botgs + 5 贊一個!
goty2000 + 1 多謝樓主,這次可以徹底擺脫while(KEY==0);.
暗光 + 35 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏89 分享淘帖 頂9 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:68618 發(fā)表于 2014-12-15 02:27 來自觸屏版 | 只看該作者
大師的解說風(fēng)趣幽默,簡單易懂。又學(xué)到了知識,謝謝,萬分感謝
回復(fù)

使用道具 舉報

板凳
ID:69862 發(fā)表于 2014-12-15 09:27 | 只看該作者
aabbcc 發(fā)表于 2014-12-15 02:27
大師的解說風(fēng)趣幽默,簡單易懂。又學(xué)到了知識,謝謝,萬分感謝

希望對你有幫助,相互學(xué)習(xí)。。。。
回復(fù)

使用道具 舉報

地板
ID:68804 發(fā)表于 2014-12-15 11:10 | 只看該作者
學(xué)習(xí)了
回復(fù)

使用道具 舉報

5#
ID:69862 發(fā)表于 2014-12-15 11:36 | 只看該作者

相互學(xué)習(xí),希望對你有幫助,。。。。
回復(fù)

使用道具 舉報

6#
ID:48140 發(fā)表于 2014-12-18 08:14 來自觸屏版 | 只看該作者
學(xué)習(xí)一下。
回復(fù)

使用道具 舉報

7#
ID:69862 發(fā)表于 2014-12-18 08:23 | 只看該作者
zgs660429 發(fā)表于 2014-12-18 08:14
學(xué)習(xí)一下。

相互學(xué)習(xí),希望對你有幫助,。。。。
回復(fù)

使用道具 舉報

8#
ID:70075 發(fā)表于 2014-12-21 22:03 | 只看該作者
好東西  贊一個
回復(fù)

使用道具 舉報

9#
ID:70075 發(fā)表于 2014-12-21 22:04 | 只看該作者
回去好好看
回復(fù)

使用道具 舉報

10#
ID:5501 發(fā)表于 2014-12-24 22:46 | 只看該作者
好好研究下,聽說過狀態(tài)機按鍵很好,一直還沒學(xué)會,謝謝樓主講解。
回復(fù)

使用道具 舉報

11#
ID:69862 發(fā)表于 2014-12-25 12:14 | 只看該作者
shgdd520com 發(fā)表于 2014-12-24 22:46
好好研究下,聽說過狀態(tài)機按鍵很好,一直還沒學(xué)會,謝謝樓主講解。

其實也不難,只是把一個按鍵,分成了幾個狀態(tài)。在不同的狀態(tài)下需要作不同的判斷。。。。
回復(fù)

使用道具 舉報

12#
ID:70544 發(fā)表于 2014-12-28 15:08 | 只看該作者
好東西  贊一個
回復(fù)

使用道具 舉報

13#
ID:59269 發(fā)表于 2014-12-28 21:45 | 只看該作者
下載學(xué)習(xí),謝謝分享
回復(fù)

使用道具 舉報

14#
ID:73002 發(fā)表于 2015-2-5 22:31 | 只看該作者
下載學(xué)習(xí),謝謝分享
回復(fù)

使用道具 舉報

15#
ID:29438 發(fā)表于 2015-2-7 08:49 | 只看該作者
學(xué)習(xí)了,謝謝!
回復(fù)

使用道具 舉報

16#
ID:73030 發(fā)表于 2015-2-7 15:03 來自觸屏版 | 只看該作者
學(xué)無止境,謝謝。
回復(fù)

使用道具 舉報

17#
ID:73450 發(fā)表于 2015-2-13 20:56 | 只看該作者
學(xué)習(xí)一下
回復(fù)

使用道具 舉報

18#
ID:73995 發(fā)表于 2015-3-1 15:10 | 只看該作者
學(xué)習(xí)學(xué)習(xí),
回復(fù)

使用道具 舉報

19#
ID:74044 發(fā)表于 2015-3-2 16:51 | 只看該作者
學(xué)習(xí)學(xué)習(xí)一下,謝謝樓主
回復(fù)

使用道具 舉報

20#
ID:46228 發(fā)表于 2015-3-3 22:42 | 只看該作者
又學(xué)到了知識,萬分感謝,太感動了
回復(fù)

使用道具 舉報

21#
ID:29438 發(fā)表于 2015-3-4 13:24 | 只看該作者
謝謝!
回復(fù)

使用道具 舉報

22#
ID:47760 發(fā)表于 2015-3-5 06:31 來自觸屏版 | 只看該作者
l謝謝樓主講解
回復(fù)

使用道具 舉報

23#
ID:73572 發(fā)表于 2015-3-6 10:42 來自觸屏版 | 只看該作者
正好最近一直為這個問題煩憂,多謝分享。回去慢慢研究研究
回復(fù)

使用道具 舉報

24#
ID:74706 發(fā)表于 2015-3-16 11:31 | 只看該作者
學(xué)習(xí)了,很好的方法
回復(fù)

使用道具 舉報

25#
ID:75007 發(fā)表于 2015-3-21 16:47 | 只看該作者
hehehe學(xué)習(xí)下
回復(fù)

使用道具 舉報

26#
ID:37003 發(fā)表于 2015-3-24 16:59 | 只看該作者
很不錯的思路
回復(fù)

使用道具 舉報

27#
ID:86418 發(fā)表于 2015-7-21 22:02 | 只看該作者
支持長按么
回復(fù)

使用道具 舉報

28#
ID:87496 發(fā)表于 2015-8-3 01:29 | 只看該作者
好東西啊,下來看看!~
回復(fù)

使用道具 舉報

29#
ID:79544 發(fā)表于 2015-8-3 18:29 | 只看該作者
獨立按鍵,那矩陣按鍵呢?
回復(fù)

使用道具 舉報

30#
ID:64178 發(fā)表于 2015-8-4 09:13 | 只看該作者
已下載,看看,謝謝LZ
回復(fù)

使用道具 舉報

31#
ID:87682 發(fā)表于 2015-8-5 13:15 | 只看該作者
正好需要,多謝摟住
回復(fù)

使用道具 舉報

32#
ID:87781 發(fā)表于 2015-8-6 20:37 | 只看該作者
正在學(xué)習(xí),很好的資料,謝謝分享
回復(fù)

使用道具 舉報

33#
ID:87781 發(fā)表于 2015-8-6 20:38 | 只看該作者
很好的資料,代碼整潔,可讀性高,謝謝樓主
回復(fù)

使用道具 舉報

34#
ID:62929 發(fā)表于 2015-8-8 10:18 來自觸屏版 | 只看該作者
很有用謝謝啦
回復(fù)

使用道具 舉報

35#
ID:86753 發(fā)表于 2015-8-8 19:29 | 只看該作者
樓主問一下,這個程序是只可以掃描一個按鍵嗎?因為我只看到一個按鍵定義。還有正常的判斷按鍵是否按下的程序不是應(yīng)該有檢測到按鍵按下之后有一個延時躲避抖動嗎?這樣的設(shè)計會使按鍵判斷不準(zhǔn)確嗎?謝謝樓主,我小白一個……
回復(fù)

使用道具 舉報

36#
ID:84495 發(fā)表于 2015-8-10 17:18 | 只看該作者
看看是何神器,,贏得一樓如此美贊
回復(fù)

使用道具 舉報

37#
ID:89194 發(fā)表于 2015-9-1 10:04 | 只看該作者
最近在研究這個狀態(tài)機按鍵,下來看下
回復(fù)

使用道具 舉報

38#
ID:89194 發(fā)表于 2015-9-1 10:09 | 只看該作者
下下來看了一下,寫的很簡單明了,便于理解!
回復(fù)

使用道具 舉報

39#
ID:90231 發(fā)表于 2015-9-16 08:42 | 只看該作者
感覺很有幫助,現(xiàn)在就是需要規(guī)范程序
回復(fù)

使用道具 舉報

40#
ID:90296 發(fā)表于 2015-9-16 21:30 | 只看該作者
這個怎么用。我也下來看看
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表