【GD32F427开发板试用】+软件IIC(OLED显示)

[复制链接]
1602|19
 楼主| 4c1l 发表于 2023-4-30 23:05 | 显示全部楼层 |阅读模式
gitee开源地址https://gitee.com/sijiwendu/gd32-f427-v/tree/master/module/oled
上一次完成DHT11开发文章https://aijishu.com/a/1060000000366189

下面将开始本次文章旅行
前言:简易智能家居需要实现的功能有:读取环境的温湿度情况,将温湿度数据实时显示在OLED上,并通过数据报文上送到服务器和PC后端,可通过PC软件、微信小程序、OLED屏幕读取到温湿度数据

一、软件IIC的原理
简单来说就是通过控制io口高低电平从而模拟出iic的通信时序
它需要模拟四种信号:空闲状态、起始信号、停止信号、数据有效性
空闲状态
当IIC总线SDA以及SCL均处于高电平时,规定此状态为空闲状态,对应输出状态为高阻态(各场器件输出效应管截止,导致场效应管电阻很大),由上拉电阻将电平拉高。

79598644e839c83f3c.png

 楼主| 4c1l 发表于 2023-4-30 23:05 | 显示全部楼层
起始信号
起始条件:SCL线是高电平时,SDA线从高电平向低电平切换
  1. void OLED_IICStart()
  2. {
  3.     OLED_SCL_SET;
  4.     OLED_SDA_SET;
  5.     delay_1ms(1);
  6.     OLED_SDA_CLEAR;
  7.     delay_1ms(1);
  8.     OLED_SCL_CLEAR;
  9.     delay_1ms(1);
  10. }
 楼主| 4c1l 发表于 2023-4-30 23:05 | 显示全部楼层
停止信号
停止条件:SCL线是高电平时,SDA线从低电平向高电平切换
  1. void OLED_IICStop()
  2. {
  3.     OLED_SCL_CLEAR;
  4.     OLED_SDA_CLEAR;
  5.     OLED_SCL_SET;
  6.     delay_1ms(1);
  7.     OLED_SDA_SET;
  8.     delay_1ms(1);
  9. }
 楼主| 4c1l 发表于 2023-4-30 23:05 | 显示全部楼层
数据有效性
SDA的高或低电平状态只有在 SCL 线的时钟信号是低电平时才能改变。
SDA在SCL的上升沿到来前准备好,并在下降沿到来之前必须稳定。
如下OLED的写一个字节:
  1. void OLED_Byte(u8 dat)//写一个字节
  2. {
  3.      u8 i;     
  4.      for(i=0;i<8;i++)
  5.      {
  6.             if(dat & 0x80)
  7.                 OLED_SDA_SET;
  8.             else
  9.                 OLED_SDA_CLEAR;
  10.             delay_1ms(1);
  11.             OLED_SCL_SET;
  12.             delay_1ms(1);
  13.             OLED_SCL_CLEAR;
  14.             dat<<=1;
  15.      }
  16.     OLED_SDA_SET;
  17.     delay_1ms(1);
  18.     OLED_SCL_SET;
  19.     delay_1ms(1);
  20.     OLED_SCL_CLEAR;   
  21.     delay_1ms(1);     
  22. }
 楼主| 4c1l 发表于 2023-4-30 23:06 | 显示全部楼层
二、移植0.96寸OLED
48733644e83e23cdd7.png
如上图所示,该OLED屏使用的是iic通信,如果使用硬件iic可以获得更好的刷新,如果使用软件iic可以不受管脚限制,本次为了方便各位移植,所以使用软件iic,更换不同引脚只需要在oled库文件修改即可。
 楼主| 4c1l 发表于 2023-4-30 23:06 | 显示全部楼层
oled.c中需要更换对应引脚的地方
36475644e83f4816c1.png
 楼主| 4c1l 发表于 2023-4-30 23:06 | 显示全部楼层
oled.h中需要更换对应引脚的地方
66716644e8400c23b6.png
 楼主| 4c1l 发表于 2023-4-30 23:06 | 显示全部楼层
如果想使用硬件iic,GD32F427V也提供了不少引脚,如下图所示
524644e840cc0ffa.png

 楼主| 4c1l 发表于 2023-4-30 23:07 | 显示全部楼层
三、在OLED上显示实时温湿度
完成了OLED的移植,接下来就该在OLED上显示温湿度了,由于本程序比较简单,就放在main上的while,建议各位可以使用ui文件管理,while只执行调度。
 楼主| 4c1l 发表于 2023-4-30 23:07 | 显示全部楼层
本次的显示逻辑为,判断是否有读回DHT11数据,读回则调用OLED驱动函数显示,如下代码段
  1. while (1)
  2. {
  3.     if (dht11_read_data(buffer) == 0)           /*采集到温湿度信息*/
  4.     {
  5.         hum = buffer[0] + buffer[1] / 10.0;     /*读出湿度信息*/
  6.         temp1 = buffer[2] + buffer[3] / 10.0;   /*读出温度信息*/
  7.         
  8.         OLED_ShowString(0,0,"hum:",16);         /*将湿度信息显示到OLED上*/
  9.         OLED_ShowNum(80,0,(u8)hum,2,16);
  10.         OLED_ShowString(0,16,"temp:",16);       /*将温度信息显示到OLED上*/
  11.         OLED_ShowNum(80,16,(u8)temp1,2,16);
  12.         
  13.         com_init(temp1,hum);                    /*上报温湿度数据*/
  14.     }
  15.     delay_ms(500);
  16. }
 楼主| 4c1l 发表于 2023-4-30 23:07 | 显示全部楼层
效果如下:
37657644e843669387.png
 楼主| 4c1l 发表于 2023-4-30 23:07 | 显示全部楼层
四、总结
oled是iic里比较简单的一个应用,有空可以试试硬件iic,由于篇幅原因,很多细节无法写出,源码已在开头开源,望各位斧正。
burgessmaggie 发表于 2023-5-7 17:38 | 显示全部楼层
oled的屏是一般是什么接口的屏幕
ulystronglll 发表于 2023-5-7 17:44 | 显示全部楼层
iic接口的12864oled屏该怎么用
zerorobert 发表于 2023-5-7 17:51 | 显示全部楼层
iic接口的oled可以运行spi接口的ssd1306d的例程吗?
fengm 发表于 2023-5-7 18:04 | 显示全部楼层
OLED屏执行时间是固定的吗              
ingramward 发表于 2023-5-7 18:13 | 显示全部楼层
GD32F427怎么修改iic频率
51xlf 发表于 2023-5-7 18:41 | 显示全部楼层
oled四脚和七脚有什么区别               
backlugin 发表于 2023-5-7 19:05 | 显示全部楼层
能用3线SPI的oled显示么
loutin 发表于 2023-5-7 19:09 | 显示全部楼层
GD32F427与四针oled怎么连线
您需要登录后才可以回帖 登录 | 注册

本版积分规则

65

主题

703

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部