STM32F407硬件IIC驱动OLED屏幕详解
创作时间:
作者:
@小白创作中心
STM32F407硬件IIC驱动OLED屏幕详解
引用
CSDN
1.
https://blog.csdn.net/weixin_64166828/article/details/143393169
概述
OLED驱动方式有8080、6800、3线/4线SPI以及IIC,能够显示字符、汉字的图片,无字库需通过取模软件获取显示内容数组。本次实验使用的是硬件IIC通信协议,SSD1306驱动芯片的OLED
实验材料
- 0.96寸OLED屏幕(四针IIC驱动)
- stm32f407vet6主控
- 杜邦线
接线
接线说明stm32f407vet6 OLED屏幕
VCC VCC
SCL SCL
SDA SDA
GND GND
代码讲解
IO引脚配置
这里使用的stm32f4的IIC2,这里与F1系列不同是F4需要使用GPIO_PinAFConfig函数!
void IIC_init(void)//PB10-->SCL || PB11-->SDA
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);
GPIO_InitTypeDef IIC1_IO;
IIC1_IO.GPIO_Mode = GPIO_Mode_AF;
IIC1_IO.GPIO_PuPd = GPIO_PuPd_NOPULL;
IIC1_IO.GPIO_OType = GPIO_OType_OD;
IIC1_IO.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
IIC1_IO.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &IIC1_IO);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_I2C2); //这里就是F1和F4的不同!!!
GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_I2C2);
I2C_InitTypeDef IIC1;
IIC1.I2C_Ack = I2C_Ack_Enable; //回复应答
IIC1.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; //作为从机时,自己的地址位数
IIC1.I2C_ClockSpeed = 100*1000; //IIC速率:0-400Khz(限制IIC速率的原因是弱上拉,因为高电平是读取数据,当弱上拉回调不及时则会影响数据的读取)
IIC1.I2C_DutyCycle = I2C_DutyCycle_2; //如果上面参数速率在100khz-400khz,则这里要必须要选
IIC1.I2C_Mode = I2C_Mode_I2C; //选择IIC模式
IIC1.I2C_OwnAddress1 = 0x00; //作为从机的地址
I2C_Init(I2C2, &IIC1);
I2C_Cmd(I2C2, ENABLE);
}
写命令函数
void OLED_WriteCommand(uint8_t cmmand) //在控制位选项上,选择不连续模式,并且片选为命令(DC为0)
{
while(SET == I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY)); //是否忙碌
I2C_GenerateSTART(I2C2, ENABLE); //起始位
while(I2C_CheckEvent(I2C2 , I2C_EVENT_MASTER_MODE_SELECT) != SUCCESS);
I2C_Send7bitAddress(I2C2, 0x78, I2C_Direction_Transmitter); //发送地址
while(I2C_CheckEvent(I2C2 , I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) != SUCCESS);
I2C_SendData(I2C2, 0x00); //发送控制位
while(I2C_CheckEvent(I2C2 , I2C_EVENT_MASTER_BYTE_TRANSMITTING) != SUCCESS);
I2C_SendData(I2C2, cmmand); //发送数据
while(I2C_CheckEvent(I2C2 , I2C_EVENT_MASTER_BYTE_TRANSMITTED) != SUCCESS);
I2C_GenerateSTOP(I2C2 , ENABLE);
}
写数据函数
void OLED_WriteData(uint8_t Data) //在控制位选项上,选择不连续模式,并且片选为数据(DC为1)
{
while(SET == I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY)); //是否忙碌
I2C_GenerateSTART(I2C2, ENABLE); //起始位
while(I2C_CheckEvent(I2C2 , I2C_EVENT_MASTER_MODE_SELECT) != SUCCESS);
I2C_Send7bitAddress(I2C2, 0x78, I2C_Direction_Transmitter); //发送地址
while(I2C_CheckEvent(I2C2 , I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) != SUCCESS);
I2C_SendData(I2C2, 0x40); //发送控制位
while(I2C_CheckEvent(I2C2 , I2C_EVENT_MASTER_BYTE_TRANSMITTING) != SUCCESS);
I2C_SendData(I2C2, Data); //发送数据
while(I2C_CheckEvent(I2C2 , I2C_EVENT_MASTER_BYTE_TRANSMITTED) != SUCCESS);
I2C_GenerateSTOP(I2C2 , ENABLE);
}
主函数
记得调用更新函数,否则不会显示!!
int main(void)
{
OLED_init();
OLED_Clear();
OLED_Printf(0,0,"%s","hello world!");
OLED_Printf(0,16,"%s","1234567890");
OLED_Update();
while(1);
}
硬件IIC的使用就是上面的代码,后续代码都是基于上面两个命令代码,源码在文末链接。
实验效果
本文是基于江科大stm32F1系列的模拟IIC驱动OLED屏幕仿写的STM32F4的硬件IIC驱动OLED屏幕,取模以及基本的函数使用说明可以借鉴江科大OLED库的使用方法。
热门推荐
婚姻保卫战:原配权益如何依法保护?
番茄酱VS番茄沙司:调味界的双生子,实则大不同
传承与新风:2025年清明节的变与不变
骨肉瘤的症状及日常注意事项
超17亿元!赣州警方打掉一网络传销组织
2024年1-4月中国汽车出口市场分析报告
河北邯郸:三千年不改名的成语之乡,11大景点探秘古城魅力
眼睛肌无力导致的眼皮下垂能治好吗?
眼部重症肌无力挂什么科
番茄酱和番茄沙司有啥区别?大厨:口感和用法均不同,别搞混淆了
美国作家协会推出“人类作者”认证,保障读者知道是谁在说话
国家有免费发放叶酸吗?叶酸买什么牌子的效果好?最好的三个牌子一览
什么情况下吃活性叶酸 活性叶酸和普通叶酸的区别
室内设计的核心要素与实用技巧
WRR论文:基于大地测量与水井水位观测研究华北平原含水层性质与地下水储量演变
中国国家地理谈最好吃的米粉,江西排第一!
山楂和决明子是“天生一对”?每天喝一杯,让血管更畅通!
钱钟书翻译理论中对于化境的理解与分析
如何用手机遥控电视?不用找机顶盒遥控器,直接手机搞定
葛根汤颗粒不能和哪些药一起使用
手机卡的PIN码是多少?如何查询?
2025年南京航空航天大学学科排名(全国第四轮评估结果)
抖音、小红书收紧私域导流,淘宝天猫却主动拥抱
Windows系统设计原理:探索操作系统的内在机制
打印机不断重复打印怎么办?5个实用解决方案帮你轻松应对
当中国人说“有句古话说的好”时,抛出的是一个终极压缩包
“1+1+1>3”,“三社联动”探索社区治理新模式
怀孕健康|孕妈不停吐?中西医解析孕吐4原因+10大舒缓Tips
留学交学费分期怎么算
马来西亚美食特辑:多元文化孕育的独特风味