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

📄 irreadinit.c

📁 红外解码程序,在中断去分析电平时间,里面含用说明,
💻 C
字号:
#include "..\..\INC\config.h"

//Sys_Ma系统码
//Sys_FMa系统反码、
//User_Ma用户码
//User_FMa用户反码
unsigned char data Sys_Ma _at_ 0x1A;//分别存放红外线译码后的数据
unsigned char data Sys_FMa _at_ 0x1B;

unsigned char irdatatemp;
unsigned char irliantemp;   //重收次数
bit irover;

unsigned char irbuf[2];
unsigned char ircount;

sbit IRIO = P3^2;

unsigned char irfifotemp[32];
unsigned char irfifoindex;
unsigned char irfifooudex;

//从FIFO读取一个字节
unsigned char irreadfifo(unsigned char *irp)
{
   if(irfifooudex == irfifoindex)return 0;
   *irp = irfifotemp[irfifooudex];
   irfifooudex++;
   if(irfifooudex>31)irfifooudex=0;
   return 1;
   
}
//从FIFO压入一个字节
void irinbytefifo(unsigned char irp)
{
   if((irfifoindex+1) == irfifooudex) return;
   irfifotemp[irfifoindex] = irp;
   irfifoindex++;
   if(irfifoindex>31)irfifoindex=0;
}

//解码	数据,是否加班结束码
void jiema(unsigned char jm,unsigned char jiesu) reentrant
{
   switch(jm)
   {
   
   case  17:	 //向上键
   	  irinbytefifo(0xE0);
	  if(jiesu)
	  {
	    irinbytefifo(0xF0);
	  }
	  irinbytefifo(0x75);
   break;
   case  16:   //向下键
	  irinbytefifo(0xE0);
	  if(jiesu)
	  {
	    irinbytefifo(0xF0);
	  }
	  irinbytefifo(0x72);
   break;
   case  18:	  //向左键
	   irinbytefifo(0xE0);
	  if(jiesu)
	  {
	    irinbytefifo(0xF0);
	  }
	  irinbytefifo(0x6B);

   break;
   case  19:   //向右键
	 irinbytefifo(0xE0);
	  if(jiesu)
	  {
	    irinbytefifo(0xF0);
	  }
	  irinbytefifo(0x74);
   break;
   case  21:   //空格键
	  
	  if(jiesu)
	  {
	    irinbytefifo(0xF0);
	  }
	  irinbytefifo(0x29);
   break;
   case  15:   //ESC键
	   if(jiesu)
	  {
	    irinbytefifo(0xF0);
	  }
	  irinbytefifo(0x76);
   break;
   case  12:   //tab键
	   if(jiesu)
	  {
	    irinbytefifo(0xF0);
	  }
	  irinbytefifo(0x0D);
   break;
   case  14:
	   if(jiesu)
	  {
	    irinbytefifo(0xF0);
	  }
	  irinbytefifo(0x1C);
   break;
   case 11:	      //关机
	   irinbytefifo(0xE0);
	  if(jiesu)
	  {
	    irinbytefifo(0xF0);
	  }
	  irinbytefifo(0x37);
   break;
   case 30:	      //读取key信息
//	   irinbytefifo(0xE0);
	  if(jiesu)
	  {
//	    irinbytefifo(0xF0);
	  }
	  SendPCKey(0xF2);
   break;

   case 31:	      //加气
	   
	  if(jiesu)
	  {
	    irinbytefifo(0xF0);
	  }

	  irinbytefifo(0x14);  //左ctrl

	  irinbytefifo(0xE0);

	  if(jiesu)
	  {
	    irinbytefifo(0xF0);
	  }
	  irinbytefifo(0x14);  //右ctrl

	  if(jiesu)
	  {
	    irinbytefifo(0xF0);
	  }
	  irinbytefifo(0x46);  //左ctrl

   break;
   case 23:	      //加钱
	   
	  if(jiesu)
	  {
	    irinbytefifo(0xF0);
	  }

	  irinbytefifo(0x14);  //左ctrl

	  irinbytefifo(0xE0);

	  if(jiesu)
	  {
	    irinbytefifo(0xF0);
	  }
	  irinbytefifo(0x14);  //右ctrl

	  if(jiesu)
	  {
	    irinbytefifo(0xF0);
	  }
	  irinbytefifo(0x25);  //左ctrl

   break;

  }
}
void irvarinit()
{
   	irrreatime = 0;

	for(irfifoindex=0;irfifoindex<32;irfifoindex++)
	{
	   irfifotemp[irfifoindex] = 0;
	}
	 irfifoindex = 0;
	 irfifooudex = 0;

	irdatatemp = 0xFF;
	irover = 0;
	irliantemp = 0;
	ircount = 0;
	irbuf[0] = 0;
	irbuf[1] = 0xFF;
}

void IrReadinit()
{
    IT0 = 1;       //INT0下降沿有效
	EX0 = 1;       //开INT0中断;
	IRIO = 1;

}

void  IrReaddata()
{
	 unsigned char it;
	 gotoxy(0,1);
	 printf("%d\n",(unsigned int )Sys_Ma);
	 gotoxy(0,2);
	 printf("%d\n",(unsigned int )Sys_FMa);

     if(irrreatime>0)
	 {
	    gotoxy(0,3);
	    printf("有红外\n");
	 }
	 else
	 {
	    gotoxy(0,3);
	    printf("无红外  %d\n",(unsigned int )ircount);
		
		if(irover && irrreatime == 0)
		{
		   irover = 0;
		   jiema(irdatatemp,1);
		   irdatatemp = 0xFF;
		   ircount = 0;
		   irbuf[0] = irbuf[1] = 0;
//		   PrintChCom2(0xAD);
		}
		
	 }

	 if(pcsendtime <1)
	 {
		if(irreadfifo(&it))
	    {
		   PrintChCom2(it);
           SendSCKey(it);
		   pcsendtime = 0;
	    }

		

	 }
	    

/*	 if(Sys_FMa == 2)
	 {
	    Sys_FMa = 0;
		SendPCKey(0xED);
		SendPCKey(0x04);
	 }
	 if(Sys_FMa == 1)
	 {
	    Sys_FMa = 0;
		SendPCKey(0xED);
		SendPCKey(0x02);
	 }
	 if(Sys_FMa == 3)
	 {
	    Sys_FMa = 0;
		SendPCKey(0xED);
		SendPCKey(0x00);
	 }
	 if(Sys_FMa == 30)
	 {
	    Sys_FMa = 0;
		SendPCKey(0xF2);
	 }

	 if(Sys_FMa == 14)   //a
	 {
	    Sys_FMa = 0;
		SendSCKey(0x1C);
	 }

	 if(Sys_FMa == 17)	 //向上键
	 {
	    Sys_FMa = 0;
      	EA = 0;
		SendSCKey(0xE0);
		EA = 0;
		DelayMs(30);
		SendSCKey(0x75);
		EA = 1;

	 }
	  if(Sys_FMa == 16)   //向下键
	 {
	    Sys_FMa = 0;
		SendSCKey(0xE0);
		EA = 0;
		DelayMs(30);
		
		SendSCKey(0x72);
		EA = 1;
	 }
	  if(Sys_FMa == 18)	  //向左键
	 {
	    Sys_FMa = 0;
		SendSCKey(0xE0);
		EA = 0;
		DelayMs(30);
		SendSCKey(0x6B);
		EA = 1;
	 }
	  if(Sys_FMa == 19)   //向右键
	 {
	    Sys_FMa = 0;
		SendSCKey(0xE0);
		EA = 0;
		DelayMs(30);
		SendSCKey(0x74);
		EA = 1;
	 }
	 if(Sys_FMa == 21)   //空格键
	 {
	    Sys_FMa = 0;
		SendSCKey(0x29);
		EA = 0;
		DelayMs(1000);
		EA = 1;
	 }

	 if(Sys_FMa == 15)   //ESC键
	 {
	    Sys_FMa = 0;
		
		SendSCKey(0x76);
		EA = 0;
		DelayMs(1000);
		EA = 1;
	 }
	 if(Sys_FMa == 12)   //tab键
	 {
	    Sys_FMa = 0;
		
		SendSCKey(0x0D);
		EA = 0;
		DelayMs(1000);
		EA = 1;
	 }	*/

}

void ISR_INT0() interrupt 0
{

   if(IRRead())
   {
	   irbuf[ircount] = Sys_FMa;
	   ircount++;
	   if(ircount>1)
	   {
		   ircount = 0;
		   if(irbuf[0] == irbuf[1])
		   {
			    irrreatime = 8;
				if(Sys_FMa != irdatatemp)
				{
					jiema(irdatatemp,1);
					irdatatemp = Sys_FMa;
					irover = 1;
					irliantemp = 0;
				    irliantime = 15;
					jiema(Sys_FMa,0);
				} 
				else
				{
				  if(irliantemp == 0)
				  {
		//		      jiema(Sys_FMa,0);
				  }
				  irliantemp++;
				  if(irliantime == 0)// && irliantemp > 2)
				  {
				      jiema(Sys_FMa,0);
					  irliantime = 5;
					  irliantemp = 2;
				  }
		        }
	      }

		  irbuf[0] = 0;
		  irbuf[1] = 0xFF;
	  }  
   }

}

⌨️ 快捷键说明

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