/***************************************************************
功能:11:32 2008-6-27
作者:SG
时间:2004-03-15
版本:V1.0
***************************************************************/

#include "INTRINS.H"
#include "reg52.h"

#define  WriteDeviceAddress 0xa0 //写驱动地址指令
#define  ReadDeviceAddress 0xa1  //读驱动地址指令

sbit AT24C02_SCL = 0xa4;
sbit AT24C02_SDA = 0xa5;

/*-------------------------------------------------------------
功能:发起始信号
------------------------------------------------------------*/
void Start_Cond()
{
    AT24C02_SCL = ;
    _nop_();
    AT24C02_SDA = ;
    _nop_();
    AT24C02_SCL = ;
    _nop_();
    AT24C02_SDA = ;
    _nop_();
}

/*-------------------------------------------------------------
功能:发停止信号
------------------------------------------------------------*/
void Stop_Cond()
{
    AT24C02_SCL = ;
    _nop_();
    AT24C02_SDA = ;
    _nop_();
    AT24C02_SCL = ;
    _nop_();
    AT24C02_SDA = ;
    _nop_();
}

/*-------------------------------------------------------------
功能:发确认信号
------------------------------------------------------------*/
void Ack()
{
    AT24C02_SCL = ;
    _nop_();
    AT24C02_SDA = ;
    AT24C02_SCL = ;
    _nop_();
    AT24C02_SCL = ;
    _nop_();
    AT24C02_SDA = ;
}

/*-------------------------------------------------------------
功能:发无确认信号
------------------------------------------------------------*/
void NoAck()
{
    AT24C02_SCL = ;
    _nop_();
    AT24C02_SDA = ;
    _nop_();
    AT24C02_SCL = ;
    _nop_();
    AT24C02_SCL = ;
    _nop_();
}

/*-------------------------------------------------------------
功能:写一个字节数据
------------------------------------------------------------*/
bit Write8Bit(unsigned char input)
{
    unsigned char i;
    ;i<;i++)
    {
        AT24C02_SCL = ;
        input <<= ;
        AT24C02_SDA = CY;
        AT24C02_SCL = ;

    }
    AT24C02_SCL = ;
    _nop_();
    AT24C02_SDA = ;
    AT24C02_SCL = ;
    _nop_();
    CY = AT24C02_SDA;
    return(CY) ;
}

/*-------------------------------------------------------------
功能:读一个字节数据
------------------------------------------------------------*/
unsigned char Read8Bit()
{
    unsigned ;
    ;temp != ;temp--)
    {
        AT24C02_SCL = ;
        _nop_();
        rbyte = (rbyte << ) | AT24C02_SDA;
        AT24C02_SCL = ;
        _nop_();
    }
    return rbyte;
}

/*-------------------------------------------------------------
功能:从EEPROM中给定一个地址连续读NLEN个字节数据存放在以指针
nContent开头的往下内容。
------------------------------------------------------------*/
bit Read_Flash ( unsigned char *nContent, unsigned char nAddr, unsigned char nLen )
{
    unsigned char Addr;
    Addr = nAddr;
    Start_Cond();                        //写开始信号
    Write8Bit(WriteDeviceAddress);      //写驱动地址
    Write8Bit(Addr);                    //写从EEPROM中读的开始地址
    Start_Cond();                        //写开始信号
    Write8Bit(ReadDeviceAddress);        //写读数据指令
    while(--nLen)
    {
        *nContent=Read8Bit();              //读出内容
        nContent++;                        //指针加1
        Ack();                            //发确认信号
    }
    *nContent=Read8Bit();               //读一字节
    NoAck();                            //没有确认信号
    Stop_Cond();                        //发停止信号
    );                            //返回
}

/*-------------------------------------------------------------
功能:初始化EEPROM子程序内容为FF
------------------------------------------------------------*/
bit Init_Flash ( unsigned int nPage ) //    8 Byte/1Page init 0xFF
{
    unsigned char nLen;
    unsigned char Addr;
    nLen=;
    Addr= *nPage;

    Start_Cond();
    Write8Bit(WriteDeviceAddress);
    Write8Bit(Addr);
    ;nLen--)
    {
        if(Write8Bit(0xff)) break;    //if Write8Bit() Return 1 Write Flase
    }
    Stop_Cond();
        return(CY);
}

/*-------------------------------------------------------------
功能:从EEPROM中给定一个地址连续写NLEN个字节数据存放在以指针
nContent开头的往下内容。
------------------------------------------------------------*/
bit Write_Flash ( unsigned char *nContent, unsigned char nAddr,unsigned char nLen)
{
    unsigned char i,temp;
    unsigned char Addr;
    Addr = nAddr;
    Start_Cond();                    //写开始信号
    Write8Bit(WriteDeviceAddress);    //写驱动地址
    Write8Bit(Addr);                //写从EEPROM中写的开始地址
    ;i < nLen;i++)
    {
        ==)                //每页8字节  //换页
        {
            Stop_Cond();
            _nop_();
            Start_Cond();
            Write8Bit(WriteDeviceAddress);
            Write8Bit(Addr);
        }
        temp = *nContent;
        if(Write8Bit(temp)) break;    //CY
        nContent++;
        Addr++;
    }
    Stop_Cond();                    //发停止信号
    return(CY);
}

/*-------------------------------------------------------------
主程序
功能:实现存储器EEPROM AT24C02的数据读写操作
------------------------------------------------------------*/
void main()
{
    unsigned ],i;

    Read_Flash(dat,,);    //读出AT24C02中从地址0开始依次往后16个字节放入dat数组中
    Init_Flash();            //将AT24C02的第0页初始化为FF
    Read_Flash(dat,,);    //读出AT24C02中从地址0开始依次往后16个字节放入dat数组中

    ;i < ;i++ )
    {
         dat[i] = i;        //对数组dat初始化为0---F
    }
    Write_Flash(dat,,);    //将dat数组中的数据写入AT24C02中地址从0开始
    Read_Flash(dat,,);    //读出AT24C02中从地址1开始依次往后16个字节放入dat数组中
    )
    {
        i = ;
    }
}

实现AT24C02的数据读写操作的更多相关文章

  1. 如何确保Memcache数据读写操作的原子性(转)

    什么是CAS协议 Memcached于1.2.4版本新增CAS(Check and Set)协议类同于Java并发的CAS(Compare and Swap)原子操作,处理同一item被多个线程更改过 ...

  2. 一个I/O线程可以并发处理N个客户端连接和读写操作 I/O复用模型 基于Buf操作NIO可以读取任意位置的数据 Channel中读取数据到Buffer中或将数据 Buffer 中写入到 Channel 事件驱动消息通知观察者模式

    Tomcat那些事儿 https://mp.weixin.qq.com/s?__biz=MzI3MTEwODc5Ng==&mid=2650860016&idx=2&sn=549 ...

  3. Java 对不同类型的数据文件的读写操作整合器[JSON,XML,CSV]-[经过设计模式改造](2020年寒假小目标03)

    日期:2020.01.16 博客期:125 星期四 我想说想要构造这样一个通用文件读写器确实不容易,嗯~以后会添加更多的文件类型,先来熟悉一下文件内容样式: <?xml version=&quo ...

  4. python第二十九课——文件读写(写数据的操作)

    演示写数据的操作: 结论:往文件中写入数据,如果文件不存在,先创建文件,再写入内容 #1.打开文件 fw=open(r'd.txt','w',encoding='utf-8') #2.写数据操作 fw ...

  5. cv.Mat 与 .txt 文件数据的读写操作

    1.按OpenCV格式实现的 .txt 文件读写 可以用 cvSave 和 cvLoad 实现,格式和 .xml/.yml 的差不多,不过如果专用与 OpenCV 的数据读写,还是用  .xml/.y ...

  6. I2C的读写操作实验

    [实验任务]   利用24C08断电以后存储的数据不消失的特点,可以做一个断电保护装置.首先利用单片机做一个0-99秒的自动计时器.然后随机关断电源,在 通电以后计时器接着断电前的状态继续计时. [实 ...

  7. c语言文件读写操作总结

    C语言文件读写操作总结 C语言文件操作 一.标准文件的读写 1.文件的打开 fopen() 文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程 ...

  8. [转]Android - 文件读写操作 总结

     转自:http://blog.csdn.net/ztp800201/article/details/7322110 Android - 文件读写操作 总结 分类: Android2012-03-05 ...

  9. JAVASE02-Unit08: 文本数据IO操作 、 异常处理

    Unit08: 文本数据IO操作 . 异常处理 * java.io.ObjectOutputStream * 对象输出流,作用是进行对象序列化 package day08; import java.i ...

随机推荐

  1. sign starfieldtech

    signtool sign /f certfile.pfx /p password /tr http://tsa.starfieldtech.com /td SHA256 mycode.exe htt ...

  2. 【CF689D Friends and Subsequences】二分搜索,区间查询

    题意:给定两个整数序列a,b,将a,b对齐,问有多少个区间满足a的区间内最大值等于b的区间内最小值. 数据范围:区间长度n属于[1, 200000],序列中的元素在整型范围内 思路:枚举所有n*(n+ ...

  3. 【POJ3006】Dirichlet's Theorem on Arithmetic Progressions(素数筛法)

    简单的暴力筛法就可. #include <iostream> #include <cstring> #include <cmath> #include <cc ...

  4. IT人员应该怎么跳槽

    中国的程序员只有两个状态,刚跳槽和准备跳槽.   中国IT行业的快速发展对IT从业人员的需求不断扩大,记得08年刚毕业的时候,在帝都找一个3k的工作都让我特别满足,现在仅能写出”hello world ...

  5. FFmpeg缩放swscale详解 <转>

    利用ffmpeg进行图像数据格式的转换以及图片的缩放应用中,主要用到了swscale.h文件中的三个函数,分别是: struct SwsContext *sws_getContext(int srcW ...

  6. java与.net比较学习系列(3) 基本数据类型和类型转换

    在Java中,数据类型分为两类,一类是基本数据类型,另外一类是引用类型. 而在C#中,数据类型分为三类,分别是基元类型,值类型和引用类型.其中基元类型是.net framework框架中预定义的类型, ...

  7. redmine fastcgi常常崩溃的解决方式

    最终找到了解决方法,在以下的文件里加入两行就可以: /home/redmine/redmine-2.5.1/public/dispatch.fcgi require 'rubygems' requir ...

  8. [转]Laravel 4之请求

    Laravel 4之请求 http://dingjiannan.com/2013/laravel-request/ 获取请求数据 获取当前请求所包括的所有GET和POST数据 Route::get(' ...

  9. 大到可以小说的Y组合子(零)

    问:啊!我想要一个匿名的递归… 答:Y(音同Why)… … … 问:作为一位命令式语言的使用者,为什么会突然折腾起Y组合子呢? 答:的确,这事儿要从很久以前的几次搁浅开始说起…上学的时候,从来没有接触 ...

  10. linux 系统监控系列之vmstat

    vmstat的官方定义是:vmstat - Report virtual memory statistics,即虚拟内存的统计. 先来追根溯源: 什么是虚拟内存? 答:虚拟内存就是磁盘上虚拟出来可以当 ...