📄 key_12.asm
字号:
ORG 0000H
AJMP Main
ORG 000BH
AJMP CountInterruput
Main: MOV SP,#60H
MOV R4,#0
MOV R5,#0 ;R5指示按键的值的键码
MOV 40H,#0FFH ;传递按键的值
MOV R0,#30H ;R0指向显存的首址 30h(30H(个位)、31H(十位)、32H(百位)、33H(千位)显示箱计数器的16进制值)
CALL T0init
LOOP: CALL Disp
CALL DELAY
AJMP LOOP
T0init: ;T0的初始化子函数
SETB ET0 ;为T0中断作准备
MOV A,TMOD ;T0模式方式二,计数,不需外部控制T1模式不变
ANL A,#0F0H
ORL A,#01H
MOV TMOD,A
MOV TL0,#LOW(-50000)
MOV TH0,#HIGH(-5000)
SETB TR0 ;计数器启动(即开始工作)
SETB EA ;中断打开
RET
CountInterruput:
PUSH PSW
PUSH ACC
CLR TF0
CLR TR0
MOV TL0,#LOW(-50000)
MOV TH0,#HIGH(-5000)
CALL KEY
SETB TR0
POP ACC ;中断返回恢复现场
POP PSW
RETI
DispMove: CJNE R5,#12,Move
AJMP MoverOver
Move: MOV 37H,36H
MOV 36H,35H
MOV 35H,34H
MOV 34H,33H
MOV 33H,32H
MOV 32H,31H
MOV 31H,30H
MOV 30H,R5
MoverOver: RET
KeyDriver:
MOV P3,#0F0H
MOV A,P3
ANL A,#0F0H
MOV R3,A
MOV P3,#0FH
MOV A,P3
ANL A,#0FH
ORL A,R3
RET
KEY: CALL KeyDriver
CJNE A,#0FFH,KeyPressY
AJMP KeyOver
KeyPressY: MOV 40H,A ;战时存A
WaitKeyOpen: CALL KeyDriver
CJNE A,#0FFH, WaitKeyOpen
MOV DPTR,#TAB3
MOV R5,#0
CountinueFind: MOV A,R5
MOVC A,@A+DPTR
CJNE A,40H,CountinueSearch
CALL DispMove
AJMP KeyOver
CountinueSearch: INC R5
CJNE R5,#12,CountinueFind
KeyOver: RET
DELAY: MOV R7,#0DH
DE10: MOV R6,#0FFH
DE01: DJNZ R6,DE01
DJNZ R7,DE10
RET
Disp: MOV DPTR,#TAB1 ;DPTR指向7段数码显示的译码表(亦即段选)
MOV A,@R0 ;R0为显示缓存单元指针,初始值指向个位的30H,个位显示后 加1指向下一位,当R1超过33H后又回到30H
MOVC A,@A+DPTR
MOV P0,#0
MOV P0,A
MOV DPTR,#TAB2 ;DPTR指向位选表
MOV A,R0 ;A中的值为当前要显示的缓存地址,由于缓存地址从30H开始,如果A减去30H,就得到当前正显示的是个、十、百、千中的哪一位
CLR CY ;因为带借位减 CY清0
SUBB A,#30H
MOVC A,@A+DPTR
MOV P2,A
INC R0 ;显示下一位
CJNE R0,#38H,Over
MOV R0,#30H
Over: RET
TAB1: DB 3FH,06H,5BH,4FH,66H ,6DH ,7DH ,07H ,7FH ,6FH ,77H,7CH,39H,5EH,79H,71H
TAB2: DB 7FH,0BFH,0DFH,0EFH,0F7H,0FBH,0FDH,0FEH
TAB3: DB 7DH,0EBH,0EDH,0EEH,0DBH,0DDH,0DEH,0BBH,0BDH,0BEH,7BH,7EH ;0,1,2,3,4,5,6,7,8,9,*,#
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -