⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 954.asm

📁 单片机开发资料光盘-双龙-686M.zip
💻 ASM
字号:
.include "8535def.inc"
.org $000
 rjmp main
.org $005
 rjmp tim1_capt
tab:.db $3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f;七段码表
main:     ldi r16,low(ramend)  ;栈指针置初值
          out spl,r16
          ldi r16,high(ramend)
          out sph,r16
          ldi r16,$ff           ;定义B口为输出口
          out ddrb,r16
          ldi r16,0b10111111   ;定义PD6为输入,其余引脚为输出
          out ddrd,r16
          rcall t2pwm2         ;调产生周期为8160μs方波子程
          clr r12              ;清上次捕获值
          clr r13
          ldi r16,$20          ;允许TIM1_CAPT
          out timsk,r16
          ldi r16,$c2          ;上升沿捕获,一分频
          out tccr1b,r16
          clr r16              ;清中断标志寄存器
          out tifr,r16
          sei                  ;CPU开中断
aa:       mov r17,r11           ;捕获偏差值送r17:r16
          mov r16,r10
          rcall b16td5          ;调二转十子程
          mov r22,r20           ;送显示缓冲区
          mov r21,r19
          mov r20,r18
          mov r19,r17
          mov r18,r16          
          rcall smiao            ; 动态扫描
          rjmp aa
tim1_capt:  in r1,sreg           ; 标志入栈
          in r10,icr1l           ; 读输入捕获寄存器且将其入栈保护
          in r11,icr1h
          push r10 
          push r11
          sub r10,r12          ;减其上次捕获时值
          sbc r11,r13
          pop r13              ;将本次捕获值差送入R11:R10中
          pop r12
          out sreg,r1
          reti

t2pwm2:
          ldi r16,$75          ;定义PWM2使能,向上计数置引脚
          out tccr2,r16        ;向下计数清引脚,时钟128分频
          ldi r16,$80
          out ocr2,r16     
          ret
t1ms:    ldi r24,71             ;延时1毫秒子程
         push r24
del2:    push r24
del3:    dec r24
         brne del3
         pop r24
         dec r24
         brne del2
         pop r24
         ret 

b16td5:
	ser r20                    ;r20先送-1
b16td5_1:  
	inc r20                    ;r20增1
        subi r16,low(10000)        ;(r17:r16)-10000
	sbci r17,high(10000)
	brcc 	b16td5_1           ;够减则返回b16td5_1
	subi r16,low(-10000)       ;不够减+10000,恢复余数
	sbci r17,high(-10000)
	ser r19                    ;r19先送-1
b16td5_2:
        inc r19                    ;r19增1   
        subi r16,low(1000)         ;(r17:r16)-10000
	sbci r17,high(1000)            
	brcc 	b16td5_2           ;够减则返回b16td5_2
	subi r16,low(-1000)        ;不够减+1000,恢复余数
	sbci r17,high(-1000)
	ser r18                    ;r18先送-1
b16td5_3:
	inc r18                    ;r18增1    
subi r16,low(100)                  ;(r17:r16)-100
	sbci r17,high(100)             
	brcc 	b16td5_3           ;够减则返回b16td5_3
	subi r16,low(-100)         ;不够减+100,恢复余数
	sbci r17,high(-100)
	ser r17                    ;r17先送-1
b16td5_4:
        inc r17                    ;r17增1
        subi r16,10                ;(r17:r16)-10          
	brcc 	b16td5_4           ;够减则返回b16td5_4               
	subi r16,-10               ;不够减+10,恢复余数
        ret
smiao: ldi r16,$fe         ;送个位位线
       out portd, r16      
       mov r23,r18         ;将个位的BCD码送R23
       rcall cqb           ;查七段码,送B口输出
       rcall t1ms          ;延时1ms
       ldi r16,$fd         ;送十位位线
       out portd, r16       
       mov r23,r19         ;将十位的BCD码送R23
       rcall cqb           ;查七段码,送B口输出
       rcall t1ms          ;延时1ms
       ldi r16,$fb         ;送百位位线
       out portd,r16
       mov r23,r20         ;将百位的BCD码送R23
       rcall cqb           ;查七段码,送B口输出
       rcall t1ms          ;延时1ms  
       ldi r16,$f7         ;送千位位线
       out portd,r16
       mov r23,r21         ;将千位的BCD码送R23
       rcall cqb           ;查七段码,送B口输出
       rcall t1ms          ;延时1ms
       ldi r16,$ef         ;送万位位线
       out portd,r16
       mov r23,r22         ;将万位的BCD码送R23
       rcall cqb           ;查七段码,送B口输出
       rcall t1ms          ;延时1ms
       ret 

cqb:   ldi zh,high(tab*2)  ;七段码的首地址给Z
       ldi zl,low(tab*2)
       add zl,r23          ;首地址+偏移量
       lpm                 ;查表送B口输出
       out portb,r0               
       ret

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -