打印

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

[复制链接]
1073|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均处于高电平时,规定此状态为空闲状态,对应输出状态为高阻态(各场器件输出效应管截止,导致场效应管电阻很大),由上拉电阻将电平拉高。



使用特权

评论回复
沙发
4c1l|  楼主 | 2023-4-30 23:05 | 只看该作者
起始信号
起始条件:SCL线是高电平时,SDA线从高电平向低电平切换
void OLED_IICStart()
{
    OLED_SCL_SET;
    OLED_SDA_SET;
    delay_1ms(1);
    OLED_SDA_CLEAR;
    delay_1ms(1);
    OLED_SCL_CLEAR;
    delay_1ms(1);
}

使用特权

评论回复
板凳
4c1l|  楼主 | 2023-4-30 23:05 | 只看该作者
停止信号
停止条件:SCL线是高电平时,SDA线从低电平向高电平切换
void OLED_IICStop()
{
    OLED_SCL_CLEAR;
    OLED_SDA_CLEAR;
    OLED_SCL_SET;
    delay_1ms(1);
    OLED_SDA_SET;
    delay_1ms(1);
}

使用特权

评论回复
地板
4c1l|  楼主 | 2023-4-30 23:05 | 只看该作者
数据有效性
SDA的高或低电平状态只有在 SCL 线的时钟信号是低电平时才能改变。
SDA在SCL的上升沿到来前准备好,并在下降沿到来之前必须稳定。
如下OLED的写一个字节:
void OLED_Byte(u8 dat)//写一个字节
{
     u8 i;     
     for(i=0;i<8;i++)
     {
            if(dat & 0x80)
                OLED_SDA_SET;
            else
                OLED_SDA_CLEAR;
            delay_1ms(1);
            OLED_SCL_SET;
            delay_1ms(1);
            OLED_SCL_CLEAR;
            dat<<=1;
     }
    OLED_SDA_SET;
    delay_1ms(1);
    OLED_SCL_SET;
    delay_1ms(1);
    OLED_SCL_CLEAR;   
    delay_1ms(1);     
}

使用特权

评论回复
5
4c1l|  楼主 | 2023-4-30 23:06 | 只看该作者
二、移植0.96寸OLED

如上图所示,该OLED屏使用的是iic通信,如果使用硬件iic可以获得更好的刷新,如果使用软件iic可以不受管脚限制,本次为了方便各位移植,所以使用软件iic,更换不同引脚只需要在oled库文件修改即可。

使用特权

评论回复
6
4c1l|  楼主 | 2023-4-30 23:06 | 只看该作者
oled.c中需要更换对应引脚的地方

使用特权

评论回复
7
4c1l|  楼主 | 2023-4-30 23:06 | 只看该作者
oled.h中需要更换对应引脚的地方

使用特权

评论回复
8
4c1l|  楼主 | 2023-4-30 23:06 | 只看该作者
如果想使用硬件iic,GD32F427V也提供了不少引脚,如下图所示


使用特权

评论回复
9
4c1l|  楼主 | 2023-4-30 23:07 | 只看该作者
三、在OLED上显示实时温湿度
完成了OLED的移植,接下来就该在OLED上显示温湿度了,由于本程序比较简单,就放在main上的while,建议各位可以使用ui文件管理,while只执行调度。

使用特权

评论回复
10
4c1l|  楼主 | 2023-4-30 23:07 | 只看该作者
本次的显示逻辑为,判断是否有读回DHT11数据,读回则调用OLED驱动函数显示,如下代码段
while (1)
{
    if (dht11_read_data(buffer) == 0)           /*采集到温湿度信息*/
    {
        hum = buffer[0] + buffer[1] / 10.0;     /*读出湿度信息*/
        temp1 = buffer[2] + buffer[3] / 10.0;   /*读出温度信息*/
        
        OLED_ShowString(0,0,"hum:",16);         /*将湿度信息显示到OLED上*/
        OLED_ShowNum(80,0,(u8)hum,2,16);
        OLED_ShowString(0,16,"temp:",16);       /*将温度信息显示到OLED上*/
        OLED_ShowNum(80,16,(u8)temp1,2,16);
        
        com_init(temp1,hum);                    /*上报温湿度数据*/
    }
    delay_ms(500);
}

使用特权

评论回复
11
4c1l|  楼主 | 2023-4-30 23:07 | 只看该作者
效果如下:

使用特权

评论回复
12
4c1l|  楼主 | 2023-4-30 23:07 | 只看该作者
四、总结
oled是iic里比较简单的一个应用,有空可以试试硬件iic,由于篇幅原因,很多细节无法写出,源码已在开头开源,望各位斧正。

使用特权

评论回复
13
burgessmaggie| | 2023-5-7 17:38 | 只看该作者
oled的屏是一般是什么接口的屏幕

使用特权

评论回复
14
ulystronglll| | 2023-5-7 17:44 | 只看该作者
iic接口的12864oled屏该怎么用

使用特权

评论回复
15
zerorobert| | 2023-5-7 17:51 | 只看该作者
iic接口的oled可以运行spi接口的ssd1306d的例程吗?

使用特权

评论回复
16
fengm| | 2023-5-7 18:04 | 只看该作者
OLED屏执行时间是固定的吗              

使用特权

评论回复
17
ingramward| | 2023-5-7 18:13 | 只看该作者
GD32F427怎么修改iic频率

使用特权

评论回复
18
51xlf| | 2023-5-7 18:41 | 只看该作者
oled四脚和七脚有什么区别               

使用特权

评论回复
19
backlugin| | 2023-5-7 19:05 | 只看该作者
能用3线SPI的oled显示么

使用特权

评论回复
20
loutin| | 2023-5-7 19:09 | 只看该作者
GD32F427与四针oled怎么连线

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

55

主题

566

帖子

2

粉丝