由原理图可知,SCL,SDA对应PB6,PB7。此方法为软件模拟iic *** 作,本次实验将实现对AT24C02指定地址进行数据的存储和读取,并将数据用lcd显示。此工程直接使用的官方例程提供的iic文件,关于iIc,AT24C02的原理在这里不再叙述。
时钟,时钟树配置不再叙述。
其实本次实验直接生成工程即可,不需要配置GPIO,因为在iic文件里有配置相关引脚的函数,不过我们在这配置也没关系,模式什么的不用管,想了解的同学可以去查看i2c.c文件的start函数。
生成工程即可。
我们需要添加用户代码,本次工程涉及lcd,iic两个文件夹:
链接:https://pan.baidu.com/s/1XBkoEnNFpfE1Y-dUVCRW5Q
提取码:6666
将user文件夹放在工程目录下,并且在工程里添加路径。(往节都有介绍)
main.h添加的头文件:
#include "lcd.h" #include "i2c.h" #include "stdio.h"
main.c定义变量:
uint8_t val = 0; // 存入数据的初始值 char buf[20]; // 用来显示一行lcd的字符串
AT24C02的读,写代码:
// AT24C02读取指定地址数据 uint8_t AT24C02_Read(uint8_t address) { unsigned char val; I2CStart(); I2CSendByte(0xa0); I2CWaitAck(); I2CSendByte(address); I2CWaitAck(); I2CStart(); I2CSendByte(0xa1); I2CWaitAck(); val = I2CReceiveByte(); I2CWaitAck(); I2CStop(); return(val); } // AT24C02在指定地址写数据 void AT24C02_Write(unsigned char address,unsigned char data) { I2CStart(); I2CSendByte(0xa0); I2CWaitAck(); I2CSendByte(address); I2CWaitAck(); I2CSendByte(data); I2CWaitAck(); I2CStop(); }
main函数里的代码:
I2CInit(); // ----------- LCD_Init(); //i2c和lcd的初始化——白底清屏,红色字体 LCD_Clear(White); LCD_SetBackColor(White); LCD_SetTextColor(Red); // ----------- AT24C02_Write(0, val); // 先向指定地址写入初始数据 HAL_Delay(100); // 写入需要一定的时间,本人测试的延迟1ms也是可以的 while (1) { val = AT24C02_Read(0); // 从指定地址读取数据 sprintf(buf, " AT24C02_data:%d ", val); // 将val值放入buf字符串中 LCD_DisplayStringLine(Line4, (uint8_t *)(buf)); // 在第四行显示buf的内容 val++; AT24C02_Write(0, val); // 将自身加一后的val值写入指定地址 HAL_Delay(1000); }运行结果
每一秒加一,当超过255时,即溢出,将重新归零。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)