找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 78929|回復(fù): 153
收起左側(cè)

狀態(tài)機(jī)按鍵掃描,看懂了會(huì)增長(zhǎng)你的功力。。。。

  [復(fù)制鏈接]
ID:69862 發(fā)表于 2014-12-14 21:19 | 顯示全部樓層 |閱讀模式
本帖最后由 xiao_yp2014 于 2016-1-21 14:37 編輯

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


捕獲.PNG


程序如下:main.c
  1. /********************************************************************************************
  2. 名    稱:狀態(tài)機(jī)按鍵掃描
  3. 功    能:運(yùn)用狀態(tài)機(jī)思想,實(shí)現(xiàn)按下按鍵LED點(diǎn)亮,再按一下LED燈熄滅。
  4. 作    者:肖亞平
  5. 創(chuàng)建時(shí)間:2014年12月14日
  6. 修改時(shí)間:
  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. 返 回 值:無(wú)
  17. 時(shí)    間:2014-12-14        
  18. 備    注:
  19. **************************************************************************************************/
  20. void main()
  21. {
  22.    while(1)
  23.    {
  24.        Key_Number = read_key();        //調(diào)用按鍵掃描函數(shù),取得按鍵值,10MS調(diào)用一次,這里我沒(méi)有計(jì)時(shí)

  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. 功    能:檢測(cè)按鍵,并返回按鍵值
  9. 返 回 值:key_press
  10. 時(shí)    間: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)才是最牛逼的炫耀。。。。。。
由于水平能力有限,紕漏之處,不望各位讀者指出。。。。。。




評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:68618 發(fā)表于 2014-12-15 02:27 來(lái)自手機(jī) | 顯示全部樓層
大師的解說(shuō)風(fēng)趣幽默,簡(jiǎn)單易懂。又學(xué)到了知識(shí),謝謝,萬(wàn)分感謝
回復(fù)

使用道具 舉報(bào)

ID:69862 發(fā)表于 2014-12-15 09:27 | 顯示全部樓層
aabbcc 發(fā)表于 2014-12-15 02:27
大師的解說(shuō)風(fēng)趣幽默,簡(jiǎn)單易懂。又學(xué)到了知識(shí),謝謝,萬(wàn)分感謝

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

使用道具 舉報(bào)

ID:68804 發(fā)表于 2014-12-15 11:10 | 顯示全部樓層
學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

ID:69862 發(fā)表于 2014-12-15 11:36 | 顯示全部樓層

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

使用道具 舉報(bào)

ID:48140 發(fā)表于 2014-12-18 08:14 來(lái)自手機(jī) | 顯示全部樓層
學(xué)習(xí)一下。
回復(fù)

使用道具 舉報(bào)

ID:69862 發(fā)表于 2014-12-18 08:23 | 顯示全部樓層

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

使用道具 舉報(bào)

ID:70075 發(fā)表于 2014-12-21 22:03 | 顯示全部樓層
好東西  贊一個(gè)
回復(fù)

使用道具 舉報(bào)

ID:70075 發(fā)表于 2014-12-21 22:04 | 顯示全部樓層
回去好好看
回復(fù)

使用道具 舉報(bào)

ID:5501 發(fā)表于 2014-12-24 22:46 | 顯示全部樓層
好好研究下,聽(tīng)說(shuō)過(guò)狀態(tài)機(jī)按鍵很好,一直還沒(méi)學(xué)會(huì),謝謝樓主講解。
回復(fù)

使用道具 舉報(bào)

ID:69862 發(fā)表于 2014-12-25 12:14 | 顯示全部樓層
shgdd520com 發(fā)表于 2014-12-24 22:46
好好研究下,聽(tīng)說(shuō)過(guò)狀態(tài)機(jī)按鍵很好,一直還沒(méi)學(xué)會(huì),謝謝樓主講解。

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

使用道具 舉報(bào)

ID:70544 發(fā)表于 2014-12-28 15:08 | 顯示全部樓層
好東西  贊一個(gè)
回復(fù)

使用道具 舉報(bào)

ID:59269 發(fā)表于 2014-12-28 21:45 | 顯示全部樓層
下載學(xué)習(xí),謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:73002 發(fā)表于 2015-2-5 22:31 | 顯示全部樓層
下載學(xué)習(xí),謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:29438 發(fā)表于 2015-2-7 08:49 | 顯示全部樓層
學(xué)習(xí)了,謝謝!
回復(fù)

使用道具 舉報(bào)

ID:73030 發(fā)表于 2015-2-7 15:03 來(lái)自手機(jī) | 顯示全部樓層
學(xué)無(wú)止境,謝謝。
回復(fù)

使用道具 舉報(bào)

ID:73450 發(fā)表于 2015-2-13 20:56 | 顯示全部樓層
學(xué)習(xí)一下
回復(fù)

使用道具 舉報(bào)

ID:73995 發(fā)表于 2015-3-1 15:10 | 顯示全部樓層
學(xué)習(xí)學(xué)習(xí),
回復(fù)

使用道具 舉報(bào)

ID:74044 發(fā)表于 2015-3-2 16:51 | 顯示全部樓層
學(xué)習(xí)學(xué)習(xí)一下,謝謝樓主
回復(fù)

使用道具 舉報(bào)

ID:46228 發(fā)表于 2015-3-3 22:42 | 顯示全部樓層
又學(xué)到了知識(shí),萬(wàn)分感謝,太感動(dòng)了
回復(fù)

使用道具 舉報(bào)

ID:29438 發(fā)表于 2015-3-4 13:24 | 顯示全部樓層
謝謝!
回復(fù)

使用道具 舉報(bào)

ID:47760 發(fā)表于 2015-3-5 06:31 來(lái)自手機(jī) | 顯示全部樓層
l謝謝樓主講解
回復(fù)

使用道具 舉報(bào)

ID:73572 發(fā)表于 2015-3-6 10:42 來(lái)自手機(jī) | 顯示全部樓層
正好最近一直為這個(gè)問(wèn)題煩憂,多謝分享;厝ヂ芯垦芯
回復(fù)

使用道具 舉報(bào)

ID:74706 發(fā)表于 2015-3-16 11:31 | 顯示全部樓層
學(xué)習(xí)了,很好的方法
回復(fù)

使用道具 舉報(bào)

ID:75007 發(fā)表于 2015-3-21 16:47 | 顯示全部樓層
hehehe學(xué)習(xí)下
回復(fù)

使用道具 舉報(bào)

ID:37003 發(fā)表于 2015-3-24 16:59 | 顯示全部樓層
很不錯(cuò)的思路
回復(fù)

使用道具 舉報(bào)

ID:86418 發(fā)表于 2015-7-21 22:02 | 顯示全部樓層
支持長(zhǎng)按么
回復(fù)

使用道具 舉報(bào)

ID:87496 發(fā)表于 2015-8-3 01:29 | 顯示全部樓層
好東西啊,下來(lái)看看!~
回復(fù)

使用道具 舉報(bào)

ID:79544 發(fā)表于 2015-8-3 18:29 | 顯示全部樓層
獨(dú)立按鍵,那矩陣按鍵呢?
回復(fù)

使用道具 舉報(bào)

ID:64178 發(fā)表于 2015-8-4 09:13 | 顯示全部樓層
已下載,看看,謝謝LZ
回復(fù)

使用道具 舉報(bào)

ID:87682 發(fā)表于 2015-8-5 13:15 | 顯示全部樓層
正好需要,多謝摟住
回復(fù)

使用道具 舉報(bào)

ID:87781 發(fā)表于 2015-8-6 20:37 | 顯示全部樓層
正在學(xué)習(xí),很好的資料,謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:87781 發(fā)表于 2015-8-6 20:38 | 顯示全部樓層
很好的資料,代碼整潔,可讀性高,謝謝樓主
回復(fù)

使用道具 舉報(bào)

ID:62929 發(fā)表于 2015-8-8 10:18 來(lái)自手機(jī) | 顯示全部樓層
很有用謝謝啦
回復(fù)

使用道具 舉報(bào)

ID:86753 發(fā)表于 2015-8-8 19:29 | 顯示全部樓層
樓主問(wèn)一下,這個(gè)程序是只可以掃描一個(gè)按鍵嗎?因?yàn)槲抑豢吹揭粋(gè)按鍵定義。還有正常的判斷按鍵是否按下的程序不是應(yīng)該有檢測(cè)到按鍵按下之后有一個(gè)延時(shí)躲避抖動(dòng)嗎?這樣的設(shè)計(jì)會(huì)使按鍵判斷不準(zhǔn)確嗎?謝謝樓主,我小白一個(gè)……
回復(fù)

使用道具 舉報(bào)

ID:84495 發(fā)表于 2015-8-10 17:18 | 顯示全部樓層
看看是何神器,,贏得一樓如此美贊
回復(fù)

使用道具 舉報(bào)

ID:89194 發(fā)表于 2015-9-1 10:04 | 顯示全部樓層
最近在研究這個(gè)狀態(tài)機(jī)按鍵,下來(lái)看下
回復(fù)

使用道具 舉報(bào)

ID:89194 發(fā)表于 2015-9-1 10:09 | 顯示全部樓層
下下來(lái)看了一下,寫(xiě)的很簡(jiǎn)單明了,便于理解!
回復(fù)

使用道具 舉報(bào)

ID:90231 發(fā)表于 2015-9-16 08:42 | 顯示全部樓層
感覺(jué)很有幫助,現(xiàn)在就是需要規(guī)范程序
回復(fù)

使用道具 舉報(bào)

ID:90296 發(fā)表于 2015-9-16 21:30 | 顯示全部樓層
這個(gè)怎么用。我也下來(lái)看看
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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