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

📄 24c02.c

📁 这是一称的项目原文件,包括T9汉字输入,打印机,24C512,已经引用到产品上
💻 C
字号:
#include  <intrins.h>
#include  <24C02.h>
#include  <lcd128x64.h>
#include <keyboard451.h>
#include <print.h>
#include <set.h>

#define MAX_SAVE_NUM  255

//DataBuff为读写数据输入/输出缓冲区的首址
//ByteQuantity 为要读写数据的字节数量
//Address 为EEPROM的片内地址
//函数返回值为一个位变量,若返回1表示此次操作失效,0表示操作成功;
//24C256的存储空间分为512页,每页64字节。总共32K字节//



/**********************************hl******************************************/
//往24c256中写数据 
//Databuf中存的是写入的数据,Bytelen为每个记录含的字节数	 adr为写数据的地址
//写数成功返回“0”,不成功返回“1”
/****************************************************************************/
char cc256W(BYTE *Databuf,BYTE Bytelen,WORD adr)
{
 BYTE len1=0,len2=0,len3=0,len4=0;
 BOOL repeat_f1=0,repeat_f2=0,repeat_f3=0;
 char status;
 len1=0x40-adr%0x40;
 if (len1>=Bytelen) status=c256W(Databuf,Bytelen,adr);
 else {
   
        status=c256W(Databuf,len1,adr);
          
        Delay1(1000); 
        Delay1(100);

       
        if ((status==0)&&((len2=Bytelen-len1)>0x40)) { len2=0x40;repeat_f1=1;}
        status=c256W(Databuf+len1,len2,adr+len1);
         
        Delay1(1000); 
        Delay1(100); 
        if((status==0)&&(repeat_f1))
        {
          if ((len3=(Bytelen-len1-len2))>0x40) {len3=0x40; repeat_f2=1;}
         
         status=c256W(Databuf+len1+len2,len3,adr+len1+len2);
        Delay1(1000);   
        Delay1(100); 
         
        if((status==0)&&(repeat_f2))
          {
           len4=(Bytelen-len1-len2-len3); 
           status=c256W(Databuf+len1+len2+len3,len4,adr+len1+len2+len3);
          }
        }
      }
return(status);
}
/****************************************hl***********************************************/
/*向24c256写数据 DataBuff为要写数据的首地址  ByteQuantity为要写数据的长度  Address为要存的地址*/
/*当写数据成功返回“0”,不成功返回“1”*/
/***************************************************************************************/
char c256W(BYTE *DataBuff,BYTE ByteQuantity,WORD Address)
{
 BYTE kk,j=0,status=1;
 ES=0;
 EA=0 ;
 ROMSCL=1;
 ROMSDA=1;
 Delay1(1);
 IICStart();//hl//启动总线
 if (!IICSendByte(0xa0))  //hl//发送Device  Address
 {

   if (!IICSendByte((BYTE)(Address>>8)))  //hl//发  WORD ADDRESS
   {
      if (!IICSendByte((BYTE)(Address)))
	  {
    for(j=0;j<ByteQuantity;j++)
    {
     kk=*(DataBuff+j); 
     if(IICSendByte(kk)) {j=ByteQuantity;status=1;}//hl//发送数据不成功IICSendByte(kk)返回“1”
     else status=0;
	}
   IICStop();//hl//停止总线
  }
 }
}
 
 EA=1;
 ES=1;
 return(status);  
}

/*************************************hl***************************************/
//读24c256中的工作日志
//Databuf中存的是读出的数据,Bytelen为每个记录含的字节数	  adr为读数据的地址
//读数成功返回“0”,不成功返回“1”
/****************************************************************************/
char cc256R(BYTE *Databuf,BYTE Bytelen,WORD adr)
{
 BYTE len1=0,len2=0,len3=0,len4=0;
 BOOL repeat_f1=0,repeat_f2=0,repeat_f3=0;
 char status;
 len1=0x40-adr%0x40;//hl//要读数据的起始地址与此地址所在页页尾的差,即起始地址所在页还剩多少空间
 if (len1>=Bytelen) status=c256R(Databuf,Bytelen,adr);
 	                  //hl//如果起始地址不是一页的开头,并且所要读的数据都在这一页中
 else {
        status=c256R(Databuf,len1,adr);    //hl//如果要读的数据不是全部在起始地址所在的页中,只读这一页的数据
       //Delay1(100); 
       if ((status==0)&&((len2=Bytelen-len1)>0x40)) { len2=0x40;repeat_f1=1;}//hl//读上一页成功,并且要读的数据不只两页时
        status=c256R(Databuf+len1,len2,adr+len1);//hl//读第2页的数据
       //Delay1(100); 
        if((status==0)&&(repeat_f1))
        {
          if ((len3=(Bytelen-len1-len2))>0x40) {len3=0x40; repeat_f2=1;}//hl//要读的数据不只3页时
          status=c256R(Databuf+len1+len2,len3,adr+len1+len2);//hl//读第3页的数据
         // Delay1(100); 
           if((status==0)&&(repeat_f2))
          {
           len4=(Bytelen-len1-len2-len3); 
           status=c256R(Databuf+len1+len2+len3,len4,adr+len1+len2+len3);//hl//读第4页的数据
          }
        }
      }
return(status);
}


 /****************************************hl***********************************************/
