📄 24c041.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 + -