⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 24c041.c

📁 按键证明24C04功能
💻 C
字号:
/*****************************************/
/*作    者:焦建国  指导老师:宋树祥     */
/* function:按K1键从0到7显示,按K2清除24C04中的数据*/
/*2007-2,               湖南工学院 	 */
/*****************************************///除去两个按键的功能为最简24C04子程序
#include <reg52.h>
#include <intrins.h>

#define	OP_READ	0xa1		// 器件地址以及读取操作
#define	OP_WRITE 0xa0		// 器件地址以及写入操作
#define	MAX_ADDR 0xfe		// AT24C02最大地址

unsigned char code dis_code[16] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; ///*0,1,2,3,4,5,6,7,8,9,A,b,C,d,E,F,*/

				// 写入到AT24C01的数据串

sbit SDA = P3^4;//P3^0;
sbit SCL = P3^3;// P3^1;


void start();
void stop();
unsigned char shin();
bit shout(unsigned char write_data);
unsigned char read_random(unsigned char random_addr);
void write_byte( unsigned char addr, unsigned char write_data);
void fill_byte(unsigned char fill_data);
void delayms(unsigned char ms);
sbit k1=P1^0;
sbit k2=P1^1;

main(void)
{
	unsigned char i;
	SDA = 1;
	SCL = 1;
//	fill_byte(0xff);		// 全部填充0xff

//	for(i = 0 ; i < 8; i++)		//写入显示代码到AT24Cxx
//	{
//		write_byte(i, dis_code[i]);
//	}

//	i = 0;
   
	while(1)
	{ 
	   if(k1==0)	  //写入显示代码到AT24Cxx
	    {
		for(i = 0 ; i < 16; i++)
		write_byte(i, dis_code[i]);
		  }
	   if(k2==0)
		  fill_byte(0xff);

		  		 
		  P0 = read_random(i);	// 循环读取24Cxx内容,并输出到P0口
		  P2 = 0xdf;

		  i++;
		  i =i& 0x0f;		// 循环读取范围为0x00~0x07	   
		  delayms(250);	delayms(100);
	}
}

void start()
// 开始位
{
	SDA = 1;
	SCL = 1;
	_nop_();
	_nop_();
	SDA = 0;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	SCL = 0;
}

void stop()
// 停止位
{
	SDA = 0;
	_nop_();
	_nop_();
	SCL = 1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	SDA = 1;//--焦建国制作
}

unsigned char shin()
// 从AT24Cxx移入数据到单片机
{
	unsigned char i,read_data;
	for(i = 0; i < 8; i++)
	{
		SCL = 1;
		read_data <<= 1;
		read_data |= (unsigned char)SDA;
		SCL = 0;
	}
	return(read_data);
}
bit shout(unsigned char write_data)
// 从单片机移出数据到AT24Cxx
{
	unsigned char i;
	bit ack_bit;
	for(i = 0; i < 8; i++)		// 循环移入8个位
	{
		SDA = (bit)(write_data & 0x80);
		_nop_();
		SCL = 1;
		_nop_();
		_nop_();
		SCL = 0;
		write_data <<= 1;
	}
	SDA = 1;			// 读取应答
	_nop_();
	_nop_();
	SCL = 1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	ack_bit = SDA;
	SCL = 0;
	return ack_bit;			// 返回AT24Cxx应答位
}

void write_byte(unsigned char addr, unsigned char write_data)
// 在指定地址addr处写入数据write_data
{
	start();
	shout(OP_WRITE);
	shout(addr);
	shout(write_data);
	stop();
	delayms(10);		// 写入周期
}

void fill_byte(unsigned char fill_data)
// 填充数据fill_data到EEPROM内
{
	unsigned char i;
	for(i = 0; i < MAX_ADDR; i++)
	{
		write_byte(i, fill_data);
	}

}

unsigned char read_current()
// 在当前地址读取
{
	unsigned char read_data;
	start();
	shout(OP_READ);
	read_data = shin();
	stop();
	return read_data;
}

unsigned char read_random(unsigned char random_addr)
// 在指定地址读取
{
	start();
	shout(OP_WRITE);
	shout(random_addr);
	return(read_current());
}

void delayms(unsigned char ms)	
// 延时子程序
{
	unsigned char i;
	while(ms--)
	{
		for(i = 0; i < 120; i++);
	}
}

⌨️ 快捷键说明

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