📄 zh1.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 PORTC =$15
.equ DDRC =$14
.equ PINC =$13
.equ PORTD =$12
.equ DDRD =$11
.equ PIND =$10
.def ZL =r30
.def ZH =r31
.org $0000
rjmp main
.org $006
rjmp t1_cp
tab1: .db $3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f,$77,$7c,$39,$5e,$79,$71
tab2: .db $05,$eb,$05,$99,$04,$fc,$04,$70,$03,$f4,$03,$bc,$03,$54,$02,$f7,$02,$cc,$02,$7e,$02,$38,$01,$fa,$01,$df,$01,$aa,$01,$7b,$01,$66
main: ldi r16,$02 ;栈指针置初值
out sph,r16
ldi r16,$5f
out spl,r16
ldi r16,$ff ;PA口定义为输出口
out DDRA,r16
ldi r16,$01 ;PD0口定义为输出口
out DDRD,r16
ldi r16,$10 ;允许T1比较匹配A中断
out TIMSK,r16
clr r16 ;置TCNT1初值为0
out TCNT1L,r16
out TCNT1H,r16
ldi r16,$0a ;设置T/C1频率
out TCCR1B,r16
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 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
mov r20,r17
lsl r20
ldi ZH,high(tab2*2)
ldi ZL,low(tab2*2)
add ZL,r20
lpm
out OCR1AH,r0
inc ZL
lpm
out OCR1AL,r0
sei
rcall cqb
w0: ldi r16,$f0 ;等待按键释放
out PORTC,r16
w1: in r16,PINC
andi r16,$ff
cpi r16,$f0
brne w2
cli
ldi r16,$00
out PORTA,r16
rjmp lscan
w2: rjmp w0
cqb: ldi ZH,high(tab1*2) ;7段码的首址给Z
ldi ZL,low(tab1*2)
add ZL,r17 ;首地址+偏移量
lpm ;查表送B口输出
out PORTA,r0
ret
t1_cp: in r1,sreg ;保护标志
in r2,PORTD ;PD口取反
com r2
out PORTD,r2
out sreg,r1 ;标志恢复
reti
t1ms: ldi r24,6 ;延时子程序
push r24
del2: push r24
del3: dec r24
brne del3
pop r24
dec r24
brne del2
pop r24
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -