📄 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 C0C0 .byte 192,192
.area data(ram, con, rel)
000C .blkb 2
.area idata
000C C0C0 .byte 192,192
.area data(ram, con, rel)
000E .blkb 2
.area idata
000E C0C0 .byte 192,192
.area data(ram, con, rel)
0010 .dbfile E:\ICCAVR\project\AVRMEG~3\icc\005-LED4\led4.c
0010 .dbsym e disp _disp A[16:16]c
0010 _led_buf::
0010 .blkb 2
.area idata
0010 0000 .byte 0,0
.area data(ram, con, rel)
0012 .dbfile E:\ICCAVR\project\AVRMEG~3\icc\005-LED4\led4.c
0012 .blkb 2
.area idata
0012 0000 .byte 0,0
.area data(ram, con, rel)
0014 .dbfile E:\ICCAVR\project\AVRMEG~3\icc\005-LED4\led4.c
0014 .blkb 1
.area idata
0014 01 .byte 1
.area data(ram, con, rel)
0015 .dbfile E:\ICCAVR\project\AVRMEG~3\icc\005-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~3\icc\005-LED4\led4.c
0000 .dbfunc e disp_init _disp_init fV
.even
0000 _disp_init::
0000 .dbline -1
0000 .dbline 29
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 ; */
0000 ; #include "iom128v.h"
0000 ; #include <macros.h>
0000 ;
0000 ; unsigned char disp[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0};
0000 ;
0000 ; /*
0000 ; 前4位为显示数值。
0000 ; 最后一位为小数点显示位置。
0000 ; */
0000 ; unsigned char led_buf[] = {0, 0, 0, 0, 1}; /*显示信息*/
0000 ;
0000 ; /*------------------------------------------------------------------*-
0000 ;
0000 ; Disp_Init()
0000 ; 显示初始化
0000 ;
0000 ; -*------------------------------------------------------------------*/
0000 ; void disp_init(void) {
0000 .dbline 32
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 33
0008 ; TIMSK |= (1 << OCIE1A); /*比较中断A允许*/
0008 87B7 in R24,0x37
000A 8061 ori R24,16
000C 87BF out 0x37,R24
000E .dbline 34
000E ; TCCR1A = 0x00;
000E 2224 clr R2
0010 2FBC out 0x2f,R2
0012 .dbline 35
0012 ; TCCR1B = (1 << WGM12); /*定时器工作在CTC计数器模式*/
0012 88E0 ldi R24,8
0014 8EBD out 0x2e,R24
0016 .dbline 36
0016 ; TCCR1B |= (1 << CS11); /*设置定时器的分频值为8分频*/
0016 8EB5 in R24,0x2e
0018 8260 ori R24,2
001A 8EBD out 0x2e,R24
001C .dbline 40
001C ;
001C ; /*SPI接口初始化*/
001C ;
001C ; DDRB = 0xFF; /* 设置PB口为输出*/
001C 8FEF ldi R24,255
001E 87BB out 0x17,R24
0020 .dbline 41
0020 ; SPCR = (1<<SPE) | (1<<MSTR)
0020 83E5 ldi R24,83
0022 8DB9 out 0xd,R24
0024 .dbline 45
0024 ; | (1<<SPR1) | (1<<SPR0); /* 使能SPI 主机模式,设置时钟速率为fck/128 */
0024 ;
0024 ; /*中断使能*/
0024 ; SEI();
0024 7894 sei
0026 .dbline -2
0026 L1:
0026 .dbline 0 ; func end
0026 0895 ret
0028 .dbend
.area vector(rom, abs)
.org 48
0030 0C941400 jmp _Int_TCCR1A
.area text(rom, con, rel)
0028 .dbfile E:\ICCAVR\project\AVRMEG~3\icc\005-LED4\led4.c
.area bss(ram, con, rel)
0000 .dbfile E:\ICCAVR\project\AVRMEG~3\icc\005-LED4\led4.c
0000 L3:
0000 .blkb 1
.area text(rom, con, rel)
0028 .dbfile E:\ICCAVR\project\AVRMEG~3\icc\005-LED4\led4.c
0028 .dbfunc e Int_TCCR1A _Int_TCCR1A fV
0028 .dbsym s i L3 c
0028 ; temp -> R20
.even
0028 _Int_TCCR1A::
0028 2A92 st -y,R2
002A 3A92 st -y,R3
002C 0A93 st -y,R16
002E 1A93 st -y,R17
0030 8A93 st -y,R24
0032 9A93 st -y,R25
0034 EA93 st -y,R30
0036 FA93 st -y,R31
0038 2FB6 in R2,0x3f
003A 2A92 st -y,R2
003C 0E940000 xcall push_gset1
0040 .dbline -1
0040 .dbline 58
0040 ; }
0040 ;
0040 ; /*------------------------------------------------------------------*-
0040 ;
0040 ; Int_TCCR1A()
0040 ; LED数码管动态显示函数
0040 ;
0040 ; 定时器'T1',A组比较中断产生5mS周期性中断
0040 ; 在中断里刷新显示
0040 ;
0040 ; -*------------------------------------------------------------------*/
0040 ; #pragma interrupt_handler Int_TCCR1A: 13
0040 ; void Int_TCCR1A(void) {
0040 .dbline 63
0040 ;
0040 ; unsigned char temp;
0040 ; static unsigned char i;
0040 ;
0040 ; PORTB &= ~(1 << PB0); /*准备锁存*/
0040 C098 cbi 0x18,0
0042 .dbline 64
0042 ; PORTB |= 0xF0; /*复位段选择口*/
0042 88B3 in R24,0x18
0044 806F ori R24,240
0046 88BB out 0x18,R24
0048 .dbline 65
0048 ; PORTB |= (1 << PB0); /*锁存数据*/
0048 C09A sbi 0x18,0
004A .dbline 66
004A ; if (i == 3) {
004A 80910000 lds R24,L3
004E 8330 cpi R24,3
0050 09F4 brne L4
0052 .dbline 66
0052 .dbline 67
0052 ; PORTB &= ~(1 << PB6); /*由于此处显示数值滞后一个周期所以显示位也要修改*/
0052 C698 cbi 0x18,6
0054 .dbline 68
0054 ; } /*此处逻辑性很强,如不能理解可先跳过,以后熟练来再看*/
0054 L4:
0054 .dbline 69
0054 ; if (i == 2) {
0054 80910000 lds R24,L3
0058 8230 cpi R24,2
005A 09F4 brne L6
005C .dbline 69
005C .dbline 70
005C ; PORTB &= ~(1 << PB5);
005C C598 cbi 0x18,5
005E .dbline 71
005E ; }
005E L6:
005E .dbline 72
005E ; if (i == 1) {
005E 80910000 lds R24,L3
0062 8130 cpi R24,1
0064 09F4 brne L8
0066 .dbline 72
0066 .dbline 73
0066 ; PORTB &= ~(1 << PB4);
0066 C498 cbi 0x18,4
0068 .dbline 74
0068 ; }
0068 L8:
0068 .dbline 75
0068 ; if (i == 0) {
0068 20900000 lds R2,L3
006C 2220 tst R2
006E 09F4 brne L10
0070 .dbline 75
0070 .dbline 76
0070 ; PORTB &= ~(1 << PB7);
0070 C798 cbi 0x18,7
0072 .dbline 77
0072 ; }
0072 L10:
0072 .dbline 78
0072 ; temp = led_buf[i] % 16; /*滤除溢出的数值*/
0072 80E0 ldi R24,<_led_buf
0074 90E0 ldi R25,>_led_buf
0076 E0910000 lds R30,L3
007A FF27 clr R31
007C E80F add R30,R24
007E F91F adc R31,R25
0080 0081 ldd R16,z+0
0082 10E1 ldi R17,16
0084 0E940000 xcall mod8u
0088 402F mov R20,R16
008A .dbline 79
008A ; temp = disp[temp]; /*取出当前显示信息*/
008A 80E0 ldi R24,<_disp
008C 90E0 ldi R25,>_disp
008E E42F mov R30,R20
0090 FF27 clr R31
0092 E80F add R30,R24
0094 F91F adc R31,R25
0096 4081 ldd R20,z+0
0098 .dbline 80
0098 ; if (led_buf[4] == i) { /*显示小数点*/
0098 20900000 lds R2,L3
009C 30901400 lds R3,_led_buf+4
00A0 3214 cp R3,R2
00A2 21F4 brne L12
00A4 .dbline 80
00A4 .dbline 81
00A4 ; SPDR = temp & 0x7F;
00A4 842F mov R24,R20
00A6 8F77 andi R24,127
00A8 8FB9 out 0xf,R24
00AA .dbline 82
00AA ; }
00AA 01C0 xjmp L13
00AC L12:
00AC .dbline 83
00AC ; else {
00AC .dbline 84
00AC ; SPDR = temp;
00AC 4FB9 out 0xf,R20
00AE .dbline 85
00AE ; }
00AE L13:
00AE .dbline 87
00AE 80910000 lds R24,L3
00B2 8F5F subi R24,255 ; addi 1
00B4 80930000 sts L3,R24
00B8 .dbline 88
00B8 83E0 ldi R24,3
00BA 20900000 lds R2,L3
00BE 8215 cp R24,R2
00C0 18F4 brsh L15
00C2 .dbline 88
00C2 .dbline 89
00C2 2224 clr R2
00C4 20920000 sts L3,R2
00C8 .dbline 90
00C8 L15:
00C8 .dbline -2
00C8 L2:
00C8 0E940000 xcall pop_gset1
00CC 2990 ld R2,y+
00CE 2FBE out 0x3f,R2
00D0 F991 ld R31,y+
00D2 E991 ld R30,y+
00D4 9991 ld R25,y+
00D6 8991 ld R24,y+
00D8 1991 ld R17,y+
00DA 0991 ld R16,y+
00DC 3990 ld R3,y+
00DE 2990 ld R2,y+
00E0 .dbline 0 ; func end
00E0 1895 reti
00E2 .dbsym r temp 20 c
00E2 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -