|
本帖最后由 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ò),確定如此。
程序如下:main.c
- /********************************************************************************************
- 名 稱:狀態(tài)機(jī)按鍵掃描
- 功 能:運(yùn)用狀態(tài)機(jī)思想,實(shí)現(xiàn)按下按鍵LED點(diǎn)亮,再按一下LED燈熄滅。
- 作 者:肖亞平
- 創(chuàng)建時(shí)間:2014年12月14日
- 修改時(shí)間:
- 備 注:
- **************************************************************************************************/
- #include<reg52.h> //頭文件
- #include"Key_State.h" //按鍵掃描頭文件
- sbit Led = P0^7; //LED燈輸出
- unsigned char Key_Number = 0; //按鍵值
- /********************************************************************************************
- 函數(shù)名稱:主程序
- 功 能:程序執(zhí)行的入口
- 返 回 值:無(wú)
- 時(shí) 間:2014-12-14
- 備 注:
- **************************************************************************************************/
- void main()
- {
- while(1)
- {
- Key_Number = read_key(); //調(diào)用按鍵掃描函數(shù),取得按鍵值,10MS調(diào)用一次,這里我沒(méi)有計(jì)時(shí)
- if(Key_Number == 1) //按鍵返回值是1
- {
- Led = ~Led; //LED燈取反
- }
- }
- }
復(fù)制代碼
Key_State.c
- #include<reg52.h>
- sbit key_sr1 = P1^6; // 按鍵輸入口
- #define key_state_0 0 //按鍵的初始狀態(tài)
- #define key_state_1 1 //按鍵按下的狀態(tài)
- #define key_state_2 2 //按鍵釋放的狀態(tài)
- /********************************************************************************************
- 函數(shù)名稱:按鍵掃描程序
- 功 能:檢測(cè)按鍵,并返回按鍵值
- 返 回 值:key_press
- 時(shí) 間:2014-12-14
- 備 注:
- **************************************************************************************************/
- unsigned char read_key(void)
- {
- static char key_state = 0; //按鍵的狀態(tài)
- unsigned char key_press; //按鍵是否被按下
- unsigned char key_return = 0; //按鍵返回值
- key_press = key_sr1; // 讀按鍵I/O電?
-
- switch (key_state)
- {
- case key_state_0: // 按鍵初始態(tài)
- if (!key_press)
- {
- key_state = key_state_1;// 鍵被按下,狀態(tài)轉(zhuǎn)換到鍵確認(rèn)態(tài)
- }
- break;
-
- case key_state_1: // 按鍵確認(rèn)態(tài)
- if (!key_press)
- {
- key_return = 1; // 按鍵仍按下,按鍵確認(rèn)輸出為“1”
- key_state = key_state_2;// 狀態(tài)轉(zhuǎn)換到鍵釋放態(tài)
- }
- else
- {
- key_state = key_state_0; // 按鍵已抬起,轉(zhuǎn)換到按鍵初始態(tài)
- }
- break;
-
- case key_state_2:
- if (key_press)
- {
- key_state = key_state_0;//按鍵已釋放,轉(zhuǎn)換到按鍵初始態(tài)
- }
- break;
- }
- return key_return; //返回按鍵值
- }
復(fù)制代碼
Key_State.h
- #ifndef __Key_State_H__
- #define __Key_State_H__
- unsigned char read_key(void);
- #endif
復(fù)制代碼
Key_State.zip
(34.43 KB, 下載次數(shù): 1414)
2014-12-14 21:12 上傳
點(diǎn)擊文件名下載附件
程序在這里下載
低調(diào),低調(diào)才是最牛逼的炫耀。。。。。。
由于水平能力有限,紕漏之處,不望各位讀者指出。。。。。。
|
評(píng)分
-
查看全部評(píng)分
|