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

📄 m8-红外遥控检测.c

📁 这是一个红外遥控检测的程序
💻 C
字号:
/********************************************************************************
红外遥控器检测程序
每输入一次信号显示一次系统码,一次操作码。
*********************************************************************************/
#include <iom8v.h>
#include <macros.h>
#define  KEY (PIND&0X08)
//KEY 定义输入引脚
unsigned int data1=0,data2=0;
//data1为收到系统码,data2为操作码
char ks=0;
/*接收状态
BIT0:引导低电平
BIT1:引导高电平
BIT2:连发
*/
//**************************************************************************

void port_init(void)
{
 PORTB = 0x00;
 DDRB  = 0xFF;
 PORTC = 0x7E; //m103 output only
 DDRC  = 0x01;
 PORTD = 0xEF;
 DDRD  = 0xF0;
}
//**************************************************************************
void delay_100us(int t)//100微秒延时
{
 int x;
 for(t;t>0;t--)
 for(x=10;x>0;x--);
}
//*************************************************************************
display(int number)//从0到F显示
{
 char i,n[4]={0},   	 		//要显示的四个数字 
 num[16]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X27,0X7F,0X6F,
 0X77,0X7C,0X39,0X5E,0X79,0X71};//十六个数字的段码
 n[0]=number>>12&0X0F;
 n[1]=number>>8 &0X0F;
 n[2]=number>>4 &0X0F;
 n[3]=number    &0X0F;
  for(i=0;i<4;i++)
   {   
   PORTD=~(0X80>>i);
   PORTB=num[n[i]];delay_100us(50);
   PORTB=0x00;				 //显示清空
   } 
}
//**************************************************************************
void begain(void)			 //启始
{
 char i=0,j=0;
   
  while(KEY!=0)				 //等待200ms
  		{
		 delay_100us(10);	 //1ms
		 j++;
		 if(j>200){ks=0;break;}//用于连发码的判断
		}
  j=0;
  while(KEY==0)				  //引导低电平,或连发低电平
  		{
		 delay_100us(1);
		 j++;
		 if(j>60)ks|=1;		  //BIT0引导低电平
		 if(j>100){ks=0;break;}
		}
  j=0;
  if((ks&0x01)!=0)
  		{
  		 while(KEY!=0)
		  	{
		   	 delay_100us(1);
		   	 j++;		 
		   	 if(j>200){ks=0;break;}
		  	}
		 if(j>15&&j<30){ks&=0XFD;ks|=4;}//BIT2连发
		 if(j>30){ks&=0XFB;ks|=2;}	  	//BIT1引导高电平
		}
		
}
//******************************************************************************
unsigned int scan(void)	//十六位数据输入
{
 unsigned int data=0;
 char i,j;
 for(i=0;i<16;i++)
 {
  j=0;
  while(KEY==0)
  	{
	 delay_100us(1);
	 j++;
	 if(j>20)return 0;
	}
  j=0;
  while(KEY!=0)
  	{
	 delay_100us(1);
	 j++;
	 if(j>8)data|=1<<i;
	 if(j>20)return 0;
	}
 }
 return data;
}
//****************************************************************************
char check(unsigned int data)//校验
{
 char i,j;
 i=data&0XFF;
 j=(data>>8)&0XFF;
 if(i+j==255)
 	return 1;
 return 0;
}
void main()
{
 
 char i=0,j=0,k=0;
 port_init();
 while(1)
 {
  begain();
  if((ks&0x03)==3)//引导成功
  	{
	data1=scan();//接收系统码
	data2=scan();//接收操作码
	}	
  if((ks&0x01)==1)
  	{
  	 for(i=0;i<40;i++)
	 display(data1);//显示系统码
	 for(i=0;i<40;i++)
	 display(data2);//显示操作码
	}

 }

}

⌨️ 快捷键说明

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