📄 run.asm
字号:
weixuan EQU 8fffH
duanxuan EQU 9fffH
keytimest EQU 38H
keytimest2 EQU 50h
keytimest3 EQU 51h
keytimest4 EQU 52h
keys equ 4eH ;定义键值寄存器
LEDBUF EQU 40H ;53H到5aH存储区用来存放要显示的段码
keystate bit 00H ;定义键状态寄存位,有键时为1,无键时为0
fshst bit 03h
qing bit 04h
chang bit 05h
org 0000H
ljmp main
org 0030H
;主函数
main:
MOV sp,#70h
mov keys,#00h
mov keytimest,#00h
mov keytimest2,#00h
mov keytimest3,#00h
mov keytimest4,#00h
CLR keystate
clr fshst
clr qing
clr chang
MOV R0,#LEDBUF
MOV R7,#0aH
CLEARDISP:
MOV @R0,#00H
INC R0
DJNZ R7,CLEARDISP
begin:
lcall key
lcall dokey
mov a,keys
cjne a,#01h,xianshi
lcall runma
xianshi:
cjne a,#02h,xianshi1
lcall runma
xianshi1:
cjne a,#03h,xianshi2
lcall runma
xianshi2:
lcall display
ljmp begin
;定义查找表
TABLE1: DB 3FH,66H,3FH,6DH,5BH,3FH,66H,7DH ;04052046
TABLE2: DB 06H,6FH,7FH,6DH,06H,06H,06H,7DH ;19851116
TABLE3: DB 5BH,3FH,3FH,07H,3FH,66H,06H,6DH ;20070415
/*TABLE4:
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H */
;显示子程序
DISPLAY:
mov a,keys
cjne a,#00h,dong
mov r1,#00h
MOV R7,#8
MOV R2,#10000000B
LOOP:
MOV DPTR,#duanxuan
MOV A,#00H
MOVX @DPTR,A ;先清一次显示
mov dpl,r5
mov dph,r6
mov a,r1
movc a,@a+dptr
MOV DPTR,#duanxuan
MOVX @DPTR,A
MOV DPTR,#weixuan
MOV A,R2
MOVX @DPTR,A
CALL DELAY ;每一位数码管亮一段时间
MOV A,R2
RR A
MOV R2,A
INC R1
DJNZ R7,LOOP
mov r1,#00h
jmp disp_end
;动态显示
dong:
MOV R1,#LEDBUF
MOV R7,#8
MOV R2,#10000000B
LOOP1:
MOV DPTR,#duanxuan
MOV A,#00H
MOVX @DPTR,A ;先清一次显示
MOV A,@R1
MOV DPTR,#duanxuan
MOVX @DPTR,A
MOV DPTR,#weixuan
MOV A,R2
MOVX @DPTR,A
CALL DELAY ;每一位数码管亮一段时间
MOV A,R2
RR A
MOV R2,A
INC R1
DJNZ R7,LOOP1
RET
disp_end: RET
; 延时子程序
DELAY: MOV R3,#30
DEL1: MOV R4,#30
DEL2: DJNZ R4,DEL2
DJNZ R3,DEL1
RET
/*DELAY2: MOV R3,#90
DEL11: MOV R4,#90
DEL22: DJNZ R4,DEL22
DJNZ R3,DEL11
RET */
;键盘子程序:
KEY: lcall keytest
jnb keystate,over
ajmp next00
over: ajmp keyend
next00:
acall display
acall display
acall display ;消除抖动
lcall keytest
jnb keystate,over
MOV dptr,#duanxuan
MOV a,#00h
movx @dptr,a ;关显示
;读取键盘的值
MOV a,#01h
mov dptr,#weixuan
movx @dptr,a
movx a,@dptr
anl a,#0fh
key0: cjne a,#01h,key1
mov keys,#00h
setb keystate
ajmp keyend
key1: cjne a,#02h,key2
mov keys,#01h
setb keystate
ajmp keyend
key2: cjne a,#04h,key3
mov keys,#02h
setb keystate
ajmp keyend
key3: cjne a,#08h,keynext1
mov keys,#03h
setb keystate
ajmp keyend
keynext1:clr keystate
keyend: ret
;键盘测试程序,返回结果在keystate中
keytest:
mov a,#0ffh
MOV dptr,#weixuan
MOVX @dptr,a
MOVX a,@dptr
anl a,#0fh
jz keytest0
setb keystate
jmp keytest1
keytest0: clr keystate
keytest1: ret
;键盘处理子程序
dokey: jb keystate,key_all
ajmp keyend1
;判断键值
key_all:
mov a,keys
key_0: cjne a,#00h,key_1
ajmp key00
key_1: cjne a,#01h,key_2
ajmp key11
key_2: cjne a,#02h,key_3
ajmp key22
key_3: cjne a,#03h,keyend1
ajmp key33
;执行相应的动作
key00: lcall start
ajmp keyend1
key11: lcall run
ajmp keyend1
key22: lcall flash
ajmp keyend1
key33: lcall control
ajmp keyend1
keyend1: ret
;判断键盘是否弹起
keyup:
scan: lcall keytest
lcall display
jb keystate,scan
ret
;键盘响
xiang: clr p1.6
lcall delay
lcall delay
lcall delay
lcall delay
lcall delay
setb p1.6
ret
;初始化界面
start:
lcall keyup
lcall xiang
mov a,keytimest
add a,#01h
mov keytimest,a
cjne a,#01H,next0
mov dptr,#TABLE1
mov r5,dpl
mov r6,dph
jmp keyover
next0:
cjne a,#02H,next1
mov dptr,#TABLE2
mov r5,dpl
mov r6,dph
jmp keyover
next1:
cjne a,#03H,keyover
mov dptr,#TABLE3
mov r5,dpl
mov r6,dph
mov keytimest,#00h
keyover:ret
;跑马程序
run:
lcall keyup
lcall xiang
mov a,keytimest2
add a,#01h
mov keytimest2,a
cjne a,#04h,keyover2
mov keytimest2,#00h
keyover2:ret
;闪烁
flash: lcall keyup
lcall xiang
mov a,keytimest3
add a,#01h
mov keytimest3,a
cjne a,#09h,keyover3
mov keytimest3,#00h
keyover3:ret
;控制
control:
lcall keyup
lcall xiang
mov a,keytimest4
add a,#01h
mov keytimest4,a
cjne a,#03h,keyover22
mov keytimest4,#00h
keyover22:ret
;跑马方式选择
runma: mov a,keytimest2
cjne a,#01h,runma2
lcall shan1
jmp runmaend
runma2 :
cjne a,#02h,runma3
lcall shan2
jmp runmaend
runma3: cjne a,#03h,runma4
lcall shan3
jmp runmaend
runma4:
lcall shan4
runmaend: ret
;方式1
shan1:
mov a,keytimest3
cjne a,#01h,go0
lcall fsh
go0: jb qing,wo0
mov LEDBUF, #0fh
lcall display
jb fshst,wo0
lcall display
lcall display
lcall display
lcall display
wo0: jb chang,wo1
mov LEDBUF, #0
wo1: lcall clear
mov a,keytimest3
cjne a,#02h,go1
lcall fsh
go1: jb qing,wo2
mov LEDBUF+1,#39h
lcall display
jb fshst,wo2
lcall display
lcall display
lcall display
lcall display
wo2: jb chang,wo3
mov LEDBUF+1,#0
wo3: lcall clear
mov a,keytimest3
cjne a,#03h,go2
lcall fsh
go2: jb qing,wo4
mov LEDBUF+2,#0fh
lcall display
jb fshst,wo4
lcall display
lcall display
lcall display
lcall display
wo4: jb chang,wo5
mov LEDBUF+2,#0
wo5: lcall clear
mov a,keytimest3
cjne a,#04h,go3
lcall fsh
go3: jb qing,wo6
mov LEDBUF+3,#39h
lcall display
jb fshst,wo6
lcall display
lcall display
lcall display
lcall display
wo6: jb chang,wo7
mov LEDBUF+3,#0
wo7: lcall clear
mov a,keytimest3
cjne a,#05h,go4
lcall fsh
go4: jb qing,wo8
mov LEDBUF+4,#0fh
lcall display
jb fshst,wo8
lcall display
lcall display
lcall display
lcall display
wo8: jb chang,wo9
mov LEDBUF+4,#0
wo9: lcall clear
mov a,keytimest3
cjne a,#06h,go5
lcall fsh
go5: jb qing,wo00
mov LEDBUF+5,#39h
lcall display
jb fshst,wo00
lcall display
lcall display
lcall display
lcall display
wo00: jb chang,wo01
mov LEDBUF+5,#0
wo01: lcall clear
mov a,keytimest3
cjne a,#07h,go6
lcall fsh
go6: jb qing,wo02
mov LEDBUF+6,#0fh
lcall display
jb fshst,wo02
lcall display
lcall display
lcall display
lcall display
wo02: jb chang,wo03
mov LEDBUF+6,#0
wo03: lcall clear
mov a,keytimest3
cjne a,#08h,go7
lcall fsh
go7: jb qing,wo04
mov LEDBUF+7,#39h
lcall display
jb fshst,wo04
lcall display
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -