国民技术
直播中

hehung

9年用户 659经验值
擅长:嵌入式技术
私信 关注
[经验]

【国民技术N32项目移植】3. 硬件IIC驱动RT-Thread OS SSD1306软件包

过往分享

【国民技术N32项目移植】1. 新建工程+LED与按键跳坑总结
【国民技术N32项目移植】2. 硬件IIC驱动OLED

前言

上一篇文章讲解了如何使用硬件IIC来驱动OLED,硬件IIC相比较于软件IIC有速度快的优势,如果是软件IIC驱动,刷新频率可能会跟不上。
因为使用了RT-Thread OS,为了便于OLED的驱动,会使用软件包SSD1306,但是SSD1306是使用RT-Thread OS的软件IIC驱动的,为了与硬件IIC结合起来使用,添加了SSD1306的软件包之后,需要修改驱动源码,本文将详细描述如何使用SSD1306的软件包结合硬件IIC来驱动OLED。

硬件IIC的代码实现参考前一篇帖子:【国民技术N32项目移植】2. 硬件IIC驱动OLED

添加软件包

本文使用RT-Thread studio开发。点击RT-Thread Setting添加软件包。

  1. 添加软件包很方便,如下图所示。
    2.jpg
  2. 修改OLED的从机地址为0x78, SSD1306的默认地址是0x3C,即0x78右移一位的值。默认是7位,虽然N32G45X的硬件IIC也是使用的7为地址,但是需要提供全地址,及0x78,所以这里修改为0x78。
    1.jpg

这里只需要修改从机地址,即可,其他都不需要在修改,对硬件IIC不适用。

代码修改

SSD1306的代码是与RT-Thread OS的软件IIC结合起来使用的,所以我们需要对底层驱动代码进行修改才能切换为硬件IIC,修改方式如下:

  1. 添加硬件IIC头文件
    3.jpg
  2. 修改SSD1306的写命令与写数据的驱动函数为硬件IIC的驱动函数,如下图所示:
    4.jpg

main函数测试代码

完成了上述步骤之后,SSD1306就修改为了使用硬件IIC驱动了,但是我们还不知道是否修改成功,所以在main函数中写测试代码进行测试,如下:

i2c_config();
//    OLED_Init();

//    OLED_ShowString(12, 0, (const unsigned char*)"N32G45XVL-STB", 16, 1);
//    OLED_ShowString(24, 16, (const unsigned char*)"elecfans", 16, 1);
//    OLED_ShowString(64, 48, (const unsigned char*)"- hehung", 16, 1);
//    OLED_Refresh_Gram();

    ssd1306_Init();

    ssd1306_Fill(Black);
    ssd1306_SetCursor(4, 0);
    ssd1306_WriteString("N32G45XVL-STB", Font_7x10, White);
    ssd1306_SetCursor(4, 24);
    ssd1306_WriteString("elecfans", Font_11x18, White);
    ssd1306_SetCursor(50, 42);
    ssd1306_WriteString("-hehung", Font_11x18, White);
    ssd1306_UpdateScreen();

试验效果

如下图,经过实际测试,硬件IIC比软件IIC刷新频率高很多,显示动态图像会比较流畅。
5.jpg

注意事项

  1. 因为修改了SSD1306的源码,如果重新加载ssd1306,修改的代码会被覆盖,所以要做好备份,防止代码丢失。或者将ssd1306的整个代码拷贝到其他目录下,如application目录下。
  2. 如果想要回复到默认的ssd1306的代码,只需要将ssd1306的软件包删掉之后,重新加载就可以了。

更多回帖

发帖
×
20
完善资料,
赚取积分