📄 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;
#ifdef DEBUG_MODE
Wait1ms(1);
#endif
}
/*********************************************
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;
#ifdef DEBUG_MODE
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;
M_WAIT;
}
#else
Pin_SW_I2CClk=0;
Pin_SW_I2CData=temp.field.B7;
Pin_SW_I2CClk=1;
M_WAIT;
Pin_SW_I2CClk=0;
Pin_SW_I2CData=temp.field.B6;
Pin_SW_I2CClk=1;
M_WAIT;
Pin_SW_I2CClk=0;
Pin_SW_I2CData=temp.field.B5;
Pin_SW_I2CClk=1;
M_WAIT;
Pin_SW_I2CClk=0;
Pin_SW_I2CData=temp.field.B4;
Pin_SW_I2CClk=1;
M_WAIT;
Pin_SW_I2CClk=0;
Pin_SW_I2CData=temp.field.B3;
Pin_SW_I2CClk=1;
M_WAIT;
Pin_SW_I2CClk=0;
Pin_SW_I2CData=temp.field.B2;
Pin_SW_I2CClk=1;
M_WAIT;
Pin_SW_I2CClk=0;
Pin_SW_I2CData=temp.field.B1;
Pin_SW_I2CClk=1;
M_WAIT;
Pin_SW_I2CClk=0;
Pin_SW_I2CData=temp.field.B0;
Pin_SW_I2CClk=1;
M_WAIT;
#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;
M_WAIT;
}
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)
{
unsigned char i;
PD_SW2_I2CClk=0;
Pin_SW2_I2CClk=1;
for(i=0;(i<20)&&(!Pin_SW2_I2CClk);i++)Wait10us(1);
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;
for(i=0;(i<20)&&(!Pin_SW2_I2CClk);i++)Wait10us(1);
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;
for(i=0;(i<20)&&(!Pin_SW2_I2CClk);i++)Wait10us(1);
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)
{
unsigned char i;
ADCCSR= (input & 0x0F)|0x20;
//while ((ADCCSR&0x80)==0);
for(i=0;(i<100)&&((ADCCSR&0x80)==0);i++)Wait10us(1);
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:
Write/Modify: Perry.Liang
Time: 2006-1-24- 15:40:54
*********************************************/
void Wait1ms(unsigned char time)
{
for(;time>0;time--)
{
Wait10us(100);
}
}
/*********************************************
Function: LibInit
Description:
Write/Modify: Perry.Liang
Time: 2006-1-24- 15:40:53
*********************************************/
void LibInit(void)
{
PD_SW_I2CData=1;
PO_SW_I2CData=0;
Pin_SW_I2CData=1;
PD_SW_I2CClk=1;
PO_SW_I2CClk=0;
Pin_SW_I2CClk=1;
PD_SW2_I2CData=1;
PO_SW2_I2CData=0;
Pin_SW2_I2CData=1;
PD_SW2_I2CClk=1;
PO_SW2_I2CClk=0;
Pin_SW2_I2CClk=1;
PD_test=1;
PO_test=1;
Pin_test=1;
}
void LibMain(void)
{
#ifdef DEBUG_MODE
unsigned char i,j;
if(F_HalfSecondOut && DebugTimer==0)
{
switch(DebugLoop)
{
case 0:
DebugLoop=1;
DebugSubMode=1;
for(i=0;i<40;i++)
DebugBuff[i]=Radio.TunerBuff[i];
DebugBuff[40]=Radio.ReadBuff.byte;
DebugBuff[41]=(unsigned char)(Radio.Freq&0x00FF);
DebugBuff[42]=(unsigned char)(Radio.Freq>>8);
DebugBuff[43]=Radio.Smeter;
DebugBuff[44]=Radio.SeekMode;
DebugBuff[45]=Radio.WorkMode;
DebugBuff[46]=Radio.CurrentBand;
if(Radio.F_LocDx)
DebugBuff[47]=1;
else
DebugBuff[47]=0;
for(i=0;i<6;i++)
{
DebugBuff[i*2+48]=(unsigned char)(Radio.Band[0].MemFreq[i]&0x00FF);
DebugBuff[i*2+49]=(unsigned char)(Radio.Band[0].MemFreq[i]>>8);
}
DebugNum=60;
break;
case 1:
DebugLoop=2;
DebugSubMode=2;
for(i=0;i<5;i++)
{
DebugBuff[i*11+0]=(unsigned char)(Radio.Band[0].PI[i]&0x00FF);
DebugBuff[i*11+1]=(unsigned char)(Radio.Band[0].PI[i]>>8);
DebugBuff[i*11+2]=Radio.Band[0].MemAFNum[i];
for(j=0;j<8;j++)
DebugBuff[i*11+j+3]=Radio.Band[0].MemAFList[i][j];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -