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

📄 main_bridge.c

📁 一个桥接器87ch47仿真器的c的源程序
💻 C
字号:
#include "IO870.h"
#include "global.h"
#include "cust_io.h"
#include "keydef.h"
#include "Main_Bridge.h"
#include "Bridge_Changer.h"

extern  void Send_Data_2_CDC(void);
extern BYTE CDC_Type;
extern S_Table_DATA_2_CDC Table_DATA_2_CDC[];
extern BYTE DATA_2_CDC[];
extern BYTE Total_Bit_2_CDC;
extern BYTE Current_DATA_2_MAIN_Index;
extern BYTE DATA_2_Main[];
extern BYTE CDC_Disc_NO;
extern BYTE CDC_Music_NO;
extern BYTE CDC_Mode;

typedef union IR_data_tag {
    unsigned char data_code[2];
    unsigned int  custom;
}IR_data;

extern BYTE Key_Code;

#pragma section data IR_State
unsigned char IR_State = IR_IDLE;

// during every 2ms,use P73 as synchronous clock,searial data 
//every Data_2_Main has 8 BYTEs,every BYTE has 2ms interrupt
void Send_Data_2_Main(void)
{
	BYTE DBR1,i,Bit_Index,Byte_Index,tmp_data;

	for(Byte_Index=0;Byte_Index<8;Byte_Index++)
	{
		DBR1=DATA_2_Main[Byte_Index];
    	tmp_data=0x80;
    	for(Bit_Index=8;Bit_Index>=1;Bit_Index--)	//synchronous clock=18us,
    	{
    		MAIN_CLK=0;
    		if(DBR1&tmp_data)	//current bit=1,inverse to 0
    			MAIN_DATA=0;
    		else
    			MAIN_DATA=1;
    		MAIN_CLK=1;
    		tmp_data>>=1;
    	}
    	MAIN_CLK=0;
    	for(i=0;i<0xff;i++)		//every 1.5ms,send 1 BYTE (original panasonic is 2ms)
    	{
    		__asm("NOP");
    		__asm("NOP");
    		__asm("NOP");
    		__asm("NOP");
    	}
	}
}	



void Transmit_Main_2_CDC()
{
//according to specification's "Reference Data","3.Communication Data of 'E-07'"
//When destination disc does not exist,CDC automatically turn to next disc,...
	BYTE Key_Order,i,j,k,n;
	if((Key_Code==0xe4))
	{
    	for(n=0;n<2;n++)
    	{
    		DATA_2_Main[0]=0xeb;
    		DATA_2_Main[1]=CDC_Disc_NO;		
    		DATA_2_Main[2]=CDC_Music_NO;			
    		DATA_2_Main[3]=0x00;
    		DATA_2_Main[4]=0x00;
    		DATA_2_Main[5]=0x00;
    		DATA_2_Main[6]=0x70;
    		DATA_2_Main[7]=0xe3;
    		Send_Data_2_Main();
    	}
		for(j=0;j<0xff;j++)
			for(k=0;k<0x0b;k++)
			__asm("NOP");
	}
	if((Key_Code==0x14)||(Key_Code==0xe4))
	{
    	for(n=0;n<2;n++)
    	{
    		for(i=1;i<=6;i++)
    		{
    			DATA_2_Main[0]=0x4b;
        		DATA_2_Main[1]=0xd0+i;		
        		DATA_2_Main[2]=0xff;			
        		DATA_2_Main[3]=0;
        		DATA_2_Main[4]=0;
        		DATA_2_Main[5]=0;
        		DATA_2_Main[6]=0;
        		DATA_2_Main[7]=0x43;
        		Send_Data_2_Main();
    			for(j=0;j<0xff;j++)			//the time to wait is important
    			for(k=0;k<0x0b;k++)		
    				__asm("NOP");
        		DATA_2_Main[0]=0x4b;
        		DATA_2_Main[1]=CDC_Disc_NO;		
        		DATA_2_Main[2]=CDC_Music_NO;			
        		DATA_2_Main[3]=0x00;
        		DATA_2_Main[4]=0x00;
        		DATA_2_Main[5]=0x00;
        		DATA_2_Main[6]=0x10;
        		DATA_2_Main[7]=0x43;
        		Send_Data_2_Main();
        		for(j=0;j<0xff;j++)
    			for(k=0;k<0x0b;k++)
    				__asm("NOP");    				
    		}
    		for(i=1;i<=6;i++)
    		{
    			DATA_2_Main[0]=0x6b;
        		DATA_2_Main[1]=0xd0+i;		
        		DATA_2_Main[2]=0xff;			
        		DATA_2_Main[3]=0;
        		DATA_2_Main[4]=0;
        		DATA_2_Main[5]=0;
        		DATA_2_Main[6]=0;
        		DATA_2_Main[7]=0x63;
        		Send_Data_2_Main();
    			for(j=0;j<0xff;j++)
    			for(k=0;k<0x0b;k++)
    				__asm("NOP");    
        		DATA_2_Main[0]=0x6b;
        		DATA_2_Main[1]=CDC_Disc_NO;		
        		DATA_2_Main[2]=CDC_Music_NO;			
        		DATA_2_Main[3]=0x00;
        		DATA_2_Main[4]=0x00;
        		DATA_2_Main[5]=0x00;
        		DATA_2_Main[6]=0x51;
        		DATA_2_Main[7]=0x63;
        		Send_Data_2_Main();
        		for(j=0;j<0xff;j++)
    			for(k=0;k<0x0b;k++)
    				__asm("NOP");    				
    		}			
    	}
	}
	if((Key_Code==0xa4))
	{
    	for(n=0;n<2;n++)
    	{
    		for(i=1;i<=6;i++)
    		{
    			DATA_2_Main[0]=0x6b;
        		DATA_2_Main[1]=0xd0+i;		
        		DATA_2_Main[2]=0xff;			
        		DATA_2_Main[3]=0;
        		DATA_2_Main[4]=0;
        		DATA_2_Main[5]=0;
        		DATA_2_Main[6]=0;
        		DATA_2_Main[7]=0x63;
        		Send_Data_2_Main();
    			for(j=0;j<0xff;j++)
    			for(k=0;k<0x0b;k++)
    				__asm("NOP");    
        		DATA_2_Main[0]=0x6b;
        		DATA_2_Main[1]=CDC_Disc_NO;		
        		DATA_2_Main[2]=CDC_Music_NO;			
        		DATA_2_Main[3]=0x00;
        		DATA_2_Main[4]=0x00;
        		DATA_2_Main[5]=0x00;
        		DATA_2_Main[6]=0x10;
        		DATA_2_Main[7]=0x63;
        		Send_Data_2_Main();
        		for(j=0;j<0xff;j++)
    			for(k=0;k<0x0b;k++)
    				__asm("NOP");    				
    		}			
    	}
	}
	//Translate begin...
	switch(Key_Code)	
	{
		case _AMFM_KEYCODE:			//stop CDC 
			Key_Order=_AMFM_KEY;
			break;						
		case _Query_CDC_Status_KEYCODE:	//Query_CDC_status
			Key_Order= _Query_CDC_Status_KEY;		
			break;
		case _SEARCH_CDC_KEYCODE:	//
//			Key_Order=_SEARCH_CDC_KEY; 	//must set this disable	
			Key_Order=_Query_CDC_Status_KEY;		
		    break;					//useful
		case _PLAY_KEYCODE:			//play CDC(current disc,music)
			Key_Order=_PLAY_KEY;
		    break;
		case _SCAN_KEYCODE:			//scan CDC
			if(CDC_Mode==4)
			{
				CDC_Mode=1;
				Key_Order=_RETURN_2_PLAY_KEY;
			}
			else 
			{
				CDC_Mode=4;
				Key_Order=_SCAN_KEY;
			}
			break;
		case _PALY_2_SFL_KEYCODE:	//Shuffle CDC
			if(CDC_Mode==3)
			{
				CDC_Mode=1;
				Key_Order=_RETURN_2_PLAY_KEY;
			}
			else 
			{
				CDC_Mode=3;
				Key_Order=_PALY_2_SFL_KEY;
			}
			break;		
		case _NEXT_KEYCODE:			// next music.use Music search code
			Key_Order=_NEXT_KEY;
			break;	
		case _PREVIOUS_KEYCODE:		//Previous  music.use Music Search Code
			Key_Order=_PREVIOUS_KEY;
			break;				
		case _DISC1_KEYCODE:		// Search Disc1 Code
			Key_Order=_DISC1_KEY;
			break;			
		case _DISC2_KEYCODE:		// Search Disc2 Code
			Key_Order=_DISC2_KEY;	
			break;			
		case _DISC3_KEYCODE:		// Search Disc3 Code
			Key_Order=_DISC3_KEY;	
			break;				
		case _DISC4_KEYCODE:		// Search Disc4 Code
			Key_Order=_DISC4_KEY;	
			break;			
		case _DISC5_KEYCODE:		// Search Disc5 Code
			Key_Order=_DISC5_KEY;	
			break;			
		case _DISC6_KEYCODE:		// Search Disc6 Code
			Key_Order=_DISC6_KEY;
			break;
		case _Query_CDC_Exist_KEYCODE:	//Query_CDC_Exist status,Connection Check Command
			Key_Order= _Query_CDC_Exist_KEY;		
			break;			
	}	
	DATA_2_CDC[0]=Table_DATA_2_CDC[Key_Order+(CDC_Type-1)*_KEY_COUNT].data_code[0];
	DATA_2_CDC[1]=Table_DATA_2_CDC[Key_Order+(CDC_Type-1)*_KEY_COUNT].data_code[1];
	DATA_2_CDC[2]=Table_DATA_2_CDC[Key_Order+(CDC_Type-1)*_KEY_COUNT].data_code[2];
	DATA_2_CDC[3]=Table_DATA_2_CDC[Key_Order+(CDC_Type-1)*_KEY_COUNT].data_code[3];
	Total_Bit_2_CDC=Table_DATA_2_CDC[Key_Order+(CDC_Type-1)*_KEY_COUNT].bitcount;
	
	//Transmit begin...
	if(Total_Bit_2_CDC>0)
		Send_Data_2_CDC();
}

//1000ms to resend data to main
void __interrupt INT_ReSend_Data_2_Main(void)
{
	Send_Data_2_Main();
}
void irKey_convert(void)
{
	BYTE i,j,k;
    if (Key_Code == _NO_KEYCODE)   	return;
//    EIR=EIR & (~EF15);		//close p20
    if (Key_Code == _AMFM_KEYCODE)  
    {
  		Transmit_Main_2_CDC();
  		for(i=0;i<0xff;i++)
        {
        	for(j=0;j<0xff;j++)
        		__asm("NOP");
        }
  		Transmit_Main_2_CDC();		
		return;
	}
	if (Key_Code == _PLAY_KEYCODE)   
	{
  		Transmit_Main_2_CDC();
  		for(i=0;i<0xff;i++)
        {
        	for(j=0;j<0xff;j++)
        		__asm("NOP");
        }
  		Transmit_Main_2_CDC();
  		for(i=0;i<0xff;i++)
        {
        	for(j=0;j<0xff;j++)
        		__asm("NOP");
        }  		
  		Transmit_Main_2_CDC();
  		for(i=0;i<0xff;i++)
        {
        	for(j=0;j<0xff;j++)
        		__asm("NOP");
        }
	}
    Transmit_Main_2_CDC();
	Key_Code = _NO_KEYCODE;
}
void __interrupt INT_MAIN_DATA(void)
{
    static unsigned char count;
    static IR_data ir_data;

    unsigned char Remote_Pulse_Time;

    Remote_Pulse_Time =	TREG3A;    /* fetch timer value, reset	timer counter */

    if (Remote_Pulse_Time >= 0xf0) {	/* capture overflow */
	IR_State = IR_IDLE;
	return;
    }

    /* process IR */
    switch (IR_State) {
	case IR_IDLE:
	    IR_State = IR_LEADER;
	    break;

	case IR_LEADER:
	    if((Remote_Pulse_Time > (13690/128-IRERR)) && (Remote_Pulse_Time < (13690/128+IRERR))) {
		IR_State = IR_CUSTOM;		   /* IR leader	end */
		count =	0;
		return;
	    }
	    else
		IR_State = IR_IDLE;
	    break;

	case IR_CUSTOM:	      /* IR_CUSTOM */
	    if((Remote_Pulse_Time > (1144/128-IRERR)) && (Remote_Pulse_Time < (1144/128+IRERR))) 
	    {  /* receive bit "0",	mid val	= 1125 */
			ir_data.custom <<= 1;
	    }
	    else {
		if((Remote_Pulse_Time >	(2288/128-IRERR)) && (Remote_Pulse_Time < (2288/128+IRERR)))	
			/* receive bit "1", mid	val = 2250 */
		    ir_data.custom = (ir_data.custom << 1) | 0x0001;
		else {
		    IR_State = IR_IDLE;
		    return;
		}
	    }
	    count++;
	    if(count == 16) 
	    {
			IR_State = IR_DATA;				    /* start data recevie */
			count =	0;
			ir_data.custom = 0;
	    }
	    break;
	case IR_DATA:	      /* data proccess */
	    count++;
	    if((Remote_Pulse_Time > (1144/128-IRERR)) && (Remote_Pulse_Time < (1144/128+IRERR)))   /* receive bit "0", mid val = 1144 */
		ir_data.data_code[0] <<= 1;
	    else  {
		if((Remote_Pulse_Time >	(2288/128-IRERR)) && (Remote_Pulse_Time < (2288/128+IRERR)))	/* receive bit "1", mid	val = 2288 */
		    ir_data.data_code[0] = (ir_data.data_code[0] << 1) | 0x01;
		else  {
		    IR_State = IR_IDLE;
		    return;
		}
	    }
	    if(count ==	8) {
		IR_State =IR_NON_DATA ;
		count =	0;
	    }
	    break;
	case IR_NON_DATA:	  /* non-data  proccess	*/
	    count++;
	    if((Remote_Pulse_Time > (1144/128-IRERR)) && (Remote_Pulse_Time < (1144/128+IRERR)))   /* receive bit "0", mid val = 1144 */
		{
			ir_data.data_code[1] <<= 1;
		}
	    else 
	    {
			if((Remote_Pulse_Time >	(2288/128-IRERR)) && (Remote_Pulse_Time < (2288/128+IRERR)))	/* receive bit "1", mid	val = 2288 */
		 	{
		    	ir_data.data_code[1] = (ir_data.data_code[1] << 1) | 0x01;
		    }
			else 
			{
		    	IR_State = IR_IDLE;
		    	return;
			}
	    }
	    if(count ==	8) 
	    {
			IR_State = IR_IDLE;
			if(ir_data.data_code[0] == (255-ir_data.data_code[1])) 
			{
		    	Key_Code = ir_data.data_code[0];
				key_contiune_process:
				irKey_convert();
			}
	    }
	    break;
	default:
	    IR_State = IR_IDLE;
    }
}

⌨️ 快捷键说明

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