📄 main.lst
字号:
__start:
__text_start:
002A E5CF LDI R28,0x5F
002B E0D4 LDI R29,4
002C BFCD OUT 0x3D,R28
002D BFDE OUT 0x3E,R29
002E 51C0 SUBI R28,0x10
002F 40D0 SBCI R29,0
0030 EA0A LDI R16,0xAA
0031 8308 STD Y+0,R16
0032 2400 CLR R0
0033 E6E0 LDI R30,0x60
0034 E0F0 LDI R31,0
0035 E010 LDI R17,0
0036 36E0 CPI R30,0x60
0037 07F1 CPC R31,R17
0038 F011 BEQ 0x003B
0039 9201 ST R0,Z+
003A CFFB RJMP 0x0036
003B 8300 STD Z+0,R16
003C E5E4 LDI R30,0x54
003D E0F0 LDI R31,0
003E E6A0 LDI R26,0x60
003F E0B0 LDI R27,0
0040 E010 LDI R17,0
0041 35E4 CPI R30,0x54
0042 07F1 CPC R31,R17
0043 F021 BEQ 0x0048
0044 95C8 LPM
0045 9631 ADIW R30,1
0046 920D ST R0,X+
0047 CFF9 RJMP 0x0041
0048 940E007C CALL _main
_exit:
004A CFFF RJMP _exit
FILE: D:\桌面\教程\外部中断\main.c
(0001) //ICC-AVR application builder : 2007-2-17 7:56:49
(0002) // Target : M16
(0003) // Crystal: 7.3728Mhz
(0004) // www.avrvi.com AVR与虚拟仪器
(0005)
(0006) // 硬件连接:
(0007) // PA0—————LED0
(0008) // PA1—————LED1
(0009) // PD2—————独立按键A
(0010) // PD3—————独立按键B
(0011)
(0012) // 实验效果:
(0013) // 按A时,LED0亮与灭交替变换
(0014) // 按B时,LED1亮与灭交替变换
(0015)
(0016) #include <iom16v.h>
(0017) #include <macros.h>
(0018)
(0019) void port_init(void)
(0020) {
(0021) PORTA = 0x00;
_port_init:
004B 2422 CLR R2
004C BA2B OUT 0x1B,R2
(0022) DDRA = 0x03; //PORTA.0 PORTA.1 输出,LED指示
004D E083 LDI R24,3
004E BB8A OUT 0x1A,R24
(0023) PORTB = 0x00;
004F BA28 OUT 0x18,R2
(0024) DDRB = 0x00;
0050 BA27 OUT 0x17,R2
(0025) PORTC = 0x00; //m103 output only
0051 BA25 OUT 0x15,R2
(0026) DDRC = 0x00;
0052 BA24 OUT 0x14,R2
(0027) PORTD |= (1<<2)|(1<<3); //使能内部上拉
0053 B382 IN R24,0x12
0054 608C ORI R24,0xC
0055 BB82 OUT 0x12,R24
(0028) DDRD = 0x00; //PD2,PD3 对应INT0,INT1 一定要设置为输入
0056 BA21 OUT 0x11,R2
0057 9508 RET
_int0_isr:
0058 922A ST R2,-Y
0059 938A ST R24,-Y
005A B62F IN R2,0x3F
005B 922A ST R2,-Y
(0029) }
(0030)
(0031) #pragma interrupt_handler int0_isr:2
(0032) void int0_isr(void)
(0033) {
(0034) //external interupt on INT0
(0035) PORTA ^= 0x01; //PA0取反
005C E081 LDI R24,1
005D B22B IN R2,0x1B
005E 2628 EOR R2,R24
005F BA2B OUT 0x1B,R2
0060 9029 LD R2,Y+
0061 BE2F OUT 0x3F,R2
0062 9189 LD R24,Y+
0063 9029 LD R2,Y+
0064 9518 RETI
_int1_isr:
0065 922A ST R2,-Y
0066 938A ST R24,-Y
0067 B62F IN R2,0x3F
0068 922A ST R2,-Y
(0036) }
(0037)
(0038) #pragma interrupt_handler int1_isr:3
(0039) void int1_isr(void)
(0040) {
(0041) //external interupt on INT1
(0042) PORTA ^= 0x02; //PA1取反
0069 E082 LDI R24,2
006A B22B IN R2,0x1B
006B 2628 EOR R2,R24
006C BA2B OUT 0x1B,R2
006D 9029 LD R2,Y+
006E BE2F OUT 0x3F,R2
006F 9189 LD R24,Y+
0070 9029 LD R2,Y+
0071 9518 RETI
(0043) }
(0044)
(0045) //call this routine to initialize all peripherals
(0046) void init_devices(void)
(0047) {
(0048) //stop errant interrupts until set up
(0049) CLI(); //disable all interrupts
_init_devices:
0072 94F8 BCLR 7
(0050) port_init();
0073 DFD7 RCALL _port_init
(0051)
(0052) MCUCR = 0x0A; //允许INT0和INT1外部中断
0074 E08A LDI R24,0xA
0075 BF85 OUT 0x35,R24
(0053) GICR = 0xC0;
0076 EC80 LDI R24,0xC0
0077 BF8B OUT 0x3B,R24
(0054) TIMSK = 0x00; //timer interrupt sources
0078 2422 CLR R2
0079 BE29 OUT 0x39,R2
(0055) SEI(); //re-enable interrupts
007A 9478 BSET 7
007B 9508 RET
(0056) //all peripherals are now initialized
(0057) }
(0058)
(0059) void main(void)
(0060) {
(0061) init_devices();
_main:
007C DFF5 RCALL _init_devices
(0062) while(1)
FILE: <library>
007D CFFF RJMP 0x007D
007E 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -