24c02.c

来自「简单的24c02驱动程序 下午写了个24c02的驱动程序」· C语言 代码 · 共 167 行

C
167
字号
#include <reg52.h>

#define uchar unsigned char //定义一下方便使用
#define uint unsigned int
#define ulong unsigned long



sbit SCL=P3^7;               //24c02时钟信号
sbit SDA=P3^6;               //24c02数据端


/************************************
              延时程序
*************************************/
void delay()
{
	uchar i;
	for(i=248;i>0;i--);
}

/************************************
              开始总线
*************************************/
void start()
{
	SDA=1;
	SCL=1;
	SDA=0;
	SCL=0;
}

/*************************************
              结束总线
**************************************/
void stop()
{
	SCL=0;
	SDA=0;
	SCL=1;
	SDA=1;
}

/*************************************
               发ack0
**************************************/
void noack()
{
	SDA=1;
	SCL=1;
	SCL=0;
}

/*************************************
             应答子函数
**************************************/
bit ack()
{
	bit e;
	SDA=1;
	SCL=1;
	e=SDA;
	SCL=0;
	return(e);
}

/**************************************
            写8个bit到24C02
			为写字节作准备
**************************************/
void wb(uchar input)
{
	uchar j;
	for(j=8;j>0;j--)
	{
		SDA=(bit)(input&0x80);
		SCL=1;
		SCL=0;
		input=input<<1;
	}
}

/***************************************
           写一个字节到24c02
****************************************/
void w(uchar d,uchar a)
{
	start();

	wb(0xa0);    //写入指令0xa0,该指令表示准备对24c02进行写操作
    ack();

	wb(a);		 //先写要存数据的地址
	ack();

	wb(d);		 //再写要存数据
    ack();

	stop();
	delay();
}


/**************************************
          从24C02中读8个bit
		   为读字节作准备
***************************************/
uchar rb()
{
	uchar j,rb=0;
	for(j=8;j>0;j--)
	{
		SCL=1;
	    rb=rb<<1;
	    rb=rb|((uchar)(SDA));
	    SCL=0;
	}
	return(rb);
}

/****************************************
          从24c02中读一个字节
*****************************************/
uchar r(uchar a)
{
	uchar d;		  //读操作得到的数据

	start();
	wb(0xa0);	      //写入指令0xa0,该指令表示准备对24c02进行写操作
	ack();
	wb(a);			  //写入要读数据的地址a
	ack();

	start();
	wb(0xa1);		  //写入指令0xa1,该指令表示准备对24c02进行读操作
	ack();
	d=rb();			  //从地址a中读出数据
	noack();
	stop();

	return(d);		  // 返回得到的数据
}


/****************************************
              试验主函数
*****************************************/
void main(void)
{
	uchar c1,c2;
 
	w(0xf0,0x02);        //写0xf0到地址0x02
	w(0x0f,0x03);        //写0x0f到地址0x03

	c1=r(0x02);          //从地址0x02读出数据
    c2=r(0x03);          //从地址0x03读出数据

	P1=c1;
	P2=c2;
	while(1);           //程序挂起
}





⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?