📄 iic.c.bak
字号:
#include"reg51.h"
sbit IIC_SDA=P3^7; /*IIC总线SDA引脚定义*/
sbit IIC_SCL=P3^6; /*IIC总线SCL引脚定义*/
#define uchar unsigned char
#define uint unsigned int
#define IC24X_ORDER_WRITE 0xa0 /*AT24C02写指令*/
#define IC24X_ORDER_READ 0xa1 /*AT24C02读指令*/
#define IIC_TLOW 10 /*IIC总线等待时间*/
uchar code dsp[72]={
0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,
0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF,
0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x00,
0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,0xFF,
0xFC,0xF9,0xF3,0xE7,0xCF,0x9F,0x3F,0x9F,
0xCF,0xE7,0xF3,0xF9,0xFC,0xFF,0xE7,0xDB,
0xBD,0x7E,0xBD,0xDB,0xE7,0xFF,0xE7,0xC3,
0x81,0x00,0x81,0xC3,0xE7,0xFF,0xAA,0x55,
0x18,0xFF,0xF0,0x0F,0x00,0xFF,0x00,0xFF};
void IicDelay();
void IicStart();
void IicStop();
void IicAck();
void IicNAck();
void IicWrite(uchar ucData);
uchar IicRead();
void AT24C02WriteByte(uint uiAddr,uchar ucData);
uchar AT24C02ReadByte(uint uiAddr);
/*****************************************************************************
名称: AT24C02WriteByte()
说明: AT24C02写操作
参数: uint uiAddr 地址
uchar ucData 数据
返回: 无
*****************************************************************************/
void AT24C02WriteByte(uint uiAddr,uchar ucData)
{
IicStart();
IicWrite(IC24X_ORDER_WRITE);
IicAck();
IicWrite(uiAddr);
IicAck();
IicWrite(ucData);
IicAck();
IicStop();
IicDelay();
}
/*****************************************************************************
名称: AT24C02ReadByte()
说明: AT24C02读操作
参数: uint uiAddr 地址
返回: uchar 数据
*****************************************************************************/
uchar AT24C02ReadByte(uint uiAddr)
{
uchar ucData;
IicStart();
IicWrite(IC24X_ORDER_WRITE);
IicAck();
IicWrite(uiAddr);
IicAck();
IicStart();
IicWrite(IC24X_ORDER_READ);
IicAck();
ucData=IicRead();
IicNAck();
IicStop();
return ucData;
}
/****************************************************************************
说明: IIC总线处理函数
*****************************************************************************/
void IicDelay(void) /*内部涵数*/
{
uchar a;
for(a=0;a<IIC_TLOW;a++);
}
void IicStart(void) /*内部涵数*/
{
IIC_SDA=1;
IIC_SCL=1;
IicDelay();
IIC_SDA=0;
IicDelay();
IIC_SCL=0;
}
void IicStop(void) /*内部涵数*/
{
IIC_SCL=0;
IIC_SDA=0;
IIC_SCL=1;
IIC_SDA=1;
}
void IicAck(void) /*内部涵数*/
{
IIC_SDA=0;
IIC_SCL=1;
IicDelay();
IIC_SCL=0;
IIC_SDA=1;
}
void IicNAck(void) /*内部涵数*/
{
IIC_SDA=1;
IIC_SCL=1;
IicDelay();
IIC_SDA=0;
IIC_SCL=0;
}
void IicWrite(uchar ucData) /*内部涵数*/
{
uchar a;
for(a=0;a<8;a++)
{
if(ucData&0x80)
{
IIC_SDA=1;
}
else
{
IIC_SDA=0;
}
IIC_SCL=1;
IIC_SCL=0;
ucData=ucData<<1;
}
}
uchar IicRead(void) /*内部涵数*/
{
uchar a,ucData=0;
for(a=0;a<8;a++)
{
IIC_SDA=1;
IIC_SCL=1;
ucData<<=1;
if(IIC_SDA==1)
{
ucData|=0x01;
}
else
{
ucData&=0xfe;
}
IIC_SCL=0;
}
return ucData;
}
/*********************************************************************/
void delay(uchar j) /*延时*/
{
uchar k,l;
for(l=0;l<=j;l++)
for(k=0;k<=250;k++);
}
/*********************************************************************/
void main(void)
{
uchar i;
IIC_SCL=0; /*IIC时钟引脚至0*/
for(i=0;i<72;i++){AT24C02WriteByte(i,dsp[i]);delay(1);} /*将dsp数组的数据写入24c02*/
while(1)
{
for(i=0;i<72;i++){P0=AT24C02ReadByte(i);delay(80);} /*读出24c02中的数据并送P0口显示*/
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -