📄 zh5.asm
字号:
.device AT90S8535
.equ sph =$3E
.equ spl =$3D
.equ TIMSK =$39
.equ OCR1AH =$2B
.equ OCR1AL =$2A
.equ TCCR1B =$2E
.equ SREG =$3F
.equ TCNT1H =$2D
.equ TCNT1L =$2C
.equ PORTA =$1B
.equ DDRA =$1A
.equ PINA =$19
.equ PORTB =$18
.equ DDRB =$17
.equ PINB =$16
.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 main
.org $006
rjmp t1_cp
main: ldi r16,$02 ;栈指针置初值
out sph,r16
ldi r16,$5f
out spl,r16
ldi r19,$00 ;清计数寄存器
ldi r21,$00 ;清数码管显示数据寄存器
ldi r22,$00
ldi r23,$00
ldi r25,$00
ldi r26,$00
ldi r27,$00
ldi r28,$00
ldi r29,$00
ldi r16,$ff ;PD、PB口定义为输出口
out DDRD,r16
out DDRB,r16
ldi r16,$01 ;PA0口定义为输出口
out DDRA,r16
ldi r16,$10 ;允许T1比较匹配A中断
out TIMSK,r16
clr r16 ;置TCNT1初值为0
out TCNT1L,r16
out TCNT1H,r16
ldi r16,$05 ;OCRLA置$5eb,即产生频率为330Hz的方波信号
out OCR1AH,r16
ldi r16,$eb
out OCR1AL,r16
ldi r16,$0a ;T/C1对主频1分频定时
out TCCR1B,r16
a0: rcall disp
;**********************************************************
;按键扫描
lscan: 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 a0
rcall t1ms
cpi r16,$f8
brne a0
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 a0
ldi r18,$03
;**********************************************************
;统计按键次数
calcu: inc r19
cpi r19,$09
brne k1 ;如果按键9次,发声提示
sei
;**********************************************************
;等待按键抬起
w0: ldi r16,$f0
out PORTC,r16
w1: in r16,PINC
andi r16,$ff
cpi r16,$f0
brne w2
cli
rjmp main
w2: rjmp w0
;**********************************************************
;第1次按键,清除已显示的0,显示按下的数字
k1: cpi r19,$01
brne k2
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
mov r21,r0
disp1: rcall disp
w01: ldi r16,$f0 ;等待按键抬起
out PORTC,r16
w11: in r16,PINC
andi r16,$ff
cpi r16,$f0
brne w21
rjmp a0
w21: rjmp disp1
;**********************************************************
;第2到8次按键,移位显示按下的数字
k2: cpi r17,$00 ;计算键号
brne calc1
ldi r17,$00
rjmp cb2
calc1: cpi r17,$01
brne calc2
ldi r17,$04
rjmp cb2
calc2: cpi r17,$02
brne calc3
ldi r17,$08
rjmp cb2
calc3: ldi r17,$0C
cb2: add r17,r18
rcall cqb
rcall shift
disp2: rcall disp
w02: ldi r16,$f0 ;等待按键抬起
out PORTC,r16
w12: in r16,PINC
andi r16,$ff
cpi r16,$f0
brne w22
rjmp a0
w22: rjmp disp2
;**********************************************************
;定时器中断服务程序,驱动扬声器发声
t1_cp: in r1,sreg ;保护标志
in r2,PORTA ;PC口取反
com r2
out PORTA,r2
out sreg,r1 ;标志恢复
reti
;**********************************************************
;段码移位子程序
shift: mov r29,r28
mov r28,r27
mov r27,r26
mov r26,r25
mov r25,r23
mov r23,r22
mov r22,r21
mov r21,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
;**********************************************************
;查7段码
cqb: ldi ZH,high(tab1*2) ;7段码的首址给Z
ldi ZL,low(tab1*2)
add ZL,r17 ;首地址+偏移量
lpm ;查表送B口输出
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 $3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f,$77,$7c,$39,$5e,$79,$71
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -