资源描述
键盘扫描
图a 4*4键盘 图b 4*3键盘
扫描步骤:
1. P2.3=0行扫描初值;
2. P2左移检测列;
3. P2右移扫描行;
4. 计数指针到表中取码(读入键盘值由表中的数据一一对应)。
;********************** 键盘扫描子程序 SCANKEY **********
; 4*4键盘扫描子程序
; 行接P2.0-P2.3,列接P2.4-P2.7
; 调用该子程序扫描一遍键盘
; 键盘如有按键,则标志位FLAG_KEY=1
; 输入键盘码放入键盘存储器KEYBUFF
; 面板上键盘为 1 2 3 C
; 4 5 6 D
7 8 9 E
; A 0 B F
;***************************************
SCANKEY:
MOV R3,#0F7H; 扫描初值(P2.3=0)
MOV R2,#00H; R2为取键盘码指针
L2: MOV A,R3; 开始扫描
MOV P2,A; 扫描值输出至P2口
MOV A,P2; 读入P2值,判断是否有键按下
MOV R4,A; 存入P2值,以判断是否放开按键
SETB C; 后用带循环移位
MOV R5,#04H; 先扫描4列(如为4*3键盘此处MOV R5,#03H)
L3: RLC A; 先从P2.3相接这一行P2.4-P2.7哪个键按下了
JNC KEYIN ; C=0则有键按下,跳至KEYIN
INC R2; C=1表明没有键按下,取码指针加1
DJNZ R5,L3; 3列扫描完毕?
MOV A,R3; 扫描值载入
SETB C
RRC A; 扫描下一行
MOV R3,A; 存回扫描寄存器
JC L2; 4行扫完?没有则回L2继续扫描
RET; 一遍扫描完返回
;-------------------------------------------------
KEYIN:
MOV R7,#60; 30MS消抖动(晶振12MHZ)
D2: MOV R6,#248
DJNZ R6,$
DJNZ R7,D2
D3: MOV A,P2; 读入P2值,判断换键是否松开
XRL A,R4; 与上次值XX比较
JZ D3; ACC=0表示未放
MOV A,R2 ; 按钮已松开,取码指针载入
MOV DPTR,#KEYSCAN_TAB
MOVC A,@A+DPTR
SETB FLAG_KEY; 键盘扫描一次有输入标志位置位
MOV KEYBUFF, A ;键盘码放入键盘存储器KEYBUFF
RET
;===========================================
; 键盘扫描码
KEYSCAN_TAB:
DB 01H,02H,03H,0CH
DB 04H,05H,06H,0DH
DB 07H,08H,09H,0DH
DB 0AH,00H,0BH,0FH
;-----------------------------------
;***************键盘扫描结束****************************
;********************** 键盘扫描子程序 SCANKEY **********
; 4*3键盘扫描子程序
; 行接P2.0-P2.3,列接P2.4-P2.6
; 调用该子程序扫描一遍键盘
; 键盘如有按键,则标志位FLAG_KEY=1
; 输入键盘码放入键盘存储器KEYBUFF
; 面板上键盘为 1 2 3 4
; 5 6 7 8
; 9 0 A B
;***************************************
SCANKEY:
MOV R3,#0F7H; 扫描初值(P2.3=0)
MOV R2,#00H; R2为取键盘码指针
L2: MOV A,R3; 开始扫描
MOV P2,A; 扫描值输出至P2口
MOV A,P2; 读入P2值,判断是否有键按下
MOV R4,A; 存入P2值,以判断是否放开按键
SETB C
MOV R5,#03H; 先扫描3列
RLC A ; 由于P2.7没有接,故先左移一位,让P2.6位进入Cy
L3: RLC A; 先从P2.3相接这一行P2.4-P2.6哪个键按下了
JNC KEYIN ; C=0则有键按下,跳至KEYIN
INC R2; C=1表明没有键按下,取码指针加1
DJNZ R5,L3; 3列扫描完毕?
MOV A,R3; 扫描值载入
SETB C
RRC A; 扫描下一行
MOV R3,A; 存回扫描寄存器
JC L2; 4行扫完?没有则回L2继续扫描
RET; 一遍扫描完返回
;-------------------------------------------------
KEYIN:
MOV R7,#60; 30MS消抖动(晶振12MHZ)
D2: MOV R6,#248
DJNZ R6,$
DJNZ R7,D2
D3: MOV A,P2; 读入P2值,判断换键是否松开
XRL A,R4; 与上次值XX比较
JZ D3; ACC=0表示未放
MOV A,R2 ; 按钮已松开,取码指针载入
MOV DPTR,#KEYSCAN_TAB
MOVC A,@A+DPTR
SETB FLAG_KEY; 键盘扫描一次有输入标志位置位
MOV KEYBUFF, A ;键盘码放入键盘存储器KEYBUFF
RET
;===========================================
; 键盘扫描码
KEYSCAN_TAB:
DB 04H,08H,0BH ;A,B代表*,#
DB 03H,07H,0AH
DB 02H,06H,00H
DB 01H,05H,09H
;-----------------------------------
;***************键盘扫描结束****************************
展开阅读全文