📄 eeprom.c
字号:
#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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -