📄 at24c256.h
字号:
#ifndef AT24C256_H
#define AT24C256_H
#include <at89x52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SCL=P3^6; //AT24C02-256的接线脚
sbit SDA=P3^7;
bit errorflag=1;
void delay24c256(unsigned char count); //延时函数
void start_24c256(void); //启动
void stop_24c256(void); //结束
bit recack_24c256(void); //应答检查
void noack_24c256(void); //不应答
void ack_24c256(void); //应答
unsigned char receivebyte(void); //读1字节
void sendbyte(unsigned char sendbyte); //写1字节
void write_24c256(uchar Data,uint add); //往地址add处写入1字节数据Data
uchar read_24c256(uint add); //从地址add处读取1字节数据
/*----------------------------------------------
调用方式:uchar read24c16(uint address)
函数说明:读24c16指定地址数据(字节读)
-----------------------------------------------*/
uchar read_24c256(uint add)
{
uchar data rdata;
uchar i=8;
while(1)
{
start_24c256();
sendbyte(0xA0);
if(recack_24c256())continue;
sendbyte(add/256);
if(recack_24c256())continue;
sendbyte(add%256);
if(recack_24c256())continue;
start_24c256();
sendbyte(0xA1);
if(recack_24c256())continue;
rdata=receivebyte();
noack_24c256();
break;
}
stop_24c256();
return rdata;
}
/*-----------------------------------------------
调用方式:void write24c16(uint address,uchar ddata)
函数说明:写数据到24c16的指定地址(字节写)
-----------------------------------------------*/
void write_24c256(uchar Data,uint add)
{
while(1)
{
start_24c256();
sendbyte(0xA0);
if(recack_24c256())continue;
sendbyte(add/256);
if(recack_24c256())continue;
sendbyte(add%256);
if(recack_24c256())continue;
sendbyte(Data);
if(recack_24c256())continue;
break;
}
stop_24c256();
}
/*==================================================*/
/* 启动函数 */
/*==================================================*/
void start_24c256()
{
SCL=0; //先拉低SCL以改变SDA
SDA=1; //SCL为高电平时,SDA的下降沿表示启动,故先拉高SDA
_nop_();//延时
_nop_();
_nop_();
SCL=1; // 当SCL为高电平时SDA的下降沿表示开始状态
_nop_();
_nop_();
SDA=0; //给SDA下降沿表示开始
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0; //恢复低电平以改变SDA的值
SDA=1;
}
/*==================================================*/
/* 停止函数 */
/*==================================================*/
void stop_24c256() //停止函数
{
SCL=0;
SDA=0; //SCL为高电平时,SDA的上升沿表示停止,故先拉低SDA
SCL=1; //拉高SCL
_nop_();//延时
_nop_();
_nop_();
_nop_();
SDA=1; //给SDA一个上升沿以停止
_nop_();
_nop_();
SCL=0; //返回0状态以等待
}
/*=======================================================================*/
/* 检查应答 */
/*=======================================================================*/
bit recack_24c256(void)
{
SCL=0; //在SCL为0的时候改变SDA的值
SDA=1; //将SDA置1以释放总线
SCL=1; //在SCL为1的时候等待SDA值的变化,在器件接受到数据后会把SDA拉低。
_nop_();
_nop_();
_nop_();
_nop_();
CY=SDA; // 因为返回值总是放在CY中的
SCL=0;
_nop_();
return(CY); //如果为CY为低则表示接受成功,如果为高,则表示接受失败。
}
/*===================================================*/
/* 不产生应答 */
/*===================================================*/
void noack_24c256(void)
{
SDA=1;
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
}
/*===================================================*/
/* 写一字节 */
/*===================================================*/
void sendbyte(unsigned char sendbyte)
{
uchar j=8;
for(;j>0;j--)
{
SCL=0; //拉低SCL准备给上升沿
_nop_(); _nop_(); _nop_(); _nop_();//延时
sendbyte<<= 1; //使CY=sendbyte^7;
SDA=CY; //移位sendbyte时,移出的部分会放进CY
SCL=1; //给上升沿,发出SDA的状态值
}
SCL=0;
}
/*===================================================*/
/* 读一字节 */
/*===================================================*/
unsigned char receivebyte(void)
{
register receivebyte,i=8;
SCL=0;
while(i--)
{
SCL=1; //拉高SCL准备给下降沿
_nop_();
receivebyte=(receivebyte<<1)|SDA; //接受值左移一位把低位和SDA相或得到SDA的状态值
SCL=0; //给下降沿发出SDA的状态值
}
_nop_();
return(receivebyte);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -