📄 m8-红外遥控检测.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 + -