📄 dds06aak20090114.c
字号:
/*========================================================================
功能描述:EEPROM 开始
========================================================================*/
void Eepr_Start(void)
{
Set_OutPut_P_EeprSda;
delay10;
P_EeprSda_High;
delay10;
P_EeprScl_High;
delay10;
P_EeprSda_Low;
delay10;
P_EeprScl_Low;
delay10;
}
/*========================================================================
功能描述:EEPROM停止
========================================================================*/
void Eepr_Stop(void)
{
Set_OutPut_P_EeprSda;
delay5;
P_EeprSda_Low;
delay10;
P_EeprScl_High;
delay10;
P_EeprSda_High;
delay5;
}
/*========================================================================
功能描述:EEPROM写应答
========================================================================*/
void Eepr_AckWr(void)
{
Set_InPut_P_EeprSda;
delay5;
P_EeprScl_High;
delay10;delay10;delay10;
delay10;delay10;delay10;
P_EeprScl_Low;
delay5;
}
/*======================================================================
功能描述:EEPROM读应答
========================================================================*/
void Eepr_AckRd(void)
{
Set_OutPut_P_EeprSda;
delay5;
P_EeprSda_Low;
delay5;
P_EeprScl_High;
delay10;
P_EeprScl_Low;
delay5;
Set_InPut_P_EeprSda;
delay5;
}
/*========================================================================
功能描述:EEPROM不应答
========================================================================*/
void Eepr_NoAck(void)
{
Set_OutPut_P_EeprSda;
delay5;
P_EeprSda_High;
delay5;
P_EeprScl_High;
delay10;
P_EeprScl_Low;
delay5;
}
/*========================================================================
功能描述:从EEPROM读一个字节
========================================================================*/
uchar Eepr_Rd1Byte(void)
{
union Un_char LUB_data;
uchar i;
Set_InPut_P_EeprSda;
LUB_data.byte=0;
for(i=0;i<8;i++)
{
P_EeprSda_High;/*pay attention here this */
P_EeprScl_High;
delay10;
LUB_data.bt.b0=P_EeprSda;
P_EeprScl_Low;
if(i==7)
{
P_EeprSda_Low;
return LUB_data.byte;
}
LUB_data.byte<<=1;
delay5;
}
return LUB_data.byte;
}
/*========================================================================
功能描述:写一个字节到EEPROM
========================================================================*/
void Eepr_Wr1Byte(uchar PB_data)
{
uchar i;
union Un_char LUB_data;
delay10;
Set_OutPut_P_EeprSda;
LUB_data.byte=PB_data;
for(i=0;i!=8;i++)
{
P_EeprSda=LUB_data.bt.b7;
delay5;
P_EeprScl_High;
LUB_data.byte<<=1;
delay5;
P_EeprScl_Low;
delay5;
}
P_EeprSda_Low;
Eepr_AckWr();
}
/*========================================================================
功能描述:将长度为N的RAM数据写入AT24C04BN中
========================================================================*/
void Write_Eeprom(uchar *ram_addr,uchar n,uint eepr_addr)
{
uchar i,j,k;
I2C_SoftReset();
P_EeprWp_Low;
Iic_Check[0]=0;
for(i=0;i<n;i++)
{
Eepr_Start();
k=((eepr_addr+i)>>8)*2;
j=Eepr_Ctrl_Wr|k;
Eepr_Wr1Byte(j);
j=(uchar)(eepr_addr+i);
Eepr_Wr1Byte(j);
nop();
Eepr_Wr1Byte(*(ram_addr+i));
Iic_Check[0]+=*(ram_addr+i);
Eepr_Stop();
Us_delay(250);
// Ms_Delay(1);
Ms_Delay(3);
}
Ms_Delay(3);
P_EeprWp_High;
P_EeprScl_Low;
P_EeprSda_High;
}
/*========================================================================
功能描述:将长度为N的数据从EEPROM读出,放入到单片机RAM中
========================================================================*/
uchar Read_Eeprom(uchar *ram_addr,uchar n,uint eepr_addr)
{
uchar i,j;
I2C_SoftReset();
Eepr_Start();
i=eepr_addr>>8;
j=(Eepr_Ctrl_Wr|(i<<1));
Eepr_Wr1Byte(j);
i=eepr_addr;
Eepr_Wr1Byte(i);
Eepr_Start();
i=eepr_addr>>8;
j=(Eepr_Ctrl_Rd|(i<<1));
Eepr_Wr1Byte(j);
Iic_Check[0]=0;
for(i=0;i<n;i++)
{
*(ram_addr+i)=Eepr_Rd1Byte();
Iic_Check[0]+=*(ram_addr+i);
if(i==(n-1)) Eepr_NoAck();
else Eepr_AckRd();
}
Eepr_Stop();
Us_delay(10);
P_EeprScl_Low;
P_EeprSda_High;
return 0;
}
/*========================================================================
功能描述:将长度为N的数据从EEPROM读出,并计算代码和
========================================================================*/
void Read_Eeprom_Check(uchar n,uint eepr_addr)
{
uchar i,j;
I2C_SoftReset();
Eepr_Start();
i=eepr_addr>>8;
j=(Eepr_Ctrl_Wr|(i<<1));
Eepr_Wr1Byte(j);
i=eepr_addr;
Eepr_Wr1Byte(i);
Eepr_Start();
i=eepr_addr>>8;
j=(Eepr_Ctrl_Rd|(i<<1));
Eepr_Wr1Byte(j);
Iic_Check[1]=0;
for(i=0;i<n;i++)
{
Iic_Check[1]+=Eepr_Rd1Byte();
if(i==(n-1)) Eepr_NoAck();
else Eepr_AckRd();
}
Eepr_Stop();
Us_delay(10);
P_EeprScl_Low;
P_EeprSda_High;
}
/*========================================================================
功能描述:清EEPROM数据
========================================================================*/
void Clear_EeprData(uchar n,uint eepr_addr)
{
uchar j,i,k;
I2C_SoftReset();
P_EeprWp_Low;//写使能
for(i=0;i<n;i++)
{
Eepr_Start();
k=((eepr_addr+i)>>8)*2;
j=Eepr_Ctrl_Wr|k;
Eepr_Wr1Byte(j);
j=(uchar)(eepr_addr+i);
Eepr_Wr1Byte(j);
nop();
Eepr_Wr1Byte(0);
Eepr_Stop();
Us_delay(200);
//Ms_Delay(1);
Ms_Delay(3);
}
Ms_Delay(5);
P_EeprWp_High;
P_EeprScl_Low;
P_EeprSda_High;
}
/*========================================================================
功能描述:读EEPROM数据(整读)
========================================================================*/
void Read_EeprData(uchar *ram_addr,uchar n,uint eepr_addr)
{
Iic_Eer_Timer=0;
do
{
Read_Eeprom(ram_addr,n,eepr_addr);
Read_Eeprom_Check(n,eepr_addr);
if(Iic_Eer_Timer>3)
{
while(1){}
}
if(Iic_Check[1]-Iic_Check[0]) Iic_Eer_Timer++;
}
while(Iic_Check[1]-Iic_Check[0]);
}
/*========================================================================
功能描述:写EEPROM数据(整写)
========================================================================*/
void Write_EeprData(uchar *ram_addr,uchar n,uint eepr_addr)
{
Iic_Eer_Timer=0;
do
{
Write_Eeprom(ram_addr,n,eepr_addr);
Read_Eeprom_Check(n,eepr_addr);
if(Iic_Eer_Timer>3)
{
while(1){}
}
if(Iic_Check[1]-Iic_Check[0]) Iic_Eer_Timer++;
}
while(Iic_Check[1]-Iic_Check[0]);
}
/*========================================================================
功能描述:EEPROM软件复位
========================================================================*/
void I2C_SoftReset(void)
{
unsigned char i;
P_EeprWp_Low;
delay5;
P_EeprSda = 1;
P_EeprScl = 1;
delay5;
for(i=0;i<9;i++)
{
P_EeprScl = 0;
delay5;
P_EeprScl = 1;
delay5;
if(P_EeprSda) break;
}
P_EeprSda = 1;
delay5;
P_EeprSda = 0;
delay5;
P_EeprSda = 1;
delay5;
P_EeprWp_High;
}
/*========================================================================
功能描述:数据保存EEP,主存储区写完,隔一段时间后kWh_Save_Bank2有效,再写备份区
========================================================================*/
void Task_Save_Eep(void)
{
uchar i;
if(kWh_Save_Bank1)
{
if(kWh_Save_H)
{
Write_EeprData(kWh_ALL.uc_en,4,kWh_ALL_EeAddr);
}
i=kWh_ALL.uc_en[2]&0x0F;
Write_EeprData(kWh_ALL.uc_en+3,1,kWh_ALL_Dot_EeAddr+2*i);
GS_Data.Temp[0]=kWh_ALL.uc_en[0]+kWh_ALL.uc_en[1]+kWh_ALL.uc_en[2]+kWh_ALL.uc_en[3];
Write_EeprData(GS_Data.Temp,1,kWh_ALL_Dot_EeAddr+2*i+1);
kWh_Save_Bank1 = 0;
kWh_Save_Delay = 10;
}
if(kWh_Save_Bank2)
{
if(kWh_Save_H)
{
Write_EeprData(kWh_ALL.uc_en,4,kWh_ALL_EeAddr1);
kWh_Save_H = 0;
}
i=kWh_ALL.uc_en[2]&0x0F;
Write_EeprData(kWh_ALL.uc_en+3,1,kWh_ALL_Dot_EeAddr1+2*i);
GS_Data.Temp[0]=kWh_ALL.uc_en[0]+kWh_ALL.uc_en[1]+kWh_ALL.uc_en[2]+kWh_ALL.uc_en[3];
Write_EeprData(GS_Data.Temp,1,kWh_ALL_Dot_EeAddr1+2*i+1);
kWh_Save_Bank2 = 0;
}
}
/*========================================================================
功能描述:显示内容初始化,全显
========================================================================*/
void Display_Initialize(void)
{
uchar i;
uchar *pointer;
SEG0 = 0x00;
SEG1 = 0x00;
SEG2 = 0x00;
P0D = 0xFF;
P1D = 0xFF;
P2D = 0xFF;
VLCON = 0x05;
LM = 0x0C3;
LRAM3 = 0x00;
LRAM4 = 0x00;
LRAM5 = 0x00;
LRAM6 = 0x00;
LRAM7 = 0x00;
LRAM8 = 0x00;
LRAM9 = 0x00;
LME=1;
//LRAM3 = 0x7D;//0
//LRAM4 = 0x60;//1
//LRAM5 = 0x3E;//2
//LRAM6 = 0x7A;//3
//LRAM7 = 0x63;//4
//LRAM8 = 0x5B;//5
//LRAM9 = 0x5F;//6
pointer=DispData_Buff;
for(i=0;i<7;i++)
*(pointer+i)=0xFF;
Disp_Transfer();
}
/*========================================================================
功能描述:LCD清屏
========================================================================*/
void Lcd_clr(void)
{
uchar i;
for(i=0;i<7;i++)
DispData_Buff[i]=0x00;
}
/*========================================================================
功能描述:LCD显示一个数字(将一特定字符放到液晶实物上第几个位置显示)
Dis_1char(选定在液晶上第几个位置显示数据 , 要显示的字符)
液晶位排列
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -