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

📄 main.lis

📁 AVR试验板程序,有LED,键盘和串口的程序
💻 LIS
📖 第 1 页 / 共 3 页
字号:
                        .module main.c
                        .area data(ram, con, rel)
 0000           _led_ch::
 0000                   .blkb 1
                        .area idata
 0000 80                .byte 128
                        .area data(ram, con, rel)
 0001                   .dbfile E:\work\百步梯攀登计划\AVR程序\new\main.c
 0001                   .dbsym e led_ch _led_ch c
 0001           _tmp_led_index::
 0001                   .blkb 1
                        .area idata
 0001 00                .byte 0
                        .area data(ram, con, rel)
 0002                   .dbfile E:\work\百步梯攀登计划\AVR程序\new\main.c
 0002                   .dbsym e tmp_led_index _tmp_led_index c
                        .area lit(rom, con, rel)
 0000           _LED_INDEX::
 0000 3F06              .byte 63,6
 0002 5B4F              .byte 91,'O
 0004 666D              .byte 'f,'m
 0006 7D07              .byte 125,7
 0008 7F6F              .byte 127,'o
 000A                   .dbsym e LED_INDEX _LED_INDEX A[10:10]kc
                        .area text(rom, con, rel)
 0000                   .dbfile E:\work\百步梯攀登计划\AVR程序\new\main.c
 0000                   .dbfunc e port_init _port_init fV
                        .even
 0000           _port_init::
 0000                   .dbline -1
 0000                   .dbline 17
 0000           ; //ICC-AVR application builder : 2007-2-22 12:20:11
 0000           ; // Target : M16
 0000           ; // Crystal: 10.000Mhz
 0000           ; 
 0000           ; #include <iom16v.h>
 0000           ; #include <macros.h>
 0000           ; 
 0000           ; unsigned char tmp_cn_0;                     //临时计数器——0
 0000           ; unsigned char tmp_cn_1;                     //临时计数器——1
 0000           ; unsigned char led_ch=0x80;                  //闪烁的花样
 0000           ; unsigned char key_code;                     //键盘按下的键盘代码
 0000           ; unsigned char tmp_led_index=0x00;
 0000           ; unsigned char const LED_INDEX[]={0X3F,0X06,0X5B,0X4F,
 0000           ;                                  0X66,0X6D,0X7D,0X07,
 0000           ;                                  0X7F,0X6F};//共阴管的数字0-9的代码
 0000           ; void port_init(void)
 0000           ; {
 0000                   .dbline 18
 0000           ;  PORTA = 0xC0; 
 0000 80EC              ldi R24,192
 0002 8BBB              out 0x1b,R24
 0004                   .dbline 19
 0004           ;  DDRA  = 0xC0; //高2位作为10位ADC的MSB,低2位用外部ADC输入,其余用于键盘的输入
 0004 8ABB              out 0x1a,R24
 0006                   .dbline 20
 0006           ;  PORTB = 0xFF;
 0006 8FEF              ldi R24,255
 0008 88BB              out 0x18,R24
 000A                   .dbline 21
 000A           ;  DDRB  = 0xFF; //驱动静态595显示,只用到高4位,低四位保留
 000A 87BB              out 0x17,R24
 000C                   .dbline 22
 000C           ;  PORTC = 0xFF; //m103 output only
 000C 85BB              out 0x15,R24
 000E                   .dbline 23
 000E           ;  DDRC  = 0xFF; //ADC的低8位输出
 000E 84BB              out 0x14,R24
 0010                   .dbline 24
 0010           ;  PORTD = 0xFF;
 0010 82BB              out 0x12,R24
 0012                   .dbline 25
 0012           ;  DDRD  = 0xFF; //高6位用于显示LED,低2位用于串口的输出。
 0012 81BB              out 0x11,R24
 0014                   .dbline -2
 0014           L1:
 0014                   .dbline 0 ; func end
 0014 0895              ret
 0016                   .dbend
 0016                   .dbfunc e timer0_init _timer0_init fV
                        .even
 0016           _timer0_init::
 0016                   .dbline -1
 0016                   .dbline 34
 0016           ; }
 0016           ; 
 0016           ; 
 0016           ; //TIMER0 initialize - prescale:256      
 0016           ; // WGM: Normal
 0016           ; // desired value: 2mSec
 0016           ; // actual value:  1.997mSec (0.2%)
 0016           ; void timer0_init(void)                       //硬件计数器0的初始化程序
 0016           ; {
 0016                   .dbline 35
 0016           ;  TCCR0 = 0x00; //stop
 0016 2224              clr R2
 0018 23BE              out 0x33,R2
 001A                   .dbline 36
 001A           ;  TCNT0 = 0xB2; //set count
 001A 82EB              ldi R24,178
 001C 82BF              out 0x32,R24
 001E                   .dbline 37
 001E           ;  OCR0  = 0x4E;  //set compare
 001E 8EE4              ldi R24,78
 0020 8CBF              out 0x3c,R24
 0022                   .dbline 38
 0022           ;  TCCR0 = 0x04; //start timer
 0022 84E0              ldi R24,4
 0024 83BF              out 0x33,R24
 0026                   .dbline -2
 0026           L2:
 0026                   .dbline 0 ; func end
 0026 0895              ret
 0028                   .dbend
 0028                   .dbfunc e adc_init _adc_init fV
                        .even
 0028           _adc_init::
 0028                   .dbline -1
 0028                   .dbline 45
 0028           ; }
 0028           ; 
 0028           ; /*-----------------------ADC转换初始化----------------------------------------*/
 0028           ; //ADC initialize
 0028           ; // Conversion time: 26uS
 0028           ; void adc_init(void)
 0028           ; {
 0028                   .dbline 46
 0028           ;  ADCSR = 0x00;                               //disable adc
 0028 2224              clr R2
 002A 26B8              out 0x6,R2
 002C                   .dbline 47
 002C           ;  ADMUX = 0x00;                               //选择外部基准电压 通道 0 输入
 002C 27B8              out 0x7,R2
 002E                   .dbline 48
 002E           ;  ACSR  = 0xC0;                               //模拟比较器控制和状态寄存器 ACSR
 002E 80EC              ldi R24,192
 0030 88B9              out 0x8,R24
 0032                   .dbline 53
 0032           ;                                              //ACD置1,使模拟比较器禁用
 0032           ;  /*--ACD--ACBG--ACO--ACI---ACIE---ACIC---ACIS1---ACIS0------------------------*/
 0032           ;  /*-模拟比较起禁用--模拟比较器的能隙基准源--模拟比较起输出--模拟比较器中断标志*/
 0032           ;  /*-模拟比较器中断使能--模拟比较器输入捕捉使能--模拟比较器中断模式选择--------*/
 0032           ;  ADCSR = 0x8B;//模拟比较起控制和状态寄存器
 0032 8BE8              ldi R24,139
 0034 86B9              out 0x6,R24
 0036                   .dbline -2
 0036           L3:
 0036                   .dbline 0 ; func end
 0036 0895              ret
 0038                   .dbend
                        .area vector(rom, abs)
                        .org 56
 0038 0C941C00          jmp _adc_isr
                        .area text(rom, con, rel)
 0038                   .dbfile E:\work\百步梯攀登计划\AVR程序\new\main.c
 0038                   .dbfunc e adc_isr _adc_isr fV
 0038           ;             rr -> R16
                        .even
 0038           _adc_isr::
 0038 2A92              st -y,R2
 003A 3A92              st -y,R3
 003C 0A93              st -y,R16
 003E 1A93              st -y,R17
 0040 8A93              st -y,R24
 0042 9A93              st -y,R25
 0044 2FB6              in R2,0x3f
 0046 2A92              st -y,R2
 0048                   .dbline -1
 0048                   .dbline 60
 0048           ;  /*-----------ADEN---ADSC---ADFR---ADIF---ADIE---ADPS2---ADPS1---ADPS0--------*/
 0048           ;  //使能模数转换 ADC开始转换 ADC连续转换  ADC中断使能  128分频
 0048           ; }
 0048           ; /*-----------------------ADC转换中断程序--------------------------------------*/
 0048           ; #pragma interrupt_handler adc_isr:15
 0048           ; void adc_isr(void)                           //组合输出ADC DATA
 0048           ; {
 0048                   .dbline 61
 0048           ;  unsigned char rr=0;
 0048 0027              clr R16
 004A                   .dbline 63
 004A           ;  //conversion complete, read value (int) using...
 004A           ;  PORTC=~(ADCL);                              //c口显示低8位的信息 (反相)
 004A 24B0              in R2,0x4
 004C 2094              com R2
 004E 25BA              out 0x15,R2
 0050                   .dbline 64
 0050           ;  rr =ADCH<<6;                                //高8位的信息
 0050 05B1              in R16,0x5
 0052 000F              lsl R16
 0054 000F              lsl R16
 0056 000F              lsl R16
 0058 000F              lsl R16
 005A 000F              lsl R16
 005C 000F              lsl R16
 005E                   .dbline 65
 005E           ;  rr ^=(0x03<<6);                             //反相
 005E 80EC              ldi R24,192
 0060 90E0              ldi R25,0
 0062 202E              mov R2,R16
 0064 3324              clr R3
 0066 2826              eor R2,R24
 0068 3926              eor R3,R25
 006A 022D              mov R16,R2
 006C                   .dbline 66
 006C           ;  PORTA=rr;                                   //在A口高2位显示
 006C 2BBA              out 0x1b,R2
 006E                   .dbline -2
 006E           L4:
 006E 2990              ld R2,y+
 0070 2FBE              out 0x3f,R2
 0072 9991              ld R25,y+
 0074 8991              ld R24,y+
 0076 1991              ld R17,y+
 0078 0991              ld R16,y+
 007A 3990              ld R3,y+
 007C 2990              ld R2,y+
 007E                   .dbline 0 ; func end
 007E 1895              reti
 0080                   .dbsym r rr 16 c
 0080                   .dbend
 0080                   .dbfunc e start_adc_0 _start_adc_0 fV
                        .even
 0080           _start_adc_0::
 0080                   .dbline -1
 0080                   .dbline 70
 0080           ; }
 0080           ; 
 0080           ; void start_adc_0(void)                       //启动ADC转换的程序
 0080           ; {
 0080                   .dbline 71
 0080           ;  ADMUX  = 0x00;                              //选择通道0
 0080 2224              clr R2
 0082 27B8              out 0x7,R2
 0084                   .dbline 72
 0084           ;  ADCSR |= 0x40;                              //开始ADC转换
 0084 369A              sbi 0x6,6
 0086                   .dbline -2
 0086           L5:
 0086                   .dbline 0 ; func end
 0086 0895              ret
 0088                   .dbend
 0088                   .dbfunc e spi_init _spi_init fV
                        .even
 0088           _spi_init::
 0088                   .dbline -1
 0088                   .dbline 78
 0088           ; }
 0088           ; 
 0088           ; //SPI initialize                             //初始化硬件SPIS口的程序
 0088           ; // clock rate: 2500000hz
 0088           ; void spi_init(void)
 0088           ; {
 0088                   .dbline 79
 0088           ;  SPCR = 0x50; //setup SPI
 0088 80E5              ldi R24,80
 008A 8DB9              out 0xd,R24
 008C                   .dbline 80
 008C           ;  SPSR = 0x00; //setup SPI
 008C 2224              clr R2
 008E 2EB8              out 0xe,R2
 0090                   .dbline -2
 0090           L6:
 0090                   .dbline 0 ; func end
 0090 0895              ret
 0092                   .dbend
 0092                   .dbfunc e SPI_595_Out _SPI_595_Out fV
 0092           ;              i -> R16
                        .even
 0092           _SPI_595_Out::
 0092                   .dbline -1
 0092                   .dbline 84
 0092           ; }
 0092           ; 
 0092           ; void SPI_595_Out(unsigned char i)            //HC595数据的输出 
 0092           ; { 
 0092                   .dbline 85
 0092           ; SPDR = i;       /* 启动数据传输 */ 
 0092 0FB9              out 0xf,R16
 0094           L8:
 0094                   .dbline 86
 0094           L9:
 0094                   .dbline 86
 0094           ; while (!(SPSR & (1<<SPIF)));                 //等待传输结束
 0094 779B              sbis 0xe,7
 0096 FECF              rjmp L8
 0098                   .dbline -2
 0098           L7:
 0098                   .dbline 0 ; func end
 0098 0895              ret
 009A                   .dbsym r i 16 c
 009A                   .dbend
 009A                   .dbfunc e disp_led _disp_led fV
 009A           ;              i -> R20
                        .even
 009A           _disp_led::
 009A 0E940000          xcall push_gset1
 009E 402F              mov R20,R16
 00A0                   .dbline -1
 00A0                   .dbline 90
 00A0           ; }
 00A0           ; 
 00A0           ; void disp_led(unsigned char i)
 00A0           ; {
 00A0                   .dbline 91
 00A0           ; PORTB &= ~(1 << PB4);              //准备锁存,在全部的四个LED数据送完后再锁存 
 00A0 C498              cbi 0x18,4
 00A2                   .dbline 92
 00A2           ; SPI_595_Out(i);                    
 00A2 042F              mov R16,R20
 00A4 F6DF              xcall _SPI_595_Out
 00A6                   .dbline 93
 00A6           ; PORTB |=  (1 << PB4);              //在这个时候锁存数据  显示
 00A6 C49A              sbi 0x18,4
 00A8                   .dbline -2
 00A8           L11:
 00A8 0E940000          xcall pop_gset1
 00AC                   .dbline 0 ; func end
 00AC 0895              ret
 00AE                   .dbsym r i 20 c
 00AE                   .dbend
 00AE                   .dbfunc e uart0_init _uart0_init fV
                        .even
 00AE           _uart0_init::
 00AE                   .dbline -1
 00AE                   .dbline 102
 00AE           ; }
 00AE           ; 
 00AE           ; //UART0 initialize                           //初始化串口0的程序
 00AE           ; // desired baud rate: 9600
 00AE           ; // actual: baud rate:9615 (0.2%)
 00AE           ; // char size: 8 bit   没有校验位
 00AE           ; // parity: Disabled
 00AE           ; void uart0_init(void)
 00AE           ; {
 00AE                   .dbline 103
 00AE           ;  UCSRB = 0x00;                               //disable while setting baud rate
 00AE 2224              clr R2
 00B0 2AB8              out 0xa,R2
 00B2                   .dbline 104
 00B2           ;  UCSRA = 0x00;
 00B2 2BB8              out 0xb,R2
 00B4                   .dbline 105
 00B4           ;  UCSRC = BIT(URSEL) | 0x06;
 00B4 86E8              ldi R24,134
 00B6 80BD              out 0x20,R24
 00B8                   .dbline 106
 00B8           ;  UBRRL = 0x40;                               //set baud rate lo

⌨️ 快捷键说明

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