⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dds06aak20090114.c

📁 瑞萨R5G0C514使用
💻 C
📖 第 1 页 / 共 2 页
字号:
/*========================================================================

功能描述: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 + -