📄 24c02.c
字号:
#include<reg52.h>
#include <stdio.h>
#include <intrins.h>
#include <absacc.h>
sbit RS=P1^0; //设置连接线
sbit RW=P1^1;
sbit E=P1^2;
sbit D7=P2^7;
sbit scl=P3^2; //24c02 SCL时钟线
sbit sda=P3^3; //24c02 SDA数据线
#define uchar unsigned char
#define uint unsigned int
unsigned char sec; //定义计数值,每过1 秒,sec 加1
unsigned int tcnt; //
uchar x24c02_read(uchar address); //从24c02的地址address中读取一个字节数据
void x24c02_write(uchar address,uchar info);//向24c02的address地址中写入一字节数据inf
void x24c02_init(); //24c02初始化子程序
void delay1(uchar x);
void flash();
void x24c01_init();
void start();
void stop();
void writex(uchar j);
uchar readx();
void clock();
/*******************************
以下为LCD1602的驱动程序
************************************/
busy() //系统忙检测函数
{
do {P2=0xff;
RS=0;
RW=1;
E=0;
_nop_();
E=1;
}while (D7);
}
write_com(char commend)//写命令函数
{
P2=commend;
RS=0;
RW=0;
E=0;
busy();
E=1;
}
i_lcd()//初始化函数
{
write_com(0x01);//清屏
write_com(0x38);//置功能
write_com(0x0c);//显示开
write_com(0x06);//输入模式
write_com(0x80);//显示位置
}
write_char(char lcddata)//写数据函数
{
P2=lcddata;
RS=1;
RW=0;
E=0;
busy();
E=1;
}
/*******************************
写一串数据
************************************/
write_string(char * s)
{
while (*s!=0x00)
write_char(*s++);
}
/*******************************
以上为LCD1602的驱动程序
************************************/
void delay1(uchar j)
{
uint i;
for(i=0;i<j;i++);
;
}
/*******************************
以下为24C02的驱动程序
************************************/
void flash()////延时
{;;
}
///////初始化
void x24c02_init()
{
scl=1; flash(); sda=1; flash();
}
/*******************************
以下为24C02的开始信号SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
************************************/
void start()
{
sda=1; flash(); scl=1; flash(); sda=0; flash(); scl=0; flash();
}
/*******************************
以下为24C02的结束信号//SCL为高电平时?,SDA由低电平向高电平跳变,结束传送数据。。
************************************/
void stop()
{
sda=0; flash(); scl=1; flash(); sda=1; flash();
}
/*******************************
以下为24C02的写一个字节
************************************/
void writex(uchar j)
{
uchar i,temp;
temp=j;
for (i=0;i<8;i++)
{
temp=temp<<1; scl=0; flash(); sda=CY; flash(); scl=1; flash();
}
scl=0; flash(); sda=1; flash();
}
/*******************************************
也可以这样写数据
for (i=0;i<8;i++)
{scl=0;flash();
if(temp<<i&0x80) sda=1;else sda=0;scl=1; flash();
****************************************************************************
以下为24C02的读一个字节
************************************/
uchar readx()
{
uchar i,j,k=0;
scl=0; flash(); sda=1;///数据线为输入状态
for (i=0;i<8;i++){
flash(); scl=1; flash();
if (sda==1) j=1;
else j=0;
k=(k<<1)|j; scl=0; ///////读数据 8位先传高位
}
flash(); return(k);
}
/*************************************
每次响应,保持SDA高电平///这里写法个人认为可以不同,SDA也可以是低电瓶///其次考虑建立时间
********************/
void clock() ///时钟
{
uchar i=0;
scl=1; flash();
while ((sda==1)&&(i<255))i++;
scl=0; flash();
}
uchar x24c02_read(uchar address)
{
uchar i;
start(); writex(0xa0);///写操作
clock();
writex(address);
clock();
start();
writex(0xa1); clock();//读操作
i=readx(); stop();
delay1(10);
return(i);
}
/*****************************
在起始条件之后,必须是器件的控制字节,其中高四位为器件类型识别符(不同的芯片类型有不同的定义,EEPROM一般应为1010)
接着三位为片选,最后一位为读写位,当为1时为读操作,为0时为写操作。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -