📄 m8-红外遥控应用程序.c
字号:
/********************************************************************************
红外遥控应用程序
以复位后的第一个输入的第一个系统码为本机系统码,
每输入一次信号显示一次操作码
*********************************************************************************/
#include <iom8v.h>
#include <macros.h>
#define KEY (PINC&0X02)
unsigned int data0,data1=0,data2=0;
//data0为本机系统码,data1为收到系统码,data2为操作码
char ks=0;
/*
BIT0:引导低电平
BIT1:引导高电平
BIT2:连发
BIT4:系统码初始化
*/
void port_init(void)
{
PORTB = 0x00;
DDRB = 0xFF;
PORTC = 0x7E; //m103 output only
DDRC = 0x01;
PORTD = 0xEF;
DDRD = 0xFF;
}
void delay_100us(int t)//100微秒延时
{
int x;
for(t;t>0;t--)
for(x=102;x>0;x--);
}
display(unsigned int number)//从0到F显示
{
int 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%65536)/4096;
n[1]=(number%4096)/256;
n[2]=(number%256)/16;
n[3]=number%16;
for(i=0;i<4;i++)
{
PORTD=~(0B10000000>>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&=0XF0;break;}//用于连发码的判断
}
j=0;
while(KEY==0)//引导低电平,或连发低电平
{
delay_100us(1);
j++;
if(j>80)ks|=1; //BIT0引导低电平
if(j>100){ks&=0XF0;break;}
}
j=0;
if((ks&0x01)!=0)
{
while(KEY!=0)//引导高电平,或连发高电平
{
delay_100us(1);
j++;
if(j>200){ks&=0XF0;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&0x10)==0){data0=data1;ks|=0X10;}
}
if((ks&0x01)==1&&data1==data0&&check(data2)==1)
for(i=0;i<40;i++)
display(data2);
/*
if(data1==data0&&check(data2)==1) */
//k=data2&0XFF;
//if((ks&0X01)==0)k=255;
//PORTB=ks;
//delay_100us(100);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -