📄 i2c_con.c
字号:
}*/
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 + -