eeprom读写程序
stc单片机eeprom读写程序
stc单片机eeprom读写程序以下是STC单片机使用EEPROM进行读写的示例程序:#include <reg52.h>#include <intrins.h>#define EEPROM_ADDR 0xA0 // EEPROM的I2C地址sbit SDA = P2^0; // I2C的数据线sbit SCL = P2^1; // I2C的时钟线// I2C开始信号void I2C_Start(){SDA = 1;_nop_(); // 延时一段时间SCL = 1;_nop_(); // 延时一段时间SDA = 0;_nop_(); // 延时一段时间SCL = 0;_nop_(); // 延时一段时间}// I2C停止信号void I2C_Stop(){SDA = 0;_nop_(); // 延时一段时间SCL = 1;_nop_(); // 延时一段时间SDA = 1;_nop_(); // 延时一段时间}// I2C发送一个字节的数据void I2C_SendByte(unsigned char dat){unsigned char i;for (i = 0; i < 8; i++){SDA = dat & 0x80; // 获取最高位dat <<= 1;_nop_(); // 延时一段时间SCL = 1;_nop_(); // 延时一段时间SCL = 0;_nop_(); // 延时一段时间}SDA = 1;_nop_(); // 延时一段时间SCL = 1;_nop_(); // 延时一段时间SCL = 0;_nop_(); // 延时一段时间}// I2C接收一个字节的数据unsigned char I2C_ReceiveByte(){unsigned char i, dat = 0;SDA = 1;for (i = 0; i < 8; i++){_nop_(); // 延时一段时间SCL = 1;_nop_(); // 延时一段时间dat <<= 1;dat |= SDA;SCL = 0;}return dat;}// 在EEPROM中写入一个字节的数据void EEPROM_WriteByte(unsigned char addr, unsigned char dat) {I2C_Start();I2C_SendByte(EEPROM_ADDR | 0); // 发送写入指令I2C_SendByte(addr); // 发送地址I2C_SendByte(dat); // 发送数据I2C_Stop();}// 从EEPROM中读取一个字节的数据unsigned char EEPROM_ReadByte(unsigned char addr){unsigned char dat;I2C_Start();I2C_SendByte(EEPROM_ADDR | 0); // 发送写入指令 I2C_SendByte(addr); // 发送地址I2C_Start();I2C_SendByte(EEPROM_ADDR | 1); // 发送读取指令 dat = I2C_ReceiveByte(); // 读取数据I2C_Stop();return dat;}。
eeprom读写程序详解
eeprom读写程序详解EEPROM(Electrically Erasable Programmable Read-Only Memory) 是一种可编程只读存储器,可以在电信号的作用下进行擦写和改写。
它通常用于存储单片机或其他嵌入式系统中的数据、设置参数、配置文件等。
对于 EEPROM 的读写程序,需要考虑以下几个方面:1. 读操作:读操作通常包括以下步骤:- 等待上次读操作完成。
- 获取要读取的数据的单元地址。
- 将 EEPGD 位和 CFGS 位清零。
- 启动读操作控制位 RD。
- 等待本次读操作完成。
- 将该单元地址中对应的数据返回。
在读取 EEPROM 数据时,为了避免芯片在一瞬间无法获取到数据,需要给芯片一定的时间来稳定获取数据。
因此,在读取操作中需要加入等待步骤。
2. 写操作:写操作通常包括以下步骤:- 等待上次写操作完成。
- 获取要写的数据的单元地址。
- 将要写的数据写入 EEPROM 的单元中。
- 将 EEPGD 位和 CFGS 位清零。
- 启动写操作控制位 WP。
- 等待写操作完成。
在写操作中,为了确保数据的可靠性,需要将要写的数据写入EEPROM 的单元中,并等待写操作完成。
同时,在写操作过程中,需要注意避免对无关的单元进行写操作,以免损坏 EEPROM 芯片。
3. 中断处理:在 EEPROM 的读写操作中,通常需要加入中断处理机制,以便在读写过程中及时响应和处理异常情况。
例如,在读取 EEPROM 数据时,如果 EEPROM 芯片出现故障,可能会导致读取失败。
为了避免这种情况,可以在读取操作中加入中断处理机制,在读取失败时及时报警或采取相应的应对措施。
总之,EEPROM 读写程序的实现需要考虑多个方面的因素,包括读操作、写操作、中断处理等。
同时,需要考虑 EEPROM 芯片的特性和限制,以便实现高效、稳定、可靠的 EEPROM 读写操作。
eprom和eeprom的读写过程
eprom和eeprom的读写过程
EPROM(Erasable Programmable Read-Only Memory)和EEPROM(Electrically Erasable Programmable Read-Only Memory)都是一种非易失性存储器,可以用来存储数据并在需要时进行读取。
两者之间的主要区别在于擦除的方式不同。
1. EPROM的读写过程:
- 写入:EPROM使用特定的设备(EPROM编程器)将数据写入芯片。
设备通过一个特定的电压脉冲将数据编程到存储单元中,并将存储单元的电平状态改变从1变为0,以此来表示数据的存储。
- 读取:EPROM的读取是通过将特定地址的存储单元的电平状态转换为电压信号来完成的。
如果存储单元的电平为1,则读取的电压为低电平;如果存储单元的电平为0,则读取的电压为高电平。
2. EEPROM的读写过程:
- 写入:EEPROM的写入过程与EPROM相比更灵活。
可以通过特定的设备将数据写入EEPROM。
写入时,需要将要写入的地址和写入的数据发送给EEPROM,并将特定的命令信号发送给EEPROM,以启动写入操作。
写入操作完成后,EEPROM中相应地址的存储单元将保存写入的数据。
- 读取:EEPROM的读取过程与EPROM相似,通过将特定地址的存储单元的电平状态转换为电压信号来读取数据。
EEPROM的读取可以直接通过数据总线传输读取命令和地址,不需要额外的编程器。
需要注意的是,在实际操作中使用EPROM和EEPROM时,需要严格按照相关规范和设备说明进行操作,确保正确的读写过程,以免损坏芯片或丢失数据。
AT24C02EEPROM读写程序
;--------------------------------------------------------------------------------------------------------------------- ;本程序是针对AT89S52单片机编制的EEPROM读写程序(2013.8.4测试通过);本程序在4MHZ、12MHZ和24MHZ分别测试通过;AT24C02的A0、A1、A2均接GND,设备地址高7位为(1010)000;WP接GND,充许对EEPROM正常读写;本程序仅作学习交流之用。
;--------------------------------------------------------------------------------------------------------------------- SCl equ P2.0 ;SCL接A T89S52的P2.0端口,作为EEPROM的串行输入时钟SDA equ P2.1 ;SDA接AT89S52的P2.1端口,作为主机与EEPROM之间信息串行传输总线WRITEDATA equ 08H;拟写入EEPROM的数据在主机中的存贮单元地址READDATA equ 09H ;从EEPROM读取的数据存放到主机存贮单元地址EPROMADDRESS equ 0AH;拟随机读写EEPROM的存贮单元地址;------------------------------------------------ORG 00HLJMP MAIN;------------------------------------------------ORG 50HMAIN: MOV SP,#20H;防止堆栈影响已用内存数据;以下为写EEPROM过程mov EPROMADDRESS,#09H;该地址可以随意输入(00H~FFH),但读和写的地址须相同MOV WRITEDA TA,#01010010B;该数字可以随意输入,并将读和写的数据进行比较;如读数正确则按将读出数据在P1口输出,可在P1口各位分别接LED灯直观显示出来。
24C01-24C256共9种EEPROM的字节读写操作程序
24C01-24C256共9种EEPROM的字节读写操作程序一个通用的24C01-24C256共9种EEPROM的字节读写操作程序,此程序有五个入口条件,分别为读写数据缓冲区指针,进行读写的字节数,EEPROM首址,EEPROM控制字节,以及EEPROM类型。
此程序结构性良好,具有极好的容错性,程序机器码也不多:#pragma ot(6,SIZE)#include#include#define ERRORCOUNT 10sbit SDA=P0^0;sbit SCL=P0^1;enum eepromtype {M2401,M2402,M2404,M2408,M2416,M2432,M2464,M24128,M 24256};enum eepromtype EepromType;//DataBuff为读写数据输入/输出缓冲区的首址//ByteQuantity 为要读写数据的字节数量//Address 为EEPROM的片内地址//ControlByte 为EEPROM的控制字节,具体形式为(1)(0)(1)(0)(A2)(A1)(A0)(R/W),其中R/W=1,//表示读操作,R/W=0为写操作,A2,A1,A0为EEPROM的页选或片选地址;//EepromType为枚举变量,需为M2401至M24256中的一种,分别对应24C01至24C256;//函数返回值为一个位变量,若返回1表示此次操作失效,0表示操作成功;//ERRORCOUNT为允许最大次数,若出现ERRORCOUNT次操作失效后,则函数中止操作,并返回1//SDA和SCL由用户自定义,这里暂定义为P0^0和P0^1;//其余的用户不用管,只要把只子程序放在你的程序中并调用它就可以了;/************************************************************** *********************/bit RW24XX(unsigned char *DataBuff,unsigned char ByteQuantity,unsigned int Address,unsigned char ControlByte,enum eepromtype EepromType) {void Delay(unsigned char DelayCount);void IICStart(void);void IICStop(void);bit IICRecAck(void);void IICNoAck(void);void IICAck(void);unsigned char IICReceiveByte(void);void IICSendByte(unsigned char sendbyte);unsigned char data j,i=ERRORCOUNT;bit errorflag=1;while(i--){IICStart();IICSendByte(ControlByte&0xfe);if(IICRecAck())continue;if(EepromType>M2416){IICSendByte((unsigned char)(Address>>8)); if(IICRecAck())continue;}IICSendByte((unsigned char)Address);if(IICRecAck())continue;if(!(ControlByte&0x01)){j=ByteQuantity;errorflag=0; //********clr errorflagwhile(j--){IICSendByte(*DataBuff++);if(!IICRecAck())continue;errorflag=1;break;}if(errorflag==1)continue;break;}else{IICStart();IICSendByte(ControlByte);if(IICRecAck())continue;while(--ByteQuantity){*DataBuff++=IICReceiveByte();IICAck();}*DataBuff=IICReceiveByte(); //read last byte data IICNoAck();errorflag=0;break;}}IICStop();if(!(ControlByte&0x01)){Delay(255);Delay(255);Delay(255);Delay(255);}return(errorflag);}/*****************以下是对IIC总线的操作子程序***//*****************启动总线**********************/ void IICStart(void){SCL=0; //SDA=1;SCL=1;_nop_();_nop_();_nop_();SDA=0;_nop_();_nop_();_nop_();_nop_();SCL=0;SDA=1; //}/*****************停止IIC总线****************/ void IICStop(void){SCL=0;SDA=0;SCL=1;_nop_();_nop_();_nop_();SDA=1;_nop_();_nop_();SCL=0;}/**************检查应答位*******************/bit IICRecAck(void){SCL=0;SDA=1;SCL=1;_nop_();_nop_();_nop_();_nop_();CY=SDA; //因为返回值总是放在CY中的SCL=0;return(CY);}/***************对IIC总线产生应答*******************/ void IICACK(void){SDA=0;SCL=1;_nop_();_nop_();_nop_();_nop_();SCL=0;_nop_();}/*****************不对IIC总线产生应答***************/void IICNoAck(void){SDA=1;SCL=1;_nop_();_nop_();_nop_();_nop_();SCL=0;}/*******************向IIC总线写数据*********************/void IICSendByte(unsigned char sendbyte){unsigned char data j=8;for(;j>0;j--){SCL=0;sendbyte<<=1; //无论C51怎样实现这个操作,始终会使CY=sendbyte^7;SDA=CY;SCL=1;}SCL=0;}/**********************从IIC总线上读数据子程序**********/ unsigned char IICReceiveByte(void){register receivebyte,i=8;SCL=0;while(i--){SCL=1;receivebyte=(receivebyte<<1)|SDA;SCL=0;}return(receivebyte);}/***************一个简单延时程序************************/ void Delay(unsigned char DelayCount){while(DelayCount--);}。
STC单片机EEPROM读写程序
STC单片机EEPROM读写程序在单片机中,EEPROM(Electrically Erasable Programmable Read-Only Memory)是一种非易失性存储器,可以用于存储数据,即使在断电情况下,数据也会被保留。
因此,掌握STC单片机的EEPROM读写程序对于开发嵌入式系统非常重要。
一、EEPROM简介EEPROM是一种可重复擦写的存储器,可用于存储小量数据。
与Flash存储器相比,EEPROM具有更快的写入和擦除速度。
在STC单片机中,EEPROM的存储容量通常较小,一般在几个字节到几千字节之间。
二、EEPROM读操作在STC单片机中,进行EEPROM读操作需要按照以下步骤进行:1. 初始化I2C总线:STC单片机使用I2C总线进行EEPROM读写操作,因此需要先初始化I2C总线。
通过设置相关寄存器,设置I2C 总线的速度和地址。
2. 发送设备地址:确定要读取的EEPROM设备的地址,并发送到I2C总线。
3. 发送寄存器地址:确定要读取的EEPROM寄存器地址,并将其发送到I2C总线。
4. 发送读命令:向EEPROM发送读命令,以启动读操作。
5. 读取数据:从EEPROM中读取数据,并保存到变量中。
6. 结束读操作:完成读操作后,关闭I2C总线。
三、EEPROM写操作类似于读操作,进行EEPROM写操作也需要按照一定的步骤进行:1. 初始化I2C总线:同样地,首先需要初始化I2C总线。
2. 发送设备地址:确定要写入的EEPROM设备的地址,并发送到I2C总线。
3. 发送寄存器地址:确定要写入的EEPROM寄存器地址,并将其发送到I2C总线。
4. 发送写命令:向EEPROM发送写命令,以启动写操作。
5. 写入数据:将要写入EEPROM的数据发送到I2C总线。
6. 结束写操作:完成写操作后,关闭I2C总线。
四、注意事项在进行EEPROM读写操作时,需要注意以下几点:1. 确保正确的设备地址:要与EEPROM的地址匹配,否则无法进行有效的读写操作。
各种EEPROM读写驱动程序
//24c01-24c16读写驱动程序,sbit a0=ACC^0; //定义ACC的位,利用ACC操作速度最快sbit a1=ACC^1;sbit a2=ACC^2;sbit a3=ACC^3;sbit a4=ACC^4;sbit a5=ACC^5;sbit a6=ACC^6;sbit a7=ACC^7;void s24(void) {_nop_();scl=0;sda=1;scl=1;_nop_();sda=0;_nop_();scl=0;}void s240(void) {_nop_();scl0=0;sda0=1;scl0=1;_nop_();sda0=0;_nop_();scl0=0; }void p24(void) {sda=0;scl=1;_nop_();sda=1;}void p240(void) {sda0=0;scl0=1;_nop_();sda0=1;}unsigned char rd24(void) {sda=1;scl=1;a7=sda;scl=0;scl=1;a6=sda;scl=0;scl=1;a5=sda;scl=0;scl=1;a4=sda;scl=0;scl=1;a3=sda;scl=0;scl=1;a2=sda;scl=0;scl=1;a1=sda;scl=0;scl=1;a0=sda;scl=0;sda=1;scl=1;scl=0;return(ACC);}void wd24(unsigned char dd) {ACC=dd;sda=a7;scl=1;scl=0;sda=a6;scl=1;scl=0;sda=a5;scl=1;scl=0;sda=a4;scl=1;scl=0;sda=a3;scl=1;scl=0;sda=a2;scl=1;scl=0;sda=a1;scl=1;scl=0;sda=a0;scl=1;scl=0;sda=1;scl=1;}unsigned char read(unsigned int address){unsigned char dd;dd=((address&0x7ff)/256)<<1;s24();wd24(0xa0|dd);scl=0;wd24(address);scl=0;s24();wd24(0xa1|dd);scl=0;dd=rd24();p24();return(dd);}void write(unsigned int address,unsigned char dd){unsigned char ddd;ddd=((address&0x7ff)/256)<<1;s24();wd24(0xa0|ddd);scl=0;wd24(address);scl=0;wd24(dd);scl=0;p24();time=0; //time为定时器时间参考,time增加1代表1ms,如果没有用定时器,取消该行while (1) {s24();wd24(0xa0|ddd);sda=1;if (sda==0) break;if (time>10) break; //此行防止由于eeprom器件损坏后的死循环scl=0;}}。
Stc12c5a60s2 eeprom读写程序
IapId
{
uchar temp=0;
Lnum=IapReadByte(0x0000);
P0=Lnum;
//连接 led
KEY_ADD=1; //按键输入端口电平置高
KEY_DEC=1;
if(IapReadByte(0x0000)==0xff||h==0)
{
IapEraseSector(0x0000); IapProgramByte(0x0000,0x0a); Lnum=10;
// 去 stc 官网下载 or stc 最新下载程序有 stc 系列头文件
sbit h=P3^0; sbit KEY_ADD=P3^4; sbit KEY_DEC=P3^5; uchar Lnum;
//定义按键输入端口
void delay(uchar i) {
uchar j; while(i--) { for(j=0;j<125;j++); } } void IapIdle() { IAP_CONTR=0; IAP_CMD=0; IAP_TRIG=0; IAP_ADDRH=0X80; IAP_ADDRL=0; } uchar IapReadByte(uint addr) {
nop();
IapIdle();
}
void IapEraseSector(uint addr)
{
IAP_CONTR=ENABLE_IAP;
IAP_CMD=CMD_ERASE;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_TRIG=0x5a;
IAP_TRIG=0xa5;
nop();
//按一下 P3^0,会把修改后的数据存入 eeprom 的 0x0000 地址内。关闭单片机,再次打开,
24C16的EEPROM的读写程序
24C16规范的51读写C文件(开发板程序之一)/*I2C总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。
在CPU与被控IC之间、IC与IC之间进行双向传送,最高传送速率400kbps。
各种被控制电路均并联在这条总线上,但就像电话机一样只有拨通各自的号码才能工作,所以每个电路和模块都有唯一的地址,在信息的传输过程中,I2C总线上并接的每一模块电路既是主控器(或被控器),又是发送器(或接收器),这取决于它所要完成的功能。
CPU发出的控制信号分为地址码和控制量两部分,地址码用来选址,即接通需要控制的电路,确定控制的种类;控制量决定该调整的类别(如对比度、亮度等)及需要调整的量。
这样,各控制电路虽然挂在同一条总线上,却彼此独立,互不相关。
I2C总线在传送数据过程中共有三种类型信号,它们分别是:开始信号、结束信号和应答信号。
开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
结束信号:SCL为低电平时,SDA由低电平向高电平跳变,结束传送数据。
应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。
CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。
若未收到应答信号,由判断为受控单元出现故障。
目前有很多半导体集成电路上都集成了I2C接口。
*//********************************************************************** ******** (C) Copyright 2007,单片机初学者园地* All Rights reserved.***项目名称: 51单片机学习开发系统***本文件名称:IIC.c** 完成作者:单片机初学者* 当前版本: V1.0* 完成日期:* 描述:本程序结构简单、合理,有帮助于初学者养成良好的编* 程风格。
EEPROM读写实验
实验十、EEPROM读写实验
(一)、实验目的:
EEPROM是掉电后不丢失信息的一种数据存储器,适用于现场数据的采集和存储。
本实验给出了EEPROM记录单片机重启次数(包括上电复位重启和下载程序的过程中的复位重启),并将该次数显示在8位4联LED数码管上的例程程序。
目的是引导使用者掌握51单片机与IIC设备进行串行通讯的原理和使用方法。
(二)、实验接线和步骤:
1、将U13(上面的8位拨码开关)的“5”~“8”位打到“ON”位置,这是数码
管位码。
2、将U14(下面的8位拨码开关)的“1”~“8”位打到“ON”位置,这是数码
管段码。
3、将24C08处的两个三位跳线处,分别短接“P34”,“PC-34”跳线和“P35”,“PC-35”
跳线。
这是24C08的IIC总线的数据线和时钟线。
4、下载程序。
5、因为U17(USB旁的4位拨码开关)会对数码管显示产生影响,所以将U17的
“1”~“3”位断开。
6、按动复位键观察数码管显示数字。
(电源重启和下载复位也会增加单片机重启次
数)
说明:因程序例程篇幅过长,不方便以书面形式列出,为方便使用者,例程的原代码及工程文件所有文档均已附在电子文档“EEPROM读写实验”文件夹中。
使用者可在例程程序的基础上改变某些参数以观察不同的实验效果。
单片机EEPROM读写数据流程解析
单片机EEPROM读写数据流程解析EEPROM 写数据流程第一步,首先是I2C 的起始信号,接着跟上首字节,也就是我们前边讲的I2C 的器件地址,并且在读写方向上选择“写”操作。
第二步,发送数据的存储地址。
24C02 一共256 个字节的存储空间,地址从0x00~0xFF,我们想把数据存储在哪个位置,此刻写的就是哪个地址。
第三步,发送要存储的数据第一个字节、第二个字节??注意在写数据的过程中,EEPROM 每个字节都会回应一个“应答位0”,来告诉我们写EEPROM 数据成功,如果没有回应答位,说明写入不成功。
在写数据的过程中,每成功写入一个字节,EEPROM 存储空间的地址就会自动加1,当加到0xFF 后,再写一个字节,地址会溢出又变成了0x00。
EEPROM 读数据流程第一步,首先是I2C 的起始信号,接着跟上首字节,也就是我们前边讲的I2C 的器件地址,并且在读写方向上选择“写”操作。
这个地方可能有同学会诧异,我们明明是读数据为何方向也要选“写”呢?刚才说过了,24C02 一共有256 个地址,我们选择写操作,是为了把所要读的数据的存储地址先写进去,告诉EEPROM 我们要读取哪个地址的数据。
这就如同我们打电话,先拨总机号码(EEPROM 器件地址),而后还要继续拨分机号码(数据地址),而拨分机号码这个动作,主机仍然是发送方,方向依然是“写”。
第二步,发送要读取的数据的地址,注意是地址而非存在EEPROM 中的数据,通知EEPROM 我要哪个分机的信息。
第三步,重新发送I2C 起始信号和器件地址,并且在方向位选择“读”操作。
这三步当中,每一个字节实际上都是在“写”,所以每一个字节EEPROM 都会回应一个“应答位0”。
第四步,读取从器件发回的数据,读一个字节,如果还想继续读下一个字节,就发送一个“应答位ACK(0)”,如果不想读了,告诉EEPROM,我不想要数据了,别再发数据了,那就发送一个“非应答位NAK(1)”。
25c04 读写例程
25c04 读写例程
25C04是一种串行EEPROM(电可擦可编程只读存储器),其读写例程可以通过以下步骤来实现。
1. 初始化,首先,需要初始化串行EEPROM,这包括设置通信协议(如I2C或SPI)、设备地址和其他必要的参数。
2. 写入数据,要向25C04写入数据,首先需要将要写入的数据发送到串行EEPROM的特定寄存器中。
这通常涉及到发送写入命令,指定要写入的存储器地址,并将数据发送到该地址。
3. 等待写入完成,在写入数据后,需要等待串行EEPROM完成写入操作。
这通常涉及轮询串行EEPROM的状态寄存器,直到写入操作完成。
4. 读取数据,要从25C04读取数据,需要发送读取命令,并指定要读取的存储器地址。
串行EEPROM将返回存储器地址处的数据,然后可以将其读取到微控制器或其他设备中。
5. 结束通信,在完成读写操作后,需要结束与串行EEPROM的
通信,并释放相关的资源。
需要注意的是,25C04的具体读写例程可能会因使用的通信协议(如I2C或SPI)以及微控制器或处理器的不同而有所不同。
因此,在实际应用中,需要根据具体的硬件和软件平台编写相应的读写例程。
EEPROM读写程序的设计及说明(v1.1改进版)
EEPROM读写程序的设计及说明一、I2C 总线概述I2C 总线是PHILIPS 公司推出的芯片间串行数据传输总线。
I2C 总线通过两根线(串行数据线SDA 和串行时钟线SCL)使挂接到总线上的器件相互进行信息传递,能够十分方便地地构成多机系统和外围器件扩展系统。
I2C 器件是把I2C 的协议植入器件的I/O 接口,使用时器件直接挂到I2C 总线上即可。
总线使用软件寻址来识别每个器件--微控制器、存储器、LCD、驱动器时钟芯片及其它I2C 总线器件,而无须使用片选信号,是否选中是由主器件发出的I2C 从地址决定的而I2C 器件的从地址是由I2C 总线委员会实行统一发配的。
总线上的每一次数据传送活动都是主控器先发送起始信号,然后主控器发送被控器的地址及读写位1个字节,这之后是主控器等待被控器的应答信号(接着的第九位),再接着就是主控器发送数据给被控器(写被控器)或接收被控器发出来的数据(读被控器),最后由主控器发出停止信号通知被控器结束整个数据传送过程。
I2C 总线的数据传送过程如下图所示。
I2C 总线协议规定传送的数据长度为8位,而每次传送的数据字节数由被控器所限制如24C01(128 字节EEPROM)规定一次最多可以传送8个字节,24C02(256字节EEPROM)规定一次最多可传送16个字节。
按照I2C总线协议,总线上非单片机类型的外围器件地址由器件编号地址(高4位D7~D4由器件类型决定)和器件引脚地址(D3~D1)组成,如24C01/02/03/04的器件编号地址为1010。
器件的引脚地址由A2A1A0三根硬件地址线决定,最后一位为读写控制位,1表示读,0表示写,如下图示。
二、程序框图三、EEPROM应用程序1、整体功能说明本程序利用NEC公司的9177芯片,用软件的模拟方法实现对EEPROM器件(如24C04)的读写操作。
2、变量说明EEDATA 所需读或写的EEPROM参数个数PARAADD EEPROM读写的地址变量EEWRDELAY 写EEPROM的延时时间计时变量3、标志说明_EEPRW 读写标志(0=EEPROM写,1=EEPROM读)_ACKERR EEPROM有无应答标志(1=无应答,0=有应答)_ERRORFG EEPROM出错标志(1=EEPROM出错,0=EEPROM无错)_PARAERR EEPROM参数错误(1=EEPROM参数出错,0=EEPROM参数无错)4、常量说明SLAW EQU 0A0H 表示EEPROM器件地址及EEPROM写SLAR EQU 0A1H 表示EEPROM器件地址及EEPROM读P_EESDA EQU P1.1 连接EEPROM数据线(SDA)的芯片管脚P_EESCL EQU P1.0 连接EEPROM 时钟线(SCL)的芯片管脚5、模块使用说明(1)本EEPROM读写模块可直接调用,在NEC9177调用方法为:CALL !EEPROMRW;(2)调用前需给以下几个参数进行赋值所需读写的EEPROM参数个数:EEDATA 例如:MOV EEDATA,#32所需读写的EEPROM参数初始地址:PARAADD 例如:MOV PARAADD,#0读写EEPROM数据所存放的地址:HL 例如:MOVW HL,#PARABUF程序要求为读或写EEPROM标志:_EEPRW 例如:SET1 _EEPRW6、应用范围此程序段可应用于NEC9177作为主芯片的电控中,其中外围的EEPROM器件应具有I2C总线的特性(如24C04),其他具有I2C特性的器件也可做参考。
eeprome读写程序(自己做实际项目已验证)
//=============================================
//函数名称:向串口发送一个字符
//=============================================
void send_char_com(unsigned char ch)
{
SBUF=ch;
//=============================================
void Rest_WDG(void)
{
CS=0;
CS=1;
}
//=============================================
//函数名称:写数据到X5045__EEPROM
//=============================================
void Init_Com(void)
{
TMOD = 0x20; //定时器工作方式2,初值自动装入
PCON = 0x00; //波特率不增倍
SCON = 0x50; //串行工作方式设定
TH1 = 0xFd; //定时器初值高位
TL1 = 0xFd; //定时器初值低位
TR1 = 1; //启动定时器
void Write_X5045(uchar Writer_data)
{
unsigned char i;
for(i=0;i<8;i++)
{
SI=(bit)(Writer_data&0x80);
SCLK=0;
SCLK=1;
Writer_data<<=1;
}
PIC单片机的EEPROM读写程序
PIC单片机的EEPROM读写程序PIC16C74B单片机与AT24C64通讯;该程序实现的功能是:;将I2C_A,I2C_B.....I2C_K内容写入EEPROM中;同时在EEPROM中读出数据从新写入各个寄存器;=======================================LIST P=16C74B#include<p16c74.inc>ERRORLEVEL -302I2C_A EQU 0X20I2C_B EQU 0X21I2C_C EQU 0X22I2C_D EQU 0X23I2C_E EQU 0X24I2C_F EQU 0X25I2C_G EQU 0X26REG1 EQU 0X2BREG2 EQU 0X2CCOUNT EQU 0X71 ;I2CBCOUNT EQU 0X72 ;I2CTXBUF EQU 0X73 ;I2CRXBUF EQU 0X74 ;I2CBUSCON EQU 0X75 ;I2CBUSSTA EQU 0X76 ;I2CI2CBUF EQU 0X77 ;I2CSLA VEADDR EQU 0XA0 ;I2CDA TAADDRH EQU 0X01 ;I2CDA TAADDRL EQU 0X00 ;I2C;---------------------------------------;BUSCON;---------------------------------------SLA VE_RW EQU 7LAST_BYTE_RX EQU 6SLA VE_ACTIVE EQU 5TIME_OUT EQU 4;---------------------------------------;BUSSTA;---------------------------------------BUS_BUSY EQU 7TX_PROGRESS EQU 6RX_PROGRESS EQU 5TX_SUCCESS EQU 4RX_SUCCESS EQU 3FATAL_ERROR EQU 2 ;SLA VE EEPROM ABORT EQU 1ACK_ERROR EQU 0;---------------------------------------R_NOT_W EQU 0TRUE EQU 1FALSE EQU 0SDA EQU 0X04 ;I2CSCL EQU 0X03 ;I2C;=======================================ORG 0X00GOTO STARTORG 0X20START BCF STATUS,RP1BCF STATUS,RP0CLRF RACLRF RBCLRF RCCLRF RDCLRF REBSF STATUS,RP0CLRF TRISACLRF TRISBCLRF TRISCCLRF TRISDCLRF TRISEMOVLW 0X02MOVWF I2C_AMOVLW 0X04MOVWF I2C_BMOVLW 0X03MOVWF I2C_CMOVLW 0X03MOVWF I2C_DMOVLW 0X05MOVWF I2C_EMOVLW 0X06MOVWF I2C_FMOVLW 0X04MOVWF I2C_G;======================================= START1CALL I2CBUS_INITCALL REGTOI2CBUFCALL I2CWRITECALL CLRI2CBUFCALL D10CALL I2CREADCALL I2CBUFTOREGGOTO START1;======================================= ;CLRI2CBUF;---------------------------------------CLRI2CBUFBCF STA TUS,RP0MOVLW I2CBUFMOVWF FSRMOVLW 0X08MOVWF COUNTCLRLOOP CLRF INDFINCF FSR,FDECFSZ COUNT,FGOTO CLRLOOPRETURN;---------------------------------------;将各个REGSTER数据写入 I2CBUF 缓冲区;---------------------------------------REGTOI2CBUFBCF STA TUS,RP0MOVLW I2CBUFMOVWF FSRMOVF I2C_A,WMOVWF INDFINCF FSR,FMOVF I2C_B,WMOVWF INDFINCF FSR,FMOVF I2C_C,WMOVWF INDFINCF FSR,FMOVF I2C_D,WMOVWF INDFINCF FSR,FMOVF I2C_E,WMOVWF INDFINCF FSR,FMOVF I2C_F,WMOVWF INDFINCF FSR,FMOVF I2C_G,WMOVWF INDFRETURN;---------------------------------------;将 I2CBUF 缓冲区数据写入各个REGSTER;---------------------------------------I2CBUFTOREGBCF STA TUS,RP0MOVLW I2CBUFMOVWF FSRMOVF INDF,WMOVWF I2C_AINCF FSR,FMOVF INDF,WMOVWF I2C_BINCF FSR,FMOVF INDF,WMOVWF I2C_CINCF FSR,FMOVF INDF,WMOVWF I2C_DINCF FSR,FMOVF INDF,WMOVWF I2C_EINCF FSR,FMOVF INDF,WMOVWF I2C_FINCF FSR,FMOVF INDF,WMOVWF I2C_GRETURN;=======================================;将I2CBUF缓冲区内的数据写入EEPROM;=======================================I2CWRITECALL I2CSTARTBTFSS BUSSTA,BUS_BUSYGOTO TX_FAILBCF BUSCON,SLA VE_RWCALL TX_SLA VE_ADDRBTFSS BUSSTA,TX_SUCCESS ;SUCESSFULL? GOTO TX_FAILCALL TX_DA TA_ADDRBTFSS BUSSTA,TX_SUCCESSGOTO TX_FAILMOVLW I2CBUFMOVWF FSRMOVLW 07MOVWF COUNTT_BYTE_LOOPMOVF INDF,WMOVWF TXBUFCALL I2CTXBBTFSS BUSSTA,TX_SUCCESSGOTO TX_FAILINCF FSR,FDECFSZ COUNT,FGOTO T_BYTE_LOOPGOTO TX_PASSTX_FAIL CALL I2CSTOPBCF BUSSTA,TX_PROGRESSBCF BUSSTA,TX_SUCCESSRETLW FALSETX_PASSCALL I2CSTOPBCF BUSSTA,TX_PROGRESSRETLW TRUE;---------------------------------------;从 EEPROM 中读出数据到 I2CBUF 寄存器;---------------------------------------I2CREAD BCF STATUS,RP0BCF BUSSTA,RX_SUCCESSCALL I2CSTARTBTFSS BUSSTA,BUS_BUSYGOTO RX_FAILBCF BUSCON,SLA VE_RWCALL TX_SLA VE_ADDRBTFSS BUSSTA,TX_SUCCESS GOTO RX_FAILCALL TX_DA TA_ADDRBTFSS BUSSTA,TX_SUCCESSGOTO RX_FAILCALL I2CSTARTBSF BUSCON,SLA VE_RWCALL TX_SLA VE_ADDRBTFSS BUSSTA,TX_SUCCESSGOTO RX_FAILBCF BUSSTA,LAST_BYTE_RXMOVLW I2CBUFMOVWF FSRMOVLW 07MOVWF COUNTR_BYTE_LOOPMOVLW 0X01XORWF COUNT,WBTFSC STATUS,ZBSF BUSSTA,LAST_BYTE_RXCALL I2CRXBBTFSS BUSSTA,RX_SUCCESSGOTO RX_FAILMOVF RXBUF,WMOVWF INDFINCF FSR,FDECFSZ COUNT,FGOTO R_BYTE_LOOPGOTO RX_PASSRX_FAIL CALL I2CSTOPBCF BUSSTA,RX_PROGRESSBCF BUSSTA,RX_SUCCESSRETLW FALSERX_PASS CALL I2CSTOPBCF STA TUS,RP0BCF BUSSTA,TX_PROGRESSBCF BUSSTA,RX_PROGRESSBSF BUSSTA,RX_SUCCESSRETLW TRUE;======================================= ; I2C 初始化;=======================================I2CBUS_INITBCF STA TUS,RP0MOVF RC,WANDLW 0X18MOVWF RCCLRF BUSSTACLRF BUSCONRETURN;======================================= ; 传送设备地址;入口: BUSCON;出口: BUSSTA;======================================= TX_SLA VE_ADDRBCF STA TUS,RP0BCF BUSSTA,ACK_ERRORMOVLW SLA VEADDRMOVWF TXBUFBTFSC BUSCON,SLA VE_RWBSF TXBUF,R_NOT_WCALL I2CTXBBTFSC BUSSTA,TX_SUCCESSGOTO TXADDR_SUCCESSCLRWDTBTFSS BUSSTA,ACK_ERRORCALL I2CSTOPGOTO TXADDR_ENDTXADDR_SUCCESSCLRWDTTXADDR_ENDRETURN;======================================= ;TX_DATA_ADDR 发送写/读的地址;======================================= TX_DATA_ADDRBCF STA TUS,RP0MOVLW DATAADDRHMOVWF TXBUFCALL I2CTXBBCF STA TUS,RP0BTFSS BUSSTA,TX_SUCCESSGOTO TX_DATA_ADDR_ERRORMOVLW DATAADDRLMOVWF TXBUFCALL I2CTXBBCF STA TUS,RP0BTFSS BUSSTA,TX_SUCCESSGOTO TX_DATA_ADDR_ERRORGOTO TX_DATA_ENDTX_DATA_ADDR_ERRORBCF BUSSTA,TX_PROGRESSBCF BUSSTA,TX_SUCCESSBSF BUSSTA,ACK_ERRORTX_DATA_ENDRETURN;=======================================;向 EEPROM 输出一个8位数据,并检测EEPROM的ACK信号;入口: TXBUF 寄存器; BUSSTA 寄存器;出口: EEPROM 存储器; BUSSTA 寄存器;======================================I2CTXB BCF STATUS,RP0BSF BUSSTA,TX_PROGRESSBCF BUSSTA,TX_SUCCESSMOVLW 0X08MOVWF BCOUNTTXLOOP CLRWDTBSF STATUS,RP0BCF TRISC,SCLNOPBCF TRISC,SDABCF STA TUS,RP0RLF TXBUF,FBSF STATUS,RP0BTFSC STATUS,CBSF TRISC,SDANOPBSF TRISC,SCLNOPNOPBCF STA TUS,RP0DECFSZ BCOUNT,FGOTO TXLOOP;---------------------------------------;检测是EEPROM否有ACK信号产生,产生为正常;检测方法:; 1. 将RC口的SCL.SDA分别设置为输出和输入状态; 2. 延时2个指令周期,将SCL设置为高电平; 3. 延时2个指令周期,检测RC口SDA的状态; 4. 如果为高电平,设置错误状态,返回; 5. 如果为低电平,延时2个指令周期后,将RC口SCL设置为低电平,继续执行;---------------------------------------BSF STATUS,RP0BCF TRISC,SCLBSF TRISC,SDANOPNOPBSF TRISC,SCLNOPBCF STA TUS,RP0BTFSC RC,SDAGOTO TX_ERRBSF STATUS,RP0BCF TRISC,SCLBCF STA TUS,RP0BCF BUSSTA,TX_PROGRESSBSF BUSSTA,TX_SUCCESSBCF BUSSTA,ACK_ERRORGOTO TX_ENDTX_ERR BCF BUSSTA,TX_PROGRESSBCF BUSSTA,TX_SUCCESSBSF BUSSTA,ACK_ERRORTX_END RETURN;=======================================;从EEPROM中读出 8 位的数据,并发送发送ACK信号;入口: EEPROM 存储器; BUSCON 寄存器;出口: RXBUF 寄存器; BUSSTA 寄存器;=======================================I2CRXB BCF STA TUS,RP0BSF BUSSTA,RX_PROGRESSBCF BUSSTA,RX_SUCCESSMOVLW 0X08MOVWF BCOUNTRXLOOP CLRWDTBSF STATUS,RP0BCF TRISC,SCL ;定义TRISC<SCL>为输出BSF TRISC,SDA ;定义TRISC<SDA>为输入NOPNOPBSF TRISC,SCL ;TRISC<SCL>输出高电平NOPBCF STA TUS,RP0BCF STA TUS,CBTFSC RC,SDA ;原指令为BTFSC TRISC,SDA BSF STATUS,CRLF RXBUF,FDECFSZ BCOUNT,FGOTO RXLOOP;---------------------------------------;发送ACK信号到EEPROM;判断接收的是否为最后一个字节;LAST_BYTE_RX为1,是 SDA发送一个高电平,结束;LAST_BYTE_RX为0,不是 SDA发送一个低电平ACK,继续接收;---------------------------------------BSF STATUS,RP0BCF TRISC,SCLBCF TRISC,SDABTFSC BUSCON,LAST_BYTE_RX ;检测是否是最后一个字节 BSF TRISC,SDA ;是最后一个字节NOP ;发送ACK信号BSF TRISC,SCLNOPNOPNOPNOPBCF TRISC,SCLBCF STA TUS,RP0BCF BUSSTA,RX_PROGRESSBSF BUSSTA,RX_SUCCESSRETURN;=======================================;I2C 开始信号;输入: 无;输出: BUFSSTA<BUS_BUSY>;=======================================I2CSTARTBSF STATUS,RP0BSF TRISC,SDA ;1USNOP ;1USBSF TRISC,SCL ;1USNOPNOPBCF TRISC,SDANOPNOPBCF STATUS,RP0BSF BUSSTA,BUS_BUSYRETURN;=======================================;I2C 结束信号;输入: 无;输出: BUSSTA<BUS_BUSY>;=======================================I2CSTOPBSF STATUS,RP0BCF TRISC,SCLBCF TRISC,SDABSF TRISC,SCLNOPNOPBSF TRISC,SDANOPBCF STATUS,RP0BCF BUSSTA,BUS_BUSYRETURN;=======================================; D10 @; clock in 4Mhz; delay 10ms;=======================================D10 MOVLW 0X0DMOVWF REG1LOOP2 MOVLW 0XFFMOVWF REG2LOOP1 DECFSZ REG2,fGOTO LOOP1DECFSZ REG1,fGOTO LOOP2RETURN;=======================================I2CERR CLRWDTNOPNOPNOPRETURNEND硬件I2C的主模式,只能在具有MSSP模块的单片机里实现,如PIC16F87X,而PIC16C7X 的SSP只能启用I2C从模式。
EEPROM------AT24C01A_IIC总线驱动读写程序
/*河北工程大学信电学院自动化系调试成功EEPROM------A T24C01A_IIC总线驱动读写程序晶振:6MHz目标板:STC90C52AD编译环境:Keil C uVision V2.38a*/#include <reg52.h>#include <intrins.h>//由于是01A,1Kbit,故此这里第一个字节的读写格式是1010,A2,A1,A0,R/W #define Read_Addr 0xa1#define Write_Addr 0xa0#define uchar unsigned char//总线的定义,时钟线P1.0,数据线P1.1sbit SCL=P1^0;sbit SDA=P1^1;//短码数组uchar tab[]={2,5,6};void Start(){SDA=1;_nop_();SCL=1;_nop_();SDA=0;_nop_();SCL=0; //可以视作第一个SCL=0}void Stop(){SDA=0;_nop_();SCL=1;_nop_();SDA=1;}//------------------------------------------------------------------------- bit Write_Byte(uchar DA TA){bit Ack;uchar i;for(i=0;i<8;i++){SDA=(bit)(DA TA&0x80);_nop_();SCL=1;_nop_();_nop_();SCL=0; //第九个SCL=0DA TA<<=1;}SDA=1; //主机释放SDA_nop_();_nop_();SCL=1; //第九个SCL=1_nop_();//SDA=1; //对程序好像没出来影响Ack=SDA; //前面是否先置1,特别注意是否是准双向口SCL=0; //下一个字节的第一个SCL=0return (Ack);}uchar Read_Byte(){uchar DA TA,i;for(i=0;i<8;i++){SCL=1;DA TA<<=1;//注意强制类型转换SDA=1; //对程序好像没出来影响DA TA|=(uchar)SDA;//前面是否先置1,特别注意是否是准双向口SCL=0;}return(DA TA);}//-------------------------------------------------------------------------//读当前地址的数据uchar Read_Current_Addr(){uchar DA TA;Start();Write_Byte(Read_Addr);DA TA=Read_Byte();Stop();return(DA TA);}//向指定地址读数据uchar Read_Random_Addr(uchar addr) //256*8byte=1024Kbit,uchar类型正好合适{uchar DA TA;Start();Write_Byte(Write_Addr);Write_Byte(addr);DA TA=Read_Current_Addr();return(DA TA);}/*-------------------------------------------------------------功能:从EEPROM中给定一个地址连续读NLEN个字节数据存放在以指针nContent开头的往下内容。
PIC单片机片内EEPROM的读写程序
PIC单片机片内EEPROM的读写程序因为也是摸索着学习PIC单片机,当要用到EEPROM存储部分系统参数,看单片机手册上的资料,觉得还是比较麻烦,然后还是不太会,然后就想找找看网上有没有现成的PIC单片机的片内EEPROM的读写程序,然后都没有找到想要的,而且对汇编语言的也不知道,所以搜索了下最后终于发现PICC编译器里面其实对内部的EEPROM的读写有头文件,可以直接来用,方法如下:PICC的安装目录下C:\Program Files\HI-TECH Software\PICC\9.81\include(这是我的电脑里目录)里面有一个eeprom_routines.h的文件这个就是关于EEPROM 中的读写程序,具体程序如下:// This header file should not be included directly// Inclusion of this file is provided indirectly by including htc.h/******************************************************************** ***//****** EEPROM memory read/write macros and function definitions *******//******************************************************************** ***//* NOTE WELL:The macro EEPROM_READ() is NOT safe to use immediately after anywrite to EEPROM, as it does NOT wait for WR to clear. This is bydesign, to allow minimal code size if a sequence of reads isdesired. To guarantee uncorrupted writes, use the functioneeprom_read() or insertwhile(WR)continue;before calling EEPROM_READ().*/#if EEPROM_SIZE > 0#ifdef __FLASHTYPE// macro versions of EEPROM write and read#define EEPROM_WRITE(addr, value) \do{ \while(WR)continue;EEADRL=(addr);EEDATA=(value); \EECON1&=0x3F;CARRY=0;if(GIE)CARRY=1;GIE=0; \WREN=1;EECON2=0x55;EECON2=0xAA;WR=1;WREN=0; \if(CARRY)GIE=1; \}while(0)#define EEPROM_READ(addr)((EEADRL=(addr)),(EECON1&=0x3F),(RD=1),EEDATA)#else // else doesn't write flash#define EEPROM_WRITE(addr, value) \do{ \while(WR)continue;EEADRL=(addr);EEDATA=(value); \CARRY=0;if(GIE)CARRY=1;GIE=0; \WREN=1;EECON2=0x55;EECON2=0xAA;WR=1;WREN=0; \if(CARRY)GIE=1; \}while(0)#define EEPROM_READ(addr) ((EEADRL=(addr)),(RD=1),EEDATA) #endif/* library function versions */extern void eeprom_write(unsigned char addr, unsigned char value); extern unsigned char eeprom_read(unsigned char addr);#endif // end EEPROM routines看到这里就知道了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
while(EECR & (1 << EEWE));
EEAR= uiAddress;
EECR |= (1 << EERE);
return EEDR;
DataTemp=DataTemp%100000;
ReadData[1]=DataTemp/10000;
DataTemp=DataTemp%10000;
ReadData[2]=DataTemp/1000;
DataTemp=DataTemp%1000;
ReadData[3]=DataTemp/100;
{
unsigned long TR_APDU_Buffer[6];
unsigned char i;
unsigned long TestCoun=0;
TR_APDU_Buffer[0]=EEPROM_Read2(AddrH,0x0C);
TR_APDU_Buffer[1]=EEPROM_Read2(AddrH,0x0D);
EEPROM_Write(EEPAdr+0x10+ ReadData[3]*11,ReadData[4]);
EEPROM_Write(EEPAdr+0x10+ ReadData[4]+1+ReadData[3]*11,ReadData[5]);
}
unsigned long ReadTestCounter(unsigned char AddrH)
void EEPROM_Write(unsigned int uiAddress, unsigned char ucData)
{
while(EECR & (1 << EEWE));
EEAR = uiAddress;
EEDR = ucData;
EECR |= (1 << EEMWE);
//+TR_APDU_Buffer[3]*100+TR_APDU_Buffer[4]*10+TR_APDU_Buffer[5]);
return TestCoun;
}
/********************************************************************/
EECR |= (1 << EERE);
return EEDR;
}
//==========================================
//写数据到E2P中设定的地址空间中
//
//==========================================
if(ReadData[3]!=EEPROM_Read2(EEPAdrH,0x0F))
EEPROM_Write(EEPAdr+0x0F, ReadData[3]);
if(ReadData[4]!=EEPROM_Read2(EEPAdrH,0x10+ ReadData[3]*11))
if(ReadData[1]!=EEPROM_Read2(EEPAdrH,0x0D))
EEPROM_Write(EEPAdr+0x0D, ReadData[1]);
if(ReadData[2]!=EEPROM_Read2(EEPAdrH,0x0E))
EEPROM_Write(EEPAdr+0x0E, ReadData[2]);
TR_APDU_Buffer[2]=EEPROM_Read2(AddrH,0x0E);
TR_APDU_Buffer[3]=EEPROM_Read2(AddrH,0x0F);
TR_APDU_Buffer[4]=EEPROM_Read2(AddrH,0x10+TR_APDU_Buffer[3]*11);
}
for(i=0;i<6;i++)
{
TestCoun= TestCoun*10+TR_APDU_Buffer[i];
}
//TestCoun=(TR_APDU_Buffer[0]*100000+TR_APDU_Buffer[1]*10000+TR_APDU_Buffer[2]*1000
EEPAdrL=(EEPAdr & (unsigned int)0xFF);
DataTemp=XCounter;
for(i=0;i<6;i++)
ReadData[i]=0;
if(DataTemp>=1000000)
DataTemp=0;
ReadData[0]=DataTemp/100000;
//#define uchar unsigned char
//#define uint unsigned int
//#define ulong unsigned long
unsigned char EEPROM_Read(unsigned int uiAddress);
unsigned char EEPROM_Read2(unsigned char uiAddress2,unsigned char uiAddress1);
void EEPROM_Write(unsigned int uiAddress, unsigned char ucData);
void WriteTestCounterToEEP(unsigned long XCounter,unsigned int EEPAdr);
unsigned long ReadTestCounter(unsigned char AddrH);
TR_APDU_Buffer[5]=EEPROM_Read2(AddrH,0x10+TR_APDU_Buffer[3]*11+TR_APDU_Buffer[4]+1);
if(TR_APDU_Buffer[0]==0xFF)
{
for(i=0;i<6;i++) TR_APDU_Buffer[i]=0x00;
}
unsigned char EEPROM_Read2(unsigned char uiAddress2,unsigned char uiAddress1)
{
while(EECR & (1 << EEWE));
EEARL = uiAddress1;
EEARH=uiAddress2;
{
unsigned char ReadData[6];
unsigned long DataTemp;
unsigned char i;
unsigned char EEPAdrL,EEPAdrH;
EEPAdrH=((EEPAdr>>8) & (unsigned int)0xFF);
//个位为每11个存储区的后10中的循环存储位置,
// 具体位置有十位的数值决定
//=========================================
void WriteTestCounterToEEP(unsigned long XCounter,unsigned int EEPAdr)
EECR |= (1 << EEWE);
}
//=========================================
//循环往EEP中写数据
//需开辟11*10+4个存储区
//高4位固定地址,十位和个位为循环存储
//-11*10存储区的分配为十位在每11个存储区的第一个位置
/********************************************************************/
//#include <io_define.h>
#include <iom64v.h>
//#include <macros.h>
//#include <card.h>
DataTemp=DataTemp%100;
ReadData[4]=DataTemp/10;
ReadData[5]=DataTemp%10;
if(ReadData[0]!=EEPROM_Read2(EEPAdrH,0x0C))
EEPROM_Write(EEPAdr+0x0C, ReadData[0]);