📄 led4.lis
字号:
.module LED4.C
.area data(ram, con, rel)
0000 _disp::
0000 .blkb 2
.area idata
0000 C0F9 .byte 192,249
.area data(ram, con, rel)
0002 .blkb 2
.area idata
0002 A4B0 .byte 164,176
.area data(ram, con, rel)
0004 .blkb 2
.area idata
0004 9992 .byte 153,146
.area data(ram, con, rel)
0006 .blkb 2
.area idata
0006 82F8 .byte 130,248
.area data(ram, con, rel)
0008 .blkb 2
.area idata
0008 8090 .byte 128,144
.area data(ram, con, rel)
000A .blkb 2
.area idata
000A 8883 .byte 136,131
.area data(ram, con, rel)
000C .blkb 2
.area idata
000C C6A1 .byte 198,161
.area data(ram, con, rel)
000E .blkb 2
.area idata
000E 868E .byte 134,142
.area data(ram, con, rel)
0010 .dbfile E:\ICCAVR\project\AVRMEG~2\icc\030-DS18B20-LED4\LED4.C
0010 .dbsym e disp _disp A[16:16]c
0010 _led_buf::
0010 .blkb 2
.area idata
0010 0102 .byte 1,2
.area data(ram, con, rel)
0012 .dbfile E:\ICCAVR\project\AVRMEG~2\icc\030-DS18B20-LED4\LED4.C
0012 .blkb 2
.area idata
0012 0304 .byte 3,4
.area data(ram, con, rel)
0014 .dbfile E:\ICCAVR\project\AVRMEG~2\icc\030-DS18B20-LED4\LED4.C
0014 .blkb 1
.area idata
0014 08 .byte 8
.area data(ram, con, rel)
0015 .dbfile E:\ICCAVR\project\AVRMEG~2\icc\030-DS18B20-LED4\LED4.C
0015 .dbsym e led_buf _led_buf A[5:5]c
.area text(rom, con, rel)
0000 .dbfile E:\ICCAVR\project\AVRMEG~2\icc\030-DS18B20-LED4\LED4.C
0000 .dbfunc e led4_init _led4_init fV
.even
0000 _led4_init::
0000 .dbline -1
0000 .dbline 28
0000 ; /*
0000 ; 模块说明:
0000 ;
0000 ; LED数码管中断动态显示程序。
0000 ; 1、程序通过SPI接口输出数据到HC595芯片驱动LED数据管简单显示。
0000 ; 2、动态调度由片内定时器1中断产生,中断周期为5mS。
0000 ; 3、内部1 M晶振,程序采用单任务方式,软件延时。
0000 ; 4、此模块文件为使用文件,可直接用于项目中。
0000 ; www.iccavr.com
0000 ; */
0000 ; #include "iom16v.h"
0000 ; #include <macros.h>
0000 ;
0000 ; unsigned char disp[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
0000 ;
0000 ; /*
0000 ; 前4位为显示数值。
0000 ; 最后一位为小数点显示位置。
0000 ; */
0000 ; unsigned char led_buf[] = {1, 2, 3, 4, 8}; /*显示信息*/
0000 ;
0000 ; /*------------------------------------------------------------------*-
0000 ;
0000 ; Disp_Init()
0000 ; 显示初始化
0000 ;
0000 ; -*------------------------------------------------------------------*/
0000 ; void led4_init(void) {
0000 .dbline 31
0000 ;
0000 ; /*初始化定时器*/
0000 ; OCR1A = 625; /*计数周期为5mS,F=1M*/
0000 81E7 ldi R24,625
0002 92E0 ldi R25,2
0004 9BBD out 0x2b,R25
0006 8ABD out 0x2a,R24
0008 .dbline 32
0008 ; TIMSK |= (1 << OCIE1A); /*比较中断A允许*/
0008 89B7 in R24,0x39
000A 8061 ori R24,16
000C 89BF out 0x39,R24
000E .dbline 33
000E ; SREG = 0x80;
000E 80E8 ldi R24,128
0010 8FBF out 0x3f,R24
0012 .dbline 34
0012 ; TCCR1A = 0x00;
0012 2224 clr R2
0014 2FBC out 0x2f,R2
0016 .dbline 35
0016 ; TCCR1B = 0x08; /*定时器工作在CTC计数器模式*/
0016 88E0 ldi R24,8
0018 8EBD out 0x2e,R24
001A .dbline 36
001A ; TCCR1B |= 0x02; /*设置定时器的分频值为8分频*/
001A 8EB5 in R24,0x2e
001C 8260 ori R24,2
001E 8EBD out 0x2e,R24
0020 .dbline 39
0020 ;
0020 ; /*SPI接口初始化*/
0020 ; DDRB |= (1<<PB5) | (1<<PB7); /* 设置MOSI 和SCK 为输出,其他为输入 */
0020 87B3 in R24,0x17
0022 806A ori R24,160
0024 87BB out 0x17,R24
0026 .dbline 40
0026 ; SPCR = (1<<SPE) | (1<<MSTR)
0026 83E5 ldi R24,83
0028 8DB9 out 0xd,R24
002A .dbline 44
002A ; | (1<<SPR1) | (1<<SPR0); /* 使能SPI 主机模式,时钟为fck/128 */
002A ;
002A ; /*中断使能*/
002A ; SEI();
002A 7894 sei
002C .dbline -2
002C L1:
002C .dbline 0 ; func end
002C 0895 ret
002E .dbend
.area vector(rom, abs)
.org 24
0018 0C941700 jmp _Int_TCCR1A
.area text(rom, con, rel)
002E .dbfile E:\ICCAVR\project\AVRMEG~2\icc\030-DS18B20-LED4\LED4.C
.area bss(ram, con, rel)
0000 .dbfile E:\ICCAVR\project\AVRMEG~2\icc\030-DS18B20-LED4\LED4.C
0000 L3:
0000 .blkb 1
.area text(rom, con, rel)
002E .dbfile E:\ICCAVR\project\AVRMEG~2\icc\030-DS18B20-LED4\LED4.C
002E .dbfunc e Int_TCCR1A _Int_TCCR1A fV
002E .dbsym s i L3 c
002E ; temp -> R20
.even
002E _Int_TCCR1A::
002E 2A92 st -y,R2
0030 3A92 st -y,R3
0032 0A93 st -y,R16
0034 1A93 st -y,R17
0036 8A93 st -y,R24
0038 9A93 st -y,R25
003A EA93 st -y,R30
003C FA93 st -y,R31
003E 2FB6 in R2,0x3f
0040 2A92 st -y,R2
0042 0E940000 xcall push_gset1
0046 .dbline -1
0046 .dbline 57
0046 ; }
0046 ;
0046 ; /*------------------------------------------------------------------*-
0046 ;
0046 ; Int_TCCR1A()
0046 ; LED数码管动态显示函数
0046 ;
0046 ; 定时器'T1',A组比较中断产生5mS周期性中断
0046 ; 在中断里刷新显示
0046 ;
0046 ; -*------------------------------------------------------------------*/
0046 ; #pragma interrupt_handler Int_TCCR1A: 7
0046 ; void Int_TCCR1A(void) {
0046 .dbline 62
0046 ;
0046 ; unsigned char temp;
0046 ; static unsigned char i;
0046 ;
0046 ; PORTB &= ~(1 << 4); /*准备锁存*/
0046 C498 cbi 0x18,4
0048 .dbline 63
0048 ; PORTB |= 0x0F;
0048 88B3 in R24,0x18
004A 8F60 ori R24,15
004C 88BB out 0x18,R24
004E .dbline 64
004E ; PORTB |= (1 << 4); /*锁存数据*/
004E C49A sbi 0x18,4
0050 .dbline 65
0050 ; if (i == 3) { /*显示位*/
0050 80910000 lds R24,L3
0054 8330 cpi R24,3
0056 09F4 brne L4
0058 .dbline 65
0058 .dbline 66
0058 ; PORTB &= ~(1 << 2);
0058 C298 cbi 0x18,2
005A .dbline 67
005A ; }
005A L4:
005A .dbline 68
005A ; if (i == 2) {
005A 80910000 lds R24,L3
005E 8230 cpi R24,2
0060 09F4 brne L6
0062 .dbline 68
0062 .dbline 69
0062 ; PORTB &= ~(1 << 1);
0062 C198 cbi 0x18,1
0064 .dbline 70
0064 ; }
0064 L6:
0064 .dbline 71
0064 ; if (i == 1) {
0064 80910000 lds R24,L3
0068 8130 cpi R24,1
006A 09F4 brne L8
006C .dbline 71
006C .dbline 72
006C ; PORTB &= ~(1 << 0);
006C C098 cbi 0x18,0
006E .dbline 73
006E ; }
006E L8:
006E .dbline 74
006E ; if (i == 0) {
006E 20900000 lds R2,L3
0072 2220 tst R2
0074 09F4 brne L10
0076 .dbline 74
0076 .dbline 75
0076 ; PORTB &= ~(1 << 3);
0076 C398 cbi 0x18,3
0078 .dbline 76
0078 ; }
0078 L10:
0078 .dbline 78
0078 ;
0078 ; temp = led_buf[i] % 16;
0078 80E0 ldi R24,<_led_buf
007A 90E0 ldi R25,>_led_buf
007C E0910000 lds R30,L3
0080 FF27 clr R31
0082 E80F add R30,R24
0084 F91F adc R31,R25
0086 0081 ldd R16,z+0
0088 10E1 ldi R17,16
008A 0E940000 xcall mod8u
008E 402F mov R20,R16
0090 .dbline 79
0090 ; temp = disp[temp];
0090 80E0 ldi R24,<_disp
0092 90E0 ldi R25,>_disp
0094 E42F mov R30,R20
0096 FF27 clr R31
0098 E80F add R30,R24
009A F91F adc R31,R25
009C 4081 ldd R20,z+0
009E .dbline 80
009E ; if (led_buf[4] == i) { /*显示小数点*/
009E 20900000 lds R2,L3
00A2 30901400 lds R3,_led_buf+4
00A6 3214 cp R3,R2
00A8 21F4 brne L12
00AA .dbline 80
00AA .dbline 81
00AA ; SPDR = temp & 0x7F;
00AA 842F mov R24,R20
00AC 8F77 andi R24,127
00AE 8FB9 out 0xf,R24
00B0 .dbline 82
00B0 ; }
00B0 01C0 xjmp L13
00B2 L12:
00B2 .dbline 83
00B2 ; else {
00B2 .dbline 84
00B2 ; SPDR = temp;
00B2 4FB9 out 0xf,R20
00B4 .dbline 85
00B4 ; }
00B4 L13:
00B4 .dbline 87
00B4 80910000 lds R24,L3
00B8 8F5F subi R24,255 ; addi 1
00BA 80930000 sts L3,R24
00BE .dbline 88
00BE 83E0 ldi R24,3
00C0 20900000 lds R2,L3
00C4 8215 cp R24,R2
00C6 18F4 brsh L15
00C8 .dbline 88
00C8 .dbline 89
00C8 2224 clr R2
00CA 20920000 sts L3,R2
00CE .dbline 90
00CE L15:
00CE .dbline -2
00CE L2:
00CE 0E940000 xcall pop_gset1
00D2 2990 ld R2,y+
00D4 2FBE out 0x3f,R2
00D6 F991 ld R31,y+
00D8 E991 ld R30,y+
00DA 9991 ld R25,y+
00DC 8991 ld R24,y+
00DE 1991 ld R17,y+
00E0 0991 ld R16,y+
00E2 3990 ld R3,y+
00E4 2990 ld R2,y+
00E6 .dbline 0 ; func end
00E6 1895 reti
00E8 .dbsym r temp 20 c
00E8 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -