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

📄 06int.lst

📁 用AVR单片机做的一些程序,包括跑马灯显示,PWM产生,ADC转换等
💻 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 + -