📄 time0.c
字号:
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
// this code main function is for decode the infrared remote controller
// ahtor: 郭福珍
// email: frankgfz@yahoo.com.cn
// msn: guofuzhen@hotmail.com
//
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
#include <reg51.h>
#define uchar unsigned char
#define MAINCLOCK 110592
#define PulsNum 32
#define DEBUG__
#define SET20MS SetTimerLong(0xA9,0x94)
#define SET2MS SetTimerLong(0xF9,0x12)
#define SET15MS SetTimerLong(0xBF,2f)
#define SETZEROMS SetTimerLong(0,0)
#define TIM0_1MS 0x3//99
//#define RAW_DATA
#define KEY_NUMBER_1 41
#define KEY_NUMBER_2 6
sbit IRIN = P3^2; //红外接收器数据线
sbit BEEP = P3^7; //蜂鸣器驱动线
sbit RELAY= P3^6; //继电器驱动线
#if 0
char code power[] ={0x42,042,0x87,0x8f};/*power*/
char code VendCode[][2]={{0x45,0x87},{0x38,0x7a}};
char code keyCode1[KEY_NUMBER_1]={ 0xc2/*up*/,0xc3/*down*/,0x93/*left*/,0x8f/*right*/,0x63/*ok*/,0xc6 /*menu*/,0x20/*guide*/,
0x76/*pip*/,0x56/*fangkuang*/,0x57/*play*/,0x42/*pause*/,0x29/*source*/,
0x5b/*quick back*/,0x6d/*back*/,0x55/*quick play*/,0x65/*back begin*/,0x75/*rec*/,0x66/*to end*/,0x64/*exit*/,0x58/*info*/,
0x72/*shift*/,0x9b/*fav*/,0x71/*home*/, 0x74/*setup*/,0x43/*1*/,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b/*9*/,0x4c/*0*/,
0x67/*enter*/,0x77/*red*/,0x78/*green*/,0x7a/*blue*/,0x79/*yellow*/}; //0x87
//char code keyCode2[]={0x50/*valume+*/,0x5a/*mute*/,0x63/*ch +*/,0x51/*v -*/,0x65/*sleep*/}; //0x7a
#endif
// CtestDlg 对话框
unsigned char code power[] ={0x42,042,0x87,0x8f};/*power*/
unsigned char code VendCode[][2]={{0x45,0x87},{0x38,0x7a}};
unsigned char code keyCodeIntel1[KEY_NUMBER_1]={ 0xc2/*up*/,0xc3/*down*/,0x93/*left*/,0x8f/*right*/,0x63/*ok*/,0xc6 /*menu*/,0x20/*guide*/,
0x76/*pip*/,0x56/*fangkuang*/,0x57/*play*/,0x42/*pause*/,0x29/*source*/,
0x5b/*quick back*/,0x6d/*back*/,0x55/*quick play*/,0x65/*back begin*/,0x75/*rec*/,0x66/*to end*/,0x64/*exit*/,0x58/*info*/,
0x72/*shift*/,0x9b/*fav*/,0x71/*home*/, 0x74/*setup*/,0x43/*1*/,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b/*9*/,0x4c/*0*/,
0x67/*enter*/,0x73/*<--*/,0x77/*red*/,0x78/*green*/,0x7a/*blue*/,0x79/*yellow*/,0x8f/*power*/}; //0x87
unsigned char code keyCodeIntel2[KEY_NUMBER_2] = {0x50/*valume+*/,0x5a/*mute*/,0x63/*ch +*/,0x51/*v -*/,0x64/*chan -*/,0x65/*sleep*/}; //0x7a
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
unsigned char code keyCodeDragon1[KEY_NUMBER_1]={ 0x80/*up*/,0x81/*down*/,0x51/*left*/,0x4d/*right*/,0x21/*ok*/,0x84 /*menu*/,0xde/*guide*/,
0x34/*pip*/,0x14/*fangkuang*/,0x15/*play*/,0x00/*pause*/,0xe7/*source*/,
0x19/*quick back*/,0x2b/*back*/,0x13/*quick play*/,0x23/*back begin*/,0x33/*rec*/,0x24/*to end*/,0x22/*exit*/,0x16/*info*/,
0x30/*shift*/,0x39/*fav*/,0x2f/*home*/, 0x32/*setup*/,0x01/*1*/,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09/*9*/,0x0a/*0*/,
0x25/*enter*/,0x31/*<--*/,0x35/*red*/,0x36/*green*/,0x38/*blue*/,0x37/*yellow*/,0x12/*power*/}; //0x45
unsigned char code keyCodeDragon2[KEY_NUMBER_2] = {0x0e/*valume+*/,0x18/*mute*/,0x21/*ch +*/,0x0f/*v -*/,0x22/*chan -*/,0x23/*sleep*/}; //0x38
////////////////////////////////////////////////////////////////////////
//Input: parameter is ir address and command that high 8 bits is address low8bits command
//return :return intel format value; if error return 0
/////////////////////////////////////////////////////////////////////////
unsigned short convert2intel(unsigned short input)
{
int i;
unsigned char * pdragon,*pintel;
unsigned short Id,maxkey;
if((unsigned char)(input>>8)==0x45)
{
pdragon=&keyCodeDragon1[0];
pintel=&keyCodeIntel1[0];
Id=(0x87<<8);
maxkey=KEY_NUMBER_1;
}
else if ((unsigned char)(input>>8)==0x38)
{
pdragon=&keyCodeDragon2[0];
pintel=&keyCodeIntel2[0];
Id=(0x7a<<8);
maxkey=KEY_NUMBER_2;
}
for(i=0;i<maxkey;i++)
{
if((unsigned char)input==*pdragon++)
break;
}
return (Id|pintel[i]);
}
//
//Phone Number 886 - 2 - 29588630
//Fax Number 886 - 2 - 29588990
//
/********************************************************************/
/**/
/* initail the uart regeister*/
/**/
/*******************************************************************/
void InitUart(void)
{
SCON = 0x50; // 8-bit UART mode
TMOD |= 0x20; // timer 1 mode 2 auto reload
TH1= 0xfd; // 9600 8n1 @ 12Mhz
TR1 = 1; // run timer1;
//ES = 1;
}
void printc(char a)
{
SBUF=a;
while(!TI);
TI=0;
}
void prints(char * string)
{
char *pbuf=string;
while(*pbuf!=0){
printc(*pbuf);
pbuf++;
}
}
void SetTimerLong(uchar Cout_h,uchar Cout_l)
{
TH0=Cout_h;
TL0=Cout_l;
}
uchar Compare(uchar th0)
{
return(th0>TIM0_1MS ? 1:0);
}
///////////////////////////////////////////////
// 解码红外计数器的数组输入
// return key value if erro return 0
// return high 8bits is address and low bits is command
/////////////////////////////////////////////
unsigned short DecodeIr(uchar * p)
{
unsigned char value[4]={0,0,0,0};
char i=0,j=0;
for(j=0;j<4;j++)
{
for(i=0;i<8;i++)
{
if(Compare(p[j*8+i]))
{
//value[j] |= 0x1<<(7-i);
value[j]|=0x1<<i;
}
}
}
if(value[0]!=(uchar)~value[1])
return 0;
if(value[2]!=(uchar)~value[3])
return 0;
#ifdef DEBUG
printc(value[0]);
#endif
return (unsigned short)(value[2]|(unsigned short)(value[0]<<8));
}
uchar TimeMode =0;
uchar Coun45msTime =0;
//uchar KeyboardValue[4]={0,0,0,0};
uchar KeyStata=0;
unsigned long KeyboardValue =0;
uchar DecodeArray[PulsNum];
void GlobleVarInit(void)
{
TimeMode=0;
Coun45msTime=0;
KeyStata=0;
KeyboardValue=0;
}
void OutIr2Uart(void)
{
unsigned short KeyValue=0,convert_val=0;
if(KeyStata==1)
{
#ifdef DEBUG
//prints("111");
for(j=0;j<PulsNum;j++)
printc(DecodeArray[j]);
prints("\r\n");
#endif
KeyValue=DecodeIr(DecodeArray);// keyValue high 8bits is address and low address is command
#ifdef RAW_DATA
printc((uchar)(KeyValue>>8));
printc((uchar)KeyValue);
#else
convert_val=convert2intel(KeyValue);
if((convert_val==0x878f)&&((uchar)KeyValue==0x12)) //power
{
printc(0x42);
printc(0x42);
}
printc((uchar)(convert_val>>8));
printc((uchar)convert_val);
#endif
KeyStata=0;
}
}
void KeyTransact(void)
{
}
void main(void)
{
#ifdef DEBUG
char j=0;
#endif
InitUart();
EA=1;
ET0=1;
TMOD|=0x01;
SET2MS;
TR0=1;
GlobleVarInit();
prints("Ok\r\n"); //if burn must content this sentence
while(1)
{
OutIr2Uart();
}
}
void Time0(void)interrupt 1 using 1
{
uchar i=0;
uchar * pbuf;
P1=~P1;
//TR0=0;
//prints("t");
if(TimeMode==0)
{
if(IRIN)
{
goto ENDTIME;
}
Coun45msTime++;
if(Coun45msTime<=3)
{
goto ENDTIME;
}
if(Coun45msTime>3) //if Coun45msTime >=2 is boot code 4.5ms lowlever ?
{
TR0=0;
while(IRIN==0);
while(IRIN==1);
TimeMode=1;
}
}
if(TimeMode==1)
{
#ifdef DEBUG
prints("@");
#endif
pbuf=DecodeArray;
KeyboardValue=0;
for(i=0;i<32;i++)
{
while(IRIN==0);
SETZEROMS;
TR0=1;
while(IRIN==1);
*pbuf++=TH0;
//*pbuf++=TL0;
TR0=0;
}
TimeMode=0;
KeyStata=1;
Coun45msTime=0;
SET2MS;
TR0=1;
}
ENDTIME:
SET2MS;
TR0=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -