范志誠,劉愛華
(河源理工學校 機電教學部,河源 517000)
只有正確檢測到按鍵,才能正確實現手機相應的功能。按鍵檢測程序的架構是否合理及嚴謹,對產品的穩定性具有至關重要的意義。通過檢測某手機按鍵功能,發現手機的按鍵檢測程序存在一定的缺陷。本文借助Sonix公司的SN8P2602B單片機,探討一種按鍵檢測程序的軟件架構,并給出了具體實現方案。
該手機采用傳統的機械式按鍵,而檢測的按鍵只限制在12個按鍵范圍內,如圖1所示。
在解鎖后,分別按下某一按鍵,持續2s,然后松手。
檢測結果:
① 1、2、3、4、5、6、7、8、9、0共10個按鍵,按下后經過很短時間(小于1s),均在屏幕上顯示出相應數字,3s后松手,數字不變。
② *、#共2個按鍵,在按下2s松手后,才在屏幕上顯示出相應的符號。

圖1
在解鎖后,按下某一按鍵,不松手,然后去按其他剩下的11個按鍵。
檢測結果:
① 以按下“1”鍵為例,如圖2所示。

圖2
② 以按下“2”鍵為例,如圖3所示。

圖3
對其他按鍵進行測試,有類似的結果,規律如圖4所示。
圖4中,對于同一列按鍵,先按住其中一個按鍵,會產生兩種情況:
① 再按同列中的其他任何一個按鍵,屏幕上顯示的都是先按住的那個按鍵;
② 再按不同列的其他任何一個按鍵,屏幕上顯示的都是正確的按鍵。
即:先按住“1”不放,再按同列的“4”、“7”、“*”,屏幕都顯示成“1”;若再按不同列的“2”、“3”、“5”、“6”、“8”、“9”、“0”、“#”,則屏幕均顯示正確的相應按鍵。
同時,還出現一個新的問題:先按住某一按鍵不放,然后再按其他11個按鍵,11個按鍵在按下后經過很短時間(小于1s),均在屏幕上顯示出數字或符號。“*”和“#”鍵都沒有像檢測項目1中那樣需要放手后才能顯示出來的情況。

圖4
(1)檢測項目1的結果說明
12個按鍵分兩類情況:一類是持續某短暫時間就認定按鍵有效,一類是需松手后才認定有效。軟件對兩類情況相應的按鍵進行檢測后判定按鍵有效的標準是不一致的。
(2)檢測項目2的結果說明
12個按鍵分兩類情況,軟件對兩類情況相應的按鍵進行檢測后判定是什么按鍵,標準是不一致的,同一列的按鍵存在互相干擾的問題。
從如下兩點作為切入口來解決以上出現的問題。
① 針對檢測結果1的解決思路:設置小時間段Tcheck,在Tcheck時間內軟件循環檢測按鍵得到相同按鍵代碼,即判定該按鍵按下有效,統一標準,便可解決判定有效的標準不一的問題。
② 針對檢測結果2的解決思路:設置成某按鍵按下后,若此按鍵不松開,其他按鍵則無效,便可解決按鍵間存在干擾的問題。
下面將借助SN8P2602B單片機,以16個按鍵為例,給出軟件解決方案,并給出具體的匯編語言源程序。SN8P2602B引腳圖如圖5所示。16個按鍵原理圖如圖6所示。圖中,P5所有口線均用軟件設置內部上拉電阻。
16個按鍵檢測方式:
① 把P5[0~3]設置為輸出口并輸出“0”信號,P5[4~7]設置為輸入口并置“1”,保存輸入信號;
② 把P5[4~7]設置為輸出口并輸出“0”信號,P5[0~3]設置為輸入口并置“1”,保存輸入信號;

圖5

圖6
③ 把兩次保持的輸入信號合并,就可以得到按鍵的唯一代碼,而無按鍵按下的代碼為11111111。
按鍵的唯一代碼如圖7所示。

圖7
按鍵檢測程序如圖8所示。

圖8
KEY_DOWN標志位:當代碼為無按鍵按下的代碼時,置0。在后續程序中,需要判斷是否為有效代碼,或是多個按鍵同時按下產生的代碼,或是受外界電磁干擾信號影響而產生的代碼。
KEY_STILL_PRESS標志位:按鍵仍然按下,未松開標志位,松開則置0。不論是有效代碼、多個按鍵同時按下的代碼,還是干擾信號產生的代碼,若不松開或不結束,都認為是未松手,置1。
KEY_TIME_CHECK標志位:設置小時間段Tcheck為50ms,置0代表時間未到,置1代表時間到。若計時中途按鍵松開,則重新計時。產生代碼經過50ms后,便開始比對是否為有效代碼。
軟件代碼如下:



按鍵檢測程序的邏輯性及嚴謹性,對產品的穩定性具有至關重要的意義。本文借助Sonix公司的SN8P2602B單片機,針對某手機按鍵檢測程序缺陷提出了解決方案,并給出了相應的軟件架構和代碼。此按鍵檢測思路具有通用性,可以移植到其他帶按鍵的電子產品中。
[1]Sonix Technology Co.,Ltd.SN8P2602B8-bit MCU DATASHEET.Version 1.2,2008-05.
[2]Sonix Technology Co.,Ltd.SONIX 8-bit MCU INSTRUCTION SET.Version 1.93,2003-02.
[3]張玉杰.松翰SN8P2700系列單片機原理及應用技術[M].北京航空航天大學出版社,2008.