//从24c256读数据 
//DataBuff为读出数据存放的首地址  ByteQuantity为要读的数据的长度  Address为要读的地址*/
/*当写数据成功返回“0”,不成功返回“1”*/
/***************************************************************************************/           
char c256R(BYTE *DataBuff,BYTE ByteQuantity,WORD Address)
            
{
 BYTE  j,status=1;
   ES=0;
   EA=0 ;
   ROMSCL=1;
   ROMSDA=1;
   
   Delay1(1);
   IICStart();
   if (!IICSendByte(0xa0))  //hl//必须先写地址
   { 

     if(!IICSendByte((BYTE)(Address>>8)))
     {
		 if(!IICSendByte((BYTE)(Address)))
       {
      IICStart();
      if (!IICSendByte(0xa1))    //hl//从地址中读数据
      { 
       if(ByteQuantity>1){ 
                          for(j=0;j<ByteQuantity;j++){ *(DataBuff+j)=IICReceiveByte(0);}
                          *(DataBuff+j+1)=IICReceiveByte(1);      //hl//返回ack信号  
                          IICStop();
                         }
       else { *(DataBuff)=IICReceiveByte(1);IICStop();}
       status=0;
      }
     }
	 }
 
   }
EA=1;
ES=1 ;
return(status);
}


/*****************以下是对IIC总线的操作子程序***/
/*****************启动总线**********************/
/*****************以下是对IIC总线的操作子程序***/
/*****************启动总线**********************/
void IICStart(void)
{
ROMSCL=0; 
Delay1(1);
ROMSDA=1;
Delay1(1);
ROMSCL=1;
Delay1(1);
ROMSDA=0;
Delay1(1);
ROMSCL=0;
Delay1(1);       
} //1nop=4us


/*****************停止IIC总线****************/
void IICStop(void)
{
 ROMSDA=0;
 Delay1(1);
 ROMSCL=1;
 Delay1(1);
 ROMSDA=1;
 Delay1(1);  
}


/**********************从IIC总线上读数据子程序**********/
BYTE IICReceiveByte(BYTE flag)
{
  BYTE i=8,kk;
  kk=0;
  ROMSCL=0;
  Delay1(1);
  for(i=0;i<8;i++)
   {
    ROMSCL=1;
    Delay1(1);
    kk=kk<<1;
    if (ROMSDA) kk++;
    Delay1(1);
    ROMSCL=0;
    if (i!=7)Delay1(1);
   }
  if(flag) ROMSDA=1;        //end read 
   else ROMSDA=0;        //ack 
    Delay1(1); 
    ROMSCL=1;
    Delay1(1); 
    ROMSCL=0; 
    Delay1(1); 
    ROMSDA=1; 
  return(kk);
}

/***************一个简单延时程序************************/
void Delay1(BYTE DelayCount)
{
while(DelayCount--);
}

//hl//**********************从IIC总线上写数据子程序**********/
BOOL IICSendByte(BYTE kk1)
{
  BYTE j=8;
  BOOL ack=0;
  for(j=0;j<8;j++)
   {
    if (kk1&0x80) ROMSDA=1; else ROMSDA=0; 
    kk1=kk1<<1;        
    Delay1(1);
    ROMSCL=1;
    Delay1(1);
    ROMSCL=0;
    if(j!=7) Delay1(1);	
  }
  ROMSDA=1;
  Delay1(1);
  ROMSCL=1;
  Delay1(1);
  if (ROMSDA) ack=1;
  ROMSCL=0;
  Delay1(1);
return(ack);
}

	

⌨️ 快捷键说明

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