📄 2402.c
字号:
/************************************************************************************/
/* 程序名:AT24C02的读取操作 */
/* */
/* 晶振:12.0 M CPU型号:AT89S52 */
/* */
/* */
/* 功能描述: 对单个AT24C02进行读和写的操作 */
/* */
/* http://www.mculover.net */
/* http://www.mculover.net/bbs */
/* */
/* */
/* 湘灵电子工作室 版权所有 */
/* 2006-02-20 */
/************************************************************************************/
#include "ir_type.h"
//#include "24C02.h"
#define TRUE 1
#define FALSE 0
#define Delay_TIME 60 /*经实验,不要小于50!否则可能造成时序混乱*/
//unsigned char seg_tab[] = {0x41, 0xf5, 0x29, 0x31, 0x95, 0x13, 0x03, 0x75, 0x01, 0x11};//0-9数字
//static unsigned char DC=0x00;
/********** Function Definition 函数定义 ************/
void Delay2(unsigned int t) /*延时函数*/
{
while(t!=0)
t--;
}
void I2C_Start(void)
{
/*启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变*/
SDA=1;
SCL=1;
Delay2(Delay_TIME);
SDA=0;
Delay2(Delay_TIME);
SCL=0;
Delay2(Delay_TIME);
}
void I2C_Stop(void)
{
/*终止I2C总线,当SCL为高电平时使SDA产生一个正跳变*/
SDA=0;
SCL=1;
Delay2(Delay_TIME);
SDA=1;
Delay2(Delay_TIME);
SCL=0;
Delay2(Delay_TIME);
}
void SEND_0(void) /* SEND ACK */
{
/*发送0,在SCL为高电平时使SDA信号为低*/
SDA=0;
SCL=1;
Delay2(Delay_TIME);
SCL=0;
Delay2(Delay_TIME);
}
void SEND_1(void)
{
/*发送1,在SCL为高电平时使SDA信号为高*/
SDA=1;
SCL=1;
Delay2(Delay_TIME);
SCL=0;
Delay2(Delay_TIME);
}
bit Check_Acknowledge(void)
{
/*发送完一个字节后检验设备的应答信号*/
SDA=1;
SCL=1;
Delay2(Delay_TIME/2);
F0=SDA;
Delay2(Delay_TIME/2);
SCL=0;
Delay2(Delay_TIME);
if(F0==1)
return FALSE;
return TRUE;
}
void WriteI2CByte(unsigned char b)reentrant
{
/*向I2C总线写一个字节*/
unsigned char i;
for(i=0;i<8;i++)
if((b<<i)&0x80)
SEND_1();
else
SEND_0();
}
unsigned char ReadI2CByte(void)reentrant
{
/*从I2C总线读一个字节*/
unsigned char b=0,i;
for(i=0;i<8;i++)
{
SDA=1; /*释放总线*/
SCL=1; /*接受数据*/
Delay2(10);
F0=SDA;
Delay2(10);
SCL=0;
if(F0==1)
{
b=b<<1;
b=b|0x01;
}
else
b=b<<1;
}
return b;
}
/**********以下为读写24c02的函数******************************/
void Write_One_Byte(unsigned char addr,unsigned char thedata)
{
bit acktemp=1;
/*write a byte to mem*/
I2C_Start();
WriteI2CByte(0xa0);
acktemp=Check_Acknowledge();
WriteI2CByte(addr); /*address*/
acktemp=Check_Acknowledge();
WriteI2CByte(thedata); /*thedata*/
acktemp=Check_Acknowledge();
I2C_Stop();
}
/************************************************************/
unsigned char Read_One_Byte(unsigned char addr)
{
bit acktemp=1;
unsigned char mydata;
/*read a byte from mem*/
I2C_Start();
WriteI2CByte(0xa0);
acktemp=Check_Acknowledge();
WriteI2CByte(addr);/*address*/
acktemp=Check_Acknowledge();
I2C_Start();
WriteI2CByte(0xa1);
acktemp=Check_Acknowledge();
mydata=ReadI2CByte();
acktemp=Check_Acknowledge();
return mydata;
I2C_Stop();
}
//调用方式如下:
//Write_One_Byte(0x10,0x04);
//k=Read_One_Byte(0x10);
/*************************************************
void main(void)
{
unsigned char tmp;
LED= 0;//选择数码管的第一位显示
while(1)
{
if(K2 == 0)//判断K5是否被按下
{
Delay(500);//延时消抖
if(K2 == 0)
{
Write_One_Byte(DC,0x07);//往2402的0X04地址写如数值0X07
}
}
if(K3 == 0)
{
Delay(500);
if(K3 == 0)
{
tmp = Read_One_Byte(DC);//将读出来的数值给tmp
//P0 = seg_tab[tmp];
LED=tmp;
Delay(50000);
}
}
}
}
*****************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -