⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 remote_led.c

📁 一个非常好的微处理器检测遥控器编码的C++ 原代码项目文件,直接可用,LED显示
💻 C
📖 第 1 页 / 共 2 页
字号:
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//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 + -