📄 tools.c
字号:
/*========================================*/
/*系统名称:DDSF-CECG-JiangSu */
/*函数名称:辅助程序 */
/*程序编写:步爱军 */
/*开始日期:2005-01-01 */
/*完成日期: */
/*修改记录: */
/*软件版本:DDSF-CECG-002 */
/*版本说明:用户数据保存在外部 */
/*外部器件:LM75、AT24C02、HT1621、LPC932 */
/* R8025、ADE7755 */
/*========================================*/
#include <REG932.h>
#include <Define.h>
#include <Stdio.h>
#include <Intrins.h>
///-----***-短延时-***-----//
void Delay(unsigned int count) reentrant
{
unsigned int data i;
unsigned char data j;
for(i=0; i<count; i++)
{
for(j=0; j<5; j++)
{
;
}
}
}
///-----***-IIC-***-----///
unsigned char FgTimeout;
unsigned char IicByteRead(unsigned char device,unsigned char address) //读取指定器件指定地址中的数据
{
unsigned char data bytedata; //定义一个变量bytedata,用来存放数据
IicStart(); //开始传送起始信号
IicSentByte(device); //传送一字节(slave)地址
IicSentByte(address); //传送一字节(address)地址
IicStart(); //开始传送起始信号
IicSentByte(device|0x01); //传送读取信号
bytedata=IicReceiveByte(); //从slave端读取一个数据并存入变量bytedata
SendAcknowledge(1); //Master端送出确认的信号等于1
IicStop(); //传送停止信号
return bytedata; //返回读出值bytedata给原调用程序
}
void IicMuchByteRead(unsigned char Device,unsigned char Address,unsigned char DataLend) //读取指定器件指定地址中的数据
{
unsigned char i; //定义一个变量bytedata,用来存放数据
IicStart(); //开始传送起始信号
IicSentByte(Device); //传送一字节(slave)地址
IicSentByte(Address); //传送一字节(address)地址
IicStart(); //开始传送起始信号
IicSentByte(Device|0x01); //传送读取信号
for(i=0;i<DataLend-1;i++)
{
IIcBuf[i]=IicReceiveByte();
SendAcknowledge(0);
} //从slave端读取一个数据并存入变量bytedata //Master端送出确认的信号等于1
IIcBuf[i]=IicReceiveByte();
SendAcknowledge(1);
IicStop(); //传送停止信号
}
void IicByteWrite(unsigned char device,unsigned char address,unsigned char bytedata)//写数据到指定地址
{ //
unsigned char i; //
bit ack; //
FgTimeout=1;
IicWP=0; //
for(i=0;i<10;i++) //
{ //
IicStart(); //
ack=IicSentByte(device); //
if(ack==1) //
{ //
IicStop(); //
continue; //
} //
ack=IicSentByte(address); //
if(ack==1) //
{ //
IicStop(); //
continue; //
} //
ack=IicSentByte(bytedata); //
if(ack==1) //
{ //
IicStop(); //
continue; //
} //
IicStop(); //
FgTimeout=0; //
if(ack==0) //
break; //
} //
Delay(200); //
IicWP=1;
}
//
unsigned char IicReceiveByte(void) //从slave端读取一个数据*/
{
unsigned char i; //*定义变量 i 和变量 bytedata */
unsigned char bytedata=0;
IicSDA=1;
for(i=0;i<8;i++) //由于读的时一个字节的数据所以要循环8次*/
{
IicSCL=1; //先将SCL设定为1,并等待一定的时间*/
IicWait();
bytedata<<=1; //先将数据变量bytedata左移1位---*/
if (IicSDA) bytedata |=0x01; //此时如果SDA=“1”则将接受到的数据加(bit0=1)1---*/
//否则自动清楚为0*/
IicSCL=0; //SCL恢复为0,并等待一定的时间*/
IicWait();
}
return bytedata; //*返回调用程序*/
}
bit IicSentByte(unsigned char bytedata) //传送一个 Byte 数据到 slave */
{
unsigned char i; //定义一个变量 i */
bit ack; //定义一个变量 ack */
for(i=0;i<8;i++) //循环8次*/
{
if(bytedata & 0x80)
{ //bytedata和0x80作AND逻辑运算等于0x80---*/
IicSDA=1;
//即表示位7等于1则条件成立---*/
}
else
{
IicSDA=0;
//所以设定SDA=1,否则清除SDA=0*/
}
bytedata <<=1; //每传送1位,则须将待传送的数据左移1位,以便继续测试下1位*/
IicWait(); //延时等候*/
IicSCL=1;
//SCL置位*/
IicWait(); //延时等候*/
IicSCL=0;
//SCL清零*/
IicWait(); //延时等候---SCL作“1”---“0”的变化*/
}
IicSDA=1; //SDA置位*/
IicWait(); //延时等候*/
IicSCL=1; //SCL置位*/
IicWait(); //延时等候---SDA先设定为1,SCL也设定为1,等待确认信号的出现*/
ack=IicSDA; //读取确认信号*/
IicSCL=0;
//将SCL恢复为0电平*/
IicWait(); //延时等候*/
return ack; //返回确认信号到原调用程序*/
}
void IicStart(void) //起始信号*/
{
IicSDA=1; //数据线等于1*/
IicSCL=1; //时钟线等于1*/
IicWait(); //延时等候*/
IicSDA=0; //数据线等于0*/
IicWait(); //延时等候*/
IicSCL=0; //时钟线等于0*/
}
void IicStop(void) //停止信号*/
{
IicSDA=0; //数据线清零*/
IicWait(); //延时等候*/
IicSCL=1; //时钟线置位*/
IicWait(); //延时等候*/
IicSDA=1; //数据线置位*/
}
void IicWait(void) //等候
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void SendAcknowledge(bit ack) //应答信号*/
{
IicSDA=ack; //发送应答信号ack*/
//IicWait();
IicSCL=1; //SCL作“1”到“0”的变化*/
IicWait();
IicSCL=0;
//IicWait();
}
//-----***-1621-***-----//
void LcdStart(void)
{
LcdCs=0;
Delay(LcdDelay);
}
void LcdStop(void)
{
LcdCs=1;
Delay(LcdDelay);
}
void LcdSendId(unsigned char ID)
{
unsigned char data i;
for(i=3;i>0;i--)
{
LcdWr=0;
Delay(LcdDelay);
if((ID&0x80)==0x80)
{
LcdData=1;
}
else
{
LcdData=0;
}
LcdWr=1;
Delay(LcdDelay);
ID=ID<<1;
}
}
void LcdSendAddress(unsigned char Address)
{
unsigned char data i;
for(i=6;i>0;i--)
{
LcdWr=0;
Delay(LcdDelay);
if((Address&0x80)==0x80)
{
LcdData=1;
}
else
{
LcdData=0;;
}
LcdWr=1;
Delay(LcdDelay);
Address=Address<<1;
}
}
void LcdSendByte(unsigned char Data)
{
unsigned char data i,k;
for(i=2;i>0;i--)
{
for(k=4;k>0;k--)
{
LcdWr=0;
Delay(LcdDelay);
if((Data&0x80)==0x80)
{
LcdData=1;
}
else
{
LcdData=0;
}
LcdWr=1;
Delay(LcdDelay);
Data=Data<<1;
}
}
}
void LcdSendCommand(unsigned char Command)
{
unsigned char data i;
LcdStart();
LcdSendId(0x80);
for(i=0;i<9;i++)
{
LcdWr=0;
Delay(LcdDelay);
if((Command&0x80)==0x80)
{
LcdData=1;
}
else
{
LcdData=0;
}
LcdWr=1;
Delay(LcdDelay);
Command=Command<<1;
}
LcdStop();
}
//-----***-16近制数据转化为BCD-***-----//
unsigned char HexToBcd(unsigned char Bytedata)
{
unsigned char ii,Byte; /*定义减数i,被减数j,相减蚀锡k,余数h*/
ii=0;
while(Bytedata>=0x0a)
{
Bytedata=Bytedata-0x0a;
ii=ii+1;
}
Byte=16*ii+Bytedata;
return Byte;
}
//-----***-BCD数据转化为16近制-***-----//
unsigned char BcdToHex(unsigned char Bytedata)
{
unsigned char i,j,Byte; /*定义减数i,被减数j,相减蚀锡k,余数h*/
i=Bytedata & 0xf0;
j=Bytedata & 0x0f;
Byte=10*(i>>4)+j;
return Byte;
}
//-----***-通过485发送一个字节-***-----//
void SeriesSentByte(unsigned char Byte)
{
unsigned char idata i,j,k;
k=Byte;
DIR=0; /*创建一个停止位*/
for(i=0;i<8;i++)
{
if(k & 0x80)
{ //bytedata和0x80作AND逻辑运算等于0x80---*/
j++;
if(j==2)
{
j=0;
} //即表示位7等于1则条件成立---*/
}
k <<=1;
} //禁止串口中断*/
if(j==0)
{
TB8=0;
}
else
{
TB8=1;
}
SBUF=Byte; /*发送数据*/
while(TI!=1); /*等待发送完毕*/
TI=0; /*发送中断标志清零*/
DIR=1;
}
void ToDay(unsigned char Day)
{
unsigned char data i;
for(i=0x1f;i<Day;i++)
{
if(IIcByteStar==0)
{
IIcByteStar=0xc0;
}
IIcByteStar=IIcByteStar-16;
}
}
void ClerBuf(void)
{
unsigned char data i;
//清除接收缓存
TimeSendFg=0;
for(i=0;i<60;i++)
{
ComDataBuf[i]=0;
}
}
void ClerData(void)
{
unsigned char i,j;
//清除IIC
EA=0;
for(i=0;i<255;i++)
{
IicByteWrite(0xa0,i,0x00); //
}
//编程初始密码:123456
j=0x56;
for(i=0;i<3;i++)
{
IicByteWrite(0xa0,0x4c+i,j);
j=j-0x22;
}
//清零初始密码:123456
j=0x56;
for(i=0;i<3;i++)
{
IicByteWrite(0xa0,0x50+i,j);
j=j-0x22;
}
//默认时段08:00---21:00峰段21:00---08:00谷段(分-时)
IicByteWrite(0xa0,0x80,0x02);
IicByteWrite(0xa0,0x82,0x08);
IicByteWrite(0xa0,0x83,0x04);
IicByteWrite(0xa0,0x85,0x21);
//时段数目默认值:2
IicByteWrite(0xa0,0xa5,2);
//液晶显示时间设置默认值:10s
IicByteWrite(0xa0,0x62,10);
//清零次数2
IicByteWrite(0xa0,0x6a,0x02);
EA=1;
}
//-----***-数据提取-***-----//
void DataPickup(void)
{
unsigned char idata i,j;
EA=0;
j=0x00;
for(i=0;i<4;i++)
{
SumPulseData[i]=IicByteRead(0xa0,j);
FengPulseData[i]=IicByteRead(0xa0,j+4);
PingPulseData[i]=IicByteRead(0xa0,j+8);
GuPulseData[i]=IicByteRead(0xa0,j+12);
j++;
}
IicMuchByteRead(0xa0,0x34,3);
for(i=0;i<3;i++)
{
ReverseTime[i]=IIcBuf[i];
}
LcdShowTime=IicByteRead(0xa0,0x62);
LcdShowBit[1]=IicByteRead(0xa0,0x63);
LcdShowBit[0]=IicByteRead(0xa0,0x64);
MataStData=IicByteRead(0xa0,0x65);
PulseData=IicByteRead(0xa0,0x70);
EA=1;
}
//-----***-数据保存-***-----//
void DataSave(void)
{
EA=0;
EA=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -