150 likes | 248 Views
鍵盤輸入控制. 4×3 矩陣鍵盤之連接. 微控制器如何得知有按鍵被按. 中斷 (Interrupt) 方式: 當有按鍵被按時,有一外部硬體電路去偵測得知,並對微控制器產生硬體中斷信號 以鍵盤主動通知微控制器,平常無按鍵時,微控制器可處理其它部份之程式。 詢問 (Polling) 方式: 微控制器以軟體方式,定期去詢問外部鍵盤是否有按鍵被按。 以微控制器為主動,需一段時間即去詢問外部之鍵盤以得知其狀況,所以較耗微控制器之處理時間。. 軟體掃描方式. 4×3 矩陣鍵盤與微控制器連接圖. 鍵盤掃描之時序.
E N D
鍵盤輸入控制 • 4×3矩陣鍵盤之連接
微控制器如何得知有按鍵被按 • 中斷(Interrupt)方式: • 當有按鍵被按時,有一外部硬體電路去偵測得知,並對微控制器產生硬體中斷信號 • 以鍵盤主動通知微控制器,平常無按鍵時,微控制器可處理其它部份之程式。 • 詢問(Polling)方式: • 微控制器以軟體方式,定期去詢問外部鍵盤是否有按鍵被按。 • 以微控制器為主動,需一段時間即去詢問外部之鍵盤以得知其狀況,所以較耗微控制器之處理時間。
軟體掃描方式 • 4×3矩陣鍵盤與微控制器連接圖
鍵盤掃描之時序 Time4 1 1 1 0 掃描週期Time3 1 1 0 1 Time2 1 0 1 1 Time1 0 1 1 1 PS0 PS1 PS2 PS3 KeyIN[3..0] KeyIn0 KeyIn1 KeyIn2 KeyIn3
LAB4、 鍵盤輸入控制 0 0 0 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 1 0
鍵盤彈跳現象 • 一般按鍵按下與放開,會有3ms~10ms的交替不穩現象。 • 掃描移位時間設為1ms,一個掃描週期為4ms。 • 連續兩個掃描週期皆偵測到相同按鍵被按下 (8ms) • 連續兩個掃描週期皆偵測到按鍵被放開 (8ms) 3ms ~ 10ms 3ms ~ 10ms
範例5.6鍵盤輸入控制 • Key_OverOnePressedInColumn旗標 • 判斷同一行是否有多個按鍵被按下 • Yes=1;No=0 • Key_OnlyOnePressedCount變數 • 記錄一個掃描週期中,有幾個按鍵被按下 • 判斷是否只有一個按鍵被按下 • Key_OverOnePressedInColumn=0 • Key_OnlyOnePressedCount=1 P5-70
每1ms中斷一次 存放A與status 設定Timer0, 1ms中斷一次 設定旗標 回存A與status
沒有按鍵按下 掃描一週期 第一顆按鍵 第二顆按鍵 第三顆按鍵 第四顆按鍵 掃描線儲存 有多個 按鍵按下 按鍵內容儲存 一顆按鍵按下 Count加1 是否有多個 按鍵按下
Page 5-78 Key_scan PROC SNZ Key_HaveShiftScan RET CLR Key_HaveShiftScan MOV a,4 SUB a,Key_ScanColumn SNZ Z JMP Seg_ShowValue CLR Key_ScanColumn CALL Confirm CLR Key_OverOnePressedInColumn CLR Key_OnlyOnePressedCount Seg_ShowValue: SET DataBus SET Segment_SEL CLR Segment_SEL ;Segment latch data FFH MOV a,Key_ScanColumn MOV Key_ScanColumn_temp,a RL Key_ScanColumn_temp RL Key_ScanColumn_temp RL Key_ScanColumn_temp RLA Key_ScanColumn_temp AND a,01110000B MOV PD,a ;scan data out CALL Segment
Page 5-79 SZ Key_OverOnePressedInColumn RET MOV a,PD AND a,00001111B MOV Key_DataBuffer,a ;KeyIn data in MOV a,00001111B SUB a,Key_DataBuffer SZ Z RET MOV a,00000111B SUB a,Key_DataBuffer SZ Z JMP OnlyOneInColumn MOV a,00001011B SUB a,Key_DataBuffer SZ Z JMP OnlyOneInColumn MOV a,00001101B SUB a,Key_DataBuffer SZ Z JMP OnlyOneInColumn MOV a,00001110B SUB a,Key_DataBuffer SZ Z JMP OnlyOneInColumn ;determine only one key is pressed in a column SET Key_OverOnePressedInColumn RET 0 1 1 1
同一行是否有 多個按鍵按下 按鍵對應的值 是否只有一 個按鍵按下 第一行掃描線 第二行掃描線 第三行掃描線 第四行掃描線 連續二個掃描 週期,為同一顆 按鍵
0 4 8 C 1 5 9 D 2 6 A E 3 7 B F
Page 5-82 lookup table ;=================================================== ORG LASTPAGE Segment_table: ; pgfedcba DC 11000000B ;0 DC 11111001B ;1 DC 10100100B ;2 DC 10110000B ;3 DC 10011001B ;4 DC 10010010B ;5 DC 10000010B ;6 DC 11111000B ;7 DC 10000000B ;8 DC 10010000B ;9 DC 10001000B ;A DC 10000011B ;b DC 10100111B ;c DC 10100001B ;d DC 10000110B ;E DC 10001110B ;F Based address 0 Based address 4 Based address 8 Based address c