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

📄 led4.lis

📁 用AVR单片机做的一些程序,包括跑马灯显示,PWM产生,ADC转换等
💻 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\009-AD-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\009-AD-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\009-AD-LED4\led4.c
 0014                   .blkb 1
                        .area idata
 0014 03                .byte 3
                        .area data(ram, con, rel)
 0015                   .dbfile E:\ICCAVR\project\AVRMEG~3\icc\009-AD-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\009-AD-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, 3};                            /*显示信息*/
 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\009-AD-LED4\led4.c
                        .area bss(ram, con, rel)
 0000                   .dbfile E:\ICCAVR\project\AVRMEG~3\icc\009-AD-LED4\led4.c
 0000           L3:
 0000                   .blkb 1
                        .area text(rom, con, rel)
 0028                   .dbfile E:\ICCAVR\project\AVRMEG~3\icc\009-AD-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 + -