📄 function.c
字号:
{
Tmp_Data[num]=ScanIic();
SendACK();
}
Tmp_Data[num]=ScanIic();
SendNotACK();
EndIic;
}
UCHAR Read_I2c_byte(UCHAR AddressH,UCHAR AddressL)
{
UCHAR num;
StartIic;
Write_8bit(Iic_Write);
Write_8bit(AddressH);
Write_8bit(AddressL); //write address to i2c;
StartIic;
Write_8bit(Iic_Read);
num=ScanIic();
SendNotACK();
EndIic;
return num;
}
void Write_I2c_Page(UCHAR * Tmp_Data, UCHAR num_array)
{
UCHAR num;
StartIic;
Write_8bit(Iic_Write);
Write_8bit(AddressH);
Write_8bit(AddressL);
for(num=0;num<num_array;num++)
{
Write_8bit(Tmp_Data[num]);
}
EndIic;
num=0;
while(num<250){Wait_Nop;Wait_Nop;num++;}
}
void Write_I2c_byte(UCHAR AddressH,UCHAR AddressL,UCHAR data_to_write)
{
UCHAR num;
StartIic;
Write_8bit(Iic_Write);
Write_8bit(AddressH);
Write_8bit(AddressL);
Write_8bit(data_to_write);
EndIic;
num=0;
while(num<250){Wait_Nop;Wait_Nop;num++;}
}
bit Write_8bit(UCHAR ch)
{
UCHAR i;
for(i=0;i<8;i++)
{
SDA=(bit)(ch&0x80);
ch<<=1;
SCL=1;
Wait_Nop;
SCL=0;
Wait_Nop;
}
return(CheckACK());
}
UCHAR ScanIic(void)
{
UCHAR i,j;/*IIC data*/
SDA=1;
j=0;
for(i=0;i<8;i++)
{
SCL=1;
j<<=1;/*这个指令已经有15个周期,所以无须再延时*/
j|=SDA;/*Scan 0*/ /*Scan 1*/
SCL=0;
}
return j;
}
bit CheckACK(void)
{
SDA=1;
SCL=1;
Wait_Nop;
if(SDA==1)return SDA;
if(SDA==1)return SDA;
if(SDA==1)return SDA;
SCL=0;
}
void SendACK(void)
{
SDA=0;
SCL=1;
Wait_Nop;
SCL=0;
SDA=1;
}
void SendNotACK(void)
{
SDA=1;
SCL=1;
Wait_Nop;
SCL=0;
SDA=0;
}
void SetInit()
{
SCON = 0xf0;
TR1 = 1;
RI = 0;
TI = 0;
EA = 1;
}
void Prepare()
{
UCHAR tmp,highByte,lowByte;
Write_Display(welString);//welString[32] = "SEARCHING CELLS PLEASE WAIT... ";
Delay5s();
QueryCell();
tmp = cellInfo.length; //acquire the number of cells
cellInfo.point = (cellInfo.length == 0)?0:(cellInfo.length-1); //point to the last cell
LCDClr();
LCDString(0,allNumber,16); //allNumber[16] = "ALL : CELLS ";
highByte = (tmp/10) + 0x30;//change hex to ascii
lowByte = (tmp%10) + 0x30;
LCDChar(6,highByte);
LCDChar(7,lowByte);
tmp = cellInfo.cellStack[cellInfo.point];
highByte = (tmp/10 + 0x30);
lowByte = (tmp%10 + 0x30);
LCDChar(16,highByte); //最大基站号
LCDChar(17,lowByte);
Delay5s();
}
void QueryCell() //query the cells and return the number of cells
{
UCHAR currentCell,highByte,lowByte,i,j;
UCHAR AddressL=1;
UCHAR AddressH=0;
bit rightFlag;
p = &QUERY;
for(currentCell=1; currentCell<=CELLMAXNUM; currentCell++)//CELLMAXNUM 可以修改CELL组数
{
highByte = (currentCell/10) + 0x30;
lowByte = (currentCell%10) + 0x30;
LCDChar(30,highByte);
LCDChar(31,lowByte); //display the querying cell
for(i = 0;i<8;i++)
UIData[i]=0;
for(j=0;j<3;j++)
{
TB8 = 1; //sign address flag
SBUF = currentCell; //send cell address
while(!sendFlag);
sendFlag = 0;
SEND_RECEIVE = 0; //receive status
TR0 = 1; //open the timer0,avoid no response
while(!receiveFlag && !responseFlag);
SEND_RECEIVE = 1; //send status
if(receiveFlag)
{
if((UIData[0]==0xaa)&&(UIData[1]==0xaa)&&(UIData[2]==0xaa)&&(UIData[3]==0xaa)&&(UIData[4]==0xaa)&&(UIData[5]==0xaa))
{
rightFlag = 1;
Write_I2c_byte(0,AddressL,currentCell);//save the cell number;total 15cells can be stored;
AddressL++;
}
else
rightFlag = 0;
}
else
rightFlag = 0;
receiveFlag = 0;
responseFlag = 0;
if(rightFlag)
{
cellInfo.cellStack[cellInfo.length++] = currentCell;
rightFlag = 0;
break;
}
}
}
}
void GatherDis()
{
LCDClr();
Write_Display(gatherProcess); //gatherProcess[32] = "CELLGATHERING PLEASE WAIT...";
}
void SendGather()
{
UCHAR i;
/*
for(i = 0;i<16;i++)
Delay5s();
*/
p = &GATHER;
TB8 = 1; //sign address flag
SBUF = COMMON; //send common address
while(!sendFlag);
sendFlag = 0;
for(i = 0;i < 250;i ++)
Delay(255);
}
void TransferDis()
{
LCDClr();
Write_Display(dataGetProcess); //dataGetProcess[32] = "DATA TRANSFERINGPLEASE WAIT...";
Delay5s();
}
void TransferIng()
{
UCHAR cellPoint,highByte,lowByte,datatmp,i;
receiveFlag = 0;
responseFlag = 0;
//在0x00地址保存接收数据组数
if(cellInfo.length == 0) //得到最大基站号
{
cellPoint = 0;
Write_Display(Nocell);
Delay5s();
}
else
{
cellPoint = cellInfo.length-1;
}
AddressL= 0;
AddressH= 0;
Write_I2c_Page(&groupCurrent, 1);//保存当前组数
AddressL = (groupCurrent-1)*2+0x10;
Write_I2c_Page(&cellInfo.length, 1);
AddressL ++;
Write_I2c_Page(&cellInfo.cellStack[cellPoint], 1);
p = &TRANSFER;
for(cellPoint = 0; cellPoint < cellInfo.length ; cellPoint ++)
{
for(i = 0;i<8;i++)
UIData[i]=0;
/*
for(i = 0;i<2;i++)
Delay5s();
*/
// Delay5s();
// Delay5s();
// Delay5s();
TB8 = 1; //sign address flag
datatmp = cellInfo.cellStack[cellPoint]; //cell address
SBUF = datatmp; //send cell address
while(!sendFlag);
sendFlag = 0;
SEND_RECEIVE = 0; //receive status
TR0 = 1; //open the timer0,avoid no response
while(!receiveFlag && !responseFlag);
SEND_RECEIVE = 1; //send status
LCDClr();
LCDString(0,allNumber,16); //allNumber[16] = "ALL : CELLS ";
highByte = (cellInfo.length/10) + 0x30;
lowByte = (cellInfo.length%10) + 0x30;
LCDChar(6,highByte);
LCDChar(7,lowByte);
if(receiveFlag)
{
highByte = (datatmp/10) + 0x30;
lowByte = (datatmp%10) + 0x30;
LCDChar(16,highByte);
LCDChar(17,lowByte); //display the current cell number
/*
//以下代码根据采集数据判断基站电池状态,并显示
if((UIData[2]&0x30)!=0)
{
SOUND = 1;
}
else
{
SOUND = 0;
}
*/
/* change the gain according to the cell number
switch(cellPoint)
{
case 3:
{GAINU=1.0;
break;}
case 5:
{GAINU=1.0;
break;}
case 7:
{GAINU=1.0;
break;}
case 0x0b:
{GAINU=1.0;
break;}
case 0x0d:
{GAINU=1.0;
break;}
default:
{GAINU=0.6575;
break;}
}
*/
showFloat(cellPoint); //显示当前测量结果
Delay5s(); //延时,方便记录
Delay5s();
Delay5s();
Delay5s();
SaveCellDataToEEPROM(groupCurrent,cellInfo.cellStack[cellPoint]);//保存数据
Save_Display(); //????????
showFloat(cellPoint); //显示当前测量结果
}
//else
// cellPoint -- ;
receiveFlag = 0;
responseFlag = 0;
}
}
void Save_Display() //???????????????
{
UCHAR highByte,lowByte,i;
//save to the eeprom;
for(i = 0;i < 8;i ++)
{
highByte = (UIData[i]/16) + 0x30;
lowByte = (UIData[i]%16) + 0x30;
if(highByte>'9')
highByte = highByte - ':' + 'a';
if(lowByte>'9')
lowByte = lowByte - ':' + 'a';
LCDChar(2*i+20,highByte);
LCDChar(2*i+21,lowByte);
}
}
void SaveCellDataToEEPROM(UCHAR group,UCHAR currentCell)
{
//UIData
UINT EEPaddr; //e2prom里的实际地址
EEPaddr = (group-1)*160+0xA0 + (currentCell-1)*8; //计算改组内基站数据地址
AddressL= (UCHAR)(EEPaddr&0x00ff);
AddressH= (UCHAR)(EEPaddr>>8);
Write_I2c_Page(UIData,8);
}
void Write_I2c_Page0(void)
{
UCHAR num;
UCHAR temp;
UCHAR num1;
UCHAR num2=0;
UCHAR ADDRH;
UCHAR ADDRL;
UINT addr;
for(num1=0;num1<64;num++)
{
addr=num1*num2;
ADDRL= (UCHAR)(addr&0x00ff);
ADDRH= (UCHAR)(addr>>8);
StartIic;
Write_8bit(Iic_Write);
Write_8bit(ADDRH);
Write_8bit(ADDRL);
for(num=0;num<128;num++)
{
Write_8bit(0xff);
}
EndIic;
num=0;
while(num<250){Wait_Nop;Wait_Nop;num++;}
temp = (addr%10) + 0x30;
LCDChar(31,temp);
addr /= 10;
temp = (addr%10) + 0x30;
LCDChar(30,temp);
addr /= 10;
temp = (addr%10) + 0x30;
LCDChar(29,temp);
addr /= 10;
temp = (addr%10) + 0x30;
LCDChar(28,temp);
num2+=128;
}
}
void Query_I2c_Page(void)
{
UCHAR num;
UCHAR pos;
UCHAR temp;
UCHAR GROUPP;
UCHAR totalnum;
NUM_GROUG_DISPLAY();//TOTAL CELLS GROUP DATA ;
totalnum=Read_I2c_byte(0,0x10);//HEX
temp = (totalnum%10) + 0x30;
LCDChar(6,temp);
totalnum /= 10;
temp = (totalnum%10) + 0x30;
LCDChar(7,temp);
GROUPP=Read_I2c_byte(0,0);//HEX
temp = (GROUPP%10) + 0x30;
LCDChar(12,temp);
GROUPP /= 10;
temp = (GROUPP%10) + 0x30;
LCDChar(13,temp);
Delay5s();
Delay5s();
EEPnum_Display();
for (num=1;num<=totalnum;num++)
{
pos=16+3*(num-1);
if(pos>30)
pos=pos-15;
GROUPP=Read_I2c_byte(0,num);
temp = (GROUPP%10) + 0x30;
LCDChar(pos,temp);
GROUPP /= 10;
temp = (GROUPP%10) + 0x30;
LCDChar(pos+1,temp);
Delay5s();
}
EEPQ_Display();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -