📄 lib.c
字号:
/*********************************************************
Project: ST FST(TDA7540)
File name: Lib.c
Description:
Write/Modify: Perry
Time: 2005-11-22- 11:07:07
*********************************************************/
#include "public.h"
/*********************************************
Function: I2CStart
Description:
Write/Modify: Perry.Liang
Time: 2004-11-11- 12:14:50
*********************************************/
void I2CStart(void)
{
PD_SW_I2CClk=1;
PD_SW_I2CData=1;
Pin_SW_I2CData=1;
M_WAIT;
Pin_SW_I2CClk=1;
M_WAIT;
Pin_SW_I2CData=0;
M_WAIT;
Pin_SW_I2CClk=0;
M_WAIT;
}
/*********************************************
Function: I2CStop
Description:
Write/Modify: Perry.Liang
Time: 2004-11-11- 12:14:54
*********************************************/
void I2CStop(void)
{
unsigned char i;
PD_SW_I2CClk=0;
Pin_SW_I2CClk=1;
//while(!Pin(Pin_I2CClk, PIN_READ));
for(i=0;(i<20)&&(!Pin_SW_I2CClk);i++)Wait10us(1);
PD_SW_I2CClk=1;
PD_SW_I2CData=1;
Pin_SW_I2CData=0;
M_WAIT;
Pin_SW_I2CClk=1;
M_WAIT;
Pin_SW_I2CData=1;
M_WAIT;
}
/*********************************************
Function: I2COut8Bit
Description:
Write/Modify: Perry.Liang
Time: 2004-11-11- 12:14:59
*********************************************/
unsigned char I2COut8Bit(unsigned char outbyte)
{
unsigned char i;
unsigned int j;
UCharField temp;
temp.byte=outbyte;
PD_SW_I2CClk=1;
PD_SW_I2CData=1;
#if 0
for(i=0x80;i>0;i>>=1)
{
Pin_SW_I2CClk=0;
if(outbyte&i)
Pin_SW_I2CData=1;
else
Pin_SW_I2CData=0;
M_WAIT;
/*if(i==0x80)
{
PD_SW_I2CClk=0;
for(j=0;((j<1) && (!Pin_SW_I2CClk));j++);
PD_SW_I2CClk=1;
}*/
Pin_SW_I2CClk=1;
}
#else
Pin_SW_I2CClk=0;
Pin_SW_I2CData=temp.field.B7;
Pin_SW_I2CClk=1;
asm nop
Pin_SW_I2CClk=0;
Pin_SW_I2CData=temp.field.B6;
Pin_SW_I2CClk=1;
asm nop
Pin_SW_I2CClk=0;
Pin_SW_I2CData=temp.field.B5;
Pin_SW_I2CClk=1;
asm nop
Pin_SW_I2CClk=0;
Pin_SW_I2CData=temp.field.B4;
Pin_SW_I2CClk=1;
asm nop
Pin_SW_I2CClk=0;
Pin_SW_I2CData=temp.field.B3;
Pin_SW_I2CClk=1;
asm nop
Pin_SW_I2CClk=0;
Pin_SW_I2CData=temp.field.B2;
Pin_SW_I2CClk=1;
asm nop
Pin_SW_I2CClk=0;
Pin_SW_I2CData=temp.field.B1;
Pin_SW_I2CClk=1;
asm nop
Pin_SW_I2CClk=0;
Pin_SW_I2CData=temp.field.B0;
Pin_SW_I2CClk=1;
asm nop
#endif
Pin_SW_I2CClk=0;
PD_SW_I2CData=0;
M_WAIT;
Pin_SW_I2CClk=1;
M_WAIT;
if(Pin_SW_I2CData)
i=0;
else
i=1;
Pin_SW_I2CClk=0;
M_WAIT;
return(i);
}
/*********************************************
Function: I2CIn8Bit
Description:
Write/Modify: Perry.Liang
Time: 2004-11-11- 12:15:02
*********************************************/
unsigned char I2CIn8Bit(void)
{
unsigned char i,inbyte=0;
PD_SW_I2CClk=0;
Pin_SW_I2CClk=1;
//while(!Pin(Pin_I2CClk, PIN_READ));
for(i=0;(i<20)&&(!Pin_SW_I2CClk);i++)Wait10us(1);
PD_SW_I2CClk=1;
PD_SW_I2CData=0;
for(i=0x80;i>0;i>>=1)
{
Pin_SW_I2CClk=1;
M_WAIT;
if(Pin_SW_I2CData)
inbyte|=i;
Pin_SW_I2CClk=0;
}
return (inbyte);
}
/*********************************************
Function: I2CAck
Description:
Write/Modify: Perry.Liang
Time: 2004-11-11- 12:15:04
*********************************************/
void I2CAck(void)
{
PD_SW_I2CClk=1;
PD_SW_I2CData=1;
Pin_SW_I2CData=0;
M_WAIT;
Pin_SW_I2CClk=1;
M_WAIT;
Pin_SW_I2CClk=0;
PD_SW_I2CData=0;
M_WAIT;
}
/*********************************************
Function: I2CNAck
Description:
Write/Modify: Perry.Liang
Time: 2004-11-11- 12:15:05
*********************************************/
void I2CNAck(void)
{
PD_SW_I2CClk=1;
PD_SW_I2CData=1;
Pin_SW_I2CData=1;
M_WAIT;
Pin_SW_I2CClk=1;
M_WAIT;
Pin_SW_I2CClk=0;
PD_SW_I2CData=0;
M_WAIT;
}
/*********************************************
Function: I2C2Start
Description:
Write/Modify: Perry.Liang
Time: 2006-8-4- 10:01:06
*********************************************/
void I2C2Start(void)
{
PD_SW2_I2CClk=1;
PD_SW2_I2CData=1;
Pin_SW2_I2CData=1;
M_WAIT;
Pin_SW2_I2CClk=1;
M_WAIT;
Pin_SW2_I2CData=0;
M_WAIT;
Pin_SW2_I2CClk=0;
M_WAIT;
}
/*********************************************
Function: I2C2Stop
Description:
Write/Modify: Perry.Liang
Time: 2006-8-4- 10:01:05
*********************************************/
void I2C2Stop(void)
{
PD_SW2_I2CClk=0;
Pin_SW2_I2CClk=1;
while(!Pin_SW2_I2CClk);
PD_SW2_I2CClk=1;
PD_SW2_I2CData=1;
Pin_SW2_I2CData=0;
M_WAIT;
Pin_SW2_I2CClk=1;
M_WAIT;
Pin_SW2_I2CData=1;
M_WAIT;
}
/*********************************************
Function: I2C2Out8Bit
Description:
Write/Modify: Perry.Liang
Time: 2006-8-4- 10:01:03
*********************************************/
unsigned char I2C2Out8Bit(unsigned char outbyte)
{
unsigned char i;
unsigned int j;
UCharField temp;
temp.byte=outbyte;
PD_SW2_I2CClk=1;
PD_SW2_I2CData=1;
#if 0
for(i=0x80;i>0;i>>=1)
{
Pin_SW_I2CClk=0;
if(outbyte&i)
Pin_SW_I2CData=1;
else
Pin_SW_I2CData=0;
M_WAIT;
/*if(i==0x80)
{
PD_SW_I2CClk=0;
for(j=0;((j<1) && (!Pin_SW_I2CClk));j++);
PD_SW_I2CClk=1;
}*/
Pin_SW_I2CClk=1;
}
#else
Pin_SW2_I2CClk=0;
Pin_SW2_I2CData=temp.field.B7;
PD_SW2_I2CClk=0;
Pin_SW2_I2CClk=1;
while(!Pin_SW2_I2CClk);
PD_SW2_I2CClk=1;
Pin_SW2_I2CClk=1;
asm nop
Pin_SW2_I2CClk=0;
Pin_SW2_I2CData=temp.field.B6;
Pin_SW2_I2CClk=1;
asm nop
Pin_SW2_I2CClk=0;
Pin_SW2_I2CData=temp.field.B5;
Pin_SW2_I2CClk=1;
asm nop
Pin_SW2_I2CClk=0;
Pin_SW2_I2CData=temp.field.B4;
Pin_SW2_I2CClk=1;
asm nop
Pin_SW2_I2CClk=0;
Pin_SW2_I2CData=temp.field.B3;
Pin_SW2_I2CClk=1;
asm nop
Pin_SW2_I2CClk=0;
Pin_SW2_I2CData=temp.field.B2;
Pin_SW2_I2CClk=1;
asm nop
Pin_SW2_I2CClk=0;
Pin_SW2_I2CData=temp.field.B1;
Pin_SW2_I2CClk=1;
asm nop
Pin_SW2_I2CClk=0;
Pin_SW2_I2CData=temp.field.B0;
Pin_SW2_I2CClk=1;
asm nop
#endif
Pin_SW2_I2CClk=0;
PD_SW2_I2CData=0;
//M_WAIT;
Pin_SW2_I2CClk=1;
//M_WAIT;
if(Pin_SW2_I2CData)
i=0;
else
i=1;
Pin_SW2_I2CClk=0;
M_WAIT;
return(i);
}
/*********************************************
Function: I2C2In8Bit
Description:
Write/Modify: Perry.Liang
Time: 2006-8-4- 10:01:02
*********************************************/
unsigned char I2C2In8Bit(void)
{
unsigned char i,inbyte=0;
PD_SW2_I2CClk=0;
Pin_SW2_I2CClk=1;
while(!Pin_SW2_I2CClk);
//for(i=0;(i<20)&&(!Pin_SW2_I2CClk);i++)Wait10us(1);
//while(i==20);
PD_SW2_I2CClk=1;
PD_SW2_I2CData=0;
for(i=0x80;i>0;i>>=1)
{
Pin_SW2_I2CClk=1;
//M_WAIT;
if(Pin_SW2_I2CData)
inbyte|=i;
Pin_SW2_I2CClk=0;
}
return (inbyte);
}
/*********************************************
Function: I2C2Ack
Description:
Write/Modify: Perry.Liang
Time: 2006-8-4- 10:01:00
*********************************************/
void I2C2Ack(void)
{
PD_SW2_I2CClk=1;
PD_SW2_I2CData=1;
Pin_SW2_I2CData=0;
M_WAIT;
Pin_SW2_I2CClk=1;
M_WAIT;
Pin_SW2_I2CClk=0;
PD_SW2_I2CData=0;
M_WAIT;
}
/*********************************************
Function: I2C2NAck
Description:
Write/Modify: Perry.Liang
Time: 2006-8-4- 10:00:56
*********************************************/
void I2C2NAck(void)
{
PD_SW2_I2CClk=1;
PD_SW2_I2CData=1;
Pin_SW2_I2CData=1;
M_WAIT;
Pin_SW2_I2CClk=1;
M_WAIT;
Pin_SW2_I2CClk=0;
PD_SW2_I2CData=0;
M_WAIT;
}
/*********************************************
Function: EepromRead
Description:
Write/Modify: Perry.Liang
Time: 2004-11-11- 11:21:29
*********************************************/
void EepromRead(unsigned char address,unsigned char begin,unsigned char length,unsigned char *p)
{
I2CStart();
I2COut8Bit(address);
I2COut8Bit(begin);
I2CStart();
I2COut8Bit(address+1);
for(;length>0;length--,p++)
{
*p=I2CIn8Bit();
if(length==1)
I2CNAck();
else
I2CAck();
}
I2CStop();
}
/*********************************************
Function: EepromWrite
Description:
Write/Modify: Perry.Liang
Time: 2005-1-21- 17:47:44
*********************************************/
void EepromWrite(unsigned char address,unsigned char begin,unsigned char length,unsigned char *p)
{
I2CStart();
I2COut8Bit(address);
I2COut8Bit(begin);
for(;length>0;length--,p++)
I2COut8Bit(*p);
I2CStop();
}
/*********************************************
Function:MaxMinChangeProtect
Description:
Write/Modify: Perry.Liang
Time: 2006-1-24- 15:40:58
*********************************************/
unsigned char MaxMinChangeProtect(unsigned char Num,signed char ChangeVal,unsigned char MaxVal,unsigned char MinVal,unsigned char ProtectState)
{
signed char TestVal;
TestVal=Num+ChangeVal;
if(TestVal>=(signed char)MinVal && TestVal<=(signed char)MaxVal)
Num+=ChangeVal;
else if (TestVal<(signed char)MinVal )
{
if(ProtectState==0)
Num=MaxVal;
else
Num=MinVal;
}
else
{
if(ProtectState==0)
Num=MinVal;
else
Num=MaxVal;
}
return(Num);
}
void CopyString(unsigned char *p, unsigned char *src)
{
while(*src>0)
*p++=*src++;
}
void CopyString2(unsigned char *p, unsigned char *src)
{
while(*src>0)
*p++=*src++;
*p=0;
}
/*********************************************
Function: GetADValue
Description:
Write/Modify: Perry.Liang
Time: 2006-1-24- 15:40:56
*********************************************/
unsigned char GetADValue(unsigned char input)
{
ADCCSR= (input & 0x0F)|0x20;
while ((ADCCSR&0x80)==0);
return(ADCDRH);
}
/*********************************************
Function: Wait10us
Description:
Write/Modify: Perry.Liang
Time: 2006-1-24- 15:40:55
*********************************************/
void Wait10us(unsigned char time)
{
unsigned char i;
for(;time>0;time--)
{
for(i=3;i>0;i--);
}
}
/*********************************************
Function: Wait1ms
Description:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -