📄 06int.lst
字号:
__text_start:
__start:
0046 EFCF LDI R28,0xFF
0047 E1D0 LDI R29,0x10
0048 BFCD OUT 0x3D,R28
0049 BFDE OUT 0x3E,R29
004A 51C0 SUBI R28,0x10
004B 40D0 SBCI R29,0
004C EA0A LDI R16,0xAA
004D 8308 STD Y+0,R16
004E 2400 CLR R0
004F E0E0 LDI R30,0
0050 E0F1 LDI R31,1
0051 E011 LDI R17,1
0052 30E0 CPI R30,0
0053 07F1 CPC R31,R17
0054 F011 BEQ 0x0057
0055 9201 ST R0,Z+
0056 CFFB RJMP 0x0052
0057 8300 STD Z+0,R16
0058 E8EC LDI R30,0x8C
0059 E0F0 LDI R31,0
005A E0A0 LDI R26,0
005B E0B1 LDI R27,1
005C E010 LDI R17,0
005D 38EC CPI R30,0x8C
005E 07F1 CPC R31,R17
005F F021 BEQ 0x0064
0060 95C8 LPM
0061 9631 ADIW R30,1
0062 920D ST R0,X+
0063 CFF9 RJMP 0x005D
0064 940E008B CALL _main
_exit:
0066 CFFF RJMP _exit
_delay_ms:
a --> R20
b --> R22
i --> R16
0067 940E0128 CALL push_gset2
FILE: E:\ICCAVR\project\AVRMEG~3\icc\006-INT-LED\main.c
(0001) /*
(0002) 实验六:
(0003) 外部中断实验。
(0004) 1、按键中断实验。INT4-INT7 4路中断触发方式,并以PB4-PB7电平
(0005) 翻转显示其状态。
(0006) 2、内部1 M晶振,程序采用全中断触发方式工作。
(0007) 3、进行此实验请插上LED短路块。
(0008) 4、此实验以简单的方式对中断的4种触发方式进行了实验,
(0009) 让大家对中断有个全面的认识。
(0010)
(0011) AVR mega128学习板
(0012) www.iccavr.com 阿发
(0013) 1:15 2007-10-11
(0014) */
(0015)
(0016) #include "iom128v.h"
(0017) #include <macros.h>
(0018)
(0019) void int_init(void);
(0020)
(0021) /*延时函数*/
(0022) void delay_ms(unsigned char i) {
(0023)
(0024) unsigned char a, b;
(0025) for (a = 0; a < i; a++) {
0069 2744 CLR R20
006A C006 RJMP 0x0071
(0026) for (b = 1; b; b++);
006B E061 LDI R22,1
006C C001 RJMP 0x006E
006D 9563 INC R22
006E 2366 TST R22
006F F7E9 BNE 0x006D
0070 9543 INC R20
0071 1740 CP R20,R16
0072 F3C0 BCS 0x006B
0073 940E011F CALL pop_gset2
0075 9508 RET
(0027) }
(0028) }
(0029)
(0030) /*IO口初始化函数*/
(0031) void io_init(void) {
(0032)
(0033) DDRA = 0x00; /*方向输入*/
_io_init:
0076 2422 CLR R2
0077 BA2A OUT 0x1A,R2
(0034) PORTA = 0xFF; /*打开上拉*/
0078 EF8F LDI R24,0xFF
0079 BB8B OUT 0x1B,R24
(0035) DDRB = 0xFF; /*方向输出*/
007A BB87 OUT 0x17,R24
(0036) PORTB = 0xFF; /*输出高电平*/
007B BB88 OUT 0x18,R24
(0037) DDRC = 0x00; /*不用的IO口建议设置为输入带上拉*/
007C BA24 OUT 0x14,R2
(0038) PORTC = 0xFF;
007D BB85 OUT 0x15,R24
(0039) DDRD = 0x00;
007E BA21 OUT 0x11,R2
(0040) PORTD = 0xFF;
007F BB82 OUT 0x12,R24
(0041) DDRE = 0x00;
0080 B822 OUT 0x02,R2
(0042) PORTE = 0xFF;
0081 B983 OUT 0x03,R24
(0043) DDRF = 0x00;
0082 92200061 STS 0x61,R2
(0044) PORTF = 0xFF;
0084 93800062 STS 0x62,R24
(0045) DDRG = 0x00;
0086 92200064 STS 0x64,R2
(0046) PORTG = 0xFF;
0088 93800065 STS 0x65,R24
008A 9508 RET
(0047) }
(0048)
(0049) void main(void) {
(0050)
(0051) io_init(); /*IO口状态初始化*/
_main:
008B DFEA RCALL _io_init
(0052) int_init(); /*中断初始化*/
008C D009 RCALL _int_init
008D C006 RJMP 0x0094
(0053)
(0054) while (1) {
(0055) delay_ms(200);
008E EC08 LDI R16,0xC8
008F DFD7 RCALL _delay_ms
(0056) PORTB ^= (1 << 0); /*PB0电平取反,闲着没事干,意思意思*/
0090 E081 LDI R24,1
0091 B228 IN R2,0x18
0092 2628 EOR R2,R24
0093 BA28 OUT 0x18,R2
0094 CFF9 RJMP 0x008E
0095 9508 RET
(0057) }
(0058) }
(0059)
(0060) /*中断初始化函数*/
(0061) void int_init(void) {
(0062) CLI(); /*关全局中断*/
_int_init:
0096 94F8 BCLR 7
(0063) EIMSK = 0x00; /*屏蔽所有外部中断*/
0097 2422 CLR R2
0098 BE29 OUT 0x39,R2
(0064) EICRA = 0x00; /*INT0-INT3设置为低电平触发*/
0099 9220006A STS 0x6A,R2
(0065) EICRB = 0x00; /*INT4-INT7设置为低电平触发*/
009B BE2A OUT 0x3A,R2
(0066) EICRB |= (1 << ISC50); /*INT5设置为任意电平变化触发*/
009C B78A IN R24,0x3A
009D 6084 ORI R24,4
009E BF8A OUT 0x3A,R24
(0067) EICRB |= (1 << ISC61); /*INT6设置为下降沿触发*/
009F B78A IN R24,0x3A
00A0 6280 ORI R24,0x20
00A1 BF8A OUT 0x3A,R24
(0068) EICRB |= (1 << ISC71) | (1 << ISC70); /*INT6设置为下降沿触发*/
00A2 B78A IN R24,0x3A
00A3 6C80 ORI R24,0xC0
00A4 BF8A OUT 0x3A,R24
(0069) EIFR = 0xFF; /*清除中断标志,请见中文手册P84*/
00A5 EF8F LDI R24,0xFF
00A6 BF88 OUT 0x38,R24
(0070) EIMSK = 0xF0; /*INT4-INT7中断允许*/
00A7 EF80 LDI R24,0xF0
00A8 BF89 OUT 0x39,R24
(0071) SEI(); /*全局中断允许*/
00A9 9478 BSET 7
00AA 9508 RET
_Int4:
i --> R16
00AB 922A ST R2,-Y
00AC 923A ST R3,-Y
00AD 930A ST R16,-Y
00AE 931A ST R17,-Y
00AF 938A ST R24,-Y
00B0 B62F IN R2,0x3F
00B1 922A ST R2,-Y
(0072) }
(0073)
(0074) /*外部中断INT4,低电平触发*/
(0075) #pragma interrupt_handler Int4: 6
(0076) void Int4(void) {
(0077) unsigned int i;
(0078)
(0079) i = 1000; /*防按键颤动代码*/
00B2 EE08 LDI R16,0xE8
00B3 E013 LDI R17,3
00B4 C003 RJMP 0x00B8
(0080) while (i --) {
(0081) if ((PINE & (1 << PE4)) != 0) { /*按键是否为低电平*/
00B5 9B0C SBIS 0x01,4
00B6 C001 RJMP 0x00B8
(0082) return ;
00B7 C00D RJMP 0x00C5
00B8 0118 MOVW R2,R16
00B9 5001 SUBI R16,1
00BA 4010 SBCI R17,0
00BB 2022 TST R2
00BC F7C1 BNE 0x00B5
00BD 2033 TST R3
00BE F7B1 BNE 0x00B5
(0083) }
(0084) }
(0085)
(0086) PORTB ^= (1 << PB4); /*PB1电平取反*/
00BF E180 LDI R24,0x10
00C0 B228 IN R2,0x18
00C1 2628 EOR R2,R24
00C2 BA28 OUT 0x18,R2
(0087) while ((PINE & (1 << PE4)) == 0); /*等待按键松开*/
00C3 9B0C SBIS 0x01,4
00C4 CFFE RJMP 0x00C3
00C5 9029 LD R2,Y+
00C6 BE2F OUT 0x3F,R2
00C7 9189 LD R24,Y+
00C8 9119 LD R17,Y+
00C9 9109 LD R16,Y+
00CA 9039 LD R3,Y+
00CB 9029 LD R2,Y+
00CC 9518 RETI
_Int5:
00CD 922A ST R2,-Y
00CE 938A ST R24,-Y
00CF B62F IN R2,0x3F
00D0 922A ST R2,-Y
(0088) }
(0089)
(0090) /*外部中断INT5,任意电平变化触发*/
(0091) #pragma interrupt_handler Int5: 7
(0092) void Int5(void) {
(0093) PORTB ^= (1 << PB5); /*PB1电平取反*/
00D1 E280 LDI R24,0x20
00D2 B228 IN R2,0x18
00D3 2628 EOR R2,R24
00D4 BA28 OUT 0x18,R2
00D5 9029 LD R2,Y+
00D6 BE2F OUT 0x3F,R2
00D7 9189 LD R24,Y+
00D8 9029 LD R2,Y+
00D9 9518 RETI
_Int6:
i --> R16
00DA 922A ST R2,-Y
00DB 923A ST R3,-Y
00DC 930A ST R16,-Y
00DD 931A ST R17,-Y
00DE 938A ST R24,-Y
00DF B62F IN R2,0x3F
00E0 922A ST R2,-Y
(0094) }
(0095)
(0096) /*外部中断INT4,下降沿触发*/
(0097) #pragma interrupt_handler Int6: 8
(0098) void Int6(void) {
(0099) unsigned int i;
(0100)
(0101) i = 1000; /*防按键颤动代码*/
00E1 EE08 LDI R16,0xE8
00E2 E013 LDI R17,3
00E3 C003 RJMP 0x00E7
(0102) while (i --) {
(0103) if ((PINE & (1 << PE6)) != 0) { /*按键是否为低电平*/
00E4 9B0E SBIS 0x01,6
00E5 C001 RJMP 0x00E7
(0104) return ;
00E6 C00B RJMP 0x00F2
00E7 0118 MOVW R2,R16
00E8 5001 SUBI R16,1
00E9 4010 SBCI R17,0
00EA 2022 TST R2
00EB F7C1 BNE 0x00E4
00EC 2033 TST R3
00ED F7B1 BNE 0x00E4
(0105) }
(0106) }
(0107)
(0108) PORTB ^= (1 << PB6); /*PB1电平取反*/
00EE E480 LDI R24,0x40
00EF B228 IN R2,0x18
00F0 2628 EOR R2,R24
00F1 BA28 OUT 0x18,R2
00F2 9029 LD R2,Y+
00F3 BE2F OUT 0x3F,R2
00F4 9189 LD R24,Y+
00F5 9119 LD R17,Y+
00F6 9109 LD R16,Y+
00F7 9039 LD R3,Y+
00F8 9029 LD R2,Y+
00F9 9518 RETI
_Int7:
i --> R16
00FA 922A ST R2,-Y
00FB 923A ST R3,-Y
00FC 930A ST R16,-Y
00FD 931A ST R17,-Y
00FE 938A ST R24,-Y
00FF 939A ST R25,-Y
0100 B62F IN R2,0x3F
0101 922A ST R2,-Y
(0109) }
(0110)
(0111) /*外部中断INT4,上升沿触发*/
(0112) #pragma interrupt_handler Int7: 9
(0113) void Int7(void) {
(0114) unsigned int i;
(0115)
(0116) i = 1000; /*防按键颤动代码*/
0102 EE08 LDI R16,0xE8
0103 E013 LDI R17,3
0104 C003 RJMP 0x0108
(0117) while (i --) {
(0118) if ((PINE & (1 << PE7)) == 0) { /*按键是否为高电平*/
0105 990F SBIC 0x01,7
0106 C001 RJMP 0x0108
(0119) return ;
0107 C00E RJMP 0x0116
0108 0118 MOVW R2,R16
0109 5001 SUBI R16,1
010A 4010 SBCI R17,0
010B 2022 TST R2
010C F7C1 BNE 0x0105
010D 2033 TST R3
010E F7B1 BNE 0x0105
(0120) }
(0121) }
(0122)
(0123) PORTB ^= (1 << PB7); /*PB1电平取反*/
FILE: <library>
010F E880 LDI R24,0x80
0110 E090 LDI R25,0
0111 B228 IN R2,0x18
0112 2433 CLR R3
0113 2628 EOR R2,R24
0114 2639 EOR R3,R25
0115 BA28 OUT 0x18,R2
0116 9029 LD R2,Y+
0117 BE2F OUT 0x3F,R2
0118 9199 LD R25,Y+
0119 9189 LD R24,Y+
011A 9119 LD R17,Y+
011B 9109 LD R16,Y+
011C 9039 LD R3,Y+
011D 9029 LD R2,Y+
011E 9518 RETI
pop_gset2:
011F E0E2 LDI R30,2
0120 940C012E JMP pop
push_gset5:
0122 92FA ST R15,-Y
0123 92EA ST R14,-Y
push_gset4:
0124 92DA ST R13,-Y
0125 92CA ST R12,-Y
push_gset3:
0126 92BA ST R11,-Y
0127 92AA ST R10,-Y
push_gset2:
0128 937A ST R23,-Y
0129 936A ST R22,-Y
push_gset1:
012A 935A ST R21,-Y
012B 934A ST R20,-Y
012C 9508 RET
pop_gset1:
012D E0E1 LDI R30,1
pop:
012E 9149 LD R20,Y+
012F 9159 LD R21,Y+
0130 FDE0 SBRC R30,0
0131 9508 RET
0132 9169 LD R22,Y+
0133 9179 LD R23,Y+
0134 FDE1 SBRC R30,1
0135 9508 RET
0136 90A9 LD R10,Y+
0137 90B9 LD R11,Y+
0138 FDE2 SBRC R30,2
0139 9508 RET
013A 90C9 LD R12,Y+
013B 90D9 LD R13,Y+
013C FDE3 SBRC R30,3
013D 9508 RET
013E 90E9 LD R14,Y+
013F 90F9 LD R15,Y+
0140 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -