📄 ss.asm
字号:
;--------------------------------------------
OUTBIT equ 0e101h ; 位控制口
CLK164 equ 0e102h ; 段控制口(接164时钟位)
DAT164 equ 0e102h ; 段控制口(接164数据位)
LEDBuf equ 60h ; 显示缓冲区首址
FLAG equ 00h
org 0000h
ljmp start
org 0023h
ljmp intr
LEDtab: ; 八段管显示码
db 3fh,71h,79h,5eh,00h,00h
db 06h,5bh,4fh,39h,00h,00h
db 66h,6dh,7dh,7ch,00h,00h
db 07h,7fh,6fh,77h,00h,00h
;------------------------------------------
start: mov dptr,#0e100h
mov a,#03h
movx @dptr,a
mov sp,#40h
mov LEDBuf,#06h ;初始化缓冲区
mov LEDBuf+1,#06h
mov LEDBuf+2,#00h
mov LEDBuf+3,#00h
mov LEDBuf+4,#06h
mov LEDBuf+5,#06h
mov flag,#0
mov tmod,#20h
mov tl1,#0f3h
mov th1,#0f3h
mov pcon,#00h
setb ea
setb tr1
mov scon,#50h
main: acall keyscan ;键盘扫描
mov LEDBuf,LEDBuf+1 ;发送的个位左移至十位
mov LEDBuf+1,a ;发送缓冲区的个位接收新数据,即发送数据
mov sbuf,a
t: jnb ti,t ;等待发送完毕
clr ti
setb es
acall DISP
ajmp main
;-------------------------------------
intr: ;接收中断子程序
clr ri
mov a,sbuf
mov LEDBuf+4,LEDBuf+5 ;左移
mov LEDBuf+5,a ;装入接收数据
reti
;------------------------------------------
;键盘扫描模块
keyscan:
acall KEY
jnz lk1
acall DISP
ajmp keyscan
lk1: acall DISP
acall DISP
acall KEY
jnz lk2
acall DISP
ajmp keyscan
lk2:
mov r4,#0feh ;扫描初值
mov r5,#00h ;扫描列号
lk3:
mov dptr,#0e101h
mov a,r4
movx @dptr,a
inc dptr
inc dptr
movx a,@dptr
jb acc.0,one
mov a,#0
ajmp keycode
one: jb acc.1,two
mov a,#6
ajmp keycode
two:
jb acc.2,thr
mov a,#12
ajmp keycode
thr:
jb acc.3,next
mov a,#18
keycode: add a,r5 ;得到键码
push acc ;入栈存储
waitrelease:
acall DISP
acall KEY
jnz waitrelease ;等待键释放
pop acc ;键释放后,出栈,寄存器ACC中为键码
mov dptr,#LEDtab
movc a,@a+dptr ;将键码转换为显示码
ajmp exit ;退出,键盘扫描程序结束
next: inc r5 ;下一列
mov a,r4
jnb acc.5,keyscan
rl a
mov r4,a
ajmp lk3
exit: ret
;------------------------
KEY: mov dptr,#0e101h ; 判断是否有键按下的子程序
mov a,#00h
movx @dptr,a
inc dptr
inc dptr
movx a,@dptr
cpl a
anl a,#0fh
ret
;-----------------------------------------------
;显示模块
DISP:
mov r0, #LEDBuf
mov r6, #6 ; 共6个八段管
mov r2, #00100000b ; 从左边开始显示
Loop:
mov dptr, #OUTBIT
mov a, #0
movx @dptr, a ; 关所有八段管
mov a, @r0
mov B, #8 ; 送164
DLP:
rlc a
mov r3, a
mov acc.0, c
mov dptr, #DAT164
anl a,#0fdh
movx @dptr, a
mov dptr, #CLK164
orl a,#02h
movx @dptr, a
anl a,#0fdh
movx @dptr, a
mov a, r3
djnz B, DLP
mov dptr, #OUTBIT
mov a, r2
movx @dptr, a ; 显示一位八段管
acall Delay ;延时1ms
mov a, r2 ; 显示下一位
rr a
mov r2, a
inc r0
djnz r6, Loop
ret
;---------------------------------
Delay: ; 延时子程序,延时1ms
mov r7, #0
do:
djnz r7, do
ret
end
;--------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -