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

📄 infrared_test.lst

📁 AVR 红外接收源代码,对学习红外的人很有帮助
💻 LST
📖 第 1 页 / 共 3 页
字号:
    0114 F0F9      BEQ	0x0134
    0115 3047      CPI	R20,7
    0116 E0E0      LDI	R30,0
    0117 075E      CPC	R21,R30
    0118 F0F1      BEQ	0x0137
    0119 3048      CPI	R20,0x8
    011A E0E0      LDI	R30,0
    011B 075E      CPC	R21,R30
    011C F0E9      BEQ	0x013A
    011D 3049      CPI	R20,0x9
    011E E0E0      LDI	R30,0
    011F 075E      CPC	R21,R30
    0120 F0E1      BEQ	0x013D
    0121 C01D      RJMP	0x013F
(0119) 		  {
(0120) 		    case 0:putchar('1');
    0122 E301      LDI	R16,0x31
    0123 DF85      RCALL	_putchar
(0121) 			       break; 
    0124 C01A      RJMP	0x013F
(0122) 		    case 1:putchar('2');
    0125 E302      LDI	R16,0x32
    0126 DF82      RCALL	_putchar
(0123) 			       break;     
    0127 C017      RJMP	0x013F
(0124) 		    case 2:putchar('3');
    0128 E303      LDI	R16,0x33
    0129 DF7F      RCALL	_putchar
(0125) 			       break; 
    012A C014      RJMP	0x013F
(0126) 		    case 3:putchar('4');
    012B E304      LDI	R16,0x34
    012C DF7C      RCALL	_putchar
(0127) 			       break;     
    012D C011      RJMP	0x013F
(0128) 		    case 4:putchar('5');
    012E E305      LDI	R16,0x35
    012F DF79      RCALL	_putchar
(0129) 			       break; 
    0130 C00E      RJMP	0x013F
(0130) 		    case 5:putchar('6');
    0131 E306      LDI	R16,0x36
    0132 DF76      RCALL	_putchar
(0131) 			       break;     
    0133 C00B      RJMP	0x013F
(0132) 		    case 6:putchar('7');
    0134 E307      LDI	R16,0x37
    0135 DF73      RCALL	_putchar
(0133) 			       break; 
    0136 C008      RJMP	0x013F
(0134) 		    case 7:putchar('8');
    0137 E308      LDI	R16,0x38
    0138 DF70      RCALL	_putchar
(0135) 			       break; 
    0139 C005      RJMP	0x013F
(0136) 			case 8:putchar('9');
    013A E309      LDI	R16,0x39
    013B DF6D      RCALL	_putchar
(0137) 			       break; 
    013C C002      RJMP	0x013F
(0138) 		    case 9:putchar('0');
    013D E300      LDI	R16,0x30
    013E DF6A      RCALL	_putchar
(0139) 			       break;     
(0140) 		    default:break;   
(0141) 		  }
(0142) 		  putchar(0x0a);//换行
    013F E00A      LDI	R16,0xA
    0140 DF68      RCALL	_putchar
(0143) 	      putchar(0x0d);//回车
    0141 E00D      LDI	R16,0xD
    0142 DF66      RCALL	_putchar
(0144) 		  infra_data[0]=0;
    0143 2422      CLR	R2
    0144 92200117  STS	infra_data,R2
(0145) 		  infra_data[1]=0;
    0146 92200118  STS	infra_data+1,R2
(0146) 		  infra_data[2]=0;
    0148 92200119  STS	infra_data+2,R2
(0147) 		  infra_data[3]=0;
    014A 9220011A  STS	infra_data+3,R2
(0148) 		  rece_flag=0;
    014C 92200116  STS	rece_flag,R2
(0149) 		  GICR  = 0x80;//打开外部中断1
    014E E880      LDI	R24,0x80
    014F BF8B      OUT	0x3B,R24
(0150) 		}
    0150 C005      RJMP	0x0156
(0151) 		else
(0152) 		{
(0153) 		//如果不是有效数据
(0154) 		rece_flag=0;
    0151 2422      CLR	R2
    0152 92200116  STS	rece_flag,R2
(0155) 		GICR  = 0x80;//打开外部中断1
    0154 E880      LDI	R24,0x80
    0155 BF8B      OUT	0x3B,R24
    0156 CF84      RJMP	0x00DB
    0157 9508      RET
FILE: D:\开发板\source\infrared\infrared_test\infrared_test.c
(0001) /******************************************/
(0002) /*             北京MCU学习之家            */
(0003) /*            红外输入演示程序            */
(0004) /*             作者:白如冰                */
(0005) /*             2005年10月1日              */
(0006) /*  目标MCU:MEGA8   晶振:外部(EXT) 8MHZ   */
(0007) /******************************************/
(0008) //红外接收头的引脚定义 
(0009) //   1----->data-----> (PD3(int1))
(0010) //   2----->gnd
(0011) //   3----->vss
(0012) /******************************************/
(0013) 
(0014) #include <iom8v.h>
(0015) #include <macros.h>
(0016) #pragma interrupt_handler int1_isr:iv_INT1
(0017) #pragma interrupt_handler t0_isr:iv_TIMER0_OVF
(0018) 
(0019) #define INFR_DIR      DDRD
(0020) #define INFR_PORT     PORTD
(0021) #define INFR_DATA     3
(0022) #define buffer_max    75
(0023) unsigned char infra_data[4],rece_flag;
(0024) unsigned int counter_buffer[buffer_max];
(0025) unsigned char flag_start,rece_data_count,t0_counter,flag_t0;
(0026) 
(0027) 
(0028) /* 初始化外部中断1 */  
(0029) void init_infr(void) 
(0030)     {
(0031) 	 unsigned char i;
(0032) 	 INFR_DIR&=~(1<<INFR_DATA); //PD3为输入方向
_init_infr:
  i                    --> R16
    0158 988B      CBI	0x11,3
(0033) 	 INFR_PORT|=1<<INFR_DATA;   //PD3初始为高电平
    0159 9A93      SBI	0x12,3
(0034) 	 MCUCR = 0x04; //int1 电平变化产生中断
    015A E084      LDI	R24,4
    015B BF85      OUT	0x35,R24
(0035)      GICR  = 0x80; //int1 外部中断使能 
    015C E880      LDI	R24,0x80
    015D BF8B      OUT	0x3B,R24
(0036) 	 TCCR0=0; //T0 1024分频
    015E 2422      CLR	R2
    015F BE23      OUT	0x33,R2
(0037) 	 TCNT0=0; //初始值为0 32ms中断一次,200ms许7次
    0160 BE22      OUT	0x32,R2
(0038) 	 TIMSK=1;//允许T0溢出中断
    0161 E081      LDI	R24,1
    0162 BF89      OUT	0x39,R24
(0039) 	 TCCR1B=0;//关闭定时器T1
    0163 BC2E      OUT	0x2E,R2
(0040) 	 TCNT1=0; //初始值为0
    0164 2433      CLR	R3
    0165 BC3D      OUT	0x2D,R3
    0166 BC2C      OUT	0x2C,R2
(0041) 	 flag_start=0;
    0167 9220007F  STS	flag_start,R2
(0042) 	 rece_data_count=0;
    0169 9220007E  STS	rece_data_count,R2
(0043) 	 t0_counter=0;
    016B 9220007D  STS	t0_counter,R2
(0044) 	 for(i=0;i<buffer_max;i++)
    016D 2700      CLR	R16
    016E C00C      RJMP	0x017B
(0045) 	 counter_buffer[i]=0;
    016F E082      LDI	R24,2
    0170 9F80      MUL	R24,R16
    0171 01F0      MOVW	R30,R0
    0172 E880      LDI	R24,0x80
    0173 E090      LDI	R25,0
    0174 0FE8      ADD	R30,R24
    0175 1FF9      ADC	R31,R25
    0176 2422      CLR	R2
    0177 2433      CLR	R3
    0178 8231      STD	Z+1,R3
    0179 8220      STD	Z+0,R2
    017A 9503      INC	R16
    017B 340B      CPI	R16,0x4B
    017C F390      BCS	0x016F
(0046) 	 infra_data[0]=0x31;
    017D E381      LDI	R24,0x31
    017E 93800117  STS	infra_data,R24
(0047) 	 infra_data[1]=0x32;
    0180 E382      LDI	R24,0x32
    0181 93800118  STS	infra_data+1,R24
(0048) 	 infra_data[2]=0x33;
    0183 E383      LDI	R24,0x33
    0184 93800119  STS	infra_data+2,R24
(0049) 	 infra_data[3]=0x34;
    0186 E384      LDI	R24,0x34
    0187 9380011A  STS	infra_data+3,R24
(0050) 	 rece_flag=0;
    0189 2422      CLR	R2
    018A 92200116  STS	rece_flag,R2
(0051) 	 flag_t0=0;
    018C 9220007C  STS	flag_t0,R2
(0052) 	 SEI();  //全局中断使能
    018E 9478      BSET	7
    018F 9508      RET
_int1_isr:
  i                    --> R20
    0190 920A      ST	R0,-Y
    0191 921A      ST	R1,-Y
    0192 922A      ST	R2,-Y
    0193 923A      ST	R3,-Y
    0194 930A      ST	R16,-Y
    0195 931A      ST	R17,-Y
    0196 932A      ST	R18,-Y
    0197 933A      ST	R19,-Y
    0198 938A      ST	R24,-Y
    0199 939A      ST	R25,-Y
    019A 93EA      ST	R30,-Y
    019B 93FA      ST	R31,-Y
    019C B60F      IN	R0,0x3F
    019D 920A      ST	R0,-Y
    019E D197      RCALL	push_gset1
(0053)      
(0054)     }
(0055) 
(0056) /*外部中断1 中断函数 */	
(0057) 
(0058) void int1_isr(void)
(0059) { 
(0060)   unsigned char i;
(0061)   
(0062)   if(flag_start==0)   //开始计时T1
    019F 9020007F  LDS	R2,flag_start
    01A1 2022      TST	R2
    01A2 F431      BNE	0x01A9
(0063)   {
(0064)     TCCR1B=2;//开始计时 8分频
    01A3 E082      LDI	R24,2
    01A4 BD8E      OUT	0x2E,R24
(0065) 	flag_start=1;
    01A5 E081      LDI	R24,1
    01A6 9380007F  STS	flag_start,R24
(0066)   }
    01A8 C056      RJMP	0x01FF
(0067)   
(0068)   else
(0069)   {  
(0070)      
(0071)      TCCR1B=0;
    01A9 2422      CLR	R2
    01AA BC2E      OUT	0x2E,R2
(0072) 	 counter_buffer[rece_data_count++]=TCNT1;
    01AB 9020007E  LDS	R2,rece_data_count
    01AD 2433      CLR	R3
    01AE 2D82      MOV	R24,R2
    01AF 5F8F      SUBI	R24,0xFF
    01B0 9380007E  STS	rece_data_count,R24
    01B2 E002      LDI	R16,2
    01B3 E010      LDI	R17,0
    01B4 0191      MOVW	R18,R2
    01B5 D164      RCALL	empy16s
    01B6 01F8      MOVW	R30,R16
    01B7 E880      LDI	R24,0x80
    01B8 E090      LDI	R25,0
    01B9 0FE8      ADD	R30,R24
    01BA 1FF9      ADC	R31,R25
    01BB B42C      IN	R2,0x2C
    01BC B43D      IN	R3,0x2D
    01BD 8231      STD	Z+1,R3
    01BE 8220      STD	Z+0,R2
(0073) 	 TCNT1=0;
    01BF 2422      CLR	R2
    01C0 2433      CLR	R3
    01C1 BC3D      OUT	0x2D,R3
    01C2 BC2C      OUT	0x2C,R2
(0074)      TCCR1B=2; //T0 8分频 开始计时
    01C3 E082      LDI	R24,2
    01C4 BD8E      OUT	0x2E,R24
(0075) 	 if((counter_buffer[0]<4000)&&(counter_buffer[1]>5000)) //如果第一个数据不是有效数据退出
    01C5 91800080  LDS	R24,counter_buffer
    01C7 91900081  LDS	R25,counter_buffer+1
    01C9 3A80      CPI	R24,0xA0
    01CA E0EF      LDI	R30,0xF
    01CB 079E      CPC	R25,R30
    01CC F538      BCC	0x01F4
    01CD E888      LDI	R24,0x88
    01CE E193      LDI	R25,0x13
    01CF 90200082  LDS	R2,counter_buffer+2
    01D1 90300083  LDS	R3,counter_buffer+3
    01D3 1582      CP	R24,R2
    01D4 0593      CPC	R25,R3
    01D5 F4F0      BCC	0x01F4
(0076) 	 { 
(0077) 	    for(i=0;i<buffer_max;i++) 
    01D6 2744      CLR	R20
    01D7 C00C      RJMP	0x01E4
(0078) 	   counter_buffer[i]=0;    //清空缓冲区
    01D8 E082      LDI	R24,2
    01D9 9F84      MUL	R24,R20
    01DA 01F0      MOVW	R30,R0
    01DB E880      LDI	R24,0x80
    01DC E090      LDI	R25,0
    01DD 0FE8      ADD	R30,R24
    01DE 1FF9      ADC	R31,R25
    01DF 2422      CLR	R2
    01E0 2433      CLR	R3
    01E1 8231      STD	Z+1,R3
    01E2 8220      STD	Z+0,R2
    01E3 9543      INC	R20
    01E4 344B      CPI	R20,0x4B
    01E5 F390      BCS	0x01D8
(0079) 	   rece_data_count=0;      //接收数据计时清 0
    01E6 2422      CLR	R2
    01E7 9220007E  STS	rece_data_count,R2
(0080) 	   flag_start=0;           //开始标志置0
    01E9 9220007F  STS	flag_start,R2
(0081) 	   TCCR1B=0;               //关闭定时器 T1
    01EB BC2E      OUT	0x2E,R2
(0082)   	   TCNT1=0;                //定时器T1 清0
    01EC 2433      CLR	R3
    01ED BC3D      OUT	0x2D,R3
    01EE BC2C      OUT	0x2C,R2
(0083) 	   TCCR0=0;               //关闭定时器 T0
    01EF BE23      OUT	0x33,R2
(0084) 	   TCNT0=0;                  //定时器T0 清0
    01F0 BE22      OUT	0x32,R2
(0085) 	   flag_t0=0;
    01F1 9220007C  STS	flag_t0,R2
(0086) 	   
(0087) 	   return;
    01F3 C00B      RJMP	0x01FF
(0088) 	  }
(0089) 	  else
(0090) 	  //如果是有效数据
(0091) 	  {
(0092) 	
(0093) 	  
(0094) 	  if(flag_t0==0)
    01F4 9020007C  LDS	R2,flag_t0
    01F6 2022      TST	R2
    01F7 F439      BNE	0x01FF
(0095) 	  {
(0096) 	  TCNT0=0;  //定时器T0 清0
    01F8 2422      CLR	R2
    01F9 BE22      OUT	0x32,R2
(0097) 	  TCCR0=5; //T0 1024分频 开始计时100MS
    01FA E085      LDI	R24,5
    01FB BF83      OUT	0x33,R24
(0098) 	  flag_t0=1;
    01FC E081      LDI	R24,1
    01FD 9380007C  STS	flag_t0,R24
(0099) 	  }
(0100) 	  }
(0101) 	
(0102) 	 
(0103)   } 
    01FF D139      RCALL	pop_gset1
    0200 9009      LD	R0,Y+
    0201 BE0F      OUT	0x3F,R0
    0202 91F9      LD	R31,Y+
    0203 91E9      LD	R30,Y+
    0204 9199      LD	R25,Y+
    0205 9189      LD	R24,Y+
    0206 9139      LD	R19,Y+
    0207 9129      LD	R18,Y+
    0208 9119      LD	R17,Y+
    0209 9109      LD	R16,Y+
    020A 9039      LD	R3,Y+
    020B 9029      LD	R2,Y+
    020C 9019      LD	R1,Y+
    020D 9009      LD	R0,Y+
    020E 9518      RETI
_t0_isr:
  i                    --> R16
    020F 920A      ST	R0,-Y
    0210 921A      ST	R1,-Y
    0211 922A      ST	R2,-Y
    0212 923A      ST	R3,-Y
    0213 930A      ST	R16,-Y
    0214 931A      ST	R17,-Y
    0215 938A      ST	R24,-Y
    0216 939A      ST	R25,-Y
    0217 93EA      ST	R30,-Y
    0218 93FA      ST	R31,-Y
    0219 B60F      IN	R0,0x3F
    021A 920A      ST	R0,-Y
(0104) 

⌨️ 快捷键说明

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