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

📄 中断按键.lst

📁 AVR之ATMega16
💻 LST
字号:
__text_start:
__start:
    002F E5CF      LDI	R28,0x5F
    0030 E0D4      LDI	R29,4
    0031 BFCD      OUT	0x3D,R28
    0032 BFDE      OUT	0x3E,R29
    0033 51C0      SUBI	R28,0x10
    0034 40D0      SBCI	R29,0
    0035 EA0A      LDI	R16,0xAA
    0036 8308      STD	Y+0,R16
    0037 2400      CLR	R0
    0038 E6EA      LDI	R30,0x6A
    0039 E0F0      LDI	R31,0
    003A E010      LDI	R17,0
    003B 36EF      CPI	R30,0x6F
    003C 07F1      CPC	R31,R17
    003D F011      BEQ	0x0040
    003E 9201      ST	R0,Z+
    003F CFFB      RJMP	0x003B
    0040 8300      STD	Z+0,R16
    0041 E5E4      LDI	R30,0x54
    0042 E0F0      LDI	R31,0
    0043 E6A0      LDI	R26,0x60
    0044 E0B0      LDI	R27,0
    0045 E010      LDI	R17,0
    0046 35EE      CPI	R30,0x5E
    0047 07F1      CPC	R31,R17
    0048 F021      BEQ	0x004D
    0049 95C8      LPM
    004A 9631      ADIW	R30,1
    004B 920D      ST	R0,X+
    004C CFF9      RJMP	0x0046
    004D 940E0124  CALL	_main
_exit:
    004F CFFF      RJMP	_exit
FILE: C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\中断按键\数码管.h
(0001) //包含所需头文件
(0002) #include <ioM16v.h>
(0003) #include <macros.h>
(0004) 
(0005) 
(0006) 
(0007) 
(0008) /*------宏定义------*/
(0009) #define uchar	unsigned char
(0010) #define uint	unsigned int
(0011) 
(0012) uchar LED_data[10]={0xC0,/*0*/0xF9,/*1*/0xA4,/*2*/0xB0,/*3*/0x99,/*4*/0x92,
(0013)                     /*5*/0x82,/*6*/0xF8,/*7*/0x80,/*8*/0x90,/*9*/};
(0014) 
(0015) 
(0016) 
(0017) void LED_init(void)
(0018) {
(0019)  	 DDRA=0xff;
_LED_init:
    0050 EF8F      LDI	R24,0xFF
    0051 BB8A      OUT	0x1A,R24
(0020) 	 DDRB|=0xff;
    0052 B387      IN	R24,0x17
    0053 6F8F      ORI	R24,0xFF
    0054 BB87      OUT	0x17,R24
(0021) 	 PORTA=0x00;
    0055 2422      CLR	R2
    0056 BA2B      OUT	0x1B,R2
(0022) 	 PORTB|=0x00;
    0057 B228      IN	R2,0x18
    0058 BA28      OUT	0x18,R2
    0059 9508      RET
_show_LED:
  data4                --> Y+6
  data3                --> Y+4
  data2                --> R20
  data1                --> R22
    005A 940E0143  CALL	push_gset2
    005C 2F42      MOV	R20,R18
    005D 2F60      MOV	R22,R16
(0023) }
(0024) void show_LED(uchar data1,uchar data2,uchar data3,uchar data4)
(0025) {
(0026)  	 PORTA=LED_data[data1];
    005E E680      LDI	R24,0x60
    005F E090      LDI	R25,0
    0060 2FE6      MOV	R30,R22
    0061 27FF      CLR	R31
    0062 0FE8      ADD	R30,R24
    0063 1FF9      ADC	R31,R25
    0064 8020      LDD	R2,Z+0
    0065 BA2B      OUT	0x1B,R2
(0027) 	 PORTB=0xf7;
    0066 EF87      LDI	R24,0xF7
    0067 BB88      OUT	0x18,R24
(0028) 	 DelayMS(1);
    0068 E001      LDI	R16,1
    0069 E010      LDI	R17,0
    006A D033      RCALL	_DelayMS
(0029) 	 
(0030) 	 PORTA=LED_data[data2];
    006B E680      LDI	R24,0x60
    006C E090      LDI	R25,0
    006D 2FE4      MOV	R30,R20
    006E 27FF      CLR	R31
    006F 0FE8      ADD	R30,R24
    0070 1FF9      ADC	R31,R25
    0071 8020      LDD	R2,Z+0
    0072 BA2B      OUT	0x1B,R2
(0031) 	 PORTB=0xfb;
    0073 EF8B      LDI	R24,0xFB
    0074 BB88      OUT	0x18,R24
(0032) 	 DelayMS(1);
    0075 E001      LDI	R16,1
    0076 E010      LDI	R17,0
    0077 D026      RCALL	_DelayMS
(0033) 	 
(0034) 	 PORTA=LED_data[data3];
    0078 E680      LDI	R24,0x60
    0079 E090      LDI	R25,0
    007A 81EC      LDD	R30,Y+4
    007B 27FF      CLR	R31
    007C 0FE8      ADD	R30,R24
    007D 1FF9      ADC	R31,R25
    007E 8020      LDD	R2,Z+0
    007F BA2B      OUT	0x1B,R2
(0035) 	 PORTB=0xfd;
    0080 EF8D      LDI	R24,0xFD
    0081 BB88      OUT	0x18,R24
(0036) 	 DelayMS(1);
    0082 E001      LDI	R16,1
    0083 E010      LDI	R17,0
    0084 D019      RCALL	_DelayMS
(0037) 	 
(0038) 	 PORTA=LED_data[data4];
    0085 E680      LDI	R24,0x60
    0086 E090      LDI	R25,0
    0087 81EE      LDD	R30,Y+6
    0088 27FF      CLR	R31
    0089 0FE8      ADD	R30,R24
    008A 1FF9      ADC	R31,R25
    008B 8020      LDD	R2,Z+0
    008C BA2B      OUT	0x1B,R2
(0039) 	 PORTB=0xfe;
    008D EF8E      LDI	R24,0xFE
    008E BB88      OUT	0x18,R24
(0040) 	 DelayMS(1);
    008F E001      LDI	R16,1
    0090 E010      LDI	R17,0
    0091 D00C      RCALL	_DelayMS
    0092 940E013A  CALL	pop_gset2
    0094 9508      RET
FILE: C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\中断按键\delay.h
(0001) #define xtal  8                      //8MS
(0002) /************************************************************
(0003) *   函数名称:void DelayUS(unsigned int time)
(0004) *   功    能:软件延时1.1Us 
(0005) *   入口参数:time 延时时间
(0006) *   出口参数:无
(0007) ************************************************************/
(0008) void DelayUS(unsigned int time)
(0009) {   
_DelayUS:
  time                 --> R16
    0095 C002      RJMP	0x0098
(0010)      while(time>1)
(0011) 	    time--; 
    0096 5001      SUBI	R16,1
    0097 4010      SBCI	R17,0
    0098 E081      LDI	R24,1
    0099 E090      LDI	R25,0
    009A 1780      CP	R24,R16
    009B 0791      CPC	R25,R17
    009C F3C8      BCS	0x0096
    009D 9508      RET
_DelayMS:
  i                    --> R20
  time                 --> R16
    009E 940E0145  CALL	push_gset1
(0012) }
(0013) /************************************************************
(0014) *   函数名称:void DelayMS(unsigned int time)
(0015) *   功    能:软件延时  1/1000s
(0016) *   入口参数:time 延时时间 MS  
(0017) *   出口参数:无
(0018) ************************************************************/
(0019) void DelayMS (unsigned int time)
(0020) {
    00A0 C009      RJMP	0x00AA
(0021)     unsigned int i;
(0022)     while(time--)	
(0023) 	{
(0024) 	  for(i=1;i<(unsigned int)(xtal*143-2);i++)
    00A1 E041      LDI	R20,1
    00A2 E050      LDI	R21,0
    00A3 C002      RJMP	0x00A6
    00A4 5F4F      SUBI	R20,0xFF
    00A5 4F5F      SBCI	R21,0xFF
    00A6 3746      CPI	R20,0x76
    00A7 E0E4      LDI	R30,4
    00A8 075E      CPC	R21,R30
    00A9 F3D0      BCS	0x00A4
    00AA 0118      MOVW	R2,R16
    00AB 5001      SUBI	R16,1
    00AC 4010      SBCI	R17,0
    00AD 2022      TST	R2
    00AE F791      BNE	0x00A1
    00AF 2033      TST	R3
    00B0 F781      BNE	0x00A1
    00B1 940E0148  CALL	pop_gset1
    00B3 9508      RET
FILE: C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\中断按键\中断按键.c
(0001) //内部晶振 8M
(0002) //包含所需头文件
(0003) #include <ioM16v.h>
(0004) #include <macros.h>
(0005) #include"数码管.h"
(0006) #include"delay.h"
(0007) 
(0008) 
(0009) 
(0010) /*------宏定义------*/
(0011) #define uchar	unsigned char
(0012) #define uint	unsigned int
(0013) 
(0014) /*********标志位************************************************/
(0015) #define start 0x0;
(0016) #define stop  0x1;
(0017) //----------函数申明-------------------------
(0018) /***************************************************************/
(0019) //void LED_init(void);                                                  //LED初始化
(0020) //void show_LED(uchar data1,uchar data2,uchar data3,uchar data4);   //LED显示
(0021) //void LED_run(void)	;						 
(0022) /****************************************************************/
(0023) /*********标志位************************************************/
(0024) uchar LED_ret;
(0025) 
(0026) uchar a,b, c,d;//全局变量定义
(0027) 
(0028) //端口初始化
(0029) void port_init(void)
(0030) {
(0031)  PORTA = 0x00;//设置A口置1
_port_init:
    00B4 2422      CLR	R2
    00B5 BA2B      OUT	0x1B,R2
(0032)  DDRA  = 0x00;//设置A口输入
    00B6 BA2A      OUT	0x1A,R2
(0033)  PORTB = 0x00;
    00B7 BA28      OUT	0x18,R2
(0034)  DDRB  = 0x00;
    00B8 BA27      OUT	0x17,R2
(0035)  PORTC = 0x00;
    00B9 BA25      OUT	0x15,R2
(0036)  DDRC  = 0x00;
    00BA BA24      OUT	0x14,R2
(0037)  PORTD = 0x0c;
    00BB E08C      LDI	R24,0xC
    00BC BB82      OUT	0x12,R24
(0038)  DDRD  = 0x00;
    00BD BA21      OUT	0x11,R2
    00BE 9508      RET
(0039) }
(0040) 
(0041) 
(0042) //外中断初始化
(0043) void int_init(void)
(0044) {
(0045)  MCUCR |= 0x0a;//INT0、INT1下降沿触发中断
_int_init:
    00BF B785      IN	R24,0x35
    00C0 608A      ORI	R24,0xA
    00C1 BF85      OUT	0x35,R24
(0046)  MCUCSR|= 0x00;//关闭INT2
    00C2 B624      IN	R2,0x34
    00C3 BE24      OUT	0x34,R2
(0047)  GICR  |= 0xC0;//INT0、INT1中断使能
    00C4 B78B      IN	R24,0x3B
    00C5 6C80      ORI	R24,0xC0
    00C6 BF8B      OUT	0x3B,R24
    00C7 9508      RET
_int0_isr:
    00C8 938A      ST	R24,-Y
    00C9 B78F      IN	R24,0x3F
    00CA 938A      ST	R24,-Y
(0048) }
(0049) 
(0050) 
(0051) 
(0052) 
(0053) //外中断0服务程序
(0054) #pragma interrupt_handler int0_isr:2
(0055) void int0_isr(void)
(0056) {
(0057)  //外中断0
(0058) LED_ret=stop;
    00CB E081      LDI	R24,1
    00CC 9380006E  STS	LED_ret,R24
    00CE 9189      LD	R24,Y+
    00CF BF8F      OUT	0x3F,R24
    00D0 9189      LD	R24,Y+
    00D1 9518      RETI
_int1_isr:
    00D2 922A      ST	R2,-Y
    00D3 B62F      IN	R2,0x3F
    00D4 922A      ST	R2,-Y
(0059) }
(0060) 
(0061) 
(0062) //外中断1服务程序
(0063) #pragma interrupt_handler int1_isr:3
(0064) void int1_isr(void)
(0065) {
(0066)  //外中断1
(0067) LED_ret=start;
    00D5 2422      CLR	R2
    00D6 9220006E  STS	LED_ret,R2
    00D8 9029      LD	R2,Y+
    00D9 BE2F      OUT	0x3F,R2
    00DA 9029      LD	R2,Y+
    00DB 9518      RETI
(0068) }
(0069) void LED_run(void)
(0070) {
(0071)  	 d++;//个位相加
_LED_run:
    00DC 9180006A  LDS	R24,d
    00DE 5F8F      SUBI	R24,0xFF
    00DF 9380006A  STS	d,R24
(0072) 	 DelayMS(1);
    00E1 E001      LDI	R16,1
    00E2 E010      LDI	R17,0
    00E3 DFBA      RCALL	_DelayMS
(0073) 	 if(d==10)
    00E4 9180006A  LDS	R24,d
    00E6 308A      CPI	R24,0xA
    00E7 F581      BNE	0x0118
(0074) 	 {
(0075) 	  d=0;
    00E8 2422      CLR	R2
    00E9 9220006A  STS	d,R2
(0076) 	  c++;//十位相加
    00EB 9180006B  LDS	R24,c
    00ED 5F8F      SUBI	R24,0xFF
    00EE 9380006B  STS	c,R24
(0077) 	  DelayMS(1);
    00F0 E001      LDI	R16,1
    00F1 E010      LDI	R17,0
    00F2 DFAB      RCALL	_DelayMS
(0078) 	  if(c==10)
    00F3 9180006B  LDS	R24,c
    00F5 308A      CPI	R24,0xA
    00F6 F509      BNE	0x0118
(0079) 	  {
(0080) 	   c=0;
    00F7 2422      CLR	R2
    00F8 9220006B  STS	c,R2
(0081) 	   b++;//百位相加
    00FA 9180006C  LDS	R24,b
    00FC 5F8F      SUBI	R24,0xFF
    00FD 9380006C  STS	b,R24
(0082) 	   DelayMS(1);
    00FF E001      LDI	R16,1
    0100 E010      LDI	R17,0
    0101 DF9C      RCALL	_DelayMS
(0083) 	   if(b==10)
    0102 9180006C  LDS	R24,b
    0104 308A      CPI	R24,0xA
    0105 F491      BNE	0x0118
(0084) 	   {
(0085) 	   b=0;
    0106 2422      CLR	R2
    0107 9220006C  STS	b,R2
(0086) 	   a++;//千位相加
    0109 9180006D  LDS	R24,a
    010B 5F8F      SUBI	R24,0xFF
    010C 9380006D  STS	a,R24
(0087) 	   DelayMS(1);
    010E E001      LDI	R16,1
    010F E010      LDI	R17,0
    0110 DF8D      RCALL	_DelayMS
(0088) 	   if(a==10)
    0111 9180006D  LDS	R24,a
    0113 308A      CPI	R24,0xA
    0114 F419      BNE	0x0118
(0089) 	   a=0;
    0115 2422      CLR	R2
    0116 9220006D  STS	a,R2
(0090) 	   }
(0091) 	  }
(0092) 	 }
    0118 9508      RET
(0093) }
(0094) 
(0095) void init_devices(void)
(0096) {
(0097)  CLI(); //禁止所有中断
_init_devices:
    0119 94F8      BCLR	7
(0098)  MCUCR  = 0x00;///触发中断方式
    011A 2422      CLR	R2
    011B BE25      OUT	0x35,R2
(0099)  MCUCSR = 0x80;//禁止JTAG
    011C E880      LDI	R24,0x80
    011D BF84      OUT	0x34,R24
(0100)  GICR   = 0x00;//中断使能
    011E BE2B      OUT	0x3B,R2
(0101)  port_init();
    011F DF94      RCALL	_port_init
(0102)  int_init();
    0120 DF9E      RCALL	_int_init
(0103)  LED_init();
    0121 DF2E      RCALL	_LED_init
(0104)  SEI();//开全局中断
    0122 9478      BSET	7
    0123 9508      RET
_main:
    0124 9723      SBIW	R28,3
(0105) }
(0106) //主函数
(0107) void main(void)
(0108) {
(0109)  init_devices();//初始化端口、中断
    0125 DFF3      RCALL	_init_devices
    0126 C010      RJMP	0x0137
(0110)  //在这继续添加你的代码
(0111)  while(1)
(0112)  {
(0113) show_LED(d,c,b,a);//显示数字
    0127 9020006D  LDS	R2,a
    0129 822A      STD	Y+2,R2
    012A 9020006C  LDS	R2,b
    012C 8228      STD	Y+0,R2
    012D 9120006B  LDS	R18,c
    012F 9100006A  LDS	R16,d
    0131 DF28      RCALL	_show_LED
(0114) if(LED_ret==0)//判断中断按键
    0132 9020006E  LDS	R2,LED_ret
    0134 2022      TST	R2
    0135 F409      BNE	0x0137
(0115) LED_run();//数字累加
FILE: <library>
    0136 DFA5      RCALL	_LED_run
    0137 CFEF      RJMP	0x0127
    0138 9623      ADIW	R28,3
    0139 9508      RET
pop_gset2:
    013A E0E2      LDI	R30,2
    013B 940C0149  JMP	pop
push_gset5:
    013D 92FA      ST	R15,-Y
    013E 92EA      ST	R14,-Y
push_gset4:
    013F 92DA      ST	R13,-Y
    0140 92CA      ST	R12,-Y
push_gset3:
    0141 92BA      ST	R11,-Y
    0142 92AA      ST	R10,-Y
push_gset2:
    0143 937A      ST	R23,-Y
    0144 936A      ST	R22,-Y
push_gset1:
    0145 935A      ST	R21,-Y
    0146 934A      ST	R20,-Y
    0147 9508      RET
pop_gset1:
    0148 E0E1      LDI	R30,1
pop:
    0149 9149      LD	R20,Y+
    014A 9159      LD	R21,Y+
    014B FDE0      SBRC	R30,0
    014C 9508      RET
    014D 9169      LD	R22,Y+
    014E 9179      LD	R23,Y+
    014F FDE1      SBRC	R30,1
    0150 9508      RET
    0151 90A9      LD	R10,Y+
    0152 90B9      LD	R11,Y+
    0153 FDE2      SBRC	R30,2
    0154 9508      RET
    0155 90C9      LD	R12,Y+
    0156 90D9      LD	R13,Y+
    0157 FDE3      SBRC	R30,3
    0158 9508      RET
    0159 90E9      LD	R14,Y+
    015A 90F9      LD	R15,Y+
    015B 9508      RET

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -