掃瞄按鍵的解決方法

2021-05-27 13:26:04 字數 2176 閱讀 4302

在做專案(工程)的時候,我們經常要用到比較多的按鍵,而且io資源緊張,於是我們就想方設法地在別的模組 中節省io口,好不容易擠出一兩個io口,卻發現仍然不夠用,實在沒辦法了就新增乙個ic來掃鍵。乙個ic雖然**不高,但對於大批量生產而且產品利潤低 的廠家來說,這是一筆不菲的開支!

那,我們能不能想到比較好的掃鍵方法:用最少的io口,掃最多的鍵?可以嗎?

舉個例:給出5個io口,能掃多少鍵?有人說是2*3=6個,如圖一:

圖一 對,大部分技術參考書都這麼做,我們也經常這樣做:用3個io口作行掃瞄,2個io作列檢測(為方便描述,我們約定:設定某一io口輸出為 「0」――稱其為「掃某io口」)。用行線輸出掃鍵碼,列線檢測是否有按鍵的查詢方法進行掃鍵。掃鍵流程:在行線依次輸出011,101,110掃鍵值, 行線每輸出乙個掃鍵值,列線檢測一次。當列線檢測到有按鍵時,結合輸出的掃鍵值可以判斷相應的按鍵。

但是,5個io真的只能掃6個鍵嗎?有人說可以掃9個,很聰明!利用行io與地衍生3個鍵(要注意上拉電阻),如圖二:

圖二 掃鍵流程:先檢測3個行io口,對k1』,k2』,k3』進行掃鍵,之後如上述2*3掃鍵流程。5個io口能掃9個鍵,夠厲害吧,足足比6個鍵多了1/2!

動動腦,還能不能再多掃幾個?就幾個?乙個也行!好,再想一下,硬是被逼出來了!如圖三:

圖三 不多不少,正好10個鍵!這種掃鍵方式比較少見吧!漂亮!掃鍵流程:設io1輸出為「0」,檢測io2…io5,若判斷有相應健按下,則可知有 健;若無鍵,則繼續掃鍵:設io2輸出為「0」,檢測io3,io4,io5,判斷有無鍵按下,如此類推。這裡應注意:當掃某一io口(輸出為「0」) 時,不要去檢測已經掃過的io口。如:此時設定io2輸出為「0」,依次檢測io3,io4,io5,但不要去檢測io1,否則會出錯(為什麼,請思 考)。

感覺怎麼樣?不錯吧!讓我們再看看圖三,好有成就感!看著,看著……又看到了什麼?快!見圖四:

圖四 真強!被您看出20個鍵!多了乙個對稱的三角形。可是,像這樣的排列能正確掃20個鍵嗎?回答是肯定的:不能!上下三角形相互對稱,其對稱掃出的鍵無法區別。有沒有注意到分析圖三時提到的注意點?(à「當掃某io口時,不要去檢測已經掃過的io口,否則會出錯」)

我們分析一下圖四:當io1輸出「0」時,按下k11或k11』鍵都能被io2檢測到,但io2檢測卻無法區別k11和k11』鍵!同理,不管掃哪個io口,都有兩個對稱的鍵不能區分。

我們假想,如果能把對稱鍵區分開來,我們就能正常地去判斷按鍵。我們在思考:有沒有單嚮導通性器件?有!見圖五!

圖五 很巧妙的思路!利用二極體的單嚮導通性,區別兩個對稱鍵。掃鍵思路:對逐個io口掃鍵,其他四個io口可以分別檢測其所在的四個按鍵。這樣,就不會有分析圖三時提到的注意點。

夠酷吧!等等,大家先別滿足現狀,我們再看一下圖二,是不是有點啟發?對,我們再分析一下「用5個io口對地衍生的5個鍵」。看圖六:

圖六 25個鍵!5個io口掃出25個鍵!先別激動,我們再分析一下它的可行性,分析通得過才能真正使用。假設掃鍵流程:先掃對地的5個鍵,再如圖五掃 鍵。先掃對地5個鍵,判斷沒有按鍵,接著對逐一對io口進行掃鍵。但當對某一io口掃鍵時,如果有對地的鍵按下,這時有可能會誤判按鍵,因為對地鍵比其他 鍵有更高的響應優先順序。例如:掃io1,io1輸出「0」,恰好此時k62按下,io2檢測到有按鍵,那就不能判斷是k11還是k62。我們可以在程式上 避免這種按鍵誤判:若io2檢測到有按鍵,那下一步就去判斷是否有對地鍵按下,如果沒有,那就可以正確地判斷是k11了。

我們小結掃鍵個數s:

s = (n-1)*n + n ――啟用二極體

s = (n-1)*n /2 + n ――省掉二極體

AppScan掃瞄「盲注」解決方法及「思路」。。。

手上的專案快上生產了,最近一直在做專案的bug修改,蛋疼的是團隊中木有軟體測試人員,只能自己來了,o 先是根據有sql盲注的鏈結位址去查詢後台是否有上面兩種問題沒做到,發現沒有。迷茫。然後考慮了無數長時間,幾乎這個模組的所有 都看了一遍,頭大了。於是跑去群裡問了一圈,詳細的我也聽不懂,只知道就是會有...

disk boot failure 的解決方法

disk boot failure please insert system disk and press enter 這文字的意思是硬碟啟動失敗,插入系統盤後按enter鍵.這種故障多發生在硬碟沒有檢測到的情況下.首先要進入cmos設定選擇 ide hdd audo detecdion 專案,看是...

Unable to load dll的解決方法

unable to load dll 的解決方法 前幾天在做專案時,需要用到乙個非託管的 dll庫,使用 net 的互操作技術可以很方便的呼叫位於非託管 dll中的函式。但是在執行時遇到了下面的錯誤 unable to load dll hresult 0x8007007e 於是馬上 google ...