📄 key2.asm
字号:
KEY EQU 30H ;定义存储器
LED_0 EQU 31H
LED_1 EQU 32H
ORG 0000H ;复位地址
LJMP stat ;转初始化
ORG 0003H ;中断入口地址
LJMP PINT0 ;转中断服务程序
ORG 0100H ;初始化程序首地址
stat: MOV SP,#60H ;置堆栈指针
SETB IT0 ;置为边沿触发方式
MOV IP,#00000001B ;置为高优先级中断
SETB EX0 ;外边中断0中断
SETB EA ;CPU开中断
loop: MOV P1,#00001111B ;P1口初始态(高4位输入态1、低4位输出0)、与硬件电路配合、任意键动作将引起INT0中断。
mov a,KEY ;中断二进制键值送A
lcall bcd ;调用2--10转换子程序
LCALL DISP ;显示子程序
SJMP loop ;跳回MAIN 等待按键按下
;中断服务程序(键读取、识别)
;键读取
PINT0: PUSH ACC ;现场保护
PUSH PSW
MOV A,P1 ;读行线(P1.0~P1.3)数据
CPL A ;数据取反,“1”效
ANL A, #0FH ;屏蔽列线,保留行线数据
MOV R2,A ;存行线(P1.0~P1.3)数据(R2低4位)
MOV P1,#11110000B ;行线置低电平,列线置输入态
MOV A,P1 ;读列线(P1.4~P1.7)数据
CPL A ;数据取反,“1”有效
ANL A,#0F0H ;屏蔽行线,保留列线数据(A中高4位)
;识别列、行
MOV R1,#03H ;取列线编号初值
MOV R3,#03H ;置循环数
CLR C ;
PINT01:RLC A ;依次左移入C中
JC PINT02 ;C=1,该列有键按下,(列线编号存R1)
DEC R1 ;C=0,无键按下,修正列编号
DJNZ R3,PINT01 ;判循环结束否?未结束继续寻找有键按下列线
PINT02:MOV A,R2 ;取行线数据(低4位)
MOV R2,#00H ;置行线编号初值
MOV R3,#03H ;置循环数
PINT03:RRC A ;依次右移入C中
JC PINT04 ;C=1,该行有键按下,(行线编号存R2)
INC R2 ;C=0,无键按下,修正行线编号
DJNZ R3,PINT03 ;判循环结束否?未结束继续寻找有键按下行线
;键值计算(结果2进制)
PINT04:MOV A,R2 ;取行线编号
CLR C ;
RLC A ;行编号×2
RLC A ;行编号×4
ADD A,R1 ;行编号×4+列编号=按键编号
MOV KEY,A ;存按键编号
POP PSW ;现场恢复
POP ACC
RETI ;中断返回
;2--10转换子程序
bcd: MOV b,#10 ;)
DIV AB ;(A)=十位数,(B)=个位
MOV LED_1,a
mov LED_0,b
RET
;显示子程序
DISP: mov dptr,#TABLE ;
MOV A,LED_0
MOVC A,@A+DPTR
CLR P2.3 ;开个位
MOV P0,A
LCALL DELAY
SETB P2.3 ;关个位
MOV A,LED_1
MOVC A,@A+DPTR
CLR P2.2 ;开十位
MOV P0,A
LCALL DELAY
SETB P2.2 ;关十位
RET
TABLE: DB 3FH,06H,5BH,4FH,66H
DB 6DH,7DH,07H,7FH,6FH
;延时子程序
DELAY: MOV R6,#10 ;
D1: MOV R7,#250
DJNZ R7,$
DJNZ R6,D1
RET
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -