本次设计是利用单片机技术,采用利用键盘产生中断的思想,利用中断查询的方法,用汇编语言设计了一个4×4的键盘模块,键盘有值0--F时产生中断,用数码管显示相应的按键值。
汇编程序如下:
;*********************************************************
; 0 1 2 3----P1^0
; 4 5 6 7----P1^1 输
; 8 9 A B----P1^2 入
; C D E F----P1^3
; | | | |
; P1^4 P1^5 P1^6 P1^7 输出
;*********************************************************
ORG 0000H
LJMP MAIN
ORG 0003H
AJMP INT
ORG 0030H
MAIN: MOV P0,#0FFH; 程序启动时灯灭
MOV P1,#0F0H
SETB TCON.0; 外部中断为下降沿触发
MOV IE,#81H; 外部中断开中断
SJMP $
INT: CLR EA ;进入中断服务程序
PUSH PSW
LCALL DELAY
LCALL KS
JNZ SAOMIAO
LJMP INT0R
SAOMIAO:MOV DPTR,#TAB;
ACALL K1; 调用键盘扫描程序
MOVC A,@A+DPTR; 查表后将值送入累加器
MOV P0,A; 在P0口显示键盘值
K1: MOV R2,#0EFH; 将扫描值送入 R2暂存
MOV R4,#00H; R4用于存放列值,并将00H暂存
K3: MOV P1,R2;
L6: JB P1^0,L1; P1^0等于1跳转到L1
MOV A,#00H; 将{dy}行的行值00H送入ACC
AJMP LK; 跳转到键值处理程序
L1: JB P1^1,L2; P1.1等于1跳转到L2
MOV A,#04H; 将第二行的行值送入ACC
AJMP LK; 跳转到键值理程序进行键值处理
L2: JB P1^2,L3; P1.2等于1跳转到L3
MOV A,#08H; 将第三行的行值送入ACC
AJMP LK; 跳转到键值处理程序
L3: JB P1^3,NEXT ; P1.3等于1跳转到NEXT处
MOV A,#0cH; 将第四行的行值送入ACC
LK: ADD A,R4; 行值与列值相加后的键值送入A
PUSH ACC; 将A中的值送入堆栈暂存
K4: LCALL DELAY; 调用延时去抖动程序
LCALL KS; 调用按键检测程序
JNZ K4; 按键没有松开继续返回检测
POP ACC; 将堆栈的值送入ACC
RET
NEXT:
INC R4; 将列值加一
MOV A,R2;
JNB ACC.7,INT0R; 未扫描出键值退出中断
RL A; 扫描未完成将A中的值右移一位进行下一列的扫描
MOV R2,A; 将ACC的值送入R2暂存
AJMP K3; 跳转到K3继续
KS: MOV P1,#0FH; 将P1口高四位置0低四位置1
MOV A,P1; 读P1口
XRL A,#0FH; 将A中的值与0FH相异或
RET
DELAY: ; 10ms延时去抖动子程序2*FA*2=10ms
MOV R5,#02H
L7: MOV R6,#0FAH
L8: DJNZ R6,L8
DJNZ R5,L7
RET
INT0R: POP PSW
MOV P1,#0F0H
SETB TCON.0; 外部中断为下降沿触发
MOV IE,#81H; 外部中断开中断
RETI
TAB: ; 采用共阳极LED显示器
DB 0C0H;0
DB 0F9H;1
DB 0A4H;2
DB 0B0H;3
DB 099H;4
DB 092H;5
DB 082H;6
DB 0F8H;7
DB 080H;8
DB 090H;9
DB 088H;A
DB 083H;b
DB 0C6H;C
DB 0A1H;d
DB 086H;E
DB 08EH;F
END
以下是硬件连接的电路图:
仿真图如下:
以上便是自己设计的4*4矩阵键盘的中断设计的服务程序,52系列的单片机的P1口作为键盘的扫描与输入口,P0作为数码显示的输出口,汇编程序的精华在扫描键盘值时,采用的是行值和列值相加的方式确定键值,键盘的程序设计应不断地提醒自己有消抖的过程,即程序的延时过程!