实现AT24C02的数据读写操作

源:实现AT24C02的数据读写操作

/***************************************************************
功能: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 = 0;
    _nop_();
    AT24C02_SDA = 1;
    _nop_();
    AT24C02_SCL = 1;
    _nop_();
    AT24C02_SDA = 0;
    _nop_();
}

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

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

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

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

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

/*-------------------------------------------------------------
功能:读一个字节数据
------------------------------------------------------------*/
unsigned char Read8Bit()
{
    unsigned char temp,rbyte=0;
    for (temp = 8;temp != 0;temp--)
    {
        AT24C02_SCL = 0;
        _nop_();
        rbyte = (rbyte << 1) | AT24C02_SDA;
        AT24C02_SCL = 1;
        _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();                        //发停止信号
    return(0);                            //返回
}

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

    Start_Cond();
    Write8Bit(WriteDeviceAddress);
    Write8Bit(Addr);
    for(;nLen!=0;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中写的开始地址
    for(i = 0;i < nLen;i++)
    {
        if(Addr%8==0)                //每页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 char dat[16],i;

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

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

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

SparkR针对mysql的数据读写操作实现

网上翻了两天没找到一份有用的文章,自己研究SparkR的官方api文档,总算找到了实现的接口 我是用R语言加载SparkR库的方式,当然也可以直接用SparkR控制台就不用自己加载SparkR的库了 #首先加载sparkR的库 Sys.setenv(TEST_HOME = "/root/software/spark-1.6.0-bin-hadoop2.6") library(SparkR, lib.loc = c(file.path(Sys.getenv("TEST_HOME

Android数据存储——文件读写操作(File)

Android文件读写操作 一.文件的基本操作 Android中可以在设备本身的存储设备或外接的存储设备中创建用于保存数据的文件.在默认状态下,文件是不能在不同程序间共享的. 当用户卸载您的应用程序时,这些文件删除. 文件存储数据可以通过openFileOutput方法打开一个文件(如果这个)文件不存在就自动创建这个文件),通过load方法来获取文件中的 数据,通过deleteFile方法删除一个指定的文件. 1,常用方法介绍: File是通过FileInputStream和FileOutput

C语言文件读写操作,从文件读取数据

很早写的在linux系统下的文件读写操作,从文件中读取数据 #include <stdio.h> int ReadInfoFromFile(const char *strFile) { FILE *fp; char ch; fp = fopen(strFile, "r"); // 只读的方式打开文件 if(fp==NULL) { perror("fopen"); // 打开文件失败 打印错误信息 return -1; } ch = fgetc(fp);

C语言文件读写操作,写入数据到文件

很早写的在linux系统下的文件读写操作,写入数据到文件,很时候初学者学习 #include <stdio.h> int writeInfoToFile(const char *strFile) { int age, i; char name[10]; FILE *fp; fp = fopen(strFile, "w"); // 只读的方式打开文件 if(fp == NULL) { perror("fopen"); // 文件打开失败,打印错误信息 re

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

日期:2020.01.16 博客期:125 星期四 我想说想要构造这样一个通用文件读写器确实不容易,嗯~以后会添加更多的文件类型,先来熟悉一下文件内容样式: 1 <?xml version="1.0" encoding="UTF-8"?> 2 <beangroup> 3 <javabean> 4 <data name='code'>A001</data> 5 <data name='name'>

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

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

poi大数据读写excel

一.描述 前端时间写了注解方式Excel的读取和写入,它是根据注解完成Excel的操作,虽说支持大数据,但对于超大数据就无能为力了,因为它的读写期间都是将所有数据放入系统内存的,除非你有超大的内存. 因项目需要对超大数据的Excel读写操作,于是网上找了个超大数据的读写代码,这个不需要太大内存.并对此进行了简单的修改. 原理如下: Excel超大数据读取:抽象Excel2007读取器,excel2007的底层数据结构是xml文件,采用SAX的事件驱动的方法解析 xml,需要继承DefaultHa

对SD卡的读写操作-保存用户登录密码

import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStreamReader; import android.content.Context; import android.os.Environment; public class Fileservice { /** * 存储用

HBase 数据读写流程

HBase 数据读写流程 2016-10-18 杜亦舒 读数据 HBase的表是按行拆分为一个个 region 块儿,这些块儿被放置在各个 regionserver 中 假设现在想在用户表中获取 row key 为 row0001 的用户信息 要想取得这条数据,就需要先找到含有此条记录的 region HBase 是如何定位到具体 regionserver 中的具体 region 的呢? HBase 中有一个内置的 hbase:meta 表,其中记录了所有表的所有 region 的详细信息 例如