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

📄 wre2prom.c

📁 符合645规范的单相485液晶普通电子式电能表
💻 C
字号:
#pragma sfr
#pragma di
#pragma ei

#include"main.h"
#include"WRE2PROM.h"
#include"serialRC.h"
#include"POWER_COUNT.h"
#include"LCD.h"






#define  SDA1   (P2.2=1)
#define  SDA0   (P2.2=0)

#define  SCL1  P2.1=1;_delay(2)
#define  SCL0  P2.1=0;_delay(2)

#define SDAOUT PM2.2=0
#define SDAINT PM2.2=1

#define DATAIN	(P2.2)



/***************************************************************************/
#define    WriteDeviceAddress 0xa0
#define    ReadDviceAddress 0xa1

/***************************************************************************/
void _delay(uchar t)
{
	for(;t>0;t--);
}


void delay10mS(void)
{
	uchar ii;
	for(ii=0;ii<4;ii++)//10mS
	{
		_delay(0xBA);
	}
}

/*--------------------------------------------------------------------------------
  调用方式:void I2CStart(void) ﹫2001/07/0 4
  函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
void I2CStart(void)
{
  SDA1; SCL1; 
  SDA0;
  SCL0;
}

/*--------------------------------------------------------------------------------
  调用方式:void I2CStop(void) ﹫2001/07/0 4
  函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
void I2CStop(void)
{
  SCL0; SDA0;
  SCL1; SDA1; //STOP
}



/*--------------------------------------------------------------------------------
 调用方式:void SendAck(void) ﹫2001/07/0 4
 函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,非应答信号。
---------------------------------------------------------------------------------*/
 void SendNotAck(void)
 {
 SDA1; 
 SCL1; 
 SCL0;
 }


/*--------------------------------------------------------------------------------
 调用方式:void I2CSend(unsigned char ch) ﹫2001/07/0 5
 函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
void I2CSendByte(unsigned char ch)
{
  unsigned char i=8;
  while(i--)
       {
         SCL0;
         if(ch&0x80)
         {
			SDA1;
		 }
		 else
		 {
			SDA0;
		 }
		 ch<<=1; 
         SCL1; 
       }
  SCL0;

  i=255;
  SDAINT;//
  SCL1;
  while(DATAIN && i--);
  SCL0;
  SDAOUT;
}

/*--------------------------------------------------------------------------------
  调用方式:unsigned char I2CReceive(void) ﹫2001/07/0 5
  函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
unsigned char I2CReceiveByte(void)
{
  unsigned char i=8;
  unsigned char dat=0;
  SDAINT;
  SDA1;
  while(i--)
       {
         dat<<=1;
         SCL0;
         SCL1;
		 if(DATAIN)
		 {
        	 dat|=0x01;
		 }
       }
  SCL0;
  SDAOUT;

  return(dat);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void WriteChar(unsigned char add,unsigned char dat)
{

 I2CStart();
 I2CSendByte(0xA0);
 
// I2CSendByte((char)(add>>8));delay32();   //如果使用的芯片是AT24C02、AT24C64、AT24C128、AT24C256的话 那么这句话就不需要屏蔽了
// WaitAck();
 I2CSendByte(add);
 I2CSendByte(dat);
 I2CStop();
 delay10mS();

}

/*-------------------------------------------------------------------------------------*/
/*  从AT24C02的任意地址读入一个字节                                                    */
/*=====================================================================================*/

unsigned char ReadChar(unsigned char add)
{
 unsigned char a;


 I2CStart();
 I2CSendByte(0xA0);
 //I2CSendByte((char)(add>>8));   //如果使用的芯片是AT24C02、AT24C64、AT24C128、AT24C256的话 那么这句话就不需要屏蔽了
 //WaitAck();
 I2CSendByte(add);
 I2CStart();
 I2CSendByte(0xA1);
 a=I2CReceiveByte();
 SendNotAck();
 I2CStop();

 return(a);
}



void ReadString(unsigned char *RamAddress,unsigned char RomAddress,unsigned char Number)
{
	while(Number--)
	{
	*RamAddress++=ReadChar(RomAddress++);
	}

}


void WriteString(unsigned char  *RamAddress,unsigned char RomAddress,unsigned char Number)
{
	while(Number--)
	{
		WriteChar(RomAddress++,*RamAddress++);
	}
}

void  Read_Degree(uchar item_NO,unsigned char   *RamAddress)
{

       item_NO%=AMOUNT_OF_DEGREE;
	ReadString(&RamAddress[1],ADDR_OF_DEGREE_INTEGER_START + item_NO*LEN_OF_DEGREE_INTEGER ,3);
	ReadString( &RamAddress[0] ,ADDR_OF_DEGREE_DECIMAL_START+item_NO*LEN_OF_DEGREE_DECIMA
		            					+ (bcd_to_hex(RamAddress[1])%100) ,1);
}



void Write_Degree(uchar item_NO ,unsigned char  *RamAddress)
{
       item_NO%=AMOUNT_OF_DEGREE;
	WriteString(&RamAddress[1],ADDR_OF_DEGREE_INTEGER_START + item_NO*LEN_OF_DEGREE_INTEGER ,3);
	WriteChar(ADDR_OF_DEGREE_DECIMAL_START+item_NO*LEN_OF_DEGREE_DECIMA
		            + (bcd_to_hex(RamAddress[1])%100) ,RamAddress[0]);
}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -