本帖最后由 xiao_yp2014 于 2016-1-21 14:37 編輯
大家好!我叫肖亞平,從小熱愛上了電子技術,讀書時陰差陽錯的選擇了電子這方面的專業,學習電子技術。對于我的理解來說,學校里面學到的技術不是全部實用,但是必須有用,所以一直奮斗在前線。我對學習總結出一句話“壓力不是有人努力,而是比你牛X N倍的人依然在努力
說在前面:
做單片機開發少不了的就是通過按鍵和單片機交流,按鍵是單片機交流的一個橋梁,所以狀態機按鍵掃描猶如嵌入式一樣的火爆,在網上一搜一大把,一說起按鍵,學了單片機的人都知道有個叫做“狀態機掃描的方法”,這個方法確實比其它的按鍵方法要好得多,我記得在星期五的一個下午,一個網友叫我幫他調一個程序,他當時說按下按鍵顯示就不顯示了,我一想,按鍵肯定有問題,我打開程序一看,里面居然還有像這樣的語句存在“ while(!Key); ”這明顯是給自己找麻煩,給CPU挖陷阱嘛,下面分享一個狀態機的按鍵掃描方法,據說這種方法是實時最高的,今天我也是親自試過,確定如此。
程序如下:main.c
- /********************************************************************************************
- 名 稱:狀態機按鍵掃描
- 功 能:運用狀態機思想,實現按下按鍵LED點亮,再按一下LED燈熄滅。
- 作 者:肖亞平
- 創建時間:2014年12月14日
- 修改時間:
- 備 注:
- **************************************************************************************************/
- #include<reg52.h> //頭文件
- #include"Key_State.h" //按鍵掃描頭文件
- sbit Led = P0^7; //LED燈輸出
- unsigned char Key_Number = 0; //按鍵值
- /********************************************************************************************
- 函數名稱:主程序
- 功 能:程序執行的入口
- 返 回 值:無
- 時 間:2014-12-14
- 備 注:
- **************************************************************************************************/
- void main()
- {
- while(1)
- {
- Key_Number = read_key(); //調用按鍵掃描函數,取得按鍵值,10MS調用一次,這里我沒有計時
- if(Key_Number == 1) //按鍵返回值是1
- {
- Led = ~Led; //LED燈取反
- }
- }
- }
復制代碼
Key_State.c
- #include<reg52.h>
- sbit key_sr1 = P1^6; // 按鍵輸入口
- #define key_state_0 0 //按鍵的初始狀態
- #define key_state_1 1 //按鍵按下的狀態
- #define key_state_2 2 //按鍵釋放的狀態
- /********************************************************************************************
- 函數名稱:按鍵掃描程序
- 功 能:檢測按鍵,并返回按鍵值
- 返 回 值:key_press
- 時 間:2014-12-14
- 備 注:
- **************************************************************************************************/
- unsigned char read_key(void)
- {
- static char key_state = 0; //按鍵的狀態
- unsigned char key_press; //按鍵是否被按下
- unsigned char key_return = 0; //按鍵返回值
- key_press = key_sr1; // 讀按鍵I/O電?
-
- switch (key_state)
- {
- case key_state_0: // 按鍵初始態
- if (!key_press)
- {
- key_state = key_state_1;// 鍵被按下,狀態轉換到鍵確認態
- }
- break;
-
- case key_state_1: // 按鍵確認態
- if (!key_press)
- {
- key_return = 1; // 按鍵仍按下,按鍵確認輸出為“1”
- key_state = key_state_2;// 狀態轉換到鍵釋放態
- }
- else
- {
- key_state = key_state_0; // 按鍵已抬起,轉換到按鍵初始態
- }
- break;
-
- case key_state_2:
- if (key_press)
- {
- key_state = key_state_0;//按鍵已釋放,轉換到按鍵初始態
- }
- break;
- }
- return key_return; //返回按鍵值
- }
復制代碼
Key_State.h
- #ifndef __Key_State_H__
- #define __Key_State_H__
- unsigned char read_key(void);
- #endif
復制代碼
Key_State.zip
(34.43 KB, 下載次數: 1414)
2014-12-14 21:12 上傳
點擊文件名下載附件
程序在這里下載
低調,低調才是最牛逼的炫耀。。。。。。
由于水平能力有限,紕漏之處,不望各位讀者指出。。。。。。
|