📄 key.asm
字号:
org 0000h
ajmp start
org 0003h
reti
org 000bh
reti
org 0013h
reti
org 001bh
reti
org 0023h
reti
org 0030h
start: CLR p3.5
MAIN:
MOV SP,#70H
nop
;mov 40h,#50h
ss: nop
aCALL p1_off
NOP
aCALL DELAY
S2: NOP
NOP
acall KEY
;aCALL KEY1
nop
;mov 30h,a
ACALL DISP
nop
AJMP S2
DELAY:MOV R7,#0aH; time delay
TM: MOV R6,#0FFH
TM6: DJNZ R6,TM6
DJNZ R7,TM
NOP
NOP
RET
;*************************************************************************************
;键盘扫描
KEY: CLR P3.5
MOV P1,#0F0H ;令所有行为低电平
MOV R7,#0FFH ;设置计数常数
KEY1: DJNZ R7,KEY1 ;延时
MOV A,P1 ;读取P1口的列值
CPL A ;求反后,有高电平就有键按下
ANL A,#0F0H ;判别有键值按下吗?
JZ EKEY ;无键按下时退出
LCALL DELAY ;延时20 ms去抖动
SKEY:MOV A,#00 ;下面进行行扫描,1行1行扫
MOV R0,A ;R0作为行计数器,开始为0
MOV R1,A ;R1作为列计数器,开始为0
MOV R3,#0FEH ;R3为行扫描字暂存, 低4位为行扫描字(P1.0=0)
SKEY2:MOV A,R3
MOV P1,A ;输出行扫描字,高4位全1
NOP
NOP
NOP ;3个NOP操作使P1口输出稳定
MOV A,P1 ;读列值
MOV R1,A ;暂存列值
CPL A ;高电平则有键闭合
ANL A,#0F0H ;取列值
S123:JNZ SKEY3 ;有键按下转SKEY3,;无键按下时进行一行扫描
INC R0 ;行计数器加1
SETB C ;准备将行扫描左移1位,形成下一行扫描字,C=1保证输出行扫描字中高4位全为1,为列输入作准备, 低4位中只有1位为0
MOV A,R3 ;R3带进位C左移1位
RLC A
MOV R3,A ;形成下一行扫描字→R3
MOV A,R0
CJNE A,#04H,SKEY2 ;最后一行扫(4次)完了吗?
EKEY:RET
;列号译码
SKEY3:MOV A,R1
JNB ACC.4,SKEY5
JNB ACC.5,SKEY6
JNB ACC.6,SKEY7
JNB ACC.7,SKEY8
AJMP EKEY
SKEY5:MOV A,#00H
MOV R2,A ;存0列号
AJMP DKEY
SKEY6:MOV A,#01H
MOV R2,A ;存1列号
AJMP DKEY
SKEY7:MOV A,#02H
MOV R2,A ;存2列号
AJMP DKEY
SKEY8:MOV A,#03H
MOV R2,A ;存3列号
AJMP DKEY
;键位置译码
DKEY: MOV A,R0 ;取行号
ACALL DECODE
AJMP EKEY
;键值(键号)译码
DECODE:MOV A,R0 ;取行号送A
MOV B,#04H ;每一行按键个数
MUL AB ;行号×按键数
ADD A,R2 ;行号×按键数+列号=键值(号),在A中
MOV 30H,A
RET
;******************************************************************************************
;显示子程序
led_asc:
db 11111100B;0
db 01100000B;1
db 11011010B;2
db 11110010B;3
db 01100110B;4
db 10110110B;5
db 10111110B;6
db 11100000B;7
db 11111110B;8
db 11110110B;9
DB 11101110B;a=>A
DB 00111110B;B=>B
DB 10011100B;C=>C
DB 01111010B;D=>D
DB 10011110B;E=>E
DB 10001110B;F=>F
DB 01101110B;H=>10H
DB 00011100B;L=>11H
DB 11101100B;N=>12H
db 00101010b;n=>13h
db 11111100b;O=>14h
dB 00111010B;o=>15H
DB 11001110B;P=>16H
DB 11100110B;Q=>17H
DB 00001010B;r=>18H
DB 10110110B;S=>19H
DB 01111100B;U=>1AH
DB 00111000B;u=>1BH
DB 00000000B;BLACK=>1CH
DB 11111111B;8.=>1DH
db 00000010b;-=>1Eh
db 00011110b;t=>1Fh
db 11111101B;0.=>20h
db 01100001B;1.
db 11011011B;2.
db 11110011B;3.
db 01100111B;4.
db 10110111B;5.
db 10111111B;6.
db 11100001B;7.
db 11111111B;8.
db 11110111B;9.=>29h
DB 10000000B;;;;; RGY ,R=1 >2AH a= ren, b=green, c=yellow
DB 01000000B; G=1 ,>2BH
DB 10100000B;;;;; RGY ,RY=1> 2CH
DB 01100000B; GR=1, >2DH
db 00000000b;y=>2Eh ;NO DIS
;********************
p1_off: mov a,#0FFh
mov p1,a
ret
sbuf_out: mov sbuf,a
nop
nop
nop
nop
ret
;**********************
DISP:
setb p3.5;开显示
mov a,#0
call p1_off
call sbuf_out
mov dptr,#led_asc
mov r5,#11011111b;
led_bit:
mov a,30h
movc a,@a+dptr
call sbuf_out
mov a,r5
mov p1,a
;***************************
mov a,#64h; old 020h
ler1:
dec a
jnz ler1
ret
;*********************************************************************************
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -