📄 sg16.asm
字号:
.device AT90S8535
.equ SREG =$3F
.equ sph =$3E
.equ spl =$3D
.equ ACSR =$08
.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 $000
rjmp reset
.org $010
rjmp ana_cp
reset: ldi r16,$02 ;栈指针置初值
out sph,r16
ldi r16,$5f
out spl,r16
ldi r16,$00 ;定义PB为输入口
out DDRB,r16
out PORTB,r16
ldi r16,$ff ;定义PD、PC为输出口
out DDRC,r16
out DDRD,r16
cbi ACSR,7
wt_e1: sbic ACSR,5 ;等待输入信号(AIN0)<(AIN1)
rjmp wt_e1
wel_1: sbis ACSR,5 ;等待输入信号(AIN0)>(AIN1)
rjmp wel_1
;说明:AIN0穿越AIN1时,模拟比较器输出(AC0)就改变一次,程序可检测此标志
wt_e2: sbi ACSR,0 ;选择模拟比较器中断模式为上升沿
sbi ACSR,1
sbi ACSR,4 ;清模拟比较器中断标志ACI
wel_2: sbis ACSR,4 ;等待模拟比较器中断标志变1
rjmp wel_2
;说明:模拟比较器中断标志(ACI)按ACIS1和ACIS0所规定的模式置位,程序可检测此标志
ana_i: ldi r16,$13 ;清模拟比较器中断标志ACI,选上升沿触发
out ACSR,r16
clr r17 ;清计数寄存器的高、低字节
clr r18
sei ;开中断
sbi ACSR,3 ;使能模拟比较器中断
rcall btd ;调二转十子程序
bb: rcall smiao ;调动态扫描子程序
rjmp bb
ana_cp: in r1,SREG ;保护标志寄存器
subi r17,low(-1) ;计数器加1
sbci r18,high(-1)
push r17
push r18
rcall btd ;调二转十子程序
mov r25,r21 ;将BCD码送r18~r22
mov r22,r20
mov r21,r19
mov r20,r18
mov r19,r17
out SREG,r1 ;恢复标志寄存器
pop r18
pop r17
reti
;说明:在模拟比较器中断使能位(ACIE)置1和全局中断使能后,就进入模拟比较器中断
btd: ser r21 ;r21先送-1
btd_1: inc r21 ;r21增1
subi r17,low(10000) ;(r18:r17)-10000
sbci r18,high(10000)
brcc btd_1 ;够减则返回btd_1
subi r17,low(-10000) ;不够减+10000,恢复余数
sbci r18,high(-10000)
ser r20 ;r20先送-1
btd_2: inc r20 ;r20增1
subi r17,low(1000) ;(r17:r16)-1000
sbci r18,high(1000)
brcc btd_2 ;够减则返回btd_2
subi r17,low(-1000) ;不够减+1000,恢复余数
sbci r18,high(-1000)
ser r19 ;r19先送-1
btd_3: inc r19 ;r19增1
subi r17,low(100) ;(r18:r17)-100
sbci r18,high(100)
brcc btd_3 ;够减则返回btd_3
subi r17,low(-100) ;不够减+100,恢复余数
sbci r18,high(-100)
ser r18 ;r18先送-1
btd_4: inc r18 ;r18增1
subi r17,10 ;(r18:r17)-10
brcc btd_4 ;够减则返回btd_4
subi r17,-10 ;不够减+10,恢复余数
ret
smiao: ldi r16,$fe ;送个位位线
out PORTD,r16
mov r23,r19 ;将个位的BCD码送r23
rcall cqb ;查7段码,送B口输出
rcall t1ms ;延时1ms
ldi r16,$fd ;送十位位线
out PORTD,r16
mov r23,r20 ;将十位的BCD码送r23
rcall cqb ;查7段码,送B口输出
rcall t1ms ;延时1ms
ldi r16,$fb ;送百位位线
out PORTD,r16
mov r23,r21 ;将百位的BCD码送r23
rcall cqb ;查7段码,送B口输出
rcall t1ms ;延时1ms
ldi r16,$f7 ;送千位位线
out PORTD,r16
mov r23,r22 ;将千位的BCD码送r23
rcall cqb ;查7段码,送B口输出
rcall t1ms ;延时1ms
ldi r16,$ef ;送万位位线
out PORTD,r16
mov r23,r25 ;将万位的BCD码送r23
rcall cqb ;查7段码,送B口输出
rcall t1ms ;延时1ms
ret
cqb: ldi ZH,high(tab*2) ;7段码的首址给Z
ldi ZL,low(tab*2)
add ZL,r23 ;首地址+偏移量
lpm ;查表送B口输出
out PORTC,r0
ret
t1ms: ldi r24,101 ;延时1ms子程序
push r24
del2: push r24
del3: dec r24
brne del3
pop r24
dec r24
brne del2
pop r24
ret
tab: .db $3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -