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

📄 main.lss

📁 一个很好用的中断程序
💻 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 + -