📄 24c04-p0-p2-led.c
字号:
/*******************************************************************
* *
* ME500单片机开发系统演示程序 - 多花样流水灯 *
* *
* P0 P2 LED显示 *
* *
* 用数据块写方式将数据写入24C04芯片内,再将其数据读出送LED显示。 *
* *
;* 版本: V1.0 (2007/1/8) *
;* 作者: gguoqing (Email: gguoqing@willar.com) *
;* 网站: www.willar.com(伟纳电子) www.mcusj.com(伟纳单片机世界) *
;* 邮箱: support@willar.com *
* *
*【版权】Copyright(C)伟纳电子 www.willar.com All Rights Reserved *
*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息! *
* *
********************************************************************
* *
* 24C04的写入数据块最大字节数n为16,一次写入的字节数m不能多于n. *
* *
*******************************************************************/
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code senddata1[16]= {
0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,
0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF };
uchar code senddata2[16]= {
0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x00,
0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,0xFF };
uchar code senddata3[16]= {
0xFC,0xF9,0xF3,0xE7,0xCF,0x9F,0x3F,0x9F,
0xCF,0xE7,0xF3,0xF9,0xFC,0xFF,0xFF,0xFF };
uchar code senddata4[16]= {
0xE7,0xDB,0xBD,0x7E,0xBD,0xDB,0xE7,0xFF,
0xE7,0xC3,0x81,0x00,0x81,0xC3,0xE7,0xFF };
uchar idata display[64]={0xff,0xff }; //数据存储区
sbit SDA = P3^5; //串行数据
sbit SCL = P3^4; //串行时钟
bit ack;
/**********************************************************
延时子程序
**********************************************************/
void delayms(uint ms)
{
uchar k;
while(ms--)
{
for(k = 0; k < 120; k++);
}
}
/**********************************************************
4us延时函数
**********************************************************/
void delayNOP()
{
_nop_();_nop_();
_nop_();_nop_();
}
/**********************************************************
起始条件函数
**********************************************************/
void I2C_start()
{
SDA = 1;
SCL = 1;
delayNOP();
SDA = 0;
delayNOP();
SCL = 0; //准备发送或接收数据
}
/**********************************************************
停止条件函数
**********************************************************/
void I2C_stop()
{
SDA = 0;
SCL = 1;
delayNOP();
SDA = 1; //发送I2C总线结束信号
delayNOP();
SCL = 0;
}
/**********************************************************
I2C总线初始化函数
**********************************************************/
void I2C_init()
{
SCL = 0;
I2C_stop();
}
/**********************************************************
发送应答子函数
**********************************************************/
void I2C_Ack()
{
SDA = 0;
SCL = 1;
delayNOP();
SCL = 0;
SDA = 1;
}
/**********************************************************
发送非应答子函数
**********************************************************/
void I2C_NAck()
{
SDA = 1;
SCL = 1;
delayNOP();
SCL = 0;
SDA = 0;
}
/**********************************************************
从AT24C02移出数据到MCU
**********************************************************/
uchar RecByte()
{
uchar i,read_data;
read_data=0x00;
SDA=1; //置数据线为输入方式
for(i = 0; i < 8; i++)
{
SCL = 1;
read_data <<= 1;
read_data |= SDA;
delayNOP();
SCL = 0;
delayNOP();
}
SCL = 0;
delayNOP();
return(read_data);
}
/**********************************************************
字节数据传送函数
写数据到AT24C04,
ack=1,发送正常。ack=0,表示接收器无应答或损害。
**********************************************************/
uchar SendByte(uchar write_data)
{
uchar i;
for(i = 0; i < 8; i++) //循环移入8个位
{
SDA = (bit)(write_data & 0x80);
_nop_();
_nop_();
SCL = 1;
delayNOP();
SCL = 0;
write_data <<= 1;
}
delayNOP();
SDA = 1; //释放总线,准备读取应答
SCL = 1;
delayNOP();
if(SDA==1) ack=0; //ack=0,表示非应答
else ack=1;
SCL = 0;
delayNOP();
return ack; //返回AT24C04应答位
}
/**********************************************************
发送多字节数据函数
**********************************************************/
uchar SendString(uchar Slave,uchar Subaddr,uchar *Source,uchar Num)
{
uchar s;
I2C_start();
SendByte(Slave); //发送器件地址
if(ack==0) return(0);
SendByte(Subaddr); //发送器件子地址
if(ack==0) return(0);
for(s=0; s<Num; s++)
{
SendByte(*Source); //发送数据
if(ack==0) return(0);
Source++;
}
I2C_stop(); //结束总线
return(1);
}
/**********************************************************
接收多字节数据函数
**********************************************************/
uchar RecString(uchar Slave,uchar Subaddr,uchar *Source,uchar Num)
{
uchar s;
I2C_start();
SendByte(Slave); //发送器件地址
if(ack==0) return(0);
SendByte(Subaddr); //发送器件子地址
if(ack==0) return(0);
I2C_start();
SendByte(Slave+1); //发送器件地址
if(ack==0) return(0);
for(s=0; s<Num; s++)
{
*Source=RecByte(); //接收数据
I2C_Ack(); //发送应答位
Source++;
}
I2C_NAck(); //发送非应答
I2C_stop(); //结束总线
return(1);
}
/**********************************************************
主函数
**********************************************************/
main(void)
{
uchar i,temp;
I2C_init();
SendString(0xa0,0x00,senddata1,16);
delayms(5);
SendString(0xa0,0x10,senddata2,16);
delayms(5);
SendString(0xa0,0x20,senddata3,16);
delayms(5);
SendString(0xa0,0x30,senddata4,16);
delayms(500);
RecString(0xa0,0x00,display,64); //从AT24C04读出数据
while(1)
{
for(i=0; i<64; i++) //显示数据
{
temp= display[i];
P0 = temp;
P2 = temp;
delayms(300);
}
}
}
/**********************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -