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

📄 rmt.c

📁 该程序是NECupd78F9479的开发的代LCD的空调方案
💻 C
字号:
#include "define.h"
#pragma EI
#pragma DI
#pragma rot
#pragma vect INTP0 INTP0_Int 
#define CustomecodeA 0b10101010
#define CustomecodeB 0b01010101
unsigned char MODEP;								//Step for remote control
unsigned char m,n;									//Number of remote date
unsigned char D_BAKt20;							//Backup time of edge falling in remote signal
unsigned char Rmt_cnt;      				//Counter for first code of 9ms low signal   	
unsigned char REGTM20;      				//Time of edge falling in remote signal
unsigned char D_RMTbuf[7];  				//Date of remote 

unsigned char D_TMPsetp,C_SettimeB;						//for display use ,set temprature
sreg unsigned char M_flag; 
#define f_rmtok		M_flag.0									//remote signal receive ok
#define f_PWRon1	M_flag.1										//power on flag
#define f_TMRset  M_flag.2                		//flag of timing set of power on or off
#define f_ton   	M_flag.3										//time set of power on
#define f_toff 		M_flag.4										//time set of power off
#define f_temph   M_flag.5
#define f_iicen    M_flag.6
extern unsigned char C_RMT1s,C_cnt8;				//delay time for remote ,to control mode 
extern unsigned char M_MODrun;
extern unsigned char M_FANset;
extern unsigned char M_auto;
extern unsigned char D_TMPset,M_MODset,C_Settime;
extern sreg unsigned char V_flag;        
#define f_temp				V_flag.0    
#define f_quick       V_flag.1    
#define f_mode        V_flag.2    
#define f_COOLonly    V_flag.3    
#define f_capa        V_flag.4    
extern sreg unsigned char M_flag2;                                           
#define f_PWRon				M_flag2.0					//flag of power on            
extern sreg unsigned char flag;
#define f_settm flag.2
extern sreg unsigned char M_flag4;
#define f_SLEEP   	M_flag4.7
extern sreg unsigned char flagkey;

#define f_slpkey 	flagkey.5
const char TEMPTAB[26]=                
{		0,		//0
		1,		//1
		1,		//2
		2,		//3
		2,		//4
		3,
		3,
		4,
		5,
		5,
		6,
		6,
		7,
		7,
		8,
		8,
		9,
		10,
		10,
		11,
		11,
		12,
		12,
		13,
		13,
		14,                                    
                                        
		                                  
					};	                          

void headb(void);
void heada(void);
void DATACD(void);                     
void head5(void);
void BAKtm20(void);
void Rotrmt(unsigned char k);
void Rmtfunc(void);
void BEEP1tms(void);
void PWRset(void);
//void M_auto(void);
void MautoCHK(void);
void SETtmr(void);
void RtmpSET(void);
void RfanSET(void);
void RslpSET(void);
void Rmtdec()
{	register unsigned char reg1,reg2,reg3,reg4;
	if(f_rmtok)
		{	f_rmtok=0;
			f_iicen=1;
			reg2=D_RMTbuf[5];						// custom check
			reg1=D_RMTbuf[6];						
			reg1&=0b00001111;						//clear high 4 bit
			reg2&=0b11110000;						//clear low 4 bit
			reg4=reg3=CustomecodeA;
			if(f_temp)
			{
				reg3=reg4=CustomecodeB;
			}				
			reg3&=0b00001111;		//shift customcode to right
			reg4&=0b11110000;					//shift custmocode to left
			
				
			if(reg1==reg3&&reg2==reg4)	//compare customecode 
				Rmtfunc();								// remote date decode
			else
				return;			
			
			
		}
}

void Rmtfunc()
{unsigned char reg1,reg2;
	reg1=D_RMTbuf[0];
	reg1&=0b00000011;
	if(reg1==3)
		{if(f_COOLonly)
			{	if(f_PWRon1)
					PWRset();
				return;
			}
		}
	reg1=D_RMTbuf[0];
	reg1&=0b00000100;
	if(reg1==4)																		//automode check for display first
		{	MautoCHK();                     					
			M_auto=M_MODrun;   
			M_MODset=4;             					
		}                                 					
	else                                					
		{reg1=D_RMTbuf[0];                					
			reg1&=0b00000011;		
			M_MODset=reg1;    					
		}                                 					
		C_RMT1s=2;                        					
		
		SETtmr();																		//timing time decode
		PWRset();																		//decode for power on or off
		BEEP1tms();																	//beep on
		RtmpSET();																	//temprature decode
		RslpSET();																	//slp check 
		RfanSET();																	//fan mode decode

}   

void PWRset()
{
register unsigned char reg1,reg2;						
	reg1=D_RMTbuf[0];	
	reg1&=0b00001000;
	if(reg1!=8)
		{if(!f_PWRon1)
				return;
		else
			{	f_PWRon1=0;
			}
		}		
	else 
		{	
				if(f_settm)
			{	
				f_PWRon1=0;
				return;
			}
			else
				{if(f_PWRon1)
					return;
				else
					{
						f_PWRon1=1;
					//	f_TMRset=0;	
					}
				}
		}
}


//=======================================
void SETtmr()
{register unsigned char reg1,reg2;
	reg1=D_RMTbuf[4];
	reg1&=0b01000000;
	if(reg1==0x40)
	{		f_settm=1;  	
			reg1=D_RMTbuf[4];
			reg1&=0b00001111;
			reg1+=reg1;
			reg2=D_RMTbuf[3];
			reg2&=0b11110000;
			if(reg2==0x30)
				{reg1++;
				}
			reg2=D_RMTbuf[4];
			reg2&=0b00010000;
			if(	reg2==0x10)
				reg1+=20;
			C_Settime=reg1;
			
			C_cnt8=0;				//clear count of setting time
			
		}
	else			
		f_settm=0;
	
	if(!f_PWRon1)		//if(Power off , cancel set time power on function
		f_ton=0;
	C_SettimeB=C_Settime;
}
//========================================
void RtmpSET()
{register unsigned char reg1,*reg2,reg3;
	
	reg1=D_RMTbuf[5];
	reg1&=0b00001111;
	D_TMPset=reg1;
	if(f_temp)
	{	reg3=D_RMTbuf[4];
		reg3&=0b10000000;
		if(reg3==0x80)
		{f_temph=1;                  
			reg1+=16;
		}
		D_TMPsetp=reg1;
		reg2=(unsigned char *)(reg1+TEMPTAB);    
		D_TMPset= * reg2;                      
	}
	else
		D_TMPset=D_TMPset+16;
} 
//==========================================  
void RslpSET()
{register unsigned char reg1,reg2;
	reg1=D_RMTbuf[4];
	reg1&=0b00100000;
	if(reg1==32)		//Sleep bit
	{	f_SLEEP=1;		
	reg1=D_RMTbuf[4];
	reg1&=0b00001111;
	reg1+=1;	
	reg1+=reg1;
		C_Settime=reg1;	
		
		C_cnt8=0;	
		f_slpkey=0;
	}
	if(reg1==0)
	{
		f_SLEEP=0;
		f_toff=0;
		if(!f_settm)
		{
			C_Settime=0;
		
		}
	}
	C_SettimeB=C_Settime;
}

void RfanSET()
{
	register unsigned char reg1;
	reg1=D_RMTbuf[0];
	reg1&=0b00110000;
	reg1=rorb(reg1,4);
	M_FANset=reg1;
	if(M_MODset==n_Mdry)
		M_FANset=n_FANlow;
}




    
void TMRremot()			//check the start code 9ms 
{	if(!MODEP)
	{	if(!i_rmt)
			{	Rmt_cnt++;
					if(Rmt_cnt>=8)
						{	MODEP=1;							
							D_BAKt20=TM50;							
							PMK0=0;
							Rmt_cnt=0;
							INTM0=4;			//RISING CAPTURE
						}
				else
						{
							return;
						}
					
			}
	else
			{	Rmt_cnt=0;
				PMK0=1;					//off intp0
				return;
			}
	}
	
}
//===================================
void INTP0_Int()
{			PMK0=1;
			PIF0=0;
			BAKtm20();
		switch(MODEP)
			{case 1: heada();		
					break;
			 case 2: headb();
			 			break;
			 case 3: DATACD();
			 		break;
			 default: head5();
			 		break;
			}
	
}
//===================================

void heada()
{	if(i_rmt)
		{
	
		if(REGTM20>=25&&REGTM20<=65)		//2ms
			{	MODEP=2;
				INTM0=0; 			//check mode is terminated ;change to FALLING EDGE mode 
						
			}
		else 
			{	head5();
				return;
			}
	}
	PMK0=0;
	EI();
	
}



void headb()
{	register unsigned char i;
	if(!i_rmt)
	{	
		if(REGTM20>=130&&REGTM20<=155)		//4.5ms high level		//32us/step
		{	for(i=0;i<7;i++)
			D_RMTbuf[i]=0;
			MODEP=3;
		
		}
		
	
		else
		{	head5();
			return;
		}
	}
	
	PMK0=0;
	
}

void DATACD()
{register unsigned char i;	
	if(!i_rmt)
		{	
		if(REGTM20>=30)
			{if(REGTM20<=105)
				{if(REGTM20<=45)
					i=0;
				 else 
				 	i=1;
				 Rotrmt(i);
				
				}
			 else
			 	{head5();
			 	return;
			 	}
			}
			else
			{head5();
			 return;
			}
		}
		
		PMK0=0;
	
}


void head5()
{	m=n=0;	
	MODEP=0;
		PMK0=1;
}



void BAKtm20()
{ 	REGTM20=TM50-D_BAKt20;
		D_BAKt20=TM50;      
}

void Rotrmt(unsigned char k)
{
  if(k)
			D_RMTbuf[n]|=0b10000000;
	else
			D_RMTbuf[n]&=0b01111111;
		m++;
	if(m<8)
	D_RMTbuf[n]=rorb(D_RMTbuf[n],1);
	if(m>=8)
		{
				m=0;				
				n++;							
			if(n>=7)				
				n=0;				
		
		}
	if(n==6&&m==4)
	{	f_rmtok=1;
		m=n=0;
		D_RMTbuf[6]=rorb(D_RMTbuf[6],3);
		MODEP=0;
		PMK0=1;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -