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

📄 main.lst

📁 AVR试验板程序,有LED,键盘和串口的程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
__text_start:
__start:
    0030 E5CF      LDI	R28,0x5F
    0031 E0D4      LDI	R29,4
    0032 BFCD      OUT	0x3D,R28
    0033 BFDE      OUT	0x3E,R29
    0034 51C0      SUBI	R28,0x10
    0035 40D0      SBCI	R29,0
    0036 EA0A      LDI	R16,0xAA
    0037 8308      STD	Y+0,R16
    0038 2400      CLR	R0
    0039 E6E2      LDI	R30,0x62
    003A E0F0      LDI	R31,0
    003B E010      LDI	R17,0
    003C 36E5      CPI	R30,0x65
    003D 07F1      CPC	R31,R17
    003E F011      BEQ	0x0041
    003F 9201      ST	R0,Z+
    0040 CFFB      RJMP	0x003C
    0041 8300      STD	Z+0,R16
    0042 E5EE      LDI	R30,0x5E
    0043 E0F0      LDI	R31,0
    0044 E6A0      LDI	R26,0x60
    0045 E0B0      LDI	R27,0
    0046 E010      LDI	R17,0
    0047 36E0      CPI	R30,0x60
    0048 07F1      CPC	R31,R17
    0049 F021      BEQ	0x004E
    004A 95C8      LPM
    004B 9631      ADIW	R30,1
    004C 920D      ST	R0,X+
    004D CFF9      RJMP	0x0047
    004E 940E01B2  CALL	_main
_exit:
    0050 CFFF      RJMP	_exit
FILE: E:\work\百步梯攀登计划\AVR程序\new\main.c
(0001) //ICC-AVR application builder : 2007-2-22 12:20:11
(0002) // Target : M16
(0003) // Crystal: 10.000Mhz
(0004) 
(0005) #include <iom16v.h>
(0006) #include <macros.h>
(0007) 
(0008) unsigned char tmp_cn_0;                     //临时计数器——0
(0009) unsigned char tmp_cn_1;                     //临时计数器——1
(0010) unsigned char led_ch=0x80;                  //闪烁的花样
(0011) unsigned char key_code;                     //键盘按下的键盘代码
(0012) unsigned char tmp_led_index=0x00;
(0013) unsigned char const LED_INDEX[]={0X3F,0X06,0X5B,0X4F,
(0014)                                  0X66,0X6D,0X7D,0X07,
(0015)                                  0X7F,0X6F};//共阴管的数字0-9的代码
(0016) void port_init(void)
(0017) {
(0018)  PORTA = 0xC0; 
_port_init:
    0051 EC80      LDI	R24,0xC0
    0052 BB8B      OUT	0x1B,R24
(0019)  DDRA  = 0xC0; //高2位作为10位ADC的MSB,低2位用外部ADC输入,其余用于键盘的输入
    0053 BB8A      OUT	0x1A,R24
(0020)  PORTB = 0xFF;
    0054 EF8F      LDI	R24,0xFF
    0055 BB88      OUT	0x18,R24
(0021)  DDRB  = 0xFF; //驱动静态595显示,只用到高4位,低四位保留
    0056 BB87      OUT	0x17,R24
(0022)  PORTC = 0xFF; //m103 output only
    0057 BB85      OUT	0x15,R24
(0023)  DDRC  = 0xFF; //ADC的低8位输出
    0058 BB84      OUT	0x14,R24
(0024)  PORTD = 0xFF;
    0059 BB82      OUT	0x12,R24
(0025)  DDRD  = 0xFF; //高6位用于显示LED,低2位用于串口的输出。
    005A BB81      OUT	0x11,R24
    005B 9508      RET
(0026) }
(0027) 
(0028) 
(0029) //TIMER0 initialize - prescale:256      
(0030) // WGM: Normal
(0031) // desired value: 2mSec
(0032) // actual value:  1.997mSec (0.2%)
(0033) void timer0_init(void)                       //硬件计数器0的初始化程序
(0034) {
(0035)  TCCR0 = 0x00; //stop
_timer0_init:
    005C 2422      CLR	R2
    005D BE23      OUT	0x33,R2
(0036)  TCNT0 = 0xB2; //set count
    005E EB82      LDI	R24,0xB2
    005F BF82      OUT	0x32,R24
(0037)  OCR0  = 0x4E;  //set compare
    0060 E48E      LDI	R24,0x4E
    0061 BF8C      OUT	0x3C,R24
(0038)  TCCR0 = 0x04; //start timer
    0062 E084      LDI	R24,4
    0063 BF83      OUT	0x33,R24
    0064 9508      RET
(0039) }
(0040) 
(0041) /*-----------------------ADC转换初始化----------------------------------------*/
(0042) //ADC initialize
(0043) // Conversion time: 26uS
(0044) void adc_init(void)
(0045) {
(0046)  ADCSR = 0x00;                               //disable adc
_adc_init:
    0065 2422      CLR	R2
    0066 B826      OUT	0x06,R2
(0047)  ADMUX = 0x00;                               //选择外部基准电压 通道 0 输入
    0067 B827      OUT	0x07,R2
(0048)  ACSR  = 0xC0;                               //模拟比较器控制和状态寄存器 ACSR
    0068 EC80      LDI	R24,0xC0
    0069 B988      OUT	0x08,R24
(0049)                                              //ACD置1,使模拟比较器禁用
(0050)  /*--ACD--ACBG--ACO--ACI---ACIE---ACIC---ACIS1---ACIS0------------------------*/
(0051)  /*-模拟比较起禁用--模拟比较器的能隙基准源--模拟比较起输出--模拟比较器中断标志*/
(0052)  /*-模拟比较器中断使能--模拟比较器输入捕捉使能--模拟比较器中断模式选择--------*/
(0053)  ADCSR = 0x8B;//模拟比较起控制和状态寄存器
    006A E88B      LDI	R24,0x8B
    006B B986      OUT	0x06,R24
    006C 9508      RET
_adc_isr:
  rr                   --> R16
    006D 922A      ST	R2,-Y
    006E 923A      ST	R3,-Y
    006F 930A      ST	R16,-Y
    0070 931A      ST	R17,-Y
    0071 938A      ST	R24,-Y
    0072 939A      ST	R25,-Y
    0073 B62F      IN	R2,0x3F
    0074 922A      ST	R2,-Y
(0054)  /*-----------ADEN---ADSC---ADFR---ADIF---ADIE---ADPS2---ADPS1---ADPS0--------*/
(0055)  //使能模数转换 ADC开始转换 ADC连续转换  ADC中断使能  128分频
(0056) }
(0057) /*-----------------------ADC转换中断程序--------------------------------------*/
(0058) #pragma interrupt_handler adc_isr:15
(0059) void adc_isr(void)                           //组合输出ADC DATA
(0060) {
(0061)  unsigned char rr=0;
    0075 2700      CLR	R16
(0062)  //conversion complete, read value (int) using...
(0063)  PORTC=~(ADCL);                              //c口显示低8位的信息 (反相)
    0076 B024      IN	R2,0x04
    0077 9420      COM	R2
    0078 BA25      OUT	0x15,R2
(0064)  rr =ADCH<<6;                                //高8位的信息
    0079 B105      IN	R16,0x05
    007A 0F00      LSL	R16
    007B 0F00      LSL	R16
    007C 0F00      LSL	R16
    007D 0F00      LSL	R16
    007E 0F00      LSL	R16
    007F 0F00      LSL	R16
(0065)  rr ^=(0x03<<6);                             //反相
    0080 EC80      LDI	R24,0xC0
    0081 E090      LDI	R25,0
    0082 2E20      MOV	R2,R16
    0083 2433      CLR	R3
    0084 2628      EOR	R2,R24
    0085 2639      EOR	R3,R25
    0086 2D02      MOV	R16,R2
(0066)  PORTA=rr;                                   //在A口高2位显示
    0087 BA2B      OUT	0x1B,R2
    0088 9029      LD	R2,Y+
    0089 BE2F      OUT	0x3F,R2
    008A 9199      LD	R25,Y+
    008B 9189      LD	R24,Y+
    008C 9119      LD	R17,Y+
    008D 9109      LD	R16,Y+
    008E 9039      LD	R3,Y+
    008F 9029      LD	R2,Y+
    0090 9518      RETI
(0067) }
(0068) 
(0069) void start_adc_0(void)                       //启动ADC转换的程序
(0070) {
(0071)  ADMUX  = 0x00;                              //选择通道0
_start_adc_0:
    0091 2422      CLR	R2
    0092 B827      OUT	0x07,R2
(0072)  ADCSR |= 0x40;                              //开始ADC转换
    0093 9A36      SBI	0x06,6
    0094 9508      RET
(0073) }
(0074) 
(0075) //SPI initialize                             //初始化硬件SPIS口的程序
(0076) // clock rate: 2500000hz
(0077) void spi_init(void)
(0078) {
(0079)  SPCR = 0x50; //setup SPI
_spi_init:
    0095 E580      LDI	R24,0x50
    0096 B98D      OUT	0x0D,R24
(0080)  SPSR = 0x00; //setup SPI
    0097 2422      CLR	R2
    0098 B82E      OUT	0x0E,R2
    0099 9508      RET
(0081) }
(0082) 
(0083) void SPI_595_Out(unsigned char i)            //HC595数据的输出 
(0084) { 
(0085) SPDR = i;       /* 启动数据传输 */ 
_SPI_595_Out:
  i                    --> R16
    009A B90F      OUT	0x0F,R16
(0086) while (!(SPSR & (1<<SPIF)));                 //等待传输结束
    009B 9B77      SBIS	0x0E,7
    009C CFFE      RJMP	0x009B
    009D 9508      RET
_disp_led:
  i                    --> R20
    009E 940E01C6  CALL	push_gset1
    00A0 2F40      MOV	R20,R16
(0087) }
(0088) 
(0089) void disp_led(unsigned char i)
(0090) {
(0091) PORTB &= ~(1 << PB4);              //准备锁存,在全部的四个LED数据送完后再锁存 
    00A1 98C4      CBI	0x18,4
(0092) SPI_595_Out(i);                    
    00A2 2F04      MOV	R16,R20
    00A3 DFF6      RCALL	_SPI_595_Out
(0093) PORTB |=  (1 << PB4);              //在这个时候锁存数据  显示
    00A4 9AC4      SBI	0x18,4
    00A5 940E01C9  CALL	pop_gset1
    00A7 9508      RET
(0094) }
(0095) 
(0096) //UART0 initialize                           //初始化串口0的程序
(0097) // desired baud rate: 9600
(0098) // actual: baud rate:9615 (0.2%)
(0099) // char size: 8 bit   没有校验位
(0100) // parity: Disabled
(0101) void uart0_init(void)
(0102) {
(0103)  UCSRB = 0x00;                               //disable while setting baud rate
_uart0_init:
    00A8 2422      CLR	R2
    00A9 B82A      OUT	0x0A,R2
(0104)  UCSRA = 0x00;
    00AA B82B      OUT	0x0B,R2
(0105)  UCSRC = BIT(URSEL) | 0x06;
    00AB E886      LDI	R24,0x86
    00AC BD80      OUT	0x20,R24
(0106)  UBRRL = 0x40;                               //set baud rate lo
    00AD E480      LDI	R24,0x40
    00AE B989      OUT	0x09,R24
(0107)  UBRRH = 0x00;                               //set baud rate hi
    00AF BC20      OUT	0x20,R2
(0108)  UCSRB = 0x98;
    00B0 E988      LDI	R24,0x98
    00B1 B98A      OUT	0x0A,R24
    00B2 9508      RET
(0109) }
(0110) 
(0111) void USART_Transmit( unsigned char data )
(0112) {
(0113) 
(0114) while ( !( UCSRA & (1<<UDRE)) )              // 等待发送缓冲器为空
_USART_Transmit:
  data                 --> R16
    00B3 9B5D      SBIS	0x0B,5
    00B4 CFFE      RJMP	_USART_Transmit
(0115) ; 
(0116) UDR = data;                                  //将数据放入缓冲器,发送数据
    00B5 B90C      OUT	0x0C,R16
    00B6 9508      RET
(0117) }
(0118) 
(0119) unsigned char USART_Receive(void)            //使用中断接受时不用此函数
(0120) {
(0121) while ( !(UCSRA & (1<<RXC)) )                // 等待接收数据
_USART_Receive:
    00B7 9B5F      SBIS	0x0B,7
    00B8 CFFE      RJMP	_USART_Receive
(0122) ;
(0123) return UDR;                                  // 从缓冲器中获取并返回数据
    00B9 B10C      IN	R16,0x0C
    00BA 9508      RET
_uart0_rx_isr:
    00BB 940E01DD  CALL	push_lset
(0124) }
(0125) 
(0126) #pragma interrupt_handler uart0_rx_isr:12    
(0127) void uart0_rx_isr(void)                      //串口0的中断服务程序
(0128) {
(0129)  USART_Transmit(UDR);                        //把接收到的数据重新发回给PC机 
    00BD B10C      IN	R16,0x0C
    00BE DFF4      RCALL	_USART_Transmit
    00BF 940E01F4  CALL	pop_lset
    00C1 9518      RETI
(0130) }
(0131) 
(0132) 
(0133) //call this routine to initialize all peripherals
(0134) void init_devices(void)
(0135) {
(0136)  //stop errant interrupts until set up
(0137)  CLI(); //disable all interrupts
_init_devices:
    00C2 94F8      BCLR	7
(0138)  port_init();
    00C3 DF8D      RCALL	_port_init
(0139)  timer0_init();
    00C4 DF97      RCALL	_timer0_init
(0140)  uart0_init();
    00C5 DFE2      RCALL	_uart0_init
(0141)  spi_init();
    00C6 DFCE      RCALL	_spi_init
(0142)  adc_init();
    00C7 DF9D      RCALL	_adc_init
(0143)  MCUCR = 0x00;
    00C8 2422      CLR	R2
    00C9 BE25      OUT	0x35,R2
(0144)  GICR  = 0x00;
    00CA BE2B      OUT	0x3B,R2
(0145)  ASSR &= ~(0X08);
    00CB B582      IN	R24,0x22
    00CC 7F87      ANDI	R24,0xF7
    00CD BD82      OUT	0x22,R24
(0146)  TIMSK = 0x01; //timer interrupt sources
    00CE E081      LDI	R24,1
    00CF BF89      OUT	0x39,R24
(0147)  SEI(); //re-enable interrupts
    00D0 9478      BSET	7
    00D1 9508      RET
(0148)  //all peripherals are now initialized
(0149) }
(0150) 
(0151) 
(0152) void flash_led_type1(void)                    //PD口的跑马灯显示  从右到左
(0153) {
(0154) if (led_ch==0x02) led_ch=0x80;
_flash_led_type1:
    00D2 91800060  LDS	R24,led_ch
    00D4 3082      CPI	R24,2
    00D5 F419      BNE	0x00D9
    00D6 E880      LDI	R24,0x80
    00D7 93800060  STS	led_ch,R24
(0155) PORTD=~(led_ch);      
    00D9 90200060  LDS	R2,led_ch
    00DB 9420      COM	R2
    00DC BA22      OUT	0x12,R2
(0156) led_ch=led_ch>>1;
    00DD 90200060  LDS	R2,led_ch
    00DF 9426      LSR	R2
    00E0 92200060  STS	led_ch,R2
    00E2 9508      RET
(0157) }
(0158) 
(0159) void flash_led_type2(void)                    //PD口的跑马灯显示  从左到右
(0160) {
(0161) if (led_ch==0x00) led_ch=0x02;
_flash_led_type2:
    00E3 90200060  LDS	R2,led_ch
    00E5 2022      TST	R2
    00E6 F419      BNE	0x00EA
    00E7 E082      LDI	R24,2
    00E8 93800060  STS	led_ch,R24
(0162) PORTD=~(led_ch);      
    00EA 90200060  LDS	R2,led_ch
    00EC 9420      COM	R2
    00ED BA22      OUT	0x12,R2
(0163) led_ch=led_ch<<1;
    00EE 90200060  LDS	R2,led_ch
    00F0 0C22      LSL	R2
    00F1 92200060  STS	led_ch,R2
    00F3 9508      RET
(0164) }
(0165) 
(0166) void flash_led_type3(void)                    //PD口的跑马灯显示  反相
(0167) {
(0168) PORTD^=0XFC;                    
_flash_led_type3:
    00F4 EF8C      LDI	R24,0xFC
    00F5 E090      LDI	R25,0
    00F6 B222      IN	R2,0x12

⌨️ 快捷键说明

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