📄 remote_led.c
字号:
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//file: remote_led.c //
//function: receive remote cortrol signed for "PHILIP SAA3010" and "NEC PD6122G" //
// display the usercode or keydata to LED //
//input: p2.0:selec display mode for usercode and keydata //
// p3.2:the remote signed //
//output: device LED:data line a b c d e f g //
// lock line ctrl_1 ctrl_2 ctrl_3 ctrl_4 ctrl_5 //
////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <reg51.h>
#define DEBUG
#define uchar unsigned char
#define uint unsigned int
#define CPU_12MHZ 0
#define CPU_24MHZ 1
#define DELAY40ms 40
#define DELAY30s 30000
#define HIGH 1
#define LOW 0
#define Display_MODE 0
#define Reserv_MODE 1
#define UserCode 1
#define PHILIP_SAA3010 1
#define NEC_PD6122G 2
#define TIME_T0 0
#define COUNT_T0 1
////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////define output pin///////////////////////////////////////////////////////
#define LED_OUT P0
//P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6
//a b c d e f g
sbit bLedCtrl_1=P1^0;//////////////////////////////////////////////////////////LED LSB display contrlbit
sbit bLedCtrl_2=P1^1;
sbit bLedCtrl_3=P1^4;
sbit bLedCtrl_4=P1^3;
sbit bLedCtrl_5=P1^2;
////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////define input pin//////////////////////////////////////////////////////
sbit InKey_Selc_UserOrKey_Code=P2^0;
sbit InKey_Selc_Other=P2^1;
sbit bInRemote_T0=P3^4;
////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////define flag///////////////////////////////////////////////////////////
bit bCHIP_TYPE_STAU;////////////////////////////////////////////1:the chip tpye is changed; 0:no changed
bit bDISP_DATA_TYPE;///////////////1:display usercode char "C" on LED 0:display keydata char "D" on LED
bit bInRemote_Flag; ///////////////////////////////////////////////////1:have remote signed; 0:no signed
bit bDelay30s_Overflow;////////////////////////in 30s no input remote the LED will display "- - - - C&D"
bit bWait_LowToHigh;//////////////////////////////////////////////1:wait the press KEY release; 0:no use
bit bInKey_Valid;//////////////////////////////////////////1:the press KEY is valid; 0:no KEY is pressed
bit bDelayFlag_PressKey;/////////////////////////////////////1:delay 40ms flag while press KEY; 0:no use
bit bTimerOrCounter_Flag;//////////////////////////COUNT_T0:T0 is used counter; TIME_T0:T0 is used timer
bit bNoise_IR;//////////////////////////////////////////////////1:the remote signed is noise; 0:no noise
bit CPU_CLK;
////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////define public var//////////////////////////////////////////////////////
uchar data DelayValue_PressKey, Key_Data, Copy_TL1, Copy_TH1, Copy_TL0, Copy_TH0;
uchar data UsercodeL, UsercodeH, Keydata, Counter, DISP_CHIP_TYPE;
uchar data disp_buff[5], *disp_str;
uint data Delay_DEC30s=0;
////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////define display data////////////////////////////////////////////////////
uchar code Disp_00To0F[18]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
////////////////////////////////////0 1 2 3 4 5 6 7 8///////////////////////////////
0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0xbf};
////////////////////////////////////9 A B C D E F H(X) -///////////////////////////////
uchar code Disp_Philp[]={0x8c,0xc7,0xcf,0x89,0x8c,0x00};
/////////////////////////////////P L I H P//////////////////////////////////////////////////////
uchar code Disp_Nec[]={0xc6,0x86,0xc8,0x00};
///////////////////////////////C E N//////////////////////////////////////////////////////////////////
uchar code Disp_Error[]={0x8f,0xc0,0x8f,0x8f,0x86,0x00};
/////////////////////////////////R O R R E//////////////////////////////////////////////////////
uchar code Disp_Noise[]={0x86,0x92,0xcf,0xc0,0xc8,0x00};
/////////////////////////////////E S I O N//////////////////////////////////////////////////////
uchar code Disp_COBY[]={0x91,0x83,0xc0,0xc6,0x00};////////////////////////////////////////////////////
//////////////////////////////Y B O C //////////////////////////////////////////////////////////
void Initial();
void Display_Led(uchar Disp_Data,uchar position);
void Display_Str();
bit InRemote();
bit InRemote_Philip();
bit InRemote_Nec();
void Display_Message();
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////main function/////////////////////////////////////////////////////////
void main()
{
uint delay1s;
Initial();
do
{ if ((bInKey_Valid)&&(Key_Data==Display_MODE))
{ bDISP_DATA_TYPE=!bDISP_DATA_TYPE;}
else {;}
bInKey_Valid=LOW;
if (bDISP_DATA_TYPE==UserCode) disp_buff[0]=Disp_00To0F[0x0c];
else disp_buff[0]=Disp_00To0F[0x0d];
disp_buff[4]=Disp_COBY[3];
disp_buff[3]=Disp_COBY[2];
disp_buff[2]=Disp_COBY[1];
disp_buff[1]=Disp_COBY[0];
disp_str=disp_buff;
for (;(!(bInKey_Valid)&&(!bInRemote_Flag));) Display_Str();
if (bInRemote_Flag)/////////////////////////////////////////////////check the remote signed
{ bInRemote_Flag=LOW;
if (InRemote())
{ Delay_DEC30s=DELAY30s; bDelay30s_Overflow=LOW;
for (;!bDelay30s_Overflow;)//////////////////////////////normal receive area
{ if (bCHIP_TYPE_STAU)
{ switch (DISP_CHIP_TYPE)
{ case PHILIP_SAA3010 : disp_str=Disp_Philp;break;
case NEC_PD6122G : disp_str=Disp_Nec;break;
default: break;
}
TR0=LOW;
delay1s=Delay_DEC30s;////////////////////display CHIP_TYPE 1s
for (;(delay1s-Delay_DEC30s)<1000;) Display_Str();
bCHIP_TYPE_STAU=LOW; TR0=HIGH;
}
if ((bInKey_Valid)&&(Key_Data==Display_MODE))
{bDISP_DATA_TYPE=!bDISP_DATA_TYPE;}
else {;}
bInKey_Valid=LOW;
if (bDISP_DATA_TYPE==UserCode)
{ disp_buff[0]=Disp_00To0F[0x0c];//////////////display usercode
if (UsercodeL==UsercodeH)//////////usercode is 8 bit address
{ disp_buff[1]=Disp_00To0F[UsercodeL&0x0f];
disp_buff[2]=Disp_00To0F[UsercodeL>>4];
disp_buff[3]=Disp_00To0F[16];
disp_buff[4]=Disp_00To0F[0];
}
else///////////////////////////////usercode is 16 bit address
{ disp_buff[1]=Disp_00To0F[UsercodeL&0x0f];
disp_buff[2]=Disp_00To0F[UsercodeL>>4];
disp_buff[3]=Disp_00To0F[UsercodeH&0x0f];
disp_buff[4]=Disp_00To0F[UsercodeH>>4];
}
}
else/////////////////////////////////////////////////display keydata
{ disp_buff[0]=Disp_00To0F[0x0d];
disp_buff[1]=Disp_00To0F[Keydata&0x0f];
disp_buff[2]=Disp_00To0F[Keydata>>4];
disp_buff[3]=Disp_00To0F[16];
disp_buff[4]=Disp_00To0F[0];
}//end of if (bDISP_DATA_TYPE==UserCode)
disp_str=disp_buff; //&&(Key_Data==Display_MODE)
for (;(!(bInKey_Valid)&&(!bInRemote_Flag)&&(!bDelay30s_Overflow));)
Display_Str();
Delay_DEC30s=DELAY30s;
if (bInRemote_Flag)
{ if (!InRemote()) Display_Message();
bInRemote_Flag=LOW;//////////////display error or noise char
}
}//end of for (;!bDelay30s_Overflow;)
bDelay30s_Overflow=LOW; Delay_DEC30s=0;
}//end of if (InRemote())
else {Delay_DEC30s=DELAY30s; Display_Message();}///////display error or noise char
}//end of if (bInRemote_Flag)
} while (1);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////InRemote function////////////////////////////////////////////////////
bit InRemote()///////////////////////////////////////the leader signed equal to 1.12ms is PHILIP SAA3010
{ bit return_bit;////////////////////////////////////////the leader signed equal to 9ms is NEC PD6122G
if (bInRemote_T0)
{
TR0=LOW; TMOD=0x15; TL0=TH0=0xff;
bTimerOrCounter_Flag=COUNT_T0; TR0=TR1=HIGH;
bNoise_IR=HIGH; return_bit=LOW;
}
else
{ for (;(!bInRemote_T0)&&(Counter<=93);){;}// Display_Str();////////////chek 9ms or 1.12ms
TR0=LOW;TL0=Copy_TL0;
if (bInRemote_T0)
{ if ((Counter>10)&&(Counter<12)) return_bit=InRemote_Philip();////////PHILIP SAA3010
else
{ if (Counter>85) return_bit=InRemote_Nec();//85/////////////////////NEC PD6122G
else { if (Counter<=8)
{ bNoise_IR=LOW; return_bit=HIGH;}
else
{ bNoise_IR=LOW; return_bit=LOW;} //ease error
}
}
}
else
{ bNoise_IR=LOW; return_bit=LOW;}
TR0=LOW; TMOD=0x15; TL0=TH0=0xff; bTimerOrCounter_Flag=COUNT_T0; TR0=TR1=HIGH;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -