📄 main.lss
字号:
main.elf: file format elf32-avr
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 0000024c 00000000 00000000 00000094 2**0
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .data 000000c8 00800060 0000024c 000002e0 2**0
CONTENTS, ALLOC, LOAD, DATA
2 .bss 00000013 00800128 00800128 000003a8 2**0
ALLOC
3 .noinit 00000000 0080013b 0080013b 000003a8 2**0
CONTENTS
4 .eeprom 00000000 00810000 00810000 000003a8 2**0
CONTENTS
5 .debug_aranges 00000014 00000000 00000000 000003a8 2**0
CONTENTS, READONLY, DEBUGGING
6 .debug_pubnames 00000092 00000000 00000000 000003bc 2**0
CONTENTS, READONLY, DEBUGGING
7 .debug_info 00000180 00000000 00000000 0000044e 2**0
CONTENTS, READONLY, DEBUGGING
8 .debug_abbrev 000000be 00000000 00000000 000005ce 2**0
CONTENTS, READONLY, DEBUGGING
9 .debug_line 00000205 00000000 00000000 0000068c 2**0
CONTENTS, READONLY, DEBUGGING
10 .debug_str 000000c8 00000000 00000000 00000891 2**0
CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:
00000000 <__vectors>:
0: 0c 94 2a 00 jmp 0x54
4: 0c 94 45 00 jmp 0x8a
8: 0c 94 45 00 jmp 0x8a
c: 0c 94 45 00 jmp 0x8a
10: 0c 94 45 00 jmp 0x8a
14: 0c 94 45 00 jmp 0x8a
18: 0c 94 45 00 jmp 0x8a
1c: 0c 94 45 00 jmp 0x8a
20: 0c 94 45 00 jmp 0x8a
24: 0c 94 45 00 jmp 0x8a
28: 0c 94 45 00 jmp 0x8a
2c: 0c 94 5e 00 jmp 0xbc
30: 0c 94 45 00 jmp 0x8a
34: 0c 94 45 00 jmp 0x8a
38: 0c 94 45 00 jmp 0x8a
3c: 0c 94 45 00 jmp 0x8a
40: 0c 94 45 00 jmp 0x8a
44: 0c 94 45 00 jmp 0x8a
48: 0c 94 45 00 jmp 0x8a
4c: 0c 94 45 00 jmp 0x8a
50: 0c 94 45 00 jmp 0x8a
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: 11 e0 ldi r17, 0x01 ; 1
62: a0 e6 ldi r26, 0x60 ; 96
64: b0 e0 ldi r27, 0x00 ; 0
66: ec e4 ldi r30, 0x4C ; 76
68: f2 e0 ldi r31, 0x02 ; 2
6a: 02 c0 rjmp .+4 ; 0x70
0000006c <.do_copy_data_loop>:
6c: 05 90 lpm r0, Z+
6e: 0d 92 st X+, r0
00000070 <.do_copy_data_start>:
70: a8 32 cpi r26, 0x28 ; 40
72: b1 07 cpc r27, r17
74: d9 f7 brne .-10 ; 0x6c
00000076 <__do_clear_bss>:
76: 11 e0 ldi r17, 0x01 ; 1
78: a8 e2 ldi r26, 0x28 ; 40
7a: b1 e0 ldi r27, 0x01 ; 1
7c: 01 c0 rjmp .+2 ; 0x80
0000007e <.do_clear_bss_loop>:
7e: 1d 92 st X+, r1
00000080 <.do_clear_bss_start>:
80: ab 33 cpi r26, 0x3B ; 59
82: b1 07 cpc r27, r17
84: e1 f7 brne .-8 ; 0x7e
86: 0c 94 f7 00 jmp 0x1ee
0000008a <__bad_interrupt>:
8a: 0c 94 00 00 jmp 0x0
0000008e <put_c>:
void put_c(unsigned char c) //发送采用查询方式
{
while( !(UCSRA & (1<<UDRE)) ); //等待发送缓冲器为空
8e: 5d 9b sbis 0x0b, 5 ; 11
90: fe cf rjmp .-4 ; 0x8e
UDR=c; //将数据放入缓冲器,发送数据
92: 8c b9 out 0x0c, r24 ; 12
94: 08 95 ret
00000096 <put_s>:
}
void put_s(unsigned char *ptr)
{
96: cf 93 push r28
98: df 93 push r29
9a: ec 01 movw r28, r24
while (*ptr)
{
put_c(*ptr++);
9c: 88 81 ld r24, Y
9e: 88 23 and r24, r24
a0: 21 f0 breq .+8 ; 0xaa
a2: 89 91 ld r24, Y+
a4: 0e 94 47 00 call 0x8e
a8: f9 cf rjmp .-14 ; 0x9c
}
put_c(0x0D);
aa: 8d e0 ldi r24, 0x0D ; 13
ac: 0e 94 47 00 call 0x8e
put_c(0x0A); //结尾发送回车换行
b0: 8a e0 ldi r24, 0x0A ; 10
b2: 0e 94 47 00 call 0x8e
b6: df 91 pop r29
b8: cf 91 pop r28
ba: 08 95 ret
000000bc <__vector_11>:
}
SIGNAL(SIG_USART_RECV) //串口接收中断服务程序
{
bc: 1f 92 push r1
be: 0f 92 push r0
c0: 0f b6 in r0, 0x3f ; 63
c2: 0f 92 push r0
c4: 11 24 eor r1, r1
c6: 2f 93 push r18
c8: 3f 93 push r19
ca: 4f 93 push r20
cc: 5f 93 push r21
ce: 6f 93 push r22
d0: 7f 93 push r23
d2: 8f 93 push r24
d4: 9f 93 push r25
d6: af 93 push r26
d8: bf 93 push r27
da: ef 93 push r30
dc: ff 93 push r31
PC_COMMAND=UDR;
de: 8c b1 in r24, 0x0c ; 12
e0: 80 93 39 01 sts 0x0139, r24
switch(PC_COMMAND)
e4: 80 91 39 01 lds r24, 0x0139
e8: 99 27 eor r25, r25
ea: 81 33 cpi r24, 0x31 ; 49
ec: 91 05 cpc r25, r1
ee: 69 f0 breq .+26 ; 0x10a
f0: 82 33 cpi r24, 0x32 ; 50
f2: 91 05 cpc r25, r1
f4: 1c f4 brge .+6 ; 0xfc
f6: c0 97 sbiw r24, 0x30 ; 48
f8: 21 f0 breq .+8 ; 0x102
fa: 18 c0 rjmp .+48 ; 0x12c
fc: c2 97 sbiw r24, 0x32 ; 50
fe: 49 f0 breq .+18 ; 0x112
100: 15 c0 rjmp .+42 ; 0x12c
{
case '0': //0x30 ASCII '0'
LED0_ON();
102: d8 98 cbi 0x1b, 0 ; 27
put_s("用户输入0#指令");
104: 80 e6 ldi r24, 0x60 ; 96
106: 90 e0 ldi r25, 0x00 ; 0
108: 13 c0 rjmp .+38 ; 0x130
break;
case '1':
LED1_ON();
10a: d9 98 cbi 0x1b, 1 ; 27
put_s("用户输入1#指令");
10c: 8f e6 ldi r24, 0x6F ; 111
10e: 90 e0 ldi r25, 0x00 ; 0
110: 0f c0 rjmp .+30 ; 0x130
break;
case '2':
LED0_OFF();
112: d8 9a sbi 0x1b, 0 ; 27
LED1_OFF();
114: d9 9a sbi 0x1b, 1 ; 27
FLAG=!FLAG;
116: 90 e0 ldi r25, 0x00 ; 0
118: 80 91 3a 01 lds r24, 0x013A
11c: 88 23 and r24, r24
11e: 09 f4 brne .+2 ; 0x122
120: 91 e0 ldi r25, 0x01 ; 1
122: 90 93 3a 01 sts 0x013A, r25
put_s("用户输入2#指令");
126: 8e e7 ldi r24, 0x7E ; 126
128: 90 e0 ldi r25, 0x00 ; 0
12a: 02 c0 rjmp .+4 ; 0x130
break;
default:
put_s("用户输入的指令无效!");
12c: 8d e8 ldi r24, 0x8D ; 141
12e: 90 e0 ldi r25, 0x00 ; 0
130: 0e 94 4b 00 call 0x96
break;
}
/*
注意,使用put_s函数发送数据需要一定的时间,如果输入数据的速度过高将会导致数据丢失
所以,一般建议中断服务程序的处理时间尽量的短,只做采集数据和设标志位,命令的处理交由主程序来完成
这里只是示范简单的命令处理
*/
RX_BUFFER[RX_index]=PC_COMMAND; //保存数据到数组里面
134: 80 91 38 01 lds r24, 0x0138
138: e8 2f mov r30, r24
13a: ff 27 eor r31, r31
13c: e8 5d subi r30, 0xD8 ; 216
13e: fe 4f sbci r31, 0xFE ; 254
140: 80 91 39 01 lds r24, 0x0139
144: 80 83 st Z, r24
RX_index++;
146: 80 91 38 01 lds r24, 0x0138
14a: 8f 5f subi r24, 0xFF ; 255
14c: 80 93 38 01 sts 0x0138, r24
if (RX_index>=16) RX_index=0; //防止数组溢出
150: 80 91 38 01 lds r24, 0x0138
154: 80 31 cpi r24, 0x10 ; 16
156: 10 f0 brcs .+4 ; 0x15c
158: 10 92 38 01 sts 0x0138, r1
15c: ff 91 pop r31
15e: ef 91 pop r30
160: bf 91 pop r27
162: af 91 pop r26
164: 9f 91 pop r25
166: 8f 91 pop r24
168: 7f 91 pop r23
16a: 6f 91 pop r22
16c: 5f 91 pop r21
16e: 4f 91 pop r20
170: 3f 91 pop r19
172: 2f 91 pop r18
174: 0f 90 pop r0
176: 0f be out 0x3f, r0 ; 63
178: 0f 90 pop r0
17a: 1f 90 pop r1
17c: 18 95 reti
0000017e <init_USART>:
}
void init_USART(void)//USART 初始化
{
//USART 9600 8, n,1 PC上位机软件(超级终端等)也要设成同样的设置才能通讯
UCSRC = (1<<URSEL) | 0x06;
17e: 86 e8 ldi r24, 0x86 ; 134
180: 80 bd out 0x20, r24 ; 32
//异步,8位数据,无奇偶校验,一个停止位,无倍速,00000110
/*
UBRRH与UCSRC共用I/O 地址。因此访问该地址时需注意以下问题。
写访问
当在该地址执行写访问时, USART 寄存器选择位(URSEL)控制被写入的寄存器。
若URSEL为0,对UBRRH值更新;若URSEL为1,对UCSRC设置更新
读访问
对UBRRH 或UCSRC 寄存器的读访问则较为复杂。但在大多数应用中,基本不需要读这些寄存器
没有UBRR这个16位寄存器,因为UBRRL(0x09)/UBRRH(0x20)的地址不连续,而且UBRRH跟UCSRC共用地址
*/
//U2X=0时的公式计算
UBRRL= (F_CPU/BAUDRATE/16-1)%256;
182: 8f e2 ldi r24, 0x2F ; 47
184: 89 b9 out 0x09, r24 ; 9
UBRRH= (F_CPU/BAUDRATE/16-1)/256;
186: 10 bc out 0x20, r1 ; 32
//U2X=1时的公式计算
//UBRRL= (F_CPU/BAUDRATE/8-1)%256;
//UBRRH= (F_CPU/BAUDRATE/8-1)/256;
//也可根据数据手册的[波特率设置的例子]查得: UBRR = 47
//UBRRL = 0x2F; //set baud rate lo
//UBRRH = 0x00; //set baud rate hi
UCSRA = 0x00;
188: 1b b8 out 0x0b, r1 ; 11
UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
18a: 88 e9 ldi r24, 0x98 ; 152
18c: 8a b9 out 0x0a, r24 ; 10
18e: 08 95 ret
00000190 <pro_coammand>:
//使能接收中断,使能接收,使能发送
}
void pro_coammand(void) //多字节命令的处理程序
{
190: cf 93 push r28
unsigned char i;
if (RX_index>=10)
192: 80 91 38 01 lds r24, 0x0138
196: 8a 30 cpi r24, 0x0A ; 10
198: 40 f1 brcs .+80 ; 0x1ea
{
UCSRB&= ~(1<<RXCIE); //关断USART接收中断
19a: 57 98 cbi 0x0a, 7 ; 10
put_c(0x0D);
19c: 8d e0 ldi r24, 0x0D ; 13
19e: 0e 94 47 00 call 0x8e
put_c(0x0A); //发送回车换行
1a2: 8a e0 ldi r24, 0x0A ; 10
1a4: 0e 94 47 00 call 0x8e
put_s("Hello! 你之前输入的命令列表是:");
1a8: 81 ea ldi r24, 0xA1 ; 161
1aa: 90 e0 ldi r25, 0x00 ; 0
1ac: 0e 94 4b 00 call 0x96
for (i=0;i<RX_index;i++) put_c(RX_BUFFER[i]);
1b0: c0 e0 ldi r28, 0x00 ; 0
1b2: 80 91 38 01 lds r24, 0x0138
1b6: c8 17 cp r28, r24
1b8: 48 f4 brcc .+18 ; 0x1cc
1ba: ec 2f mov r30, r28
1bc: ff 27 eor r31, r31
1be: e8 5d subi r30, 0xD8 ; 216
1c0: fe 4f sbci r31, 0xFE ; 254
1c2: 80 81 ld r24, Z
1c4: 0e 94 47 00 call 0x8e
1c8: cf 5f subi r28, 0xFF ; 255
1ca: f3 cf rjmp .-26 ; 0x1b2
put_c(0x0D);
1cc: 8d e0 ldi r24, 0x0D ; 13
1ce: 0e 94 47 00 call 0x8e
put_c(0x0A);
1d2: 8a e0 ldi r24, 0x0A ; 10
1d4: 0e 94 47 00 call 0x8e
put_c(0x0D);
1d8: 8d e0 ldi r24, 0x0D ; 13
1da: 0e 94 47 00 call 0x8e
put_c(0x0A); //发送回车换行
1de: 8a e0 ldi r24, 0x0A ; 10
1e0: 0e 94 47 00 call 0x8e
RX_index=0; //清零
1e4: 10 92 38 01 sts 0x0138, r1
UCSRB|= (1<<RXCIE); //打开USART接收中断
1e8: 57 9a sbi 0x0a, 7 ; 10
1ea: cf 91 pop r28
1ec: 08 95 ret
000001ee <main>:
}
}
int main(void)
{
1ee: cf e5 ldi r28, 0x5F ; 95
1f0: d4 e0 ldi r29, 0x04 ; 4
1f2: de bf out 0x3e, r29 ; 62
1f4: cd bf out 0x3d, r28 ; 61
//上电默认DDRx=0x00,PORTx=0x00 输入,无上拉电阻
PORTB =0xFF; //不用的管脚使能内部上拉电阻。
1f6: 9f ef ldi r25, 0xFF ; 255
1f8: 98 bb out 0x18, r25 ; 24
PORTC =0xFF;
1fa: 95 bb out 0x15, r25 ; 21
DDRA =(1<<LED2)|(1<<LED1)|(1<<LED0); //输出
1fc: 8b e0 ldi r24, 0x0B ; 11
1fe: 8a bb out 0x1a, r24 ; 26
PORTA =((1<<LED2)|(1<<LED1)|(1<<LED0)); //高电平,灯灭
200: 8b bb out 0x1b, r24 ; 27
DDRD =(1<<PIN_TXD); //TXD为输出
202: 82 e0 ldi r24, 0x02 ; 2
204: 81 bb out 0x11, r24 ; 17
PORTD =0xFF;
206: 92 bb out 0x12, r25 ; 18
FLAG=0;
208: 10 92 3a 01 sts 0x013A, r1
init_USART();
20c: 0e 94 bf 00 call 0x17e
put_s("你好!");
210: 81 ec ldi r24, 0xC1 ; 193
212: 90 e0 ldi r25, 0x00 ; 0
214: 0e 94 4b 00 call 0x96
put_s("这是一个简单的串口实验程序");
218: 88 ec ldi r24, 0xC8 ; 200
21a: 90 e0 ldi r25, 0x00 ; 0
21c: 0e 94 4b 00 call 0x96
put_s("你可以在电脑上的超级终端程按下[0][1][2]按键,模拟用户板上的按键操作");
220: 83 ee ldi r24, 0xE3 ; 227
222: 90 e0 ldi r25, 0x00 ; 0
224: 0e 94 4b 00 call 0x96
sei(); //使能全局中断
228: 78 94 sei
while (1)
{
while (FLAG==0) pro_coammand();
22a: 80 91 3a 01 lds r24, 0x013A
22e: 88 23 and r24, r24
230: 19 f4 brne .+6 ; 0x238
232: 0e 94 c8 00 call 0x190
236: f9 cf rjmp .-14 ; 0x22a
LED2_ON(); //如果FLAG不加volatile限定(即has_volatile=0),程序将永远都运行不到这里。
238: db 98 cbi 0x1b, 3 ; 27
while (FLAG!=0) pro_coammand();
23a: 80 91 3a 01 lds r24, 0x013A
23e: 88 23 and r24, r24
240: 19 f0 breq .+6 ; 0x248
242: 0e 94 c8 00 call 0x190
246: f9 cf rjmp .-14 ; 0x23a
LED2_OFF();
248: db 9a sbi 0x1b, 3 ; 27
24a: ef cf rjmp .-34 ; 0x22a
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -