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

📄 main.lst

📁 一个关于AVR单片机的例程
💻 LST
字号:
__text_start:
__start:
    0035 E5CF      LDI	R28,0x5F
    0036 E0D4      LDI	R29,4
    0037 BFCD      OUT	0x3D,R28
    0038 BFDE      OUT	0x3E,R29
    0039 51C0      SUBI	R28,0x10
    003A 40D0      SBCI	R29,0
    003B EA0A      LDI	R16,0xAA
    003C 8308      STD	Y+0,R16
    003D 2400      CLR	R0
    003E E6E0      LDI	R30,0x60
    003F E0F0      LDI	R31,0
    0040 E010      LDI	R17,0
    0041 36E0      CPI	R30,0x60
    0042 07F1      CPC	R31,R17
    0043 F011      BEQ	0x0046
    0044 9201      ST	R0,Z+
    0045 CFFB      RJMP	0x0041
    0046 8300      STD	Z+0,R16
    0047 E6E9      LDI	R30,0x69
    0048 E0F0      LDI	R31,0
    0049 E6A0      LDI	R26,0x60
    004A E0B0      LDI	R27,0
    004B E010      LDI	R17,0
    004C 36E9      CPI	R30,0x69
    004D 07F1      CPC	R31,R17
    004E F021      BEQ	0x0053
    004F 95C8      LPM
    0050 9631      ADIW	R30,1
    0051 920D      ST	R0,X+
    0052 CFF9      RJMP	0x004C
    0053 940E00B0  CALL	_main
_exit:
    0055 CFFF      RJMP	_exit
_USART_Init:
  tmp                  --> R10
  baud                 --> R10
    0056 940E014E  CALL	push_gset3
    0058 0158      MOVW	R10,R16
