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

📄 键盘显示.asm

📁 一个非常经典的4*4键盘处理asm51程序源码
💻 ASM
字号:
;----------------------------------------------------------------------------
;主要功能:按键扫描,数码管动态显示,利用4511及74138的译码(只占用7个I\O口)
;节省了单片机的I\O口
;-----------------------------------------------------------------------------

TEMP     EQU 30H         ;七段数码管缓冲区,连续8个字节
TEMP_NUM EQU 38H         ;按键数据缓冲区,存储新输入的值或者上一次的键值
KEY_NO   EQU 39H         ;按键值
FKEY     EQU 20H.0       ;按键标志,若有按键为1
      ORG  0000H

      AJMP START
START:
      MOV SP,#60H        ;定义堆栈指针地址
      MOV A,#10
START1:
      MOV R0,#TEMP
      MOV R4,#8
INITIAL:
      MOV @R0,A
      INC R0
      DJNZ R4,INITIAL    ;对七段缓冲区消隐,全部赋值为10

;=============================扫描程序============================
SCAN:
      CLR FKEY
SCAN0:
      ACALL DISP          ;调用显示扫描子程序
      ACALL KEY_SCAN      ;调用键盘扫描子程序
SCAN1:
      JB FKEY,WAIT_OFF    ;若有按键就等待按键放开,无则继续扫描显示器和键盘
      AJMP SCAN
WAIT_OFF:
      ACALL DISP           ;再次调用DISP,按键按下时继续显示上次的值
      ACALL KEY_SCAN
      JB FKEY,WAIT_OFF
WAIT:
      MOV A,KEY_NO          ;按键松开后
NEXT:                       ;键值判断,分支跳转
      CJNE A,#0AH,NEXT0
      ACALL ML              ;左移
NEXT0:
      CJNE A,#0BH,NEXT1
      ACALL MR              ;右移
NEXT1:
      CJNE A,#0CH,NEXT2
      ACALL SHINE           ;闪烁
NEXT2:
      CJNE A,#0DH,NEXT3
      ACALL NORMOL          ;静止显示
NEXT3:
      CJNE A,#0EH,NEXT4
      ACALL CLEAR           ;清零
NEXT4:
      CJNE A,#0FH,NEXT5
      ACALL HIDE            ;消隐
NEXT5:
      CALL NUM_OUT          ;数字键直接输出
      AJMP SCAN

;*******************************显示扫描子程序****************************
DISP:
     MOV R2,#00H
     MOV R0,#TEMP
SCAN_LED:                ;数据输出至4511及74138端口,使数码管显示相应值
     MOV A,R2
     SWAP A
     MOV R3,A
     MOV A,@R0
     ADD A,R3
     MOV P2,A
     MOV R5,#5
     ACALL DELAY           ;延时1ms,清抖作用
     INC R2
     INC R0
     CJNE R2,#8,SCAN_LED  ;缓存区数据依次从低位开始输出
     MOV P2,#0FFH         ;消除余辉
     RET
;***************************************************************************
;&&&&&&&&&&&&&&&&&&&&&&&&===A、B控制键需调用的子程序====&&&&&&&&&&&&&&&&&&
CONTROL:
      ACALL DISP
      ACALL KEY_SCAN
      JB FKEY,L1             ;有键按下跳至L1处等待按键松开
      DJNZ 40H,CONTROL       ;连续交替扫描显示和键盘,可以提高按键的灵敏度
      RET                    ;无键按下继续循环
L1:
      ACALL KEY_SCAN
      JB FKEY,L1
L0:
      MOV A,KEY_NO
      CLR C
      SUBB A,#0AH
      JC L2                   ;键值小于10则继续循环,大于10跳回至WAIT处
      JMP WAIT
L2:   ACALL RESTART           ;低位输入新数字
      JMP CONTROL
      RET
;&&&&&&&&&&&&&&&&&&&&&&===&&&&&&&&&&&&&&&&&&&&&&&&&&&&&====&&&&&&&&&&&&&&&&
;---------------------------闪烁程序-----------------------------
SHINE:
      MOV 40H,#75
SH0:
      ACALL DISP
      ACALL KEY_SCAN
      JB FKEY,SH2          ;有键按下跳至SH2处等待按键松开
      DJNZ 40H,SH0         ;连续交替扫描显示和键盘75次,可以提高按键的灵敏度
      MOV R0,#250          ;连续扫描键盘250次来使显示熄灭,达到闪烁效果
SH1:
      ACALL KEY_SCAN
      JB FKEY,SH2
      DJNZ R0,SH1
      JMP SHINE
SH2:
      ACALL KEY_SCAN
      JB FKEY ,SH2
      ACALL COMPARE
      JMP SHINE
      RET
;---------------------------消隐程序-------------------------------
HIDE:
      MOV P2,#0FFH           ;P2口赋值OFFH让其消隐
      CALL KEY_SCAN
H1:
      MOV A,KEY_NO
      CJNE A,#0DH,H2
      AJMP WAIT_OFF
H2:
      CJNE A,#0EH,HIDE
      AJMP WAIT_OFF
      RET
;*************************键盘扫描子程序*********************************
KEY_SCAN:
     MOV R3,#0EFH     ;加载扫描输出初始信号11101111B
     MOV R4,#0
     MOV R1,#4
     CLR PSW.5
S1:
     MOV A,R3         ;循环扫描16个按键
     MOV P1,A
     MOV R5,#1
     ACALL DELAY      ;延时0.2ms
     MOV A,P1         ;读取P1口数据判断按键是否有效
     ANL A,#0FH
     MOV R2,#4
S2:
     JB ACC.0,N1      ;判断有无按键, 若为1则表示没按键按下
     MOV KEY_NO,R4
     SETB PSW.5
N1:
     INC R4
     RR A
     DJNZ R2,S2       ;对一行进行扫描
     MOV A,R3
     RL A             ;移至下一行扫描
     MOV R3,A
     DJNZ R1,S1
BACK:
     JNB PSW.5,NO_KEY
     SETB FKEY
     RET
NO_KEY:
     CLR FKEY
     RET
;*****************************************************************************
;-----------------------------左移程序-----------------------------
ML:
      MOV TEMP_NUM,TEMP+7
      MOV TEMP+7, TEMP+6
      MOV TEMP+6, TEMP+5
      MOV TEMP+5, TEMP+4
      MOV TEMP+4, TEMP+3
      MOV TEMP+3, TEMP+2
      MOV TEMP+2, TEMP+1
      MOV TEMP+1, TEMP
      MOV TEMP,TEMP_NUM
      MOV 40H,#110
      ACALL CONTROL
      JMP ML
      RET
;------------------------------右移程序------------------------------
MR:
     MOV TEMP_NUM,TEMP
     MOV TEMP,TEMP+1
     MOV TEMP+1,TEMP+2
     MOV TEMP+2,TEMP+3
     MOV TEMP+3,TEMP+4
     MOV TEMP+4,TEMP+5
     MOV TEMP+5,TEMP+6
     MOV TEMP+6,TEMP+7
     MOV TEMP+7,TEMP_NUM
     MOV 40H,#110
     ACALL CONTROL
     JMP MR
     RET
;------------------------------静止显示程序---------------------------
NORMOL:
      AJMP SCAN
      RET
;------------------------------清零程序-------------------------------
CLEAR:
      MOV A,#0
      AJMP START1
      RET
;------------------------------数字输出程序----------------------------
NUM_OUT:
      MOV A,KEY_NO
      MOV DPTR,#TABLE
      MOVC A,@A+DPTR
      MOV TEMP_NUM,A
      MOV TEMP+7, TEMP+6
      MOV TEMP+6, TEMP+5
      MOV TEMP+5, TEMP+4
      MOV TEMP+4, TEMP+3
      MOV TEMP+3, TEMP+2
      MOV TEMP+2, TEMP+1
      MOV TEMP+1, TEMP
      MOV TEMP,TEMP_NUM     ;显示自动左移
      RET
;--------------------------仅改变最低位数值子程序(供左右移调用)---------------
RESTART:
      MOV A,KEY_NO
    MOV DPTR,#TABLE
     MOVC A,@A+DPTR
     MOV TEMP,A
      RET
;---------------------------键值比较子程序(供闪烁调用)-------------------------
COMPARE:
      MOV A,KEY_NO
      CLR C
      SUBB A,#0AH
      JNC  COM1
      ACALL NUM_OUT
      RET
COM1: JMP WAIT
      RET
;###########################延时子程序程序#############################
DELAY:                    ;延时R5*0.2ms
      MOV R6,#1
DELAY0:
      MOV R7,#100
      DJNZ R7,$
      DJNZ R6,DELAY0
      DJNZ R5,DELAY
      RET
;##########################################################################
;%%%%%%%%%%%%%%%%%%%%%  表格  %%%%%%%%%%%%%%%%%%%%%%%%%
TABLE: DB 00H,01H,02H,03H,04H
       DB 05H,06H,07H,08H,09H
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -