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

📄 i2c_con.c

📁 美上美fea397 FM/AM车载收音模块(tda7540芯片)控制源码
💻 C
📖 第 1 页 / 共 2 页
字号:
}*/

void ST_BY_Ctrl_PCA9554(U8 statu)
{char buf[2];
if(statu==0)
   {PCA9554_DATA&=~(1<<ST_By_PCA9554);
   AudioMUTE_ALL_M52795(1);
   }
else if(statu==1)
  {PCA9554_DATA|=(1<<ST_By_PCA9554);
  AudioMUTE_ALL_M52795(0);
  }

 buf[0]=0x01;//命令字节.
 buf[1]=PCA9554_DATA;
 WriteI2C_NULLSubAddr(buf,2,Addr_PCA9554);
 WriteI2C_NULLSubAddr(buf,2,Addr_PCA9554test);
}


void ACC_Ctrl_PCA9554(U8 statu)
{char buf[2];
 if(statu==0)
   PCA9554_DATA&=~(1<<ACC_PCA9554);
 else if(statu==1)
   {PCA9554_DATA|=(1<<ACC_PCA9554);}

 buf[0]=0x01;//命令字节.
 buf[1]=PCA9554_DATA;
 WriteI2C_NULLSubAddr(buf,2,Addr_PCA9554);
 WriteI2C_NULLSubAddr(buf,2,Addr_PCA9554test);
}

void MUTE_Ctrl_PCA9554(U8 statu)
{char buf[2];

/*	mute_lc75412(statu);
#ifdef TESTLC75412
#endif*/

 if(statu==1)  //MUTE
   {
   MUTE_Lc75412_M52795(1);
    PCA9554_DATA&=~(1<<MUTE_PCA9554);
 buf[0]=0x01;//命令字节.
 buf[1]=PCA9554_DATA;
 WriteI2C_NULLSubAddr(buf,2,Addr_PCA9554);
 WriteI2C_NULLSubAddr(buf,2,Addr_PCA9554test);
    #if MUTEbyAD1941orM52795
    /*
    if(car_MainVolume>20)
    {Audio_MainVolume(car_MainVolume-5);
        delay_ileaon(50); 
    }
    if(car_MainVolume>30)
    {Audio_MainVolume(car_MainVolume-10);
        delay_ileaon(50); 
    }
    if(car_MainVolume>40)
    {Audio_MainVolume(car_MainVolume-18);
        delay_ileaon(50); 
    }
    if(car_MainVolume>50)
    {Audio_MainVolume(car_MainVolume-28);
        delay_ileaon(50); 
    }
    */
    Audio_MainVolume(0);
    #else
    AudioMUTE_out1_M52795(1);
    #endif    
   }
 else if(statu==0)  //Not MUTE
   {
   MUTE_Lc75412_M52795(0);
    PCA9554_DATA|=(1<<MUTE_PCA9554);
 buf[0]=0x01;//命令字节.
 buf[1]=PCA9554_DATA;
 WriteI2C_NULLSubAddr(buf,2,Addr_PCA9554);
 WriteI2C_NULLSubAddr(buf,2,Addr_PCA9554test);
    #if MUTEbyAD1941orM52795==0
    AudioMUTE_out1_M52795(0);
    #else
 //   Audio_MainVolume(car_MainVolume>>1);
    Audio_MainVolume(car_MainVolume);
    #endif
   }
}


void ANT_Ctrl_PCA9554(U8 statu)
{char buf[2];
 if(statu==0)
   {PCA9554_DATA&=~(1<<ANT_PCA9554);}
 else if(statu==1)
   {PCA9554_DATA|=(1<<ANT_PCA9554);}
 buf[0]=0x01;//命令字节.
 buf[1]=PCA9554_DATA;
 WriteI2C_NULLSubAddr(buf,2,Addr_PCA9554);
 WriteI2C_NULLSubAddr(buf,2,Addr_PCA9554test);
}


/*************************************************************/


void channel_M52795(U8 data)
{//data&=0x03;//防止数据破坏.
//在此添加DVD数字音源选择.
#if AD1938_SlaveMode
if(data==1)
    Audio_ChannelIn(0);
else Audio_ChannelIn(1);
#else
      Audio_ChannelIn(1);
#endif
if(data<4)
    {
    M52795_DATA[0]&=~3;
	 M52795_DATA[0]|=8;
     M52795_DATA[0]|=data;
WriteI2C_NULLSubAddr(M52795_DATA,2,Addr_M52795);

	if(data==0)//tuner
		Write_75412_Switch(1);
	else if(data==1)//dvd
		Write_75412_Switch(4);
	else if(data==2)//cdc
		Write_75412_Switch(3);
	else if(data==3)//aux
		Write_75412_Switch(2);
    }
else
    {data&=0x03;
     M52795_DATA[1]&=~3;
     M52795_DATA[1]|=8;
     M52795_DATA[1]|=data;
WriteI2C_NULLSubAddr(M52795_DATA,2,Addr_M52795);
    }

}

void AV_InOutMUTE_Ctrl_M52795(U8 statu)
{
 if(statu==0)//NOT MUTE
      {M52795_DATA[0]&=~(1<<5);
    //   M52795_DATA[0]|=(0<<5);
       }
 else if(statu==1)//MUTE
      {
       M52795_DATA[0]&=~(1<<5);
       M52795_DATA[0]|=(1<<5);
      }      
 WriteI2C_NULLSubAddr(M52795_DATA,2,Addr_M52795);
}

void AudioMUTE_out1_M52795(U8 statu)
{
 if(statu==0)//DEMUTE
    {
    M52795_DATA[0]|=(3<<6);
    //M52795_DATA[1]|=(3<<6);
    }
 else if(statu==1)//MUTE
    {
    M52795_DATA[0]&=~(3<<6);
    //M52795_DATA[1]&=~(3<<6);
    }
 WriteI2C_NULLSubAddr(M52795_DATA,2,Addr_M52795);
}

void AudioMUTE_ALL_M52795(U8 statu)
{
 if(statu==0)//DEMUTE
    {
    M52795_DATA[0]|=(3<<6);
    M52795_DATA[1]|=(3<<6);
    }
 else if(statu==1)//MUTE
    {
    M52795_DATA[0]&=~(3<<6);
    M52795_DATA[1]&=~(3<<6);
    }
 WriteI2C_NULLSubAddr(M52795_DATA,2,Addr_M52795);
}

void GPS_PowerCtrl_M52795(U8 statu)
{
 if(statu==0)
      {M52795_DATA[1]&=~(1<<4);
       M52795_DATA[1]|=(1<<4);
       }
 else if(statu==1)
      {
       M52795_DATA[1]&=~(1<<4);
    //   M52795_DATA[1]|=(0<<4);
      }      
 WriteI2C_NULLSubAddr(M52795_DATA,2,Addr_M52795);
}

void IPOD_CON_M52795(U8 statu)
{
 if(statu==0)
      {M52795_DATA[1]&=~(1<<5);
       M52795_DATA[1]|=(1<<5);
       }
 else if(statu==1)
      {
       M52795_DATA[1]&=~(1<<5);
    //   M52795_DATA[1]|=(0<<5);
      }      
 WriteI2C_NULLSubAddr(M52795_DATA,2,Addr_M52795);

}

void MUTE_Lc75412_M52795(U8 statu)
{
 if(statu==0)
      {M52795_DATA[0]&=~(1<<4);
       M52795_DATA[0]|=(1<<4);
       }
 else if(statu==1)
      {
       M52795_DATA[0]&=~(1<<4);
    //   M52795_DATA[1]|=(0<<5);
      }      
 WriteI2C_NULLSubAddr(M52795_DATA,2,Addr_M52795);

}

/*****************************************************/
/***********************
两个光耦及两个行程开关的检测.
***************************/
void DetectK_init(void)
{
    rGPECON = rGPECON & (~(3<<0))&(~(3<<2))& (~(3<<6))&(~(3<<8));
//	rGPECON =rGPECON  | (0<<0)|(0<<2)| (0<<6)|(0<<8);	
	rGPEUP = rGPEUP & (~(1<<0))&(~(1<<1))&(~(1<<3))&(~(1<<4));
}
//U8 MotorPosition[]={0,2,4,7,11,16,22,30};
static signed int currentPanelAngle;
//static U8 StatuCountDetect=0;
//static U8 Motor_exception=0;
//角度控制
/*
U8 DetectPosition(void)
{ U8 Detectbuf[3]={0xff,0xff,0xff};
  Detectbuf[1]=(U8)(rGPEDAT&0x1B);
  do
    {Detectbuf[0]=Detectbuf[1];
     Delay(20);
     Detectbuf[1]=(U8)(rGPEDAT&0x1B);
     }while(Detectbuf[0]!=Detectbuf[1]);
  if(!(Detectbuf[1]&0x08)) return 1;
  if(!(Detectbuf[1]&0x10)) return 0;
  return (U8)((Detectbuf[1]&0x03)+2);     
}
*/

void Delay_us_standart(unsigned int para)
{unsigned int i,j;
    for (i=0; i<para; i++) {
        for (j=0; j<20; j++) {
            ;
        }
     
    }
     
}
#define     START_POINT    0x10
#define     END_POINT      0x20

char DetectPosition(void)
{char temp1,temp0=1;
 unsigned int count = 0;
	  temp1 =(U8)(rGPEDAT&0x1B);;
  while (temp1 != temp0) {
      temp0 = temp1;
	  Delay_us_standart(1000);
	  temp1 = (U8)(rGPEDAT&0x1B);;
  }
  if ((temp1 & 0x10) == 0) {
      return START_POINT;
  }
  else if ((temp1 & 0x08) == 0) {
      return END_POINT;
  }
  return (temp1 & 0x03);
}

/*
int crash_length(U8 laststatu)
{int length=0,j=0;U8 currentstatu;
 while(1)
        {currentstatu=DetectPosition();             
            if(currentstatu!=laststatu)
              {laststatu=currentstatu;
               length++;
               j=0;               
              }
            else   j++;
            if(j>100)break;
        }
return length;
}
*/





void MotorCtrl(char para)
{if(para==0)
           DVD_MotorCtrl_PCA9554(0);//MotorStop;
 if(para==1)
           DVD_MotorCtrl_PCA9554(2);//MotorRunDOWN;	
 if(para==2)
           DVD_MotorCtrl_PCA9554(1);//MotorRunUP;	   
}

static signed int length=0;
static signed char step_direction=0;
static char Motor_exception=0;
//extern char  currentPanelAngle;

void crash_length(unsigned char laststatu)
{
	unsigned int j=0; 
	unsigned char currentstatu;
	while(1){
        currentstatu=DetectPosition();             
        if(currentstatu!=laststatu){
              laststatu=currentstatu;
              length+=step_direction;
              j=0;               
        }
        else   j++;
        if(j>300) break;
 } 
}


#define   endAngle   0x35
signed int angleTab[6]={0x00,0x10,0x1a,0x23,0x2b,endAngle};//0x39 == 57
//改成滑至底后,实测行程总长:0X35==53
BOOL PanelAngleCtrl(unsigned char  para)//0~255.
{
 unsigned char grade=para/50;
 signed int expectAngle;
 //signed char currentPanelAngle0;
 signed int length0;
 signed int old_PanelAngle = currentPanelAngle;
 char currentstatu,laststatu;
 char turnBack=0;
 int j,i=0;  
 //currentPanelAngle0=currentPanelAngle; 
 while (1){
        if (turnBack == 0) {
            expectAngle=angleTab[grade];
        }
		else {
			expectAngle = old_PanelAngle;
		}
		length0=length = expectAngle - currentPanelAngle;
		if (length > 0) {
		    length -=1;
			length0 = length;
		}
		else {
		    length +=1;length0 = length;
		}
        currentstatu=laststatu = DetectPosition();
        if (length<0 || Motor_exception==1 || (expectAngle == 0x00)) {
               MotorCtrl(2);//UP  
               step_direction = 1;            
        }
        else if (length>0) {
               MotorCtrl(1);//DOWN 
               step_direction = -1;            
        }
		else if (length == 0) {
	        //BaseDATA.car_PannelAngleSetting = para;
					//	 print_ascii_1620(280,280,((currentPanelAngle&0xf0)>>4)+'a',0xffff,0x0000);
					//	 print_ascii_1620(300,280,(currentPanelAngle&0x0f)+'a',0xffff,0x0000);
		 	return TRUE;
		}
        while(1){
               currentstatu=DetectPosition();
               if(currentstatu!=laststatu){length+=step_direction;laststatu=currentstatu;i=0;}
               else   i++;
               if(i>300) break;
			   if ((length != length0) && (currentstatu == START_POINT)) {
			       break;
			   }
			   if ((Motor_exception == 1) || (expectAngle == 0)) {
			       if (currentstatu == START_POINT) {
				       break;
			       }
			   }
			   else if (expectAngle == endAngle) {
			       if (currentstatu == END_POINT) {
				      // for(i=0;i<1000;i++)Delay(10000);
				       break;
			       }
			   }
			   else if(length ==0) {
			       break;
			   }
        }
        MotorCtrl(0);
        crash_length(laststatu);
		
              if (currentstatu==START_POINT) {
                   currentPanelAngle=0;
                   Motor_exception=0;
                   if (expectAngle==0) {
				   	     //BaseDATA.car_PannelAngleSetting = para;
						 return TRUE;
				   }
              }
              else if (currentstatu==END_POINT) {
                   currentPanelAngle = endAngle;//currentPanelAngle=endAngle;
                   //Motor_exception=0;
                   if (expectAngle==endAngle) {
				   	     //BaseDATA.car_PannelAngleSetting = para;
						// print_ascii_1620(200,220,((currentPanelAngle&0xf0)>>4)+'a',0xffff,0x0000);
						// print_ascii_1620(220,220,(currentPanelAngle&0x0f)+'a',0xffff,0x0000);
						 //for(i=0;i<2;i++)Delay(10000);
						 return TRUE;
				   }
              }
			  
        else if (i <= 300) {
              {
                   currentPanelAngle+=(length0-length);
                   if (currentPanelAngle<(expectAngle+1) && currentPanelAngle>(expectAngle-1)) {
				   	   //BaseDATA.car_PannelAngleSetting = para;
						// print_ascii_1620(240,260,((currentPanelAngle&0xf0)>>4)+'a',0xffff,0x0000);
						// print_ascii_1620(260,260,(currentPanelAngle&0x0f)+'a',0xffff,0x0000);
                       return TRUE;
				   }
              }
        }
		
        else{
            if(turnBack == 0){
               currentPanelAngle+=(length0-length);
               turnBack=1;
            }
            else {
                 Motor_exception=1;
                 currentPanelAngle+=(length0-length);
                 return FALSE;
            }
        }
 }
 return FALSE;
} 
 
 
 














////////////////TMP75/////////////////////////////////////////
void Init_TMP75(void)
{
 char data[3];
 data[0]=0x99;
 while(!WriteI2C_SubAddrU8(data,1,1,Addr_TMP75));
 data[0]=0x00;data[1]=0x00;
 while(!WriteI2C_SubAddrU8(data,2,2,Addr_TMP75));
 data[0]=0x32;data[1]=0x00;
 while(!WriteI2C_SubAddrU8(data,2,3,Addr_TMP75));
}

//返回值为符号数,每个最小单位代表0.5度
S16 Read_TMP75(void)
{char data[2];S16 Temperature;
  data[0]=0x99;
 WriteI2C_SubAddrU8(data,1,1,Addr_TMP75);//start TMP75 converter
 Delay(400);
 ReadI2C_SubAddrU8(data,2,0,Addr_TMP75);
  if(data[0]&0x80) 
   {
    Temperature=((data[0]<<1)+((data[1]&0x80)>>7))|0xfe00;
   }
 else
   {
    Temperature=(data[0]<<1)+((data[1]&0x80)>>7);
   } 
 #if DebugInf_On  
   hexbcd(640,420,Temperature,0x0000,0xffff);
 #endif
   return Temperature;
}

⌨️ 快捷键说明

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