⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 key2.asm

📁 采用中断方式的4*4扫描矩阵式键盘
💻 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 + -