📄 键盘显示.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 + -