📄 sg8.lst
字号:
AVRASM ver. 1.30 sg8.ASM Thu Apr 19 09:54:43 2007
.device AT90S8535
.equ sph =$3E
.equ spl =$3D
.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
.equ TIMSK =$39
.equ TCCR1B =$2E
.equ SREG =$3F
.equ TCCR0 =$33
.equ TCNT0 =$32
.equ TCNT1H =$2D
.equ TCNT1L =$2C
.def ZH =r31
.def ZL =r30
.org $0000
000000 c00e rjmp main
.org $009
000009 c024 rjmp t0_ovf
00000a tab: .db $3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f
00000a 063f
00000b 4f5b
00000c 6d66
00000d 077d
00000e 6f7f
00000f e002 main: ldi r16,$02 ;栈指针置初值
000010 bf0e out sph,r16
000011 e50f ldi r16,$5f
000012 bf0d out spl,r16
000013 e000 ldi r16,0
000014 2ec0 mov r12,r16
000015 2ed0 mov r13,r16
000016 ef0f ldi r16,$ff ;定义C口、D口为输出
000017 bb01 out DDRD,r16
000018 bb04 out DDRC,r16
000019 e001 ldi r16,$01 ;允许T/C0中断
00001a bf09 out TIMSK,r16
00001b e004 ldi r16,$04 ;定时器8分频
00001c bf03 out TCCR0,r16
00001d e006 ldi r16,6 ;定时器0置初值6
00001e bf02 out TCNT0,r16
00001f 98b9 cbi DDRB,1 ;PB1定义为输入口
000020 e086 ldi r24,$06 ;T1(PB1)引脚每一次上升沿计数1次
000021 bd8e out TCCR1B,r24
000022 e7bd ldi r27,125
000023 9478 sei
000024 2d0a loop: mov r16,r10 ;将TCNT1的增量值送r17、r16
000025 2d1b mov r17,r11
000026 d017 rcall btd ;调二转十子程序
000027 2f64 mov r22,r20
000028 2f53 mov r21,r19
000029 2f42 mov r20,r18
00002a 2f31 mov r19,r17
00002b 2f20 mov r18,r16
00002c d02c rcall smiao ;调动态扫描显示子程序
00002d cff6 rjmp loop
00002e b61f t0_ovf: in r1,sreg ;保护现场
00002f e086 ldi r24,6 ;T/C0送初值
000030 bf82 out TCNT0,r24
000031 50b1 subi r27,1 ;中断计数减1
000032 f449 brne tt ;不为0,则返回
000033 b4ac in r10,TCNT1L ;读TCNT1计数值到r11、r10
000034 b4bd in r11,TCNT1H
000035 92af push r10 ;入栈保存
000036 92bf push r11
000037 18ac sub r10,r12 ;求2次T/C1计数差值
000038 08bd sbc r11,r13
000039 90df pop r13 ;将本次T/C1计数值放入r13、r12中
00003a 90cf pop r12 ;为下次计算计数器差值做准备
00003b e7bd ldi r27,125
00003c be1f tt: out sreg,r1 ;恢复现场
00003d 9518 reti
00003e ef4f btd: ser r20 ;r20先送-1
00003f 9543 btd_1: inc r20 ;r20增1
000040 5100 subi r16,low(10000) ;(r17:r16)-10000
000041 4217 sbci r17,high(10000)
000042 f7e0 brcc btd_1 ;够减则返回btd_1
000043 5f00 subi r16,low(-10000) ;不够减+10000,恢复余数
000044 4d18 sbci r17,high(-10000)
000045 ef3f ser r19 ;r19先送-1
000046 9533 btd_2: inc r19 ;r19增1
000047 5e08 subi r16,low(1000) ;(r17:r16)-1000
000048 4013 sbci r17,high(1000)
000049 f7e0 brcc btd_2 ;够减则返回btd_2
00004a 5108 subi r16,low(-1000) ;不够减+1000,恢复余数
00004b 4f1c sbci r17,high(-1000)
00004c ef2f ser r18 ;r18先送-1
00004d 9523 btd_3: inc r18 ;r18增1
00004e 5604 subi r16,low(100) ;(r17:r16)-100
00004f 4010 sbci r17,high(100)
000050 f7e0 brcc btd_3 ;够减则返回btd_3
000051 590c subi r16,low(-100) ;不够减+100,恢复余数
000052 4f1f sbci r17,high(-100)
000053 ef1f ser r17 ;r17先送-1
000054 9513 btd_4: inc r17 ;r17增1
000055 500a subi r16,10 ;(r17:r16)-10
000056 f7e8 brcc btd_4 ;够减则返回btd_4
000057 5f06 subi r16,-10 ;不够减+10,恢复余数
000058 9508 ret
000059 ef0e smiao: ldi r16,$fe ;送个位位线
00005a bb02 out PORTD,r16
00005b 2f72 mov r23,r18 ;将个位的BCD码送r23
00005c d020 rcall cqb ;查7段码,送B口输出
00005d d015 rcall t1ms ;延时1ms
00005e ef0d ldi r16,$fd ;送十位位线
00005f bb02 out PORTD,r16
000060 2f73 mov r23,r19 ;将十位的BCD码送r23
000061 d01b rcall cqb ;查7段码,送B口输出
000062 d010 rcall t1ms ;延时1ms
000063 ef0b ldi r16,$fb ;送百位位线
000064 bb02 out PORTD,r16
000065 2f74 mov r23,r20 ;将百位的BCD码送r23
000066 d016 rcall cqb ;查7段码,送B口输出
000067 d00b rcall t1ms ;延时1ms
000068 ef07 ldi r16,$f7 ;送千位位线
000069 bb02 out PORTD,r16
00006a 2f75 mov r23,r21 ;将千位的BCD码送r23
00006b d011 rcall cqb ;查7段码,送B口输出
00006c d006 rcall t1ms ;延时1ms
00006d ee0f ldi r16,$ef ;送万位位线
00006e bb02 out PORTD,r16
00006f 2f76 mov r23,r22 ;将万位的BCD码送r23
000070 d00c rcall cqb ;查7段码,送B口输出
000071 d001 rcall t1ms ;延时1ms
000072 9508 ret
000073 e685 t1ms: ldi r24,101 ;延时1ms子程序
000074 938f push r24
000075 938f del2: push r24
000076 958a del3: dec r24
000077 f7f1 brne del3
000078 918f pop r24
000079 958a dec r24
00007a f7d1 brne del2
00007b 918f pop r24
00007c 9508 ret
00007d e0f0 cqb: ldi ZH,high(tab*2) ;查个位7段码
00007e e1e4 ldi ZL,low(tab*2)
00007f 0fe7 add ZL,r23
000080 95c8 lpm
000081 ba05 out PORTC,r0
000082 9508 ret
Assembly complete with no errors.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -