新型的按鍵掃描程序(轉(zhuǎn)載)

新型的按鍵掃描程序(轉(zhuǎn)載)

ID:47162152

大?。?2.50 KB

頁數(shù):5頁

時(shí)間:2019-08-14

新型的按鍵掃描程序(轉(zhuǎn)載)_第1頁
新型的按鍵掃描程序(轉(zhuǎn)載)_第2頁
新型的按鍵掃描程序(轉(zhuǎn)載)_第3頁
新型的按鍵掃描程序(轉(zhuǎn)載)_第4頁
新型的按鍵掃描程序(轉(zhuǎn)載)_第5頁
資源描述:

《新型的按鍵掃描程序(轉(zhuǎn)載)》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。

1、新型的按鍵掃描程序不過我在網(wǎng)上游逛了很久,也看過不少源程序了,沒有發(fā)現(xiàn)這種按鍵處理辦法的蹤跡,所以,我將他共享出來,和廣大同僚們共勉。我非常堅(jiān)信這種按鍵處理辦法的便捷和高效,你可以移植到任何一種嵌入式處理器上面,因?yàn)镃語言強(qiáng)大的可移植性。同時(shí),這里面用到了一些分層的思想,在單片機(jī)當(dāng)中也是相當(dāng)有用的,也是本文的另外一個(gè)重點(diǎn)。對于老鳥,我建議直接看那兩個(gè)表達(dá)式,然后自己想想就會懂的了,也不需要聽我后面的自吹自擂了,我可沒有班門弄斧的意思,hoho~~但是對于新手,我建議將全文看完。因?yàn)檫@是實(shí)際項(xiàng)目中總結(jié)出來的經(jīng)驗(yàn),學(xué)校里面學(xué)不到的

2、東西。以下假設(shè)你懂C語言,因?yàn)榧兇獾腃語言描述,所以和處理器平臺無關(guān),你可以在MCS-51,AVR,PIC,甚至是ARM平臺上面測試這個(gè)程序性能。當(dāng)然,我自己也是在多個(gè)項(xiàng)目用過,效果非常好的。好了,工程人員的習(xí)慣,廢話就應(yīng)該少說,開始吧。以下我以AVR的MEGA8作為平臺講解,沒有其它原因,因?yàn)槲沂诸^上只有AVR的板子而已沒有51的。用51也可以,只是芯片初始化部分不同,還有寄存器名字不同而已。核心算法:unsignedcharTrg;unsignedcharCont;voidKeyRead(void){unsignedcha

3、rReadData=PINB^0xff;//1Trg=ReadData&(ReadData^Cont);//2Cont=ReadData;//3}完了。有沒有一種不可思議的感覺?當(dāng)然,沒有想懂之前會那樣,想懂之后就會驚嘆于這算法的精妙!!下面是程序解釋:Trg(triger)代表的是觸發(fā),Cont(continue)代表的是連續(xù)按下。1:讀PORTB的端口數(shù)據(jù),取反,然后送到ReadData臨時(shí)變量里面保存起來。2:算法1,用來計(jì)算觸發(fā)變量的。一個(gè)位與操作,一個(gè)異或操作,我想學(xué)過C語言都應(yīng)該懂吧?Trg為全局變量,其它程序可以

4、直接引用。3:算法2,用來計(jì)算連續(xù)變量??吹竭@里,有種“知其然,不知其所以然”的感覺吧?代碼很簡單,但是它到底是怎么樣實(shí)現(xiàn)我們的目的的呢?好,下面就讓我們繞開云霧看青天吧。我們最常用的按鍵接法如下:AVR是有內(nèi)部上拉功能的,但是為了說明問題,我是特意用外部上拉電阻。那么,按鍵沒有按下的時(shí)候,讀端口數(shù)據(jù)為1,如果按鍵按下,那么端口讀到0。下面就看看具體幾種情況之下,這算法是怎么一回事。(1)沒有按鍵的時(shí)候端口為0xff,ReadData讀端口并且取反,很顯然,就是0x00了。Trg=ReadData&(ReadData^Cont

5、);(初始狀態(tài)下,Cont也是為0的)很簡單的數(shù)學(xué)計(jì)算,因?yàn)镽eadData為0,則它和任何數(shù)“相與”,結(jié)果也是為0的。Cont=ReadData;保存Cont其實(shí)就是等于ReadData,為0;結(jié)果就是:ReadData=0;Trg=0;Cont=0;(2)第一次PB0按下的情況端口數(shù)據(jù)為0xfe,ReadData讀端口并且取反,很顯然,就是0x01了。Trg=ReadData&(ReadData^Cont);因?yàn)檫@是第一次按下,所以Cont是上次的值,應(yīng)為為0。那么這個(gè)式子的值也不難算,也就是Trg=0x01&(0x01^

6、0x00)=0x01Cont=ReadData=0x01;結(jié)果就是:ReadData=0x01;Trg=0x01;Trg只會在這個(gè)時(shí)候?qū)?yīng)位的值為1,其它時(shí)候都為0Cont=0x01;(3)PB0按著不松(長按鍵)的情況端口數(shù)據(jù)為0xfe,ReadData讀端口并且取反是0x01了。Trg=ReadData&(ReadData^Cont);因?yàn)檫@是連續(xù)按下,所以Cont是上次的值,應(yīng)為為0x01。那么這個(gè)式子就變成了Trg=0x01&(0x01^0x01)=0x00Cont=ReadData=0x01;結(jié)果就是:ReadDat

7、a=0x01;Trg=0x00;Cont=0x01;因?yàn)楝F(xiàn)在按鍵是長按著,所以MCU會每個(gè)一定時(shí)間(20ms左右)不斷的執(zhí)行這個(gè)函數(shù),那么下次執(zhí)行的時(shí)候情況會是怎么樣的呢?ReadData=0x01;這個(gè)不會變,因?yàn)榘存I沒有松開Trg=ReadData&(ReadData^Cont)=0x01&(0x01^0x01)=0,只要按鍵沒有松開,這個(gè)Trg值永遠(yuǎn)為0?。?!Cont=0x01;只要按鍵沒有松開,這個(gè)值永遠(yuǎn)是0x01?。。?)按鍵松開的情況端口數(shù)據(jù)為0xff,ReadData讀端口并且取反是0x00了。Trg=ReadD

8、ata&(ReadData^Cont)=0x00&(0x00^0x01)=0x00Cont=ReadData=0x00;結(jié)果就是:ReadData=0x00;Trg=0x00;Cont=0x00;很顯然,這個(gè)回到了初始狀態(tài),也就是沒有按鍵按下的狀態(tài)??偨Y(jié)一下,不知道想懂了沒有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動畫的文件,查看預(yù)覽時(shí)可能會顯示錯(cuò)亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時(shí)聯(lián)系客服。
3. 下載前請仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動等原因無法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請聯(lián)系客服處理。