📄 main.lss
字号:
main.elf: file format elf32-avr
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00000184 00000000 00000000 00000094 2**0
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .data 00000000 00800060 00000184 00000218 2**0
CONTENTS, ALLOC, LOAD, DATA
2 .bss 00000001 00800060 00800060 00000218 2**0
ALLOC
3 .noinit 00000000 00800061 00800061 00000218 2**0
CONTENTS
4 .eeprom 00000000 00810000 00810000 00000218 2**0
CONTENTS
5 .debug_aranges 00000014 00000000 00000000 00000218 2**0
CONTENTS, READONLY, DEBUGGING
6 .debug_pubnames 00000052 00000000 00000000 0000022c 2**0
CONTENTS, READONLY, DEBUGGING
7 .debug_info 0000027e 00000000 00000000 0000027e 2**0
CONTENTS, READONLY, DEBUGGING
8 .debug_abbrev 000000e0 00000000 00000000 000004fc 2**0
CONTENTS, READONLY, DEBUGGING
9 .debug_line 000001c0 00000000 00000000 000005dc 2**0
CONTENTS, READONLY, DEBUGGING
10 .debug_str 000000cf 00000000 00000000 0000079c 2**0
CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:
00000000 <__vectors>:
0: 0c 94 2a 00 jmp 0x54
4: 0c 94 47 00 jmp 0x8e
8: 0c 94 61 00 jmp 0xc2
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 45 00 jmp 0x8a
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 7c 00 jmp 0xf8
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: 10 e0 ldi r17, 0x00 ; 0
62: a0 e6 ldi r26, 0x60 ; 96
64: b0 e0 ldi r27, 0x00 ; 0
66: e4 e8 ldi r30, 0x84 ; 132
68: f1 e0 ldi r31, 0x01 ; 1
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: a0 36 cpi r26, 0x60 ; 96
72: b1 07 cpc r27, r17
74: d9 f7 brne .-10 ; 0x6c
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
0000007e <.do_clear_bss_loop>:
7e: 1d 92 st X+, r1
00000080 <.do_clear_bss_start>:
80: a1 36 cpi r26, 0x61 ; 97
82: b1 07 cpc r27, r17
84: e1 f7 brne .-8 ; 0x7e
86: 0c 94 a0 00 jmp 0x140
0000008a <__bad_interrupt>:
8a: 0c 94 00 00 jmp 0x0
0000008e <__vector_1>:
#endif
//仿真时在watch窗口,监控这些变量。
SIGNAL(SIG_INTERRUPT0) //INT0中断服务程序
{
8e: 1f 92 push r1
90: 0f 92 push r0
92: 0f b6 in r0, 0x3f ; 63
94: 0f 92 push r0
96: 11 24 eor r1, r1
98: 8f 93 push r24
9a: 9f 93 push r25
__ticks = 1;
else if (__tmp > 65535)
__ticks = 0; /* i.e. 65536 */
else
__ticks = (uint16_t)__tmp;
9c: 84 ec ldi r24, 0xC4 ; 196
9e: 99 e0 ldi r25, 0x09 ; 9
a0: 01 97 sbiw r24, 0x01 ; 1
a2: f1 f7 brne .-4 ; 0xa0
//硬件自动清除INTF0标志位
_delay_ms(10); //延时
if ((PIND&(1<<EXT_INT0))==0) //重复检测,防抖动
a4: 82 9b sbis 0x10, 2 ; 16
LED0_ON(); //点亮LED0
a6: c0 9a sbi 0x18, 0 ; 24
loop_until_bit_is_set(PIND,EXT_INT0); //等待按键释放(变为高电平)
a8: 82 9b sbis 0x10, 2 ; 16
aa: fe cf rjmp .-4 ; 0xa8
__ticks = 1;
else if (__tmp > 65535)
__ticks = 0; /* i.e. 65536 */
else
__ticks = (uint16_t)__tmp;
ac: 84 ec ldi r24, 0xC4 ; 196
ae: 99 e0 ldi r25, 0x09 ; 9
b0: 01 97 sbiw r24, 0x01 ; 1
b2: f1 f7 brne .-4 ; 0xb0
b4: 9f 91 pop r25
b6: 8f 91 pop r24
b8: 0f 90 pop r0
ba: 0f be out 0x3f, r0 ; 63
bc: 0f 90 pop r0
be: 1f 90 pop r1
c0: 18 95 reti
000000c2 <__vector_2>:
_delay_ms(10); //延时 按键释放时也会抖动。
// 即使同时发生其它的中断事件,如果在这里把相应的中断标志位清除,那么该中断将不能触发进入中断服务
/*
注意
读端口用 PINx
写端口用 PORTx
*/
}
INTERRUPT(SIG_INTERRUPT1) //INT1中断服务程序
{
c2: 78 94 sei
c4: 1f 92 push r1
c6: 0f 92 push r0
c8: 0f b6 in r0, 0x3f ; 63
ca: 0f 92 push r0
cc: 11 24 eor r1, r1
ce: 8f 93 push r24
d0: 9f 93 push r25
__ticks = 1;
else if (__tmp > 65535)
__ticks = 0; /* i.e. 65536 */
else
__ticks = (uint16_t)__tmp;
d2: 84 ec ldi r24, 0xC4 ; 196
d4: 99 e0 ldi r25, 0x09 ; 9
d6: 01 97 sbiw r24, 0x01 ; 1
d8: f1 f7 brne .-4 ; 0xd6
//硬件自动清除INTF1标志位
//这里全局中断被打开,将允许其他中断嵌套执行
_delay_ms(10);
if ((PIND&(1<<EXT_INT1))==0)
da: 83 9b sbis 0x10, 3 ; 16
LED1_ON(); //点亮LED1
dc: c1 9a sbi 0x18, 1 ; 24
loop_until_bit_is_set(PIND,EXT_INT1);
de: 83 9b sbis 0x10, 3 ; 16
e0: fe cf rjmp .-4 ; 0xde
__ticks = 1;
else if (__tmp > 65535)
__ticks = 0; /* i.e. 65536 */
else
__ticks = (uint16_t)__tmp;
e2: 84 ec ldi r24, 0xC4 ; 196
e4: 99 e0 ldi r25, 0x09 ; 9
e6: 01 97 sbiw r24, 0x01 ; 1
e8: f1 f7 brne .-4 ; 0xe6
ea: 9f 91 pop r25
ec: 8f 91 pop r24
ee: 0f 90 pop r0
f0: 0f be out 0x3f, r0 ; 63
f2: 0f 90 pop r0
f4: 1f 90 pop r1
f6: 18 95 reti
000000f8 <__vector_18>:
_delay_ms(10);
}
SIGNAL(SIG_INTERRUPT2) //INT2中断服务程序
{
f8: 1f 92 push r1
fa: 0f 92 push r0
fc: 0f b6 in r0, 0x3f ; 63
fe: 0f 92 push r0
100: 11 24 eor r1, r1
102: 8f 93 push r24
104: 9f 93 push r25
__ticks = 1;
else if (__tmp > 65535)
__ticks = 0; /* i.e. 65536 */
else
__ticks = (uint16_t)__tmp;
106: 84 ec ldi r24, 0xC4 ; 196
108: 99 e0 ldi r25, 0x09 ; 9
10a: 01 97 sbiw r24, 0x01 ; 1
10c: f1 f7 brne .-4 ; 0x10a
//硬件自动清除INTF2标志位
_delay_ms(10);
if ((PINB&(1<<EXT_INT2))==0)
10e: b2 99 sbic 0x16, 2 ; 22
110: 02 c0 rjmp .+4 ; 0x116
{
LED0_OFF(); //熄灭LED0
112: c0 98 cbi 0x18, 0 ; 24
LED1_OFF(); //熄灭LED1
114: c1 98 cbi 0x18, 1 ; 24
}
loop_until_bit_is_set(PINB,EXT_INT2);
116: b2 9b sbis 0x16, 2 ; 22
118: fe cf rjmp .-4 ; 0x116
FLAG=!FLAG; //修改全局变量
11a: 90 e0 ldi r25, 0x00 ; 0
11c: 80 91 60 00 lds r24, 0x0060
120: 88 23 and r24, r24
122: 09 f4 brne .+2 ; 0x126
124: 91 e0 ldi r25, 0x01 ; 1
126: 90 93 60 00 sts 0x0060, r25
__ticks = 1;
else if (__tmp > 65535)
__ticks = 0; /* i.e. 65536 */
else
__ticks = (uint16_t)__tmp;
12a: 88 ea ldi r24, 0xA8 ; 168
12c: 91 e6 ldi r25, 0x61 ; 97
12e: 01 97 sbiw r24, 0x01 ; 1
130: f1 f7 brne .-4 ; 0x12e
132: 9f 91 pop r25
134: 8f 91 pop r24
136: 0f 90 pop r0
138: 0f be out 0x3f, r0 ; 63
13a: 0f 90 pop r0
13c: 1f 90 pop r1
13e: 18 95 reti
00000140 <main>:
_delay_ms(100);
}
int main(void)
{
140: cf e5 ldi r28, 0x5F ; 95
142: d4 e0 ldi r29, 0x04 ; 4
144: de bf out 0x3e, r29 ; 62
146: cd bf out 0x3d, r28 ; 61
//上电默认DDRx=0x00,PORTx=0x00 输入,无上拉电阻
PORTA =0xFF; //不用的管脚使能内部上拉电阻。
148: 8f ef ldi r24, 0xFF ; 255
14a: 8b bb out 0x1b, r24 ; 27
PORTC =0xFF;
14c: 85 bb out 0x15, r24 ; 21
PORTD =0xFF;
14e: 82 bb out 0x12, r24 ; 18
DDRB = (1<<LED2)|(1<<LED1)|(1<<LED0); //输出
150: 8b e0 ldi r24, 0x0B ; 11
152: 87 bb out 0x17, r24 ; 23
PORTB =~((1<<LED2)|(1<<LED1)|(1<<LED0)); //低电平,灯灭
154: 84 ef ldi r24, 0xF4 ; 244
156: 88 bb out 0x18, r24 ; 24
//外部中断INT0,1,2 做按键输入,使能内部上拉,就可以不用外接电阻了
MCUCR=(1<<ISC11)|(0<<ISC10)|(1<<ISC01)|(0<<ISC00); //注意该寄存器有多个功能
158: 8a e0 ldi r24, 0x0A ; 10
15a: 85 bf out 0x35, r24 ; 53
/*
ISCx1:0=00 INTx引脚为低电平时产生中断请求
ISCx1:0=01 INTx引脚上任意的逻辑电平变化都将引发中断
ISCx1:0=10 INTx引脚的下降沿产生中断请求
ISCx1:0=11 INTx引脚的上升沿产生中断请求
*/
MCUCSR&=~(1<<ISC2); //注意该寄存器有多个功能
15c: 84 b7 in r24, 0x34 ; 52
15e: 8f 7b andi r24, 0xBF ; 191
160: 84 bf out 0x34, r24 ; 52
/*
ISC2=0 INT2引脚的下降沿产生异步中断请求
ISC2=1 INT2引脚的上升沿产生异步中断请求
*/
GIFR=(1<<INTF1)|(1<<INTF0)|(1<<INTF2);//写1清除标志位,在使能中断前最好先把对应的标志位清除,以免误触发
162: 80 ee ldi r24, 0xE0 ; 224
164: 8a bf out 0x3a, r24 ; 58
GICR=(1<<INT1)|(1<<INT0)|(1<<INT2); //使能三个外部中断
166: 8b bf out 0x3b, r24 ; 59
FLAG=0;
168: 10 92 60 00 sts 0x0060, r1
sei(); //使能全局中断
16c: 78 94 sei
while (1)
{
while (FLAG==0);
16e: 80 91 60 00 lds r24, 0x0060
172: 88 23 and r24, r24
174: e1 f3 breq .-8 ; 0x16e
LED2_ON(); //如果FLAG不加volatile限定(即has_volatile=0),程序将永远都运行不到这里。
176: c3 9a sbi 0x18, 3 ; 24
while (FLAG!=0);
178: 80 91 60 00 lds r24, 0x0060
17c: 88 23 and r24, r24
17e: e1 f7 brne .-8 ; 0x178
LED2_OFF();
180: c3 98 cbi 0x18, 3 ; 24
182: f5 cf rjmp .-22 ; 0x16e
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -