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

📄 main.c

📁 遥控代码,一种多用途的,用C51实现可以安装四十多种功能码
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <\Register\6688.h>
#include <\Register\6688OPN.h>
#include <\Register\6688XFR.h>
#include "define.h"
#include "main.h"
//****************************程序版本号RC4490.HEX*********************************//
// The following line should be declared if using emulator, otherwise, diable it
sfr	P2	= 0xA0;
//--------------------------------------
// Port A interrupt 
//--------------------------------------
void PORTA_ISR (void) interrupt 0
{
		KEY_DETECTED=1;
}

//--------------------------------------
// Timer 0 interrupt 
//--------------------------------------
void TIMER0_ISR (void) interrupt 1
{
	// write code here
}

//--------------------------------------
// Counter A interrupt 
//--------------------------------------
void COUNTER_A_ISR (void) interrupt 2
{
	// write code here
}

//--------------------------------------
// Timer 1 interrupt 
//--------------------------------------
void TIMER1_ISR (void) interrupt 3
{
		
	// write code here
}

//--------------------------------------
// Serial port 0 interrupt 
//--------------------------------------
void UART0_ISR (void) interrupt 4
{
	
}

//--------------------------------------
// Timer 2 interrupt 
//--------------------------------------
void TIMER2_ISR (void) interrupt 5
{
	TF2=0;
	CACON=CACON_VALUE;
}

//--------------------------------------
// Serial port 1 interrupt 
//--------------------------------------
void UART1_ISR (void) interrupt 7
{
	
}

//******************************************
//*** DELAY ROUTINE ***
//******************************************

void INIT_BEFORE_SCAN (void)
{
/*
TMOD=0X11;//TIMER0 init 16BIT timer,TIMER1 init 16BIT timer
TCON=0X00;
TL0=0;
TH0=0;
*/

T2CON=0X00;//timer2 init
T2MOD=0X00;																		
PCCONH = 0X3F;			//required for DC6688FSA

PBCONH=0X55;//01010101 PB7-4 open drain out
PBCONL=0X55;//01010101 PB3-0 open drain out
PBPUR =0;   //PULL-UP DISABLE
last_pc=0XFF;
PORTB    =0XFF;//init PORTB to high

//pull up in 1
PACONH=0;//PA7-4 IN int falling edge
PACONL=0;//PA3-0 IN int falling edge
PAPUR =0XFF;//PULL-UP ENABLE

CACON =0X03;//carrier fosc/1 start counter A, repeating mode, flip-flop high lvl
PCCONL=0XAB;//10101011 PC1 = push pull output  REM Port Normal I/O Carrier on
PORTC=PORTC&0XBB;//PC2 to low ,	,turn off all light
PORTC=PORTC|0X01;//PC0 TO HIGH.
ET2   =0;
IT0=0;//falling edge trigger

EA=1;//enable cpu interrupt

//set=0;//总是从TV开始
//last_led_value=0x7f;
get_set();
get_flash_data();

//time0_value.tempval=0;
//time0_over=0;
//low.tempval=0;
//low_over=0;
type=0;
													//KEYSCAN_ENABLE=0;//??????????
													//EXTEND_TIME   =0;//????????????
toggle=0;

end_flag=0;
//last_led_value=0x7f;//1011 1111
last_pb=0x7f;
//stuck_key=255;
}

	

void CHECK_ACCESS_COMPLETE(void)
{
	while((FAS & 0x01) == 1);	// FBUSY bit 
}

void _WR_(void)
{
	CHECK_ACCESS_COMPLETE();//test busy bit wait for complete
	FPTRL = (unsigned char)DATA_FLASH_PTR;//address
	FPTRH = (unsigned char)(DATA_FLASH_PTR>>8);
	FDB = FLASH_BUFFER;//a byte
	FCNT = 1;//start to execute
	CHECK_ACCESS_COMPLETE();//test busy bit wait for complete
}
void _RD_(void)
{
	CHECK_ACCESS_COMPLETE();
	FPTRL = (unsigned char)DATA_FLASH_PTR;
	FPTRH = (unsigned char)(DATA_FLASH_PTR>>8);
	FLASH_BUFFER = FDB;
	CHECK_ACCESS_COMPLETE();
}



void SRAM_TO_FLASH(char adress,char value)
{
	DATA_FLASH_PTR=adress;
	FLASH_BUFFER = value;
	_WR_();

}

char FLASH_TO_SRAM(char adress)
{
	DATA_FLASH_PTR=adress;
	_RD_();
	return(FLASH_BUFFER);

}
void get_flash_data(void)
{
	

	flash_flag=FLASH_TO_SRAM(8);
	if(flash_flag!=0x90)//如果是第一次则向FLASH写入出厂初值
	{
					
		memory_channel[0]=7;
		memory_channel[1]=11;
		memory_channel[2]=21;
		memory_channel[3]=23;
		

		for(m=0;m<4;m++)//高地址为高位,低地址为低位。
		{
			temp_data_flash=(unsigned char)memory_channel[m];					
			SRAM_TO_FLASH(2*m,temp_data_flash);
		
			temp_data_flash=(unsigned char)(memory_channel[m]>>8);					
			SRAM_TO_FLASH(2*m+1,temp_data_flash);
		}
	}
	for(m=0;m<4;m++)//从FLASH中得到四套当前套值
	{
		temp_data_flash=FLASH_TO_SRAM(2*m+1);
		memory_channel[m]=temp_data_flash;
	
		temp_data_flash=FLASH_TO_SRAM(2*m);
		memory_channel[m]=(memory_channel[m]<<8)+temp_data_flash;
	}
}
void get_last_led_value(void)
{
	if(set==0)
	{
		last_led_value=0x7f;	
	}
	else if(set==1)
	{
		last_led_value=0xbf;	
	}
	else if(set==2)
	{
		last_led_value=0xdf;	
	}
	else if(set==3)
	{
		last_led_value=0xef;	
	}

}
void get_set(void)
{
	flash_flag=FLASH_TO_SRAM(11);
	if(flash_flag!=0x90)//如果是第一次出厂赋初值
	{
		set=0;	
	}
	else
	{
		set=FLASH_TO_SRAM(10);
	}

	get_last_led_value();
	

}
/*
void init_timer0(void)
{
	TL0=0;
	TH0=0;
	TF0=0;	
}
*/
//################基本电平#############################//

void sent_uint_rc5_hi(void)
{
	RCAP2L=0xff-0x78;
	RCAP2H=0xff-0x03;	
	CACON_VALUE=0x07;//00000111
	PCON=PCON|0X01;//bit 0 -> IDLE mode, assumed only waiting timer 2 interrupt	
}
void sent_uint_rc5_low(void)
{
	RCAP2L=0xff-0x78;
	RCAP2H=0xff-0x03;
	CACON_VALUE=0x03;//00000011
	PCON=PCON|0X01;

}
void sent_uint_rc6_hi(void)
{
	RCAP2L=0xff-0xbc;
	RCAP2H=0xff-0x01;	
	CACON_VALUE=0x07;//00000111
	PCON=PCON|0X01;//bit 0 -> IDLE mode, assumed only waiting timer 2 interrupt
	
}
void sent_uint_rc6_low(void)
{
	RCAP2L=0xff-0xbc;
	RCAP2H=0xff-0x01;
	CACON_VALUE=0x03;//00000011
	PCON=PCON|0X01;

}
//########################################################//



//################基本位电平#####################//
void sent_unit_rc5_hi_low(void)//n:type  i:lead,0,1,or endcode
{

	sent_uint_rc5_hi();

	sent_uint_rc5_low();
}

void sent_unit_rc5_low_hi(void)
{
	sent_uint_rc5_low();

	sent_uint_rc5_hi();

}
void sent_unit_rc6_hi_low(void)//n:type  i:lead,0,1,or endcode
{

	sent_uint_rc6_hi();

	sent_uint_rc6_low();
}

void sent_unit_rc6_low_hi(void)
{
	sent_uint_rc6_low();

	sent_uint_rc6_hi();

}
//###############################################//

//###################基本字节电平###################//

void sent_n_bit_0_hl_1_lh(char n,char temp)//rc5码   0电平为高低,1电平为低高
{
	unsigned char 			 idata 			reverse;
	unsigned char 			 idata 			m;	
	if(n==8)
	{
	reverse=2;
	}
	else 
	{
	reverse=10;
	}
	for(m=0;m<n;m++)
	{
		
		if(m==reverse)		
		{
			if(toggle==0)
			{
				sent_unit_rc5_hi_low();
			}
			else
			{
				sent_unit_rc5_low_hi();
			}
			
		}
		else
		{
			if((temp&0X80)==0)//judge 0 or 1
			{
				sent_unit_rc5_hi_low();
			}
			else
			{
				sent_unit_rc5_low_hi();
			}
		}
		
		temp<<=1;
			
	}
}




void sent_n_bit_0_lh_1_hl(char n,char temp)//rc6码 0电平为低高,1电平为高低
{

	unsigned char 			 idata 			m;		
	for(m=0;m<n;m++)
	{
		
		
			if((temp&0X80)==0)//judge 0 or 1
			{
				sent_unit_rc6_low_hi();
			}
			else
			{
				sent_unit_rc6_hi_low();
			}
		

		
			temp<<=1;
		
				
	}
}

//#################################################//
//###########################rc6头码###################//
void sent_rc6_head(void)
{
	RCAP2L=0xff-0x68;
	RCAP2H=0xff-0x0a;	
	CACON_VALUE=0x07;//00000111
	PCON=PCON|0X01;//bit 0 -> IDLE mode, assumed only waiting timer 2 interrupt
	
	RCAP2L=0xff-0x78;
	RCAP2H=0xff-0x03;
	CACON_VALUE=0x03;//00000011
	PCON=PCON|0X01;

}
//###########################dream_DVB固定码###################//
void sent_DVB_uint(char n,char m)
{
	RCAP2L=0xff-0xbe;
	RCAP2H=0xff-0x00;	
	CACON_VALUE=0x07;//00000111
	PCON=PCON|0X01;//bit 0 -> IDLE mode, assumed only waiting timer 2 interrupt
	
	RCAP2L=0xff-m;
	RCAP2H=0xff-n;
	CACON_VALUE=0x03;//00000011
	PCON=PCON|0X01;

}


//#################################################//
//#################################################//


//###########################尾码###################//
void sent_tail(char n,char m)//83ms      use a flag all tail with this function
{

	RCAP2L=0;
	RCAP2H=0;		
	CACON_VALUE=0x03;//00000011
	PCON=PCON|0X01;
			
	RCAP2L=0xff-m;
	RCAP2H=0xff-n;
	CACON_VALUE=0x03;//00000011
	PCON=PCON|0X01;
}

//####################################################//

void sent_rc5(void)//13
{
	CADATAL           =110;
	CADATAH           =222;
	

	sent_n_bit_0_hl_1_lh(8,temp_system_value);

	

	temp_key_value<<=2;
	sent_n_bit_0_hl_1_lh(6,temp_key_value);
	
	
	sent_tail(0x52,0xe8);//0x52e8=89.76-3-65.536

}


void sent_rc6(void)//13
{
	unsigned char fix;

	fix=0x08;	
	
	CADATAL           =110;
	CADATAH           =222;

	sent_rc6_head();
	fix<<=4;
	sent_n_bit_0_lh_1_hl(4,fix);
	
	
	if(toggle==0)//toggle bit
	{
		sent_unit_rc5_low_hi();

	}
	else
	{
		sent_unit_rc5_hi_low();
	}

	sent_n_bit_0_lh_1_hl(8,temp_system_value);
	sent_n_bit_0_lh_1_hl(8,temp_key_value);

	sent_tail(0x3a,0xec);//0x3aec=83-3-65.536

	

	


}

void sent_dream_DVB(void)//系统码9244F1C1
{
	unsigned char 			 idata 	 hbit;
	unsigned char 			 idata 	 lbit;	 
	unsigned char 			 idata 	 temp;	 
	unsigned int 			 idata 	 time;
	unsigned int 			 idata 	 temp_key_value1;
	CADATAL           =103;
	CADATAH           =209;	
	temp_key_value1=766+136*dvb[KEY1_OFFSET];//键码	
	lbit=(unsigned char)temp_key_value1	;
	hbit=(unsigned char)(temp_key_value1>>8)	;

	sent_DVB_uint(0x03,0x86);//1---902us
	sent_DVB_uint(0x09,0x5e);//c---2398us
	sent_DVB_uint(0x03,0x86);//1---902us
	sent_DVB_uint(0x0a,0xf6);//f---2806us
	sent_DVB_uint(0x05,0x1e);//4---1310us
	sent_DVB_uint(0x05,0x1e);//4---902us
	sent_DVB_uint(0x04,0x0e);//2---1038us
	sent_DVB_uint(0x07,0xc6);//9---1990us
	
	sent_DVB_uint(0x32,0xf0);//间隔码,13040us
	
	sent_DVB_uint(0x03,0x86);//1---902us
	if(press==0)
	{
		sent_DVB_uint(hbit,lbit);		//一位变量
		sent_DVB_uint(0x02,0xfe);//0---766us
	}
	else
	{
		temp=8+dvb[KEY1_OFFSET];
		if(temp>=16)
		{
			temp=temp-16;			
		}
		time=766+136*temp;
		lbit=(unsigned char)time	;
		hbit=(unsigned char)(time>>8)	;
		sent_DVB_uint(hbit,lbit);		//一位变量
		sent_DVB_uint(0x07,0x3e);//0---1854us
	}
	sent_DVB_uint(0x03,0x86);//1---902us

//*************变量的低四位*************//

	temp=(temp_key_value&0x0f);//取低四位
	time=766+136*temp;
	lbit=(unsigned char)time	;
	hbit=(unsigned char)(time>>8)	;
	sent_DVB_uint(hbit,lbit);//两位键码

//*************变量的高四位*************//	

	temp=(temp_key_value&0xf0);//
	temp=(temp>>4);//取高四位
	time=766+136*temp;
	lbit=(unsigned char)time	;
	hbit=(unsigned char)(time>>8)	;
	sent_DVB_uint(hbit,lbit);//两位键码
		
	sent_DVB_uint(0x02,0xfe);//0---766us
	sent_DVB_uint(0x02,0xfe);//0---766us

	

	sent_DVB_uint(0x00,0x00);//低电平
	sent_tail(0x36,0x14);	//高电平0x3aec=83-3-65.536
}


void SEND_CODE(void)//send code,new code and repeat code diffrent in code_length and code_list
{

	
	
		if( ( (KEY1_OFFSET>=16) && (KEY1_OFFSET<=18) )&&((memory_channel[set]==13)||(memory_channel[set]==23)||(memory_channel[set]==25)) )//SAT的203发TV的码,遇到声音的三个键
		{
				flash_current_led=0X7F;//1011 1111 light tv led
				temp_set=0;			
		}
		else
		{
			flash_current_led=last_led_value;//指示灯地址赋值
			temp_set=set;	//当前套变量赋值	
		}	
		
		temp_key_value=channel[memory_channel[temp_set]][KEY1_OFFSET];//键码	
		type=channel[memory_channel[temp_set]][37];					  //类型代号	
		temp_system_value=channel[memory_channel[temp_set]][38];	  //系统码
		

	
	if ( temp_key_value!=0xff )//有健值的闪烁1S闪烁5次
	{
		sent_flash++;
		if(sent_flash<=2)
		{		
			turn_on_portb_led(flash_current_led);//在键盘扫描处关闭了指示灯,故该处再次打开						
		}
		else
		{			
			turn_off_portb_led();							
		}
		
		if(sent_flash>=4)
		{
			sent_flash=0;
		}																			
	}
	else //无码键
	{
		turn_off_portb_led();
		delay_65ms();
		delay_65ms();
		return;
	}

	sent_detail_code();
																			
}

void sent_detail_code(void)
{

	
//	rotate_flag=0;//default right rotate
//	tail_flag=0;//default tail type       high and low
//	reverse_bit=10;//default reverse bit 

	switch(type)
		{
			case 0://MN6014A/W-C6D6		
					sent_rc5();
			break;

			case 1://M50560
					sent_rc6();
			break;

			case 2://M50119P
					sent_dream_DVB();
			break;

			default:
			break;

		}

}


void BIT_SCANKEY(void)//bia this routine we can get KEY_COUNT,KEY1_OFFSET,GF_9  input variable PB,PA,COLUMN,BUFFER_KEY
{
															//    bit      bdata 0_row;
	unsigned char  idata CYC_PB;
	unsigned char  idata CYC_PA;
	unsigned char  idata i;//row cycle
	unsigned char  idata j;//column cycle	
															//	unsigned char  current_row;//the pressed key row
															//	unsigned char  current_column;//the pressed key column
	unsigned char  idata current_key_value;//the pressed key value
	unsigned char  idata pa_value;//the port a value buffer

	last_pc=PORTC;//保存PC口值
//	last_pb=PORTB;//保存PB口值
	//init before scan	
	PAPUR = 0X00;					//扫描前先把PA口设置为推挽输出
	PACONH = 0XAA;
	PACONL = 0XAA;					//并把上拉禁止

⌨️ 快捷键说明

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