【GD32F303红枫派使用手册】第二十二节 IIC-IIC OLED显示实验

news2024/11/28 22:33:43

22.1 实验内容

通过本实验主要学习以下内容:

  • OLED驱动原理
  • IIC驱动OLED显示操作

22.2 实验原理

OLED模块的驱动芯片为SSD1306,其显存大小总共为 128*64bit 大小,SSD1306 将这些显存分为了 8 页,其对应关系如下所示:

SSD1306 的命令比较多,这里我们仅介绍几个比较常用的命令,这些命令如下所示:

我们再来介绍一下 OLED 模块的初始化过程,SSD1306 的典型初始化框图如下图:

22.3 硬件设计

OLED电路如下所示,该OLED驱动使用PB10和PB11引脚,本例程采用IIC的驱动方式。

 

22.4 代码解析

22.4.1 主函数

主函数代码如下所示,调用bsp_oled_init进行OLED初始化,之后循环显示图片/字符串以及数字。

C
int main(void)
{
  delay_init();                                                                                                                                                                                                                        /* 延迟函数初始化 */
        BOARD_UART.uart_mode_tx=MODE_DMA;                                                                                                                                        /* 配置串口为DMA模式 */
        bsp_uart_init(&BOARD_UART);                                                                                                                                                          /* 初始化串口 */
        printf("Start OLED display demo! \r\n");                                                                                                        /* 显示启动OLED显示实验 */
        bsp_oled_init();                                                                                                                                                                                                        /* OLED初始化 */
        while (1)
        {
                  bsp_oled_clear(0);                                                                                                                                                                                /* 清除显示 */
                  bsp_oled_logo(0,0,128,32,gImage_juwo2);                                                                                                /* 显示聚沃logo*/
                  delay_ms(1000);                                                                                                                                                                                                /* 延迟1000ms间隔 */
                  bsp_oled_clear(0);                                                                                                                                                                                /* 清除显示 */
                  bsp_oled_logo(20,0,86,64,gImage_gd_logo);                                                                                        /* 显示GD logo*/
                  delay_ms(1000);                                                                                                                                                                                                /* 延迟1000ms间隔 */
                  bsp_oled_clear(0);                                                                                                                                                                                /* 清除显示 */
                  bsp_oled_showstring(20,0,(uint8_t *)"ju wo ke ji",FONT_8_16); /* 显示聚沃科技字符串 */
                  bsp_oled_shownum(30,3, 1234,4,FONT_8_16);                                                                                        /* 显示数字 */
                  delay_ms(1000);                                                                                                                                                                                                /* 延迟1000ms间隔 */
                  bsp_oled_clear(0);                                                                                                                                                                                /* 清除显示 */
        }
}

 

22.4.2 OLED初始化函数

OLED初始化函数如下,通过该函数可完成对外部OLED模块初始化。

C
void bsp_oled_init(void)
{
    bsp_i2c_config();                                   /* IIC接口初始化 */

    bsp_oled_write_byte(0xAE,OLED_CMD);                 /* 关闭oled 显示 */

    bsp_oled_write_byte(0x81,OLED_CMD);                 /* 设置对比度控制寄存器 */
    bsp_oled_write_byte(BRIGHTNESS,OLED_CMD);           /* 设置对比度, 0x00-0xff */

    bsp_oled_write_byte(0xA0,OLED_CMD);                 /* 设置seg/row映射,row地址127映射到seg0 */
    bsp_oled_write_byte(0xC0,OLED_CMD);                 /* 设置com/row扫描方向,从com[n-1]扫描到com0 */

    bsp_oled_write_byte(0xD5,OLED_CMD);                 /* 设置显示时钟分频比/振荡器频率 */
    bsp_oled_write_byte(0x80,OLED_CMD);                 /* 分频比为1,使用默认的内部时钟*/
    bsp_oled_write_byte(0xA8,OLED_CMD);                 /* 设置多路复用比率, 0x0f-0x3f */
    bsp_oled_write_byte(0x3F,OLED_CMD);                 /* 1/64 占空比 */

    bsp_oled_write_byte(0xD3,OLED_CMD);                 /* 通过com设置0d~63d的垂直偏移 */
    bsp_oled_write_byte(0x00,OLED_CMD);                 /* 不偏移 */

    bsp_oled_write_byte(0xD9,OLED_CMD);                 /* 设置预充电时间 */
    bsp_oled_write_byte(0xF1,OLED_CMD);                 /* 将预充电设置为15个时钟,将放电设置为1个时钟 */

    bsp_oled_write_byte(0xDA,OLED_CMD);                 /* 设置com引脚硬件配置 */
    bsp_oled_write_byte(0x12,OLED_CMD);                 /* 顺序com引脚配置和禁用com左/右重映射 */

    bsp_oled_write_byte(0xDB,OLED_CMD);                 /* 调整Vcom调节器输出 */
    bsp_oled_write_byte(0x30,OLED_CMD);                 /* 设置 Vcom 为 0.83Vcc */

    bsp_oled_write_byte(0x20,OLED_CMD);                 /* 设置存储器寻址模式, 0x00-0x02 */
    bsp_oled_write_byte(0x02,OLED_CMD);                 /* 页面寻址模式 */

    bsp_oled_write_byte(0x8D,OLED_CMD);                 /* 电荷泵设置 */
    bsp_oled_write_byte(0x14,OLED_CMD);                 /* 使能电荷泵*/

    bsp_oled_write_byte(0xA4,OLED_CMD);                 /* 禁用整个显示, 0xA4 or 0xA5 */

    bsp_oled_write_byte(0xA6,OLED_CMD);                 /* 设置正常显示,0为OFF显示,1为ON显示*/

    bsp_oled_write_byte(0xAF,OLED_CMD);                 /* 正常模式或睡眠模式, 0xAF or 0xAE */

    bsp_oled_clear(0);
}

 

22.4.3 OLED显示图片函数

OLED显示图片函数如下,其中形参说明如下:x为图片起始地址的x坐标,y为图片起始位置的y坐标,x_res为图片分辨率的x轴分辨率,y_res为分辨率的y轴分辨率,比如图片为128*32显示,则x_res为128,y_res为32,pbuff为图片数组的指针。

C
void bsp_oled_logo(uint8_t x, uint8_t y, uint8_t x_res, uint8_t y_res, uint8_t *pbuff)
{
    uint8_t i,n;
          uint8_t y_num;
          uint16_t pixel;
          pixel = x_res*y_res;
    if(y_res%8>0)
                {
                        y_num = y_res/8 +1;
                }else{
          y_num = y_res/8;
                }
          
    /* 显示log */
    for(i=0;i<y_num;i++){
        /* 设置页面寻址模式的页面起始地址(B0h~B7h) */
        bsp_oled_write_byte (0xB0+i,OLED_CMD);
        /* 为页面寻址模式设置低四位列起始地址(00h~0Fh) */
        bsp_oled_write_byte (0x00,OLED_CMD);
        /* 为页面寻址模式设置高四位列起始地址(10h~1Fh) */
        bsp_oled_write_byte (0x10,OLED_CMD);
                          /* 设置坐标 */
        bsp_oled_set_pos(x,y+i);
        /* l传输图片数据 */
        for(n=0;n<x_res;n++){
                                          if(i*x_res+n<pixel)
                                                {
            bsp_oled_write_byte(pbuff[i*x_res+n],OLED_DATA);
                                                }else{
                                                        break;
                                                }
        }
    }
}

 

在图片显示的应用中需要对图片进行取模,开发板配套资料中有取模软件以及使用说明,本文档中简要介绍取模方法:

  • 调整图片为合适分辨率和格式

将图片调整到合适分辨率,如果分辨率比较大的话,可以使用PS等工具,调整到128*64分辨率以内,格式的话建议调整为bmp格式文件。

  • 使用取模工具进行取模

取模可使用资料中带的以下工具。

选择图片模式。

点击文件,打开要取模的图片,点击选项,进行设置。

最后点击生成字模。

将生成的字模复制到代码的数组中。

另外也可以对汉字和英文进行取模,使用方法类似,可以参考资料中的说明。

22.4.4 字符串显示函数

字符串显示函数如下所示,通过该函数可在任意起始地址显示字符串。

C
void bsp_oled_logo(uint8_t x, uint8_t y, uint8_t x_res, uint8_t y_res, uint8_t *pbuff)
{
    uint8_t i,n;
          uint8_t y_num;
          uint16_t pixel;
          pixel = x_res*y_res;
    if(y_res%8>0)
                {
                        y_num = y_res/8 +1;
                }else{
          y_num = y_res/8;
                }
          
    /* 显示log */
    for(i=0;i<y_num;i++){
        /* 设置页面寻址模式的页面起始地址(B0h~B7h) */
        bsp_oled_write_byte (0xB0+i,OLED_CMD);
        /* 为页面寻址模式设置低四位列起始地址(00h~0Fh) */
        bsp_oled_write_byte (0x00,OLED_CMD);
        /* 为页面寻址模式设置高四位列起始地址(10h~1Fh) */
        bsp_oled_write_byte (0x10,OLED_CMD);
                          /* 设置坐标 */
        bsp_oled_set_pos(x,y+i);
        /* l传输图片数据 */
        for(n=0;n<x_res;n++){
                                          if(i*x_res+n<pixel)
                                                {
            bsp_oled_write_byte(pbuff[i*x_res+n],OLED_DATA);
                                                }else{
                                                        break;
                                                }
        }
    }
}

 

22.5 实验结果

将本例程下载到红枫派开发板中,并将H10跳线帽加上,上电运行后将会看到OLED屏上循环显示聚沃科技logo、GD Logo、字符串以及数字。

由聚沃科技原创,来源于【红枫派开发板】第二十二讲 IIC-IIC OLED显示实验 - 苏州聚沃电子科技有限公司 (gd32bbs.com) 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1851253.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CST初级教程 七

本教程将实例讲解CST设计优化仿真及其操作步骤。下面是一个微带功率分配器的图片&#xff1a; 一 3D建模 Substrate 建模 Step1 绘制Substrate外形 Substrate 的尺寸参数如下&#xff1a; Step2 添加新材料Substrate Step3 将新建的材料分配给Substrate 选中新建材料Substra…

和琪宝的厦门之旅~

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作)&#xff0c;由 李兆龙 确认&#xff0c;转载请注明版权。 引言 承接去年国庆的遗憾&#xff0c;我们将这次的旅行城市定为厦门。 琪宝是下午四点左右到…

迈巴赫S480升级增强现实AR抬头显示hud比普通抬头显示HUD更好用吗

增强AR实景抬头显示HUD&#xff08;Augmented Reality Head-Up Display&#xff09;是一种更高级的驾驶辅助技术&#xff0c;相比于普通抬头显示HUD&#xff0c;它提供了更丰富、更具沉浸感的驾驶体验。以下是它比普通抬头显示HUD多的一些功能&#xff1a; • 信息呈现方式&am…

新火种AI|Claude 3.5一夜封王超越GPT-4o!留给OpenAI的时间真的不多了...

AI大模型更新换代的速度&#xff0c;的确快到令人难以想象。 相信很多人现在对“最先进AI大模型”的印象还停留在GPT-4&#xff0c;但事实上&#xff0c;大模型领域的头把交椅早已悄然易主了好几回。就在GPT-4惊艳全球不久之后&#xff0c;其“死对头” Anthropic发布了Claude…

大模型自然语言生成自动驾驶可编辑仿真场景(其一 共十篇)

第一篇&#xff1a;LLM greater scene summarize 第二篇&#xff1a;LLM simulation Test effect 第三篇&#xff1a;LLM simulation driving scenario flow work 第四篇&#xff1a;LLM Algorithm flow description 第五篇&#xff1a;Configure the environment and back…

【CSS in Depth2精译】1.4 简写属性

文章目录 1.4 简写属性1.4.1 当心简写属性悄悄覆盖其他样式1.4.2 记住简写值的顺序1 上、右、下、左顺序2 先水平、再垂直的顺序 1.4 简写属性 简写属性&#xff08;Shorthand properties&#xff09; 是可以一次性设置多个属性值的样式属性。例如&#xff0c; font 就是一个简…

大模型产品化第一年​:战术、运营与战略

作者 | Eugene Yan、Bryan Bischof等 OneFlow编译 翻译&#xff5c;宛子琳、张雪聃、杨婷 题图由SiliconCloud平台生成 这是一个激动人心的时代&#xff0c;所有人都能够利用语言大模型&#xff08;LLM&#xff09;进行各种各样的产品构建。 过去一年里&#xff0c;LLM已经达到…

Apple - Advanced Memory Management Programming Guide 内存管理

翻译整理自&#xff1a;Advanced Memory Management Programming Guide&#xff08;Updated: 2012-07-17 https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html#//apple_ref/doc/uid/10000011i 文章目录 一、关于…

Mac OS 如何在命令行下启动Docker

现象 当用 Mac air作为服务器时&#xff0c;远程登录上去后想使用 docker&#xff0c;却报如下错&#xff1a; Cannot connect to the Docker daemon at unix:///Users/aborn/.docker/run/docker.sock. Is the docker daemon running? 原因分析 因为 docker 有一个守护进程…

WebSocket走私实践(附赠LiveGBS监控系统未授权管理员密码重置)

WebSocket走私实践&#xff08;附赠LiveGBS监控系统未授权管理员密码重置&#xff09; 对此&#xff0c;我特别感谢TryHackMe和HackTheBox academy&#xff0c;永远相信和追随英国TryHackMe所教导的网络安全知识,并保持学习 WebSocket走私相关的知识在这里 前段时间学习过htt…

关于小程序内嵌H5页面交互的问题?

有木有遇到&#xff1f;有木有遇到。 小程序内嵌了H5&#xff0c;然后H5某个按钮&#xff0c;需要打开小程序某个页面进行信息完善或登记&#xff0c;登记后要返回H5页面&#xff0c;而H5页面要动态显示刚才在小程序页面登记的信息。 操作流程是这样&#xff1a; 方案1&#…

一般人不要学Python?一般人怎么学Python!!

关于“建议一般人真的不要学Python”这一观点&#xff0c;我认为这是一个过于绝对的说法。实际上&#xff0c;Python作为一种流行的编程语言&#xff0c;具有许多优点&#xff0c;适合不同背景和需求的人学习。以下是一些反驳这一观点的理由&#xff1a; 易于学习和理解&#x…

学习笔记——路由网络基础——动态路由

五、动态路由 1、动态路由概述 动态路由&#xff1a;通过在设备上运行某种协议&#xff0c;通过该协议自动交互路由信息的过程。 动态路由协议有自己的路由算法&#xff0c;能够自动适应网络拓扑的变化&#xff0c;适用于具有一定数量三“层设备的网络。 动态路由协议适用场…

C++ 89 之 string查找和替换

#include <iostream> #include <string> using namespace std;int main() { // int find(const string& str, int pos 0) const; //查找str第一次出现位置,从pos开始查找 // int find(const char* s, int pos 0) const; //查找s第一次出现位置,从pos开始查找…

【吊打面试官系列-Mysql面试题】什么是存储过程?用什么来调用?

大家好&#xff0c;我是锋哥。今天分享关于 【什么是存储过程&#xff1f;用什么来调用&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 什么是存储过程&#xff1f;用什么来调用&#xff1f; 答&#xff1a;存储过程是一个预编译的 SQL 语句&#xff0c;优点是…

Flutter-实现头像叠加动画效果

实现头像叠加动画效果 在这篇文章中&#xff0c;我们将介绍如何使用 Flutter 实现一个带有透明度渐变效果和过渡动画的头像叠加列表。通过这种效果&#xff0c;可以在图片切换时实现平滑的动画&#xff0c;使 UI 更加生动和吸引人。 需求 我们的目标是实现一个头像叠加列表&…

2024信友队春季 Day3 二分分治

二分 & 分治 二分 二分查找 也叫折半搜索&#xff0c;用于在一个有序数组中查找某一元素的算法。 给定一个长度为 n n n 的从小到大排列的数列 a a a 和 q q q 次询问&#xff0c;每次询问给定 x x x&#xff0c;查找 x x x​ 在数列中的位置。 n , q ≤ 1 0 6 n,q\…

【机器学习】大模型驱动下的医疗诊断应用

摘要&#xff1a; 随着科技的不断发展&#xff0c;机器学习在医疗领域的应用日益广泛。特别是在大模型的驱动下&#xff0c;机器学习为医疗诊断带来了革命性的变化。本文详细探讨了机器学习在医疗诊断中的应用&#xff0c;包括疾病预测、图像识别、基因分析等方面&#xff0c;并…

cherry 笔记三(启动)

cherry启动很简单 app创建完 直接startup()就好了 func main() {app : cherry.Configure("./examples/config/profile-chat.json","chat-master",false,cherry.Cluster,)app.SetSerializer(cserializer.NewJSON())app.Startup() } Configure()--->N…

深入理解RunLoop

RunLoop 是 iOS 和 OSX 开发中非常基础的一个概念&#xff0c;这篇文章将从 CFRunLoop 的源码入手&#xff0c;介绍 RunLoop 的概念以及底层实现原理。之后会介绍一下在 iOS 中&#xff0c;苹果是如何利用 RunLoop 实现自动释放池、延迟回调、触摸事件、屏幕刷新等功能的。 一…