eeprom.c

来自「应用KEILC写的一个C51程序」· C语言 代码 · 共 115 行

C
115
字号
#include "eeprom.h"
void start_24c16(void)
{   
   SDA=1;_nop_();
   SCL=1;
   _nop_(); _nop_();_nop_();_nop_();
   SDA=0;
   _nop_(); _nop_();_nop_();_nop_();  
   SCL=0;   
   _nop_();_nop_();
}

void stop_24c16(void)
{   
   SDA=0;
   _nop_();_nop_();_nop_();_nop_();
   SCL=1;   
   _nop_();_nop_();_nop_();_nop_();
   SDA=1;   
   _nop_();_nop_();_nop_();_nop_();   
}
/*-----------------------------------------------
调用方式:void ack(void)
函数说明:应答函数  ack低电平脉冲
-----------------------------------------------*/
void ack(void)
{
   SCL=0;_nop_();
   SDA=0;_nop_();
   SCL=1;_nop_();_nop_();_nop_();_nop_();
   SCL=0;_nop_();
   SDA=1;_nop_();
}


/*-----------------------------------------------
调用方式:void no_ack(void)
函数说明:无需应答位,在读程序中用到
-----------------------------------------------*/
void no_ack(void)
{
   SDA=1;_nop_();
   SCL=1;_nop_();_nop_();_nop_();_nop_();   
   SCL=0;_nop_();
   SDA=0;_nop_();
}
/*-----------------------------------------------
调用方式:write_8bit(uchar ch)
函数说明:写一个字节(8位)数据
-----------------------------------------------*/
void write_8bit(uchar ch)
{
   uchar i=8;
   SCL=0;_nop_();
   while(i--)
   {
      SDA=(bit)(ch&0x80);_nop_();
      ch<<=1;
      SCL=1;_nop_();_nop_();_nop_();_nop_();
      SCL=0;_nop_();_nop_();_nop_();_nop_();
   }
}
/*-----------------------------------------------
调用方式:void write24c16(uint address,uchar ddata)
函数说明:写数据到24c16的指定地址(字节写)
-----------------------------------------------*/
void write24c16(uint address,uchar ddata)
{
   uchar ddd;
   EA=0;  //避免与串口通讯等中断冲突
   ddd=((address&0x7ff)/256)<<1;   //7ff=2048-1
   ddd=ddd & 0x0e;//求出在第几页写
   start_24c16();
   write_8bit(0xA0|ddd); //A=1010器件地址高4位
   ack();
   write_8bit(address);
   ack();
   write_8bit(ddata);
   ack();
   stop_24c16();
   EA=1;
}
/*----------------------------------------------
调用方式:uchar read24c16(uint address)
函数说明:读24c16指定地址数据(字节读)
-----------------------------------------------*/
uchar read24c16(uint address)
{
   uchar data rdata;
   uchar i=8;
   uchar ddd;
   EA=0;  //避免与串口通讯等中断冲突
   ddd=((address&0x7ff)/256)<<1;
   ddd=ddd & 0x0e; //求出在第几页写
   start_24c16();
   write_8bit(0xA0|ddd);
   ack();
   write_8bit(address);
   ack();//伪写 随机地址读前按定义伪写
   start_24c16();
   write_8bit(0xA1|ddd);//在指定的页读
   ack();
   while(i--)
   {
      rdata<<=1;
      SCL=0;_nop_(); SCL=1;
      if(SDA) rdata|=0x01;
   }
   no_ack();
   stop_24c16();
   EA=1;
   return rdata;
}

⌨️ 快捷键说明

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