📄 main.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 + -