FILE: E:\avr\usart_mega16\main.c
(0001) // ICC-AVR application builder : 2007-5-20 17:21:25
(0002) // Target : M16
(0003) // Crystal: 7.3728Mhz
(0004) // AVR mega16 串口测试
(0005) 
(0006) #include <iom16v.h>
(0007) #include <macros.h>
(0008) 
(0009) #define F_CPU 7372800
(0010) const unsigned char buffer[]="http://www.avrvi.com";
(0011) 
(0012) //下面三个函数直接从数据手册上拷贝过来的
(0013) 
(0014) void USART_Init( unsigned int baud )
(0015) {
(0016) unsigned int tmp;
(0017) /* 设置波特率*/
(0018) tmp= F_CPU/baud/16-1;
    0059 0115      MOVW	R2,R10
    005A 2444      CLR	R4
    005B 2455      CLR	R5
    005C E040      LDI	R20,0
    005D E850      LDI	R21,0x80
    005E E760      LDI	R22,0x70
    005F E070      LDI	R23,0
    0060 925A      ST	R5,-Y
    0061 924A      ST	R4,-Y
    0062 923A      ST	R3,-Y
    0063 922A      ST	R2,-Y
    0064 018A      MOVW	R16,R20
    0065 019B      MOVW	R18,R22
    0066 940E00DC  CALL	div32s
    0068 E140      LDI	R20,0x10
    0069 E050      LDI	R21,0
    006A E060      LDI	R22,0
    006B E070      LDI	R23,0
    006C 937A      ST	R23,-Y
    006D 936A      ST	R22,-Y
    006E 935A      ST	R21,-Y
    006F 934A      ST	R20,-Y
    0070 940E00DC  CALL	div32s
    0072 0118      MOVW	R2,R16
    0073 0129      MOVW	R4,R18
    0074 E041      LDI	R20,1
    0075 E050      LDI	R21,0
    0076 E060      LDI	R22,0
    0077 E070      LDI	R23,0
    0078 1A24      SUB	R2,R20
    0079 0A35      SBC	R3,R21
    007A 0A46      SBC	R4,R22
    007B 0A57      SBC	R5,R23
    007C 0151      MOVW	R10,R2
(0019) UBRRH = (unsigned char)(tmp>>8);
    007D 2C23      MOV	R2,R3
    007E 2433      CLR	R3
    007F BC20      OUT	0x20,R2
(0020) UBRRL = (unsigned char)tmp;
    0080 B8A9      OUT	0x09,R10
(0021) /* 接收器与发送器使能*/
(0022) UCSRB = (1<<RXEN)|(1<<TXEN);
    0081 E188      LDI	R24,0x18
    0082 B98A      OUT	0x0A,R24
(0023) /* 设置帧格式: 8 个数据位, 2 个停止位*/
(0024) UCSRC = (1<<URSEL)|(1<<USBS)|(1<<UCSZ0)|(1<<UCSZ1);
    0083 E88E      LDI	R24,0x8E
    0084 BD80      OUT	0x20,R24
    0085 940E0147  CALL	pop_gset3
    0087 9508      RET
(0025) }
(0026) /* UMSEL 模式选择
(0027)    0 异步操作
(0028)    1 同步操作
(0029) 
(0030)   USBS 停止位位数
(0031)    0    1
(0032)    1    2
(0033) 
(0034)    UCSZ2 UCSZ1 UCSZ0 字符长度
(0035)    0 0 0 5 位
(0036)    0 0 1 6 位
(0037)    0 1 0 7 位
(0038)    0 1 1 8 位
(0039)    1 0 0 保留
(0040)    1 0 1 保留
(0041)    1 1 0 保留
(0042)    1 1 1 9 位
(0043) */
(0044) // ICC 生成的初始化
(0045) //UART0 initialize
(0046) // desired baud rate: 9600
(0047) // actual: baud rate:9600 (0.0%)
(0048) // char size: 8 bit
(0049) // parity: Disabled
(0050) void uart0_init(void)
(0051) {
(0052)  UCSRB = 0x00; //disable while setting baud rate
_uart0_init:
    0088 2422      CLR	R2
    0089 B82A      OUT	0x0A,R2
(0053)  UCSRA = 0x00;
    008A B82B      OUT	0x0B,R2
(0054)  UCSRC = BIT(URSEL) | 0x06;
    008B E886      LDI	R24,0x86
    008C BD80      OUT	0x20,R24
(0055)  UBRRL = 0x2F; //set baud rate lo
    008D E28F      LDI	R24,0x2F
    008E B989      OUT	0x09,R24
(0056)  UBRRH = 0x00; //set baud rate hi
    008F BC20      OUT	0x20,R2
(0057)  UCSRB = 0x18;
    0090 E188      LDI	R24,0x18
    0091 B98A      OUT	0x0A,R24
    0092 9508      RET
(0058) }
(0059) 
(0060) // 数据发送【发送5 到8 位数据位的帧】
(0061) void USART_Transmit( unsigned char data )
(0062) {
(0063) /* 等待发送缓冲器为空 */
(0064) while ( !( UCSRA & (1<<UDRE)) )
_USART_Transmit:
  data                 --> R16
    0093 9B5D      SBIS	0x0B,5
    0094 CFFE      RJMP	_USART_Transmit
(0065) ;
(0066) /* 将数据放入缓冲器,发送数据 */
(0067) UDR = data;
    0095 B90C      OUT	0x0C,R16
    0096 9508      RET
(0068) } 
(0069) 
(0070) 
(0071) // 数据接收【以5 到8 个数据位的方式接收数 据帧】
(0072) unsigned char USART_Receive( void )
(0073) {
(0074) /* 等待接收数据*/
(0075) while ( !(UCSRA & (1<<RXC)) )
_USART_Receive:
    0097 9B5F      SBIS	0x0B,7
    0098 CFFE      RJMP	_USART_Receive
(0076) ;
(0077) /* 从缓冲器中获取并返回数据*/
(0078) return UDR;
    0099 B10C      IN	R16,0x0C
    009A 9508      RET
(0079) } 
(0080) 
(0081) //连续发送字符
(0082) void USART_Transmit_2( void )
(0083) {
(0084) while ( !( UCSRA & (1<<UDRE)) )
_USART_Transmit_2:
    009B 9B5D      SBIS	0x0B,5
    009C CFFE      RJMP	_USART_Transmit_2
(0085) ;
(0086) UDR = 'H';
    009D E488      LDI	R24,0x48
    009E B98C      OUT	0x0C,R24
(0087) while ( !( UCSRA & (1<<UDRE)) )
    009F 9B5D      SBIS	0x0B,5
    00A0 CFFE      RJMP	0x009F
(0088) ;
(0089) UDR = 'e';
    00A1 E685      LDI	R24,0x65
    00A2 B98C      OUT	0x0C,R24
(0090) while ( !( UCSRA & (1<<UDRE)) )
    00A3 9B5D      SBIS	0x0B,5
    00A4 CFFE      RJMP	0x00A3
(0091) ;
(0092) UDR = 'l';
    00A5 E68C      LDI	R24,0x6C
    00A6 B98C      OUT	0x0C,R24
(0093) while ( !( UCSRA & (1<<UDRE)) )
    00A7 9B5D      SBIS	0x0B,5
    00A8 CFFE      RJMP	0x00A7
(0094) ;
(0095) UDR = 'l';
    00A9 E68C      LDI	R24,0x6C
    00AA B98C      OUT	0x0C,R24
(0096) while ( !( UCSRA & (1<<UDRE)) )
    00AB 9B5D      SBIS	0x0B,5
    00AC CFFE      RJMP	0x00AB
(0097) ;
(0098) UDR = 'o';
    00AD E68F      LDI	R24,0x6F
    00AE B98C      OUT	0x0C,R24
    00AF 9508      RET
(0099) } 
(0100) 
(0101) 
(0102) void main(void)
(0103) {
(0104)  unsigned char i=0,tmp=0;
_main:
  tmp                  --> R20
  i                    --> R22
    00B0 2766      CLR	R22
    00B1 2744      CLR	R20
(0105)  
(0106)  USART_Init(9600); //波特率9600 初始化串口
    00B2 E800      LDI	R16,0x80
    00B3 E215      LDI	R17,0x25
    00B4 DFA1      RCALL	_USART_Init
(0107) // uart0_init();
(0108)  
(0109)  for(i=0;i<20;i++) //发送数组里面的字符串
    00B5 C009      RJMP	0x00BF
(0110)  {
(0111)  USART_Transmit(buffer[i]);
    00B6 E584      LDI	R24,0x54
    00B7 E090      LDI	R25,0
    00B8 2FE6      MOV	R30,R22
    00B9 27FF      CLR	R31
    00BA 0FE8      ADD	R30,R24
    00BB 1FF9      ADC	R31,R25
    00BC 9104      LPM	R16,0(Z)
    00BD DFD5      RCALL	_USART_Transmit
    00BE 9563      INC	R22
    00BF 3164      CPI	R22,0x14
    00C0 F3A8      BCS	0x00B6
(0112)  }
(0113)  
(0114)  USART_Transmit(0x0d); //发送一个回车
    00C1 E00D      LDI	R16,0xD
    00C2 DFD0      RCALL	_USART_Transmit
(0115)  USART_Transmit(0x0a); //发送一个换行
    00C3 E00A      LDI	R16,0xA
    00C4 DFCE      RCALL	_USART_Transmit
    00C5 C00E      RJMP	0x00D4
(0116)  
(0117)  while(1)
(0118)  {
(0119)   if(UCSRA&(1<<RXC))  //如果接收缓存区有数据
    00C6 9B5F      SBIS	0x0B,7
    00C7 C00C      RJMP	0x00D4
(0120)   {
(0121)    tmp=USART_Receive(); //接收数据
    00C8 DFCE      RCALL	_USART_Receive
    00C9 2F40      MOV	R20,R16
(0122)    USART_Transmit(tmp); //发送数据
    00CA DFC8      RCALL	_USART_Transmit
(0123)    
(0124)    if(tmp=='a')         //对接收到的数据进行,如果是a,再发一个OK回来
    00CB 3641      CPI	R20,0x61
    00CC F421      BNE	0x00D1
(0125)    {
(0126)     USART_Transmit('O');
    00CD E40F      LDI	R16,0x4F
    00CE DFC4      RCALL	_USART_Transmit
(0127) 	USART_Transmit('K');
    00CF E40B      LDI	R16,0x4B
    00D0 DFC2      RCALL	_USART_Transmit
(0128)    }
(0129)    if(tmp=='A')
    00D1 3441      CPI	R20,0x41
    00D2 F409      BNE	0x00D4
(0130)    {
(0131)     USART_Transmit_2();
FILE: <library>
    00D3 DFC7      RCALL	_USART_Transmit_2
    00D4 CFF1      RJMP	0x00C6
    00D5 9508      RET
div32u:
    00D6 94E8      BCLR	6
    00D7 C001      RJMP	0x00D9
mod32u:
    00D8 9468      BSET	6
    00D9 D02F      RCALL	long_div_prolog
    00DA 24CC      CLR	R12
    00DB C008      RJMP	0x00E4
div32s:
    00DC 94E8      BCLR	6
    00DD C001      RJMP	0x00DF
mod32s:
    00DE 9468      BSET	6
    00DF D029      RCALL	long_div_prolog
    00E0 FD37      SBRC	R19,7
    00E1 D053      RCALL	neg_R16_R19
    00E2 FDB7      SBRC	R27,7
    00E3 D05A      RCALL	neg_R24_R27
    00E4 2477      CLR	R7
    00E5 2488      CLR	R8
    00E6 2499      CLR	R9
    00E7 24AA      CLR	R10
    00E8 24BB      CLR	R11
    00E9 D041      RCALL	tst_R16_R19
    00EA F0C1      BEQ	0x0103
    00EB D044      RCALL	tst_R24_R27
    00EC F0B1      BEQ	0x0103
    00ED E2E8      LDI	R30,0x28
    00EE 0F00      LSL	R16
    00EF 1F11      ROL	R17
    00F0 1F22      ROL	R18
    00F1 1F33      ROL	R19
    00F2 1C77      ROL	R7
    00F3 1C88      ROL	R8
    00F4 1C99      ROL	R9
    00F5 1CAA      ROL	R10
    00F6 1CBB      ROL	R11
    00F7 1688      CP	R8,R24
    00F8 0699      CPC	R9,R25
    00F9 06AA      CPC	R10,R26
    00FA 06BB      CPC	R11,R27
    00FB F028      BCS	0x0101
    00FC 1A88      SUB	R8,R24
    00FD 0A99      SBC	R9,R25
    00FE 0AAA      SBC	R10,R26
    00FF 0ABB      SBC	R11,R27
    0100 9503      INC	R16
    0101 95EA      DEC	R30
    0102 F759      BNE	0x00EE
    0103 F426      BRTC	0x0108
    0104 2D08      MOV	R16,R8
    0105 2D19      MOV	R17,R9
    0106 2D2A      MOV	R18,R10
    0107 2D3B      MOV	R19,R11
    0108 C013      RJMP	long_div_epilog
long_div_prolog:
    0109 927A      ST	R7,-Y
    010A 928A      ST	R8,-Y
    010B 929A      ST	R9,-Y
    010C 92AA      ST	R10,-Y
    010D 92BA      ST	R11,-Y
    010E 92CA      ST	R12,-Y
    010F 93EA      ST	R30,-Y
    0110 938A      ST	R24,-Y
    0111 939A      ST	R25,-Y
    0112 93AA      ST	R26,-Y
    0113 93BA      ST	R27,-Y
    0114 858B      LDD	R24,Y+11
    0115 859C      LDD	R25,Y+12
    0116 85AD      LDD	R26,Y+13
    0117 85BE      LDD	R27,Y+14
    0118 2EC3      MOV	R12,R19
    0119 F00E      BRTS	0x011B
    011A 26CB      EOR	R12,R27
    011B 9508      RET
long_div_epilog:
    011C FCC7      SBRC	R12,7
    011D D017      RCALL	neg_R16_R19
    011E 91B9      LD	R27,Y+
    011F 91A9      LD	R26,Y+
    0120 9199      LD	R25,Y+
    0121 9189      LD	R24,Y+
    0122 91E9      LD	R30,Y+
    0123 90C9      LD	R12,Y+
    0124 90B9      LD	R11,Y+
    0125 90A9      LD	R10,Y+
    0126 9099      LD	R9,Y+
    0127 9089      LD	R8,Y+
    0128 9079      LD	R7,Y+
    0129 9624      ADIW	R28,4
    012A 9508      RET
tst_R16_R19:
    012B 2FE0      MOV	R30,R16
    012C 2BE1      OR	R30,R17
    012D 2BE2      OR	R30,R18
    012E 2BE3      OR	R30,R19
    012F 9508      RET
tst_R24_R27:
    0130 2FE8      MOV	R30,R24
    0131 2BE9      OR	R30,R25
    0132 2BEA      OR	R30,R26
    0133 2BEB      OR	R30,R27
    0134 9508      RET
neg_R16_R19:
    0135 9500      COM	R16
    0136 9510      COM	R17
    0137 9520      COM	R18
    0138 9530      COM	R19
    0139 5F0F      SUBI	R16,0xFF
    013A 4F1F      SBCI	R17,0xFF
    013B 4F2F      SBCI	R18,0xFF
    013C 4F3F      SBCI	R19,0xFF
    013D 9508      RET
neg_R24_R27:
    013E 9580      COM	R24
    013F 9590      COM	R25
    0140 95A0      COM	R26
    0141 95B0      COM	R27
    0142 5F8F      SUBI	R24,0xFF
    0143 4F9F      SBCI	R25,0xFF
    0144 4FAF      SBCI	R26,0xFF
    0145 4FBF      SBCI	R27,0xFF
    0146 9508      RET
pop_gset3:
    0147 E0E4      LDI	R30,4
    0148 940C0156  JMP	pop
push_gset5:
    014A 92FA      ST	R15,-Y
    014B 92EA      ST	R14,-Y
push_gset4:
    014C 92DA      ST	R13,-Y
    014D 92CA      ST	R12,-Y
push_gset3:
    014E 92BA      ST	R11,-Y
    014F 92AA      ST	R10,-Y
push_gset2:
    0150 937A      ST	R23,-Y
    0151 936A      ST	R22,-Y
push_gset1:
    0152 935A      ST	R21,-Y
    0153 934A      ST	R20,-Y
    0154 9508      RET
pop_gset1:
    0155 E0E1      LDI	R30,1
pop:
    0156 9149      LD	R20,Y+
    0157 9159      LD	R21,Y+
    0158 FDE0      SBRC	R30,0
    0159 9508      RET
    015A 9169      LD	R22,Y+
    015B 9179      LD	R23,Y+
    015C FDE1      SBRC	R30,1
    015D 9508      RET
    015E 90A9      LD	R10,Y+
    015F 90B9      LD	R11,Y+
    0160 FDE2      SBRC	R30,2
    0161 9508      RET
    0162 90C9      LD	R12,Y+
    0163 90D9      LD	R13,Y+
    0164 FDE3      SBRC	R30,3
    0165 9508      RET
    0166 90E9      LD	R14,Y+
    0167 90F9      LD	R15,Y+
    0168 9508      RET

⌨️ 快捷键说明

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