?? 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 + -