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

📄 m16_usart.lss

📁 AVR单片机ATmega16的串口测试程序
💻 LSS
字号:

M16_USART.elf:     file format elf32-avr

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         000001ca  00000000  00000000  00000054  2**1
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .debug_aranges 00000040  00000000  00000000  0000021e  2**0
                  CONTENTS, READONLY, DEBUGGING
  2 .debug_pubnames 000000c6  00000000  00000000  0000025e  2**0
                  CONTENTS, READONLY, DEBUGGING
  3 .debug_info   000002ec  00000000  00000000  00000324  2**0
                  CONTENTS, READONLY, DEBUGGING
  4 .debug_abbrev 000001d0  00000000  00000000  00000610  2**0
                  CONTENTS, READONLY, DEBUGGING
  5 .debug_line   0000037a  00000000  00000000  000007e0  2**0
                  CONTENTS, READONLY, DEBUGGING
  6 .debug_frame  000000b0  00000000  00000000  00000b5c  2**2
                  CONTENTS, READONLY, DEBUGGING
  7 .debug_str    0000015a  00000000  00000000  00000c0c  2**0
                  CONTENTS, READONLY, DEBUGGING
  8 .debug_loc    00000056  00000000  00000000  00000d66  2**0
                  CONTENTS, READONLY, DEBUGGING
  9 .debug_ranges 00000060  00000000  00000000  00000dbc  2**0
                  CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:

00000000 <__vectors>:
   0:	0c 94 2a 00 	jmp	0x54	; 0x54 <__ctors_end>
   4:	0c 94 47 00 	jmp	0x8e	; 0x8e <__bad_interrupt>
   8:	0c 94 47 00 	jmp	0x8e	; 0x8e <__bad_interrupt>
   c:	0c 94 47 00 	jmp	0x8e	; 0x8e <__bad_interrupt>
  10:	0c 94 47 00 	jmp	0x8e	; 0x8e <__bad_interrupt>
  14:	0c 94 47 00 	jmp	0x8e	; 0x8e <__bad_interrupt>
  18:	0c 94 47 00 	jmp	0x8e	; 0x8e <__bad_interrupt>
  1c:	0c 94 47 00 	jmp	0x8e	; 0x8e <__bad_interrupt>
  20:	0c 94 47 00 	jmp	0x8e	; 0x8e <__bad_interrupt>
  24:	0c 94 47 00 	jmp	0x8e	; 0x8e <__bad_interrupt>
  28:	0c 94 47 00 	jmp	0x8e	; 0x8e <__bad_interrupt>
  2c:	0c 94 47 00 	jmp	0x8e	; 0x8e <__bad_interrupt>
  30:	0c 94 47 00 	jmp	0x8e	; 0x8e <__bad_interrupt>
  34:	0c 94 47 00 	jmp	0x8e	; 0x8e <__bad_interrupt>
  38:	0c 94 47 00 	jmp	0x8e	; 0x8e <__bad_interrupt>
  3c:	0c 94 47 00 	jmp	0x8e	; 0x8e <__bad_interrupt>
  40:	0c 94 47 00 	jmp	0x8e	; 0x8e <__bad_interrupt>
  44:	0c 94 47 00 	jmp	0x8e	; 0x8e <__bad_interrupt>
  48:	0c 94 47 00 	jmp	0x8e	; 0x8e <__bad_interrupt>
  4c:	0c 94 47 00 	jmp	0x8e	; 0x8e <__bad_interrupt>
  50:	0c 94 47 00 	jmp	0x8e	; 0x8e <__bad_interrupt>

00000054 <__ctors_end>:
  54:	11 24       	eor	r1, r1
  56:	1f be       	out	0x3f, r1	; 63
  58:	cf e5       	ldi	r28, 0x5F	; 95
  5a:	d4 e0       	ldi	r29, 0x04	; 4
  5c:	de bf       	out	0x3e, r29	; 62
  5e:	cd bf       	out	0x3d, r28	; 61

00000060 <__do_copy_data>:
  60:	10 e0       	ldi	r17, 0x00	; 0
  62:	a0 e6       	ldi	r26, 0x60	; 96
  64:	b0 e0       	ldi	r27, 0x00	; 0
  66:	ea ec       	ldi	r30, 0xCA	; 202
  68:	f1 e0       	ldi	r31, 0x01	; 1
  6a:	02 c0       	rjmp	.+4      	; 0x70 <.do_copy_data_start>

0000006c <.do_copy_data_loop>:
  6c:	05 90       	lpm	r0, Z+
  6e:	0d 92       	st	X+, r0

00000070 <.do_copy_data_start>:
  70:	a0 36       	cpi	r26, 0x60	; 96
  72:	b1 07       	cpc	r27, r17
  74:	d9 f7       	brne	.-10     	; 0x6c <.do_copy_data_loop>

00000076 <__do_clear_bss>:
  76:	10 e0       	ldi	r17, 0x00	; 0
  78:	a0 e6       	ldi	r26, 0x60	; 96
  7a:	b0 e0       	ldi	r27, 0x00	; 0
  7c:	01 c0       	rjmp	.+2      	; 0x80 <.do_clear_bss_start>

0000007e <.do_clear_bss_loop>:
  7e:	1d 92       	st	X+, r1

00000080 <.do_clear_bss_start>:
  80:	a0 36       	cpi	r26, 0x60	; 96
  82:	b1 07       	cpc	r27, r17
  84:	e1 f7       	brne	.-8      	; 0x7e <.do_clear_bss_loop>
  86:	0e 94 ae 00 	call	0x15c	; 0x15c <main>
  8a:	0c 94 e3 00 	jmp	0x1c6	; 0x1c6 <_exit>

0000008e <__bad_interrupt>:
  8e:	0c 94 00 00 	jmp	0	; 0x0 <__vectors>

00000092 <usart_init_baud>:
/*------------------------------------------------------
关于波特率的设置,还是直接赋给寄存器比较好,减少CPU工作量
--------------------------------------------------------*/
// 形参为波特率
void usart_init_baud(uint16 baud)
{
  92:	59 98       	cbi	0x0b, 1	; 11
	UCSRA |= (1<<U2X);
	UBRRL= (F_CPU/baud/8-1)%256;
	UBRRH= (F_CPU/baud/8-1)/256;
#else
	UCSRA &= ~(1<<U2X);
	UBRRL= (F_CPU/baud/16-1)%256;			// OK here
  94:	9c 01       	movw	r18, r24
  96:	40 e0       	ldi	r20, 0x00	; 0
  98:	50 e0       	ldi	r21, 0x00	; 0
  9a:	60 e0       	ldi	r22, 0x00	; 0
  9c:	78 e0       	ldi	r23, 0x08	; 8
  9e:	87 e0       	ldi	r24, 0x07	; 7
  a0:	90 e0       	ldi	r25, 0x00	; 0
  a2:	0e 94 c1 00 	call	0x182	; 0x182 <__udivmodsi4>
  a6:	c9 01       	movw	r24, r18
  a8:	da 01       	movw	r26, r20
  aa:	21 50       	subi	r18, 0x01	; 1
  ac:	29 b9       	out	0x09, r18	; 9
	UBRRH= (F_CPU/baud/16-1)/256;
  ae:	01 97       	sbiw	r24, 0x01	; 1
  b0:	a1 09       	sbc	r26, r1
  b2:	b1 09       	sbc	r27, r1
  b4:	89 2f       	mov	r24, r25
  b6:	9a 2f       	mov	r25, r26
  b8:	ab 2f       	mov	r26, r27
  ba:	bb 27       	eor	r27, r27
  bc:	80 bd       	out	0x20, r24	; 32
	UCSRB = (1<<RXEN) | (1<<TXEN) | (1<<UCSZ2);	// 使能发送接收
#elif METHOD == 7
	UCSRC = (1<<URSEL) | (1<<USBS) |(3<<UCSZ0);	//9位数据位,2位停止位,无校验
	UCSRB = (1<<RXEN) | (1<<TXEN) | (1<<UCSZ2);	// 使能发送接收
#elif METHOD == 8
	UCSRC = (1<<URSEL) | (2<<UPM0) | (1<<USBS) |(3<<UCSZ0);	//9位数据位,2位停止位,偶校验
  be:	8e ea       	ldi	r24, 0xAE	; 174
  c0:	80 bd       	out	0x20, r24	; 32
	UCSRB = (1<<RXEN) | (1<<TXEN) | (1<<UCSZ2);	// 使能发送接收
  c2:	8c e1       	ldi	r24, 0x1C	; 28
  c4:	8a b9       	out	0x0a, r24	; 10
#endif
}
  c6:	08 95       	ret

000000c8 <usart_init_std>:

// 用库函数设置
void usart_init_std(void)
{
  c8:	10 bc       	out	0x20, r1	; 32
	// 利用库函数设置
	UBRRH= UBRRH_VALUE;
	UBRRL= UBRRL_VALUE;
  ca:	8b e0       	ldi	r24, 0x0B	; 11
  cc:	89 b9       	out	0x09, r24	; 9
#ifdef U2XX						// 倍速
	UCSRA |= (1<<U2X);
#else
	UCSRA &= ~(1<<U2X);
  ce:	59 98       	cbi	0x0b, 1	; 11
	UCSRB = (1<<RXEN) | (1<<TXEN) | (1<<UCSZ2);	// 使能发送接收
#elif METHOD == 7
	UCSRC = (1<<URSEL) | (1<<USBS) |(3<<UCSZ0);	//9位数据位,2位停止位,无校验
	UCSRB = (1<<RXEN) | (1<<TXEN) | (1<<UCSZ2);	// 使能发送接收
#elif METHOD == 8
	UCSRC = (1<<URSEL) | (2<<UPM0) | (1<<USBS) |(3<<UCSZ0);	//9位数据位,2位停止位,偶校验
  d0:	8e ea       	ldi	r24, 0xAE	; 174
  d2:	80 bd       	out	0x20, r24	; 32
	UCSRB = (1<<RXEN) | (1<<TXEN) | (1<<UCSZ2);	// 使能发送接收
  d4:	8c e1       	ldi	r24, 0x1C	; 28
  d6:	8a b9       	out	0x0a, r24	; 10
#endif
}
  d8:	08 95       	ret

000000da <usart_init>:

// 无形参,波特率直接赋给UBRRH和UBRRL
void usart_init(void)
{
  da:	59 98       	cbi	0x0b, 1	; 11
	UCSRA |= (1<<U2X);
	UBRRL= 0;
	UBRRH= 0;
#else
	UCSRA &= ~(1<<U2X);
	UBRRL= 0;			
  dc:	19 b8       	out	0x09, r1	; 9
	UBRRH= 0;
  de:	10 bc       	out	0x20, r1	; 32
	UCSRB = (1<<RXEN) | (1<<TXEN) | (1<<UCSZ2);	// 使能发送接收
#elif METHOD == 7
	UCSRC = (1<<URSEL) | (1<<USBS) |(3<<UCSZ0);	//9位数据位,2位停止位,无校验
	UCSRB = (1<<RXEN) | (1<<TXEN) | (1<<UCSZ2);	// 使能发送接收
#elif METHOD == 8
	UCSRC = (1<<URSEL) | (2<<UPM0) | (1<<USBS) |(3<<UCSZ0);	//9位数据位,2位停止位,偶校验
  e0:	8e ea       	ldi	r24, 0xAE	; 174
  e2:	80 bd       	out	0x20, r24	; 32
	UCSRB = (1<<RXEN) | (1<<TXEN) | (1<<UCSZ2);	// 使能发送接收
  e4:	8c e1       	ldi	r24, 0x1C	; 28
  e6:	8a b9       	out	0x0a, r24	; 10
#endif
}
  e8:	08 95       	ret

000000ea <usart_transmit8>:

// 8位发送
void usart_transmit8(uint8 data)
{
  ea:	5d 9b       	sbis	0x0b, 5	; 11
  ec:	fe cf       	rjmp	.-4      	; 0xea <usart_transmit8>
	while ( !(UCSRA & (1<<UDRE)) )		// 不为空,等之
		;
	UDR = data;			
  ee:	8c b9       	out	0x0c, r24	; 12
}
  f0:	08 95       	ret

000000f2 <usart_transmit9>:

// 9位发送
void usart_transmit9(uint16 data)
{
  f2:	5d 9b       	sbis	0x0b, 5	; 11
  f4:	fe cf       	rjmp	.-4      	; 0xf2 <usart_transmit9>
	while ( !(UCSRA & (1<<UDRE)) )		// 不为空,等之
		;											
	UCSRB &= ~(1<<TXB8);			// 先清零
  f6:	50 98       	cbi	0x0a, 0	; 10
	if (data & 0x0100)			// 第9位为1
  f8:	90 fd       	sbrc	r25, 0
		UCSRB |= (1<<TXB8);
  fa:	50 9a       	sbi	0x0a, 0	; 10
	UDR = data;		
  fc:	8c b9       	out	0x0c, r24	; 12
}
  fe:	08 95       	ret

