📄 zh6.asm
字号:
.device AT90S8535
.equ sph =$3E
.equ spl =$3D
.equ PORTC =$15
.equ DDRC =$14
.equ PINC =$13
.equ PORTD =$12
.equ DDRD =$11
.equ PIND =$10
.def ZH =r31
.def ZL =r30
.org $0000
rjmp start
start: ldi r16,$02 ;栈指针置初值
out sph,r16
ldi r16,$5f
out spl,r16
ldi r16,$ff
out DDRD,r16 ;PD口定义为输出口
ldi r19,$00 ;清显示数据寄存器寄存器
ldi r20,$00
ldi r21,$00
ldi r22,$00
ldi r23,$00
mloop: rcall disp ;调显示子程序
wait: rcall testk ;判断有无按键
cpi r16,$00
breq wait
rcall getkey ;读键
inc r25 ;按键个数
cpi r16,$3f ;判断是否功能键
breq e1
cpi r16,$06
breq e1
cpi r16,$5b
breq e1
cpi r16,$4f
breq e1
cpi r16,$66
breq e1
cpi r16,$6d
breq e1
cpi r16,$7d
breq e1
cpi r16,$07
breq e1
cpi r16,$7f
breq e1
cpi r16,$6f
breq e1
cpi r16,$00
breq e2
cpi r16,$01
breq e2
cpi r16,$02
breq e2
cpi r16,$04
breq e2
cpi r16,$05
breq e2
breq e3 ;判断是否清除键
e1: cpi r25,$01
brne n1
rjmp e11 ;为第一个数字
n1: cpi r25,$02
brne n2
rjmp e12 ;为第二个数字
n2: cpi r25,$03
brne n3
rjmp e13 ;为第三个数字
n3: rjmp e3 ;第四个数字转溢出
e11: mov r4,r16 ;输入值暂存R4
mov r19,r4 ;输入值送显示缓存
rjmp mloop ;等待再次输入
e12: mov r7,r16 ;个位数暂存R7
;**********************************************************
;测试有无按键按下子程序
testk: ldi r16,$f0
out DDRC,r16
out PORTC,r16
in r16,PINC
andi r16,$ff
ret
;**********************************************************
;读键子程序
getkey: ldi r16,$f0
out DDRC,r16
out PORTC,r16
l1: in r16,PINC
cpi r16,$f1
brne l2
rcall t1ms
in r16,PINC
cpi r16,$f1
brne l2
ldi r17,$00
rjmp rscan
l2: cpi r16,$f2
brne l3
rcall t1ms
cpi r16,$f2
brne l3
ldi r17,$01
rjmp rscan
l3: cpi r16,$f4
brne l4
rcall t1ms
cpi r16,$f4
brne l4
ldi r17,$02
rjmp rscan
l4: cpi r16,$f8
brne lscan
rcall t1ms
cpi r16,$f8
brne lscan
ldi r17,$03
rscan: ldi r16,$0f
out DDRC,r16
out PORTC,r16
c1: in r16,PINC
cpi r16,$e0
brne c2
ldi r18,$00
rjmp calcu
c2: cpi r16,$d0
brne c3
ldi r18,$01
rjmp calcu
c3: cpi r16,$b0
brne c4
ldi r18,$02
rjmp calcu
c4: cpi r16,$70
brne lscan
ldi r18,$03
calcu: cpi r17,$00 ;计算键号
brne calcu1
ldi r17,$00
rjmp cb
calcu1: cpi r17,$01
brne calcu2
ldi r17,$04
rjmp cb
calcu2: cpi r17,$02
brne calcu3
ldi r17,$08
rjmp cb
calcu3: ldi r17,$0C
cb: add r17,r18
rcall cqb
ret
;**********************************************************
;查表子程序
cqb: ldi ZH,high(tab1*2) ;7段码的首址给Z
ldi ZL,low(tab1*2)
add ZL,r17 ;首地址+偏移量
lpm ;查表送B口输出
mov r16,r0
ret
;**********************************************************
;显示控制子程序
disp: ldi r16,$fe ;送个位位线
out PORTD,r16
out PORTB,r21 ;查7段码,送B口输出
rcall t1ms ;延时1ms
ldi r16,$fd ;送十位位线
out PORTD,r16
out PORTB,r22 ;查7段码,送B口输出
rcall t1ms ;延时1ms
ldi r16,$fb ;送百位位线
out PORTD,r16
out PORTB,r23
rcall t1ms
ldi r16,$f7 ;送千位位线
out PORTD,r16
out PORTB,r25 ;查7段码,送B口输出
rcall t1ms ;延时1ms
ldi r16,$ef ;送万位位线
out PORTD,r16
out PORTB,r26 ;查7段码,送B口输出
rcall t1ms ;延时1ms
ldi r16,$df ;送十万位位线
out PORTD,r16
out PORTB,r27
rcall t1ms
ldi r16,$bf ;送百万位位线
out PORTD,r16
out PORTB,r28 ;查7段码,送B口输出
rcall t1ms ;延时1ms
ldi r16,$7f ;送千万位位线
out PORTD,r16
out PORTB,r29 ;查7段码,送B口输出
rcall t1ms ;延时1ms
ret
;**********************************************************
;延时
t1ms: ldi r24,71 ;延时1ms子程序
push r24
del2: push r24
del3: dec r24
brne del3
pop r24
dec r24
brne del2
pop r24
ret
;**********************************************************
tab1: .db $07,$7f,$6f,$00,$66,$6d,$7d,$01,$06,$5b,$4f,$02,$03,$3f,$04,$05
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -