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

📄 main.lst

📁 bootloader
💻 LST
📖 第 1 页 / 共 3 页
字号:
__start:
__text_start:
    0031 E5CF      LDI	R28,0x5F
    0032 E0D4      LDI	R29,4
    0033 BFCD      OUT	0x3D,R28
    0034 BFDE      OUT	0x3E,R29
    0035 51C0      SUBI	R28,0x10
    0036 40D0      SBCI	R29,0
    0037 EA0A      LDI	R16,0xAA
    0038 8308      STD	Y+0,R16
    0039 2400      CLR	R0
    003A E6ED      LDI	R30,0x6D
    003B E0F0      LDI	R31,0
    003C E010      LDI	R17,0
    003D 38E9      CPI	R30,0x89
    003E 07F1      CPC	R31,R17
    003F F011      BEQ	0x0042
    0040 9201      ST	R0,Z+
    0041 CFFB      RJMP	0x003D
    0042 8300      STD	Z+0,R16
    0043 E5E4      LDI	R30,0x54
    0044 E0F0      LDI	R31,0
    0045 E6A0      LDI	R26,0x60
    0046 E0B0      LDI	R27,0
    0047 E010      LDI	R17,0
    0048 36E1      CPI	R30,0x61
    0049 07F1      CPC	R31,R17
    004A F021      BEQ	0x004F
    004B 95C8      LPM
    004C 9631      ADIW	R30,1
    004D 920D      ST	R0,X+
    004E CFF9      RJMP	0x0048
    004F 940E007A  CALL	_main
_exit:
    0051 CFFF      RJMP	_exit
FILE: D:\桌面\avr程序设计\串口通讯范例\main.c
(0001) //ICC-AVR application builder : 2006-11-11 12:55:39
(0002) // Target : M16
(0003) // Crystal: 7.3728Mhz
(0004) 
(0005) #include "config.h"
(0006) 
(0007) void port_init(void)
(0008) {
(0009)  PORTA = 0x03;
_port_init:
    0052 E083      LDI	R24,3
    0053 BB8B      OUT	0x1B,R24
(0010)  DDRA  = 0x03;
    0054 BB8A      OUT	0x1A,R24
(0011)  PORTB = 0x00;
    0055 2422      CLR	R2
    0056 BA28      OUT	0x18,R2
(0012)  DDRB  = 0x00;
    0057 BA27      OUT	0x17,R2
(0013)  PORTC = 0x00; //m103 output only
    0058 BA25      OUT	0x15,R2
(0014)  DDRC  = 0x00;
    0059 BA24      OUT	0x14,R2
(0015)  PORTD = 0x00;
    005A BA22      OUT	0x12,R2
(0016)  DDRD  = 0x00;
    005B BA21      OUT	0x11,R2
    005C 9508      RET
(0017) }
(0018) 
(0019) //call this routine to initialize all peripherals
(0020) void init_devices(void)
(0021) {
(0022)  //stop errant interrupts until set up
(0023)  CLI(); //disable all interrupts
_init_devices:
    005D 94F8      BCLR	7
(0024)  port_init();
    005E DFF3      RCALL	_port_init
(0025) 
(0026)  MCUCR = 0x00;
    005F 2422      CLR	R2
    0060 BE25      OUT	0x35,R2
(0027)  GICR  = 0x00;
    0061 BE2B      OUT	0x3B,R2
(0028)  TIMSK = 0x00; //timer interrupt sources
    0062 BE29      OUT	0x39,R2
(0029)  Com_init();  //串行口初始化
    0063 940E00C3  CALL	_Com_init
(0030)  SEI(); //re-enable interrupts
    0065 9478      BSET	7
    0066 9508      RET
(0031)  //all peripherals are now initialized
(0032) }
(0033) 
(0034) void Delay(void)  //软件延时
(0035) {
(0036)  unsigned char i,j;
(0037)   for(i=200;i>0;i--)
_Delay:
  i                    --> R16
  j                    --> R18
    0067 EC08      LDI	R16,0xC8
    0068 C00D      RJMP	0x0076
(0038)    {
(0039)    	for(j=200;j>0;j--)
    0069 EC28      LDI	R18,0xC8
    006A C001      RJMP	0x006C
    006B 952A      DEC	R18
    006C 2422      CLR	R2
    006D 1622      CP	R2,R18
    006E F3E0      BCS	0x006B
(0040) 	;
(0041) 	for(j=200;j>0;j--)
    006F EC28      LDI	R18,0xC8
    0070 C001      RJMP	0x0072
    0071 952A      DEC	R18
    0072 2422      CLR	R2
    0073 1622      CP	R2,R18
    0074 F3E0      BCS	0x0071
    0075 950A      DEC	R16
    0076 2422      CLR	R2
    0077 1620      CP	R2,R16
    0078 F380      BCS	0x0069
    0079 9508      RET
_main:
  SIO_buff             --> Y+2
    007A 9726      SBIW	R28,6
(0042) 	;
(0043)    }
(0044) }
(0045) 
(0046) void main(void)
(0047) {
(0048)   uint8 SIO_buff[4];  //定义串口数据缓冲区
(0049)   init_devices();
    007B DFE1      RCALL	_init_devices
(0050)   //指示单片机正常开始工作,一亮,二亮,都亮,都灭
(0051)   PORTA = 0x02;       //1脚为高,0脚为低,0脚灯亮
    007C E082      LDI	R24,2
    007D BB8B      OUT	0x1B,R24
(0052)   Delay();           //延时
    007E DFE8      RCALL	_Delay
(0053)   PORTA = 0x01;	     //0脚为高,1脚为低,1脚灯亮
    007F E081      LDI	R24,1
    0080 BB8B      OUT	0x1B,R24
(0054)   Delay();           //延时
    0081 DFE5      RCALL	_Delay
(0055)   PORTA = 0x00;      //同时亮
    0082 2422      CLR	R2
    0083 BA2B      OUT	0x1B,R2
(0056)   Delay();           //延时
    0084 DFE2      RCALL	_Delay
(0057)   PORTA = 0x03;      //同时灭
    0085 E083      LDI	R24,3
    0086 BB8B      OUT	0x1B,R24
(0058)   
(0059)   Com_putstring ("ww",2,&RTbuf_UART0); //输出一个字符串到串行口
    0087 E68D      LDI	R24,0x6D
    0088 E090      LDI	R25,0
    0089 8399      STD	Y+1,R25
    008A 8388      STD	Y+0,R24
    008B E022      LDI	R18,2
    008C E60A      LDI	R16,0x6A
    008D E010      LDI	R17,0
    008E 940E0113  CALL	_Com_putstring
    0090 C02F      RJMP	0x00C0
(0060) 
(0061)   while(1)
(0062)   {
(0063)    if(Com_R_count(&RTbuf_UART0)!=0)
    0091 E60D      LDI	R16,0x6D
    0092 E010      LDI	R17,0
    0093 940E0173  CALL	_Com_R_count
    0095 2300      TST	R16
    0096 F0F9      BEQ	0x00B6
(0064)      {
(0065) 	     Com_getstring (SIO_buff,1,&RTbuf_UART0);
    0097 E68D      LDI	R24,0x6D
    0098 E090      LDI	R25,0
    0099 8399      STD	Y+1,R25
    009A 8388      STD	Y+0,R24
    009B E021      LDI	R18,1
    009C 018E      MOVW	R16,R28
    009D 5F0E      SUBI	R16,0xFE
    009E 4F1F      SBCI	R17,0xFF
    009F 940E014D  CALL	_Com_getstring
(0066) 		 Com_Rbuf_Clear(&RTbuf_UART0); //清空buffer
    00A1 E60D      LDI	R16,0x6D
    00A2 E010      LDI	R17,0
    00A3 940E0145  CALL	_Com_Rbuf_Clear
(0067) 		 if(SIO_buff[0]==1)  //接收到一个一
    00A5 818A      LDD	R24,Y+2
    00A6 3081      CPI	R24,1
    00A7 F471      BNE	0x00B6
(0068) 		 {
(0069) 		    Com_putstring ("ok!!",4,&RTbuf_UART0); //输出一个字符串到串行口
    00A8 E68D      LDI	R24,0x6D
    00A9 E090      LDI	R25,0
    00AA 8399      STD	Y+1,R25
    00AB 8388      STD	Y+0,R24
    00AC E024      LDI	R18,4
    00AD E605      LDI	R16,0x65
    00AE E010      LDI	R17,0
    00AF 940E0113  CALL	_Com_putstring
(0070) 		    PORTA = 0x00;      //同时亮
    00B1 2422      CLR	R2
    00B2 BA2B      OUT	0x1B,R2
(0071) 			Delay();           //延时
    00B3 DFB3      RCALL	_Delay
(0072) 			PORTA = 0x03;      //同时灭
    00B4 E083      LDI	R24,3
    00B5 BB8B      OUT	0x1B,R24
(0073) 		 }
(0074)      } //end of if(Com_R_count(&RTbuf_UART0)!=0)
(0075)    Delay();//延时
    00B6 DFB0      RCALL	_Delay
(0076)    Com_putstring ("ww00",4,&RTbuf_UART0); //输出一个字符串到串行口
    00B7 E68D      LDI	R24,0x6D
    00B8 E090      LDI	R25,0
    00B9 8399      STD	Y+1,R25
    00BA 8388      STD	Y+0,R24
    00BB E024      LDI	R18,4
    00BC E600      LDI	R16,0x60
    00BD E010      LDI	R17,0
    00BE 940E0113  CALL	_Com_putstring
    00C0 CFD0      RJMP	0x0091
    00C1 9626      ADIW	R28,6
    00C2 9508      RET
FILE: D:\桌面\avr程序设计\串口通讯范例\sio.c
(0001) 
(0002) 
(0003) #include "config.h"
(0004) 
(0005) #if USEUART0
(0006) siocirqueue RTbuf_UART0;
(0007) #endif
(0008) #if USEUART1
(0009) siocirqueue RTbuf_UART1;
(0010) #endif
(0011) 
(0012) 
(0013) 
(0014) #if (CPU_TYPE == M32)||(CPU_TYPE == M16)||(CPU_TYPE == M8)
(0015) #define USEUART0  TRUE
(0016) #define USEUART1  FALSE
(0017) #define iv_USART0_RXC   iv_USART_RXC
(0018) #define iv_USART0_TXC   iv_USART_TXC
(0019) #define UDR0  	  UDR 
(0020) #define UCSR0A    UCSRA
(0021) #define UCSR0B    UCSRB
(0022) #define UCSR0C	  UCSRC
(0023) #define UBRR0H	  UBRRH
(0024) #define UBRR0L	  UBRRL
(0025) #define RXCIE0	  RXCIE
(0026) #define TXCIE0	  TXCIE
(0027) #endif
(0028) 
(0029) 
(0030) /*********************************************************************************************************
(0031) ** 函数名称: Com_init
(0032) ** 功能描述: 初始化串行口
(0033) ** 输 入: 
(0034) ** 全局变量: 无
(0035) ** 调用模块: Com_baudrate
(0036) ** 说明:
(0037) ** 注意:
(0038) ********************************************************************************************************/
(0039) void Com_init (void) {	
(0040) //WDR(); //喂狗 
(0041) //CLI();                     // 关中断
(0042) #if USEUART0
(0043) Tbuf_init(&RTbuf_UART0);              //初始化接收缓冲
_Com_init:
    00C3 E60D      LDI	R16,0x6D
    00C4 E010      LDI	R17,0
    00C5 D0B9      RCALL	_Tbuf_init
(0044) Rbuf_init(&RTbuf_UART0);
    00C6 E60D      LDI	R16,0x6D
    00C7 E010      LDI	R17,0
    00C8 D0AD      RCALL	_Rbuf_init
(0045) UCSR0B = 0x00; //disable while setting baud rate
    00C9 2422      CLR	R2
    00CA B82A      OUT	0x0A,R2
(0046) UCSR0A=0x00;
    00CB B82B      OUT	0x0B,R2
(0047) 
(0048) #if CPU_TYPE <= M32
(0049) UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
    00CC E886      LDI	R24,0x86
    00CD BD80      OUT	0x20,R24
(0050) UCSR0B = (1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN);  // RXCIE=1;TXCIE=1;UDREIE=0;RXEN=1;TXEN=1
    00CE ED88      LDI	R24,0xD8
    00CF B98A      OUT	0x0A,R24
(0051) #else
(0052) UCSR0C=0x06;  //8 DATA ,1 STOP, NO PARITY
(0053) UCSR0B = (1<<RXCIE0)|(1<<TXCIE0)|(1<<RXEN0)|(1<<TXEN0);  // RXCIE=1;TXCIE=1;UDREIE=0;RXEN=1;TXEN=1
(0054) #endif
(0055) 
(0056) #endif
(0057) 
(0058) 
(0059) #if USEUART1
(0060) Tbuf_init(&RTbuf_B);              //初始化接收缓冲
(0061) Rbuf_init(&RTbuf_B);
(0062) UCSR1B = 0x00; //disable while setting baud rate
(0063) UCSR1A = 0x00;
(0064) UCSR1C = 0x06;
(0065) UCSR1B = 0xD8;
(0066) #endif
(0067) Com_baudrate (9600);		 // 
    00D0 E800      LDI	R16,0x80
    00D1 E215      LDI	R17,0x25
    00D2 D001      RCALL	_Com_baudrate
    00D3 9508      RET
_Com_baudrate:
  tmp                  --> R10
  baudrate             --> R10
    00D4 940E0314  CALL	push_gset3
    00D6 0158      MOVW	R10,R16
(0068) 
(0069) //SEI();                     // 开中断
(0070) }
(0071) /*********************************************************************************************************
(0072) ** 函数名称: Com_baudrate
(0073) ** 功能描述: 利用定时器T1产生由参数baudrate指定的波特率
(0074) ** 输 入: baudrate指定的波特率
(0075) ** 全局变量: 无
(0076) ** 调用模块: 无
(0077) ** 说明:
(0078) ** 注意:
(0079) ********************************************************************************************************/
(0080) void Com_baudrate (uint16 baudrate) {
(0081) uint16 tmp;
(0082) tmp= F_CPU/baudrate/16-1;
    00D7 0115      MOVW	R2,R10
    00D8 2444      CLR	R4
    00D9 2455      CLR	R5
    00DA E040      LDI	R20,0
    00DB E850      LDI	R21,0x80
    00DC E760      LDI	R22,0x70
    00DD E070      LDI	R23,0
    00DE 925A      ST	R5,-Y
    00DF 924A      ST	R4,-Y
    00E0 923A      ST	R3,-Y
    00E1 922A      ST	R2,-Y
    00E2 018A      MOVW	R16,R20
    00E3 019B      MOVW	R18,R22
    00E4 940E0284  CALL	div32s
    00E6 E140      LDI	R20,0x10
    00E7 E050      LDI	R21,0
    00E8 E060      LDI	R22,0
    00E9 E070      LDI	R23,0
    00EA 937A      ST	R23,-Y
    00EB 936A      ST	R22,-Y
    00EC 935A      ST	R21,-Y
    00ED 934A      ST	R20,-Y
    00EE 940E0284  CALL	div32s
    00F0 0118      MOVW	R2,R16
    00F1 0129      MOVW	R4,R18
    00F2 E041      LDI	R20,1
    00F3 E050      LDI	R21,0
    00F4 E060      LDI	R22,0
    00F5 E070      LDI	R23,0
    00F6 1A24      SUB	R2,R20
    00F7 0A35      SBC	R3,R21
    00F8 0A46      SBC	R4,R22
    00F9 0A57      SBC	R5,R23
    00FA 0151      MOVW	R10,R2
(0083) #if USEUART0
(0084) UBRR0H=(uint8)(tmp>>8);
    00FB 2C23      MOV	R2,R3
    00FC 2433      CLR	R3
    00FD BC20      OUT	0x20,R2
(0085) UBRR0L=(uint8)tmp;
    00FE B8A9      OUT	0x09,R10
    00FF 940E030A  CALL	pop_gset3
    0101 9508      RET
_Com_putchar:
  RTbuf                --> R22
  c                    --> R20
    0102 940E0316  CALL	push_gset2
    0104 01B9      MOVW	R22,R18
    0105 2F40      MOV	R20,R16
(0086) #endif
(0087) #if USEUART1
(0088) UBRR1H=(uint8)(tmp>>8);
(0089) UBRR1L=(uint8)tmp;
(0090) #endif
(0091) }
(0092) /*********************************************************************************************************
(0093) ** 函数名称: Com_putchar
(0094) ** 功能描述: 从串行口输出一个字符c
(0095) ** 输 入: c:输出字符
(0096) ** 输出	 : 0:失败 1:成功
(0097) ** 全局变量: 无
(0098) ** 调用模块: 
(0099) ** 说明:
(0100) ** 注意:
(0101) ********************************************************************************************************/
(0102) uint8 Com_putchar (uint8 c,siocirqueue *RTbuf) {
(0103) //WDR(); //喂狗
(0104) if (Tbuf_full(RTbuf)) 
    0106 018B      MOVW	R16,R22
    0107 D091      RCALL	_Tbuf_full
    0108 2300      TST	R16
    0109 F011      BEQ	0x010C
(0105)    return(0);
    010A 2700      CLR	R16
    010B C004      RJMP	0x0110
(0106) else{
(0107) 	Tbuf_putchar(c,RTbuf);				// 将数据加入到发送缓冲区并开中断
    010C 019B      MOVW	R18,R22
    010D 2F04      MOV	R16,R20
    010E D099      RCALL	_Tbuf_putchar
(0108) 	return(1);
    010F E001      LDI	R16,1
    0110 940E0307  CALL	pop_gset2
    0112 9508      RET
_Com_putstring:
  i                    --> R12
  RTbuf                --> R22
  len                  --> R10
  p                    --> R20
    0113 940E0312  CALL	push_gset4
    0115 2EA2      MOV	R10,R18
    0116 01A8      MOVW	R20,R16
    0117 8568      LDD	R22,Y+8
    0118 8579      LDD	R23,Y+9
(0109) 	}
(0110) }
(0111) /*********************************************************************************************************
(0112) ** 函数名称: Com_putstring
(0113) ** 功能描述: 从串行口输出一个字符串
(0114) ** 输 入: p:指向输出字符串 len:输出长度
(0115) ** 输出	 : 
(0116) ** 全局变量: 无
(0117) ** 调用模块: 
(0118) ** 说明:
(0119) ** 注意:
(0120) ********************************************************************************************************/
(0121) void Com_putstring (uint8 *p,uint8 len,siocirqueue *RTbuf) {
(0122) uint8 i;
(0123) //WDR(); //喂狗
(0124) if (len!=0 ){
    0119 20AA      TST	R10
    011A F079      BEQ	0x012A
(0125) 	for(i=0;i<len;i++)

⌨️ 快捷键说明

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