目录
1.元件介绍
2.存储器
3.地址总线和数据总线
地址总线只能一次选中一行
4.引脚及应用电路
5.I2C总线
6.电路规范
9.AT24C02数据帧
通过独立按键控制,独立按键K1使数值加一,
独立按键K2使数值减一,独立按键K3写入数据,独立按键K4读出数据
首先是要根据I2C的时序逻辑写对应的实现函数
- #include <REGX52.H>
-
- sbit I2C_SCL=P2^1;
- sbit I2C_SDA=P2^0;
-
- /**
- * @brief I2C开始
- * @param 无
- * @retval 无
- */
- void I2C_Start(void)
- {
- I2C_SDA=1;
- I2C_SCL=1;
- I2C_SDA=0;
- I2C_SCL=0;
- }
-
- /**
- * @brief I2C停止
- * @param 无
- * @retval 无
- */
- void I2C_Stop(void)
- {
- I2C_SDA=0;
- I2C_SCL=1;
- I2C_SDA=1;
- }
-
- /**
- * @brief I2C发送一个字节
- * @param Byte 要发送的字节
- * @retval 无
- */
- void I2C_SendByte(unsigned char Byte)
- {
- unsigned char i;
- for(i=0;i<8;i++)
- {
- I2C_SDA=Byte&(0x80>>i);
- I2C_SCL=1;
- I2C_SCL=0;
- }
- }
-
- /**
- * @brief I2C接收一个字节
- * @param 无
- * @retval 接收到的一个字节数据
- */
- unsigned char I2C_ReceiveByte(void)
- {
- unsigned char i,Byte=0x00;
- I2C_SDA=1;
- for(i=0;i<8;i++)
- {
- I2C_SCL=1;
- if(I2C_SDA){Byte|=(0x80>>i);}
- I2C_SCL=0;
- }
- return Byte;
- }
-
- /**
- * @brief I2C发送应答
- * @param AckBit 应答位,0为应答,1为非应答
- * @retval 无
- */
- void I2C_SendAck(unsigned char AckBit)
- {
- I2C_SDA=AckBit;
- I2C_SCL=1;
- I2C_SCL=0;
- }
-
- /**
- * @brief I2C接收应答位
- * @param 无
- * @retval 接收到的应答位,0为应答,1为非应答
- */
- unsigned char I2C_ReceiveAck(void)
- {
- unsigned char AckBit;
- I2C_SDA=1;
- I2C_SCL=1;
- AckBit=I2C_SDA;
- I2C_SCL=0;
- return AckBit;
- }
其次在AT24C02中调用I2C的函数,并结合AT24C02自己的时序结构写函数
- #include <REGX52.H>
- #include "I2C.h"
-
- #define AT24C02_ADDRESS 0xA0
-
- /**
- * @brief AT24C02写入一个字节
- * @param WordAddress 要写入字节的地址
- * @param Data 要写入的数据
- * @retval 无
- */
- void AT24C02_WriteByte(unsigned char WordAddress,Data)
- {
- I2C_Start();
- I2C_SendByte(AT24C02_ADDRESS);
- I2C_ReceiveAck();
- I2C_SendByte(WordAddress);
- I2C_ReceiveAck();
- I2C_SendByte(Data);
- I2C_ReceiveAck();
- I2C_Stop();
- }
-
- /**
- * @brief AT24C02读取一个字节
- * @param WordAddress 要读出字节的地址
- * @retval 读出的数据
- */
- unsigned char AT24C02_ReadByte(unsigned char WordAddress)
- {
- unsigned char Data;
- I2C_Start();
- I2C_SendByte(AT24C02_ADDRESS);
- I2C_ReceiveAck();
- I2C_SendByte(WordAddress);
- I2C_ReceiveAck();
- I2C_Start();
- I2C_SendByte(AT24C02_ADDRESS|0x01);
- I2C_ReceiveAck();
- Data=I2C_ReceiveByte();
- I2C_SendAck(1);
- I2C_Stop();
- return Data;
- }
最后在main函数中实现按键与LCD1602显示的逻辑
- #include <REGX52.H>
- #include "LCD1602.h"
- #include "Key.h"
- #include "AT24C02.h"
- #include "Delay.h"
-
- unsigned char KeyNum;
- unsigned int Num;
-
- void main()
- {
- LCD_Init();
- LCD_ShowNum(1,1,Num,5);
- while(1)
- {
- KeyNum=Key();
- if(KeyNum==1) //K1按键,Num自增
- {
- Num++;
- LCD_ShowNum(1,1,Num,5);
- }
- if(KeyNum==2) //K2按键,Num自减
- {
- Num--;
- LCD_ShowNum(1,1,Num,5);
- }
- if(KeyNum==3) //K3按键,向AT24C02写入数据
- {
- AT24C02_WriteByte(0,Num%256);
- Delay(5);
- AT24C02_WriteByte(1,Num/256);
- Delay(5);
- LCD_ShowString(2,1,"Write OK");
- Delay(1000);
- LCD_ShowString(2,1," ");
- }
- if(KeyNum==4) //K4按键,从AT24C02读取数据
- {
- Num=AT24C02_ReadByte(0);
- Num|=AT24C02_ReadByte(1)<<8;
- LCD_ShowNum(1,1,Num,5);
- LCD_ShowString(2,1,"Read OK ");
- Delay(1000);
- LCD_ShowString(2,1," ");
- }
- }
- }
效果展示
原理图