2kbit 的eeprom存储器
设备地址:0xA1是读操作 0xA0是写操作
写操作:需要写入地址和数据,地址用来存放你这个数据放到哪里的
eeprom有页写操作:24c02中有页写缓冲器,一次性可以写入8个字节,然后由缓冲器再次写入到eeprom中去,值的注意的是,每接收完一个数据后,地址会进行自动加1
写字节:参数有地址 和数据
iic初始化
iic写入设备的的地址
等待应答
iic写入要存储的数据的内存地址
等待应答
iic写入数据
等待应答
iic终止信号
读字节:读取地址,返回类型为 char型
首先进行伪写操作让从机产生应答
iic初始化
iic写入设备地址
等待应答
iic写入字节地址
等待应答
iic初始化
iic写入要读取设备数据的控制命令字
等待应答
创建变量接收 iic上返回的数据
产生非应答信号
iic终止信号
返回变量
读写数据函数:
创建变量接收地址的值,
对值进行操作,然后重新写入到eeprom中去
#include <STC15F2K60S2.H>
#include "iic.h"
unsigned char dat_1=0;
unsigned char dat_2=0;
unsigned char dat_3=0;
unsigned char stat=0;
code SMG_NoDot[18] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
0xbf,0x7f};
void select138(unsigned char n)
{
switch(n)
{
case 4:
P2=(0x1f&P2)|0x80;
break;
case 5:
P2=(0x1f&P2)|0xa0;
break;
case 6:
P2=(0x1f&P2)|0xc0;
break;
case 7:
P2=(0x1f&P2)|0xe0;
break;
case 0:
P2=(0x1f&P2)|0x00;
break;
}
}
void smgshow_bite(unsigned char date,unsigned char pos)
{
select138(6);
P0=0x01<<pos;
select138(7);
P0=date;
}
void smgshowall()
{
select138(6);
P0=0xff;
select138(7);
P0=0xff;
}
void delay_smg(unsigned int i)
{
while(i--);
}
void write(unsigned char dat ,unsigned char addr)
{
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(addr);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
unsigned char read(unsigned char addr)
{
unsigned char tmp;
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(addr);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0xa1);
IIC_WaitAck();
tmp= IIC_RecByte();
IIC_WaitAck();
IIC_SendAck(1);
IIC_Stop();
return tmp;
}
void write_read()
{
dat_1= read(0x01);
dat_2= read(0x03);
dat_3= read(0x05);
dat_1= dat_1+1;
dat_2= dat_2+2;
dat_3= dat_3+3;
if(dat_1>10)
{
dat_1=0;
}
if(dat_2>30)
{
dat_2=0;
}
if(dat_3>50)
{
dat_3=0;
}
write(dat_1,0x01);
delay_smg(500);
write(dat_1,0x03);
delay_smg(500);
write(dat_1,0x05);
delay_smg(500);
}
void showsmg()
{
smgshow_bite(SMG_NoDot[dat_1/10],0);
delay_smg(500);
smgshow_bite(SMG_NoDot[dat_1%10],1);
delay_smg(500);
smgshow_bite(SMG_NoDot[16],2);
delay_smg(500);
smgshow_bite(SMG_NoDot[dat_2/10],3);
delay_smg(500);
smgshow_bite(SMG_NoDot[dat_2%10],4);
delay_smg(500);
smgshow_bite(SMG_NoDot[16],5);
delay_smg(500);
smgshow_bite(SMG_NoDot[dat_3/10],6);
delay_smg(500);
smgshow_bite(SMG_NoDot[dat_3%10],7);
delay_smg(500);
smgshowall();
}
void main()
{
write_read();
while(1)
{
showsmg();
}
}