5個(gè)IO口掃描25個(gè)按鍵的解決方法 收藏.doc_第1頁
5個(gè)IO口掃描25個(gè)按鍵的解決方法 收藏.doc_第2頁
5個(gè)IO口掃描25個(gè)按鍵的解決方法 收藏.doc_第3頁
5個(gè)IO口掃描25個(gè)按鍵的解決方法 收藏.doc_第4頁
5個(gè)IO口掃描25個(gè)按鍵的解決方法 收藏.doc_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

5個(gè)IO口掃描25個(gè)按鍵的解決方法 收藏 轉(zhuǎn)帖來源:/bbs/bbs_content_all.jsp?bbs_sn=854599 在做項(xiàng)目(工程)的時(shí)候,我們經(jīng)常要用到比較多的按鍵,而且IO資源緊張,于是我們就想方設(shè)法地在別的模塊中節(jié)省IO口,好不容易擠出一兩個(gè)IO口,卻發(fā)現(xiàn)仍然不夠用,實(shí)在沒辦法了就添加一個(gè)IC來掃鍵。一個(gè)IC雖然價(jià)格不高,但對于大批量生產(chǎn)而且產(chǎn)品利潤低的廠家來說,這是一筆不菲的開支!那,我們能不能想到比較好的掃鍵方法:用最少的IO口,掃最多的鍵?可以嗎?舉個(gè)例:給出5個(gè)IO口,能掃多少鍵?有人說是2*36個(gè),如圖一: 圖一對,大部分技術(shù)參考書都這么做,我們也經(jīng)常這樣做:用3個(gè)IO口作行掃描,2個(gè)IO作列檢測(為方便描述,我們約定:設(shè)置某一IO口輸出為“0”稱其為“掃某IO口”)。用行線輸出掃鍵碼,列線檢測是否有按鍵的查詢方法進(jìn)行掃鍵。掃鍵流程:在行線依次輸出011,101,110掃鍵值,行線每輸出一個(gè)掃鍵值,列線檢測一次。當(dāng)列線檢測到有按鍵時(shí),結(jié)合輸出的掃鍵值可以判斷相應(yīng)的按鍵。但是,5個(gè)IO真的只能掃6個(gè)鍵嗎?有人說可以掃9個(gè),很聰明!利用行IO與地衍生3個(gè)鍵(要注意上拉電阻),如圖二:圖二掃鍵流程:先檢測3個(gè)行IO口,對K1,K2,K3進(jìn)行掃鍵,之后如上述2*3掃鍵流程。5個(gè)IO口能掃9個(gè)鍵,夠厲害吧,足足比6個(gè)鍵多了1/2!動動腦,還能不能再多掃幾個(gè)?就幾個(gè)?一個(gè)也行!好,再想一下,硬是被逼出來了!如圖三:圖三不多不少,正好10個(gè)鍵!這種掃鍵方式比較少見吧!漂亮!掃鍵流程:設(shè)IO1輸出為“0”,檢測IO2IO5,若判斷有相應(yīng)健按下,則可知有??;若無鍵,則繼續(xù)掃鍵:設(shè)IO2輸出為“0”,檢測IO3,IO4,IO5,判斷有無鍵按下,如此類推。這里應(yīng)注意:當(dāng)掃某一IO口(輸出為“0”)時(shí),不要去檢測已經(jīng)掃過的IO口。如:此時(shí)設(shè)置IO2輸出為“0”,依次檢測IO3,IO4,IO5,但不要去檢測IO1,否則會出錯(cuò)(為什么,請思考)。感覺怎么樣?不錯(cuò)吧!讓我們再看看圖三,好有成就感!看著,看著又看到了什么?快!見圖四:圖四真強(qiáng)!被您看出20個(gè)鍵!多了一個(gè)對稱的三角形??墒?,像這樣的排列能正確掃20個(gè)鍵嗎?回答是肯定的:不能!上下三角形相互對稱,其對稱掃出的鍵無法區(qū)別。有沒有注意到分析圖三時(shí)提到的注意點(diǎn)?(“當(dāng)掃某IO口時(shí),不要去檢測已經(jīng)掃過的IO口,否則會出錯(cuò)”)我們分析一下圖四:當(dāng)IO1輸出“0”時(shí),按下K11或K11鍵都能被IO2檢測到,但I(xiàn)O2檢測卻無法區(qū)別K11和K11鍵!同理,不管掃哪個(gè)IO口,都有兩個(gè)對稱的鍵不能區(qū)分。我們假想,如果能把對稱鍵區(qū)分開來,我們就能正常地去判斷按鍵。我們在思考:有沒有單向?qū)ㄐ云骷??有!見圖五!圖五很巧妙的思路!利用二極管的單向?qū)ㄐ?,區(qū)別兩個(gè)對稱鍵。掃鍵思路:對逐個(gè)IO口掃鍵,其他四個(gè)IO口可以分別檢測其所在的四個(gè)按鍵。這樣,就不會有分析圖三時(shí)提到的注意點(diǎn)。夠酷吧!等等,大家先別滿足現(xiàn)狀,我們再看一下圖二,是不是有點(diǎn)啟發(fā)?對,我們再分析一下“用5個(gè)IO口對地衍生的5個(gè)鍵”??磮D六:圖六25個(gè)鍵!5個(gè)IO口掃出25個(gè)鍵!先別激動,我們再分析一下它的可行性,分析通得過才能真正使用。假設(shè)掃鍵流程:先掃對地的5個(gè)鍵,再如圖五掃鍵。先掃對地5個(gè)鍵,判斷沒有按鍵,接著對逐一對IO口進(jìn)行掃鍵。但當(dāng)對某一IO口掃鍵時(shí),如果有對地的鍵按下,這時(shí)有可能會誤判按鍵,因?yàn)閷Φ劓I比其他鍵有更高的響應(yīng)優(yōu)先級。例如:掃IO1,IO1輸出“0”,恰好此時(shí)K62按下,IO2檢測到有按鍵,那就不能判斷是K11還是K62。我們可以在程序上避免這種按鍵誤判:若IO2檢測到有按鍵,那下一步就去判斷是否有對地鍵按下,如果沒有,那就可以正確地判斷是K11了。我們小結(jié)掃鍵個(gè)數(shù)S:S = (N-1)*N + N 啟用二極管S = (N-1)*N /2 + N 省掉二極管 經(jīng)典嗎?太經(jīng)典了!告訴大家一個(gè)小道消息:第一個(gè)設(shè)計(jì)出此電路的人是一個(gè)美國大佬,他(她?)還為此申請了專利 我自己在protues也建立了一個(gè)6口21的仿真程序,圖如下: 這個(gè)圖一點(diǎn)要注意上拉電子一定要直接在I/O口上;本人試過因?yàn)閷/O上啦電阻接的位置不對弄到反復(fù)調(diào)整程序,也沒有得到意向的結(jié)果。最后通過keil與protues建立調(diào)試環(huán)境,才發(fā)現(xiàn)這個(gè)問題。鍵盤掃描主要函數(shù),我也貼出來了,僅供參考uchar keyscan() uchar key,i,keyscan; P1=0x3f; /準(zhǔn)備讀取P1.0P1.5 51的I/0為準(zhǔn)雙向I/0口 作為輸入是最好先將其置1 /讀取接地按鍵值 if(P1&0x3f)!=0x3f) /若無按鍵按下 P1.0P1.5為高 delay(); /延時(shí)去抖動 if(P1&0x3f)!=0x3f)/判斷哪個(gè)按鍵按下 key=P1&0x3f; return key; keyscan=0x3e; for(i=0;i6;i+) P1=keyscan; /輸出I/O口掃描 輸出 判斷 if(P1!=keyscan) /讀取I/O口,看輸出掃P1.0P1.5的值是否與掃描不同 key=P1&0x3f; /轉(zhuǎn)換掃描碼 return key; keyscan=(key

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論