00000100 <usart_sendstring>:

// 发送字符串
void usart_sendstring(uint8 *string)
{
 100:	fc 01       	movw	r30, r24
 102:	04 c0       	rjmp	.+8      	; 0x10c <usart_sendstring+0xc>
}

// 8位发送
void usart_transmit8(uint8 data)
{
	while ( !(UCSRA & (1<<UDRE)) )		// 不为空,等之
 104:	5d 9b       	sbis	0x0b, 5	; 11
 106:	fe cf       	rjmp	.-4      	; 0x104 <usart_sendstring+0x4>
// 发送字符串
void usart_sendstring(uint8 *string)
{
	while (*string)
	{
		usart_transmit8(*string++);
 108:	31 96       	adiw	r30, 0x01	; 1
// 8位发送
void usart_transmit8(uint8 data)
{
	while ( !(UCSRA & (1<<UDRE)) )		// 不为空,等之
		;
	UDR = data;			
 10a:	8c b9       	out	0x0c, r24	; 12
}

// 发送字符串
void usart_sendstring(uint8 *string)
{
	while (*string)
 10c:	80 81       	ld	r24, Z
 10e:	88 23       	and	r24, r24
 110:	c9 f7       	brne	.-14     	; 0x104 <usart_sendstring+0x4>
}

// 8位发送
void usart_transmit8(uint8 data)
{
	while ( !(UCSRA & (1<<UDRE)) )		// 不为空,等之
 112:	5d 9b       	sbis	0x0b, 5	; 11
 114:	fe cf       	rjmp	.-4      	; 0x112 <usart_sendstring+0x12>
		;
	UDR = data;			
 116:	8d e0       	ldi	r24, 0x0D	; 13
 118:	8c b9       	out	0x0c, r24	; 12
}

// 8位发送
void usart_transmit8(uint8 data)
{
	while ( !(UCSRA & (1<<UDRE)) )		// 不为空,等之
 11a:	5d 9b       	sbis	0x0b, 5	; 11
 11c:	fe cf       	rjmp	.-4      	; 0x11a <usart_sendstring+0x1a>
		;
	UDR = data;			
 11e:	8a e0       	ldi	r24, 0x0A	; 10
 120:	8c b9       	out	0x0c, r24	; 12
	{
		usart_transmit8(*string++);
	}
	usart_transmit8(0x0d);
	usart_transmit8(0x0a);			// 最后发送回车换行 
}
 122:	08 95       	ret

00000124 <usart_receive8>:

// 8位接收
uint8 usart_receive8(void)
{
 124:	5f 9b       	sbis	0x0b, 7	; 11
 126:	fe cf       	rjmp	.-4      	; 0x124 <usart_receive8>
	while ( !(UCSRA & (1<<RXC)) )
		;
	return UDR;	
 128:	8c b1       	in	r24, 0x0c	; 12
}
 12a:	08 95       	ret

0000012c <usart_receive9>:

// 9位接收
uint16 usart_receive9(void)
{
 12c:	5f 9b       	sbis	0x0b, 7	; 11
 12e:	fe cf       	rjmp	.-4      	; 0x12c <usart_receive9>
	uint16 status,resulth,resultl;
	while ( !(UCSRA & (1<<RXC)) )
		;
	status = UCSRA;
 130:	8b b1       	in	r24, 0x0b	; 11
	resulth = UCSRB;
 132:	9a b1       	in	r25, 0x0a	; 10
	resultl = UDR;
 134:	4c b1       	in	r20, 0x0c	; 12
	if ((uint8)status & ((1<<FE) | (1<<DOR) | (1<<PE)))
 136:	8c 71       	andi	r24, 0x1C	; 28
 138:	19 f0       	breq	.+6      	; 0x140 <usart_receive9+0x14>
 13a:	2f ef       	ldi	r18, 0xFF	; 255
 13c:	3f ef       	ldi	r19, 0xFF	; 255
 13e:	0c c0       	rjmp	.+24     	; 0x158 <usart_receive9+0x2c>
		return -1;
	resulth = (resulth>>1) & 0x01;
 140:	89 2f       	mov	r24, r25
 142:	90 e0       	ldi	r25, 0x00	; 0
 144:	96 95       	lsr	r25
 146:	87 95       	ror	r24
	return ((resulth<<8) | resultl);
 148:	81 70       	andi	r24, 0x01	; 1
 14a:	90 70       	andi	r25, 0x00	; 0
 14c:	38 2f       	mov	r19, r24
 14e:	22 27       	eor	r18, r18
 150:	84 2f       	mov	r24, r20
 152:	90 e0       	ldi	r25, 0x00	; 0
 154:	28 2b       	or	r18, r24
 156:	39 2b       	or	r19, r25
 158:	c9 01       	movw	r24, r18
 15a:	08 95       	ret

0000015c <main>:
#include "M16_USART.h"

int main(void)
{
 15c:	0e 94 64 00 	call	0xc8	; 0xc8 <usart_init_std>
	uint16 tmp;
	uint8 tmp1;
	usart_init_std();
	DDRA = 0xff;
 160:	8f ef       	ldi	r24, 0xFF	; 255
 162:	8a bb       	out	0x1a, r24	; 26
	DDRB = 0xff;
 164:	87 bb       	out	0x17, r24	; 23
	PORTB = 0x00;
 166:	18 ba       	out	0x18, r1	; 24
	PORTA = 0x00;
 168:	1b ba       	out	0x1b, r1	; 27
	tmp = usart_receive9();
 16a:	0e 94 96 00 	call	0x12c	; 0x12c <usart_receive9>
    milliseconds can be achieved.
 */
void
_delay_loop_2(uint16_t __count)
{
	__asm__ volatile (
 16e:	20 e0       	ldi	r18, 0x00	; 0
 170:	38 e4       	ldi	r19, 0x48	; 72
	tmp1 = tmp >>8;
	while (1)
	{
		PORTA = (uint8)tmp;
 172:	8b bb       	out	0x1b, r24	; 27
		PORTB = tmp1;
 174:	98 bb       	out	0x18, r25	; 24
 176:	f9 01       	movw	r30, r18
 178:	31 97       	sbiw	r30, 0x01	; 1
 17a:	f1 f7       	brne	.-4      	; 0x178 <main+0x1c>
		_delay_ms(10);
		PORTA = 0x00;
 17c:	1b ba       	out	0x1b, r1	; 27
		PORTB = 0x00;
 17e:	18 ba       	out	0x18, r1	; 24
 180:	f8 cf       	rjmp	.-16     	; 0x172 <main+0x16>

00000182 <__udivmodsi4>:
 182:	a1 e2       	ldi	r26, 0x21	; 33
 184:	1a 2e       	mov	r1, r26
 186:	aa 1b       	sub	r26, r26
 188:	bb 1b       	sub	r27, r27
 18a:	fd 01       	movw	r30, r26
 18c:	0d c0       	rjmp	.+26     	; 0x1a8 <__udivmodsi4_ep>

0000018e <__udivmodsi4_loop>:
 18e:	aa 1f       	adc	r26, r26
 190:	bb 1f       	adc	r27, r27
 192:	ee 1f       	adc	r30, r30
 194:	ff 1f       	adc	r31, r31
 196:	a2 17       	cp	r26, r18
 198:	b3 07       	cpc	r27, r19
 19a:	e4 07       	cpc	r30, r20
 19c:	f5 07       	cpc	r31, r21
 19e:	20 f0       	brcs	.+8      	; 0x1a8 <__udivmodsi4_ep>
 1a0:	a2 1b       	sub	r26, r18
 1a2:	b3 0b       	sbc	r27, r19
 1a4:	e4 0b       	sbc	r30, r20
 1a6:	f5 0b       	sbc	r31, r21

000001a8 <__udivmodsi4_ep>:
 1a8:	66 1f       	adc	r22, r22
 1aa:	77 1f       	adc	r23, r23
 1ac:	88 1f       	adc	r24, r24
 1ae:	99 1f       	adc	r25, r25
 1b0:	1a 94       	dec	r1
 1b2:	69 f7       	brne	.-38     	; 0x18e <__udivmodsi4_loop>
 1b4:	60 95       	com	r22
 1b6:	70 95       	com	r23
 1b8:	80 95       	com	r24
 1ba:	90 95       	com	r25
 1bc:	9b 01       	movw	r18, r22
 1be:	ac 01       	movw	r20, r24
 1c0:	bd 01       	movw	r22, r26
 1c2:	cf 01       	movw	r24, r30
 1c4:	08 95       	ret

000001c6 <_exit>:
 1c6:	f8 94       	cli

000001c8 <__stop_program>:
 1c8:	ff cf       	rjmp	.-2      	; 0x1c8 <__stop_program>

⌨️ 快捷键说明

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