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

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) 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何将办公文档压缩成rar格式文件?

压缩包格式是我们生活工作中常用到的文件格式&#xff0c;那么如何得到一个rar格式的压缩文件&#xff1f;或者说如何将文件压缩成rar格式而不是zip格式呢&#xff1f;今天我们来了解一下如何压缩为rar格式文件。 首先&#xff0c;下载并安装WinRAR&#xff0c;然后用鼠标选择需…

FlinkCDC介绍及使用

CDC简介 什么是CDC&#xff1f; cdc是Change Data Capture(变更数据获取)的简称。核心思想是&#xff0c;监测并捕获数据库的 变动(包括数据或数据表的插入&#xff0c;更新以及删除等)&#xff0c;将这些变更按发生的顺序完整记录下来&#xff0c;写入到消息中间件以供其它服…

修复 Android 手机卡在启动屏幕上的 7 种方法

Android 手机卡在启动屏幕上的情况并不常见。通常&#xff0c;问题出现在应用新更新或安装未知来源的应用程序后。幸运的是&#xff0c;您可以让您的 Android 手机跳过启动屏幕&#xff0c;而无需前往最近的服务中心。 当您的 Android 手机在启动屏幕上陷入无限循环时&#xf…

计算机组成原理 —— 存储系统(概述)

计算机组成原理 —— 存储系统&#xff08;概述&#xff09; 存储系统按层次划分按照存储介质分类按照存储方式分类按照信息可更改性分类根据信息的可保存性分类存储器性能指标 我们今天来学习计算机组成原理中的存储系统&#xff1a; 存储系统 存储系统是计算机系统中用于存…

css文字镂空加描边

css文字镂空加描边 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>文字镂空</title><style>/* 公用样式 */html,body{width: 100%;height: 100%;position: relative;}/* html{overflow-y: scroll;} */*{margi…

【机器学习 复习】 第1章 概述

一、概念 1.机器学习是一种通过先验信息来提升模型能力的方式。 即从数据中产生“模型”( model )的算法&#xff0c;然后对新的数据集进行预测。 2.数据集&#xff08;Dataset&#xff09;&#xff1a;所有数据的集合称为数据集。 训练集&#xff1a;用来训练出一个适合模…

Android (已解决)Execution failed for task ‘:app:lint‘

文章目录 一、错误原因二、解决方法 一、错误原因 这个错误信息表示在执行 Lint 检查时发现了错误&#xff0c;导致构建过程被中断。Lint 是一个用于检测 Android 项目中潜在问题的工具&#xff0c;比如性能、安全性、可用性等方面的问题。当Lint检查到严重错误时&#xff0c;…

库卡机器人减速机维修齿轮磨损故障

一、KUKA机器人减速器齿轮磨损故障的原因 1. 润滑不足&#xff1a;润滑油不足或质量不佳可能导致齿轮磨损。 2. 负载过重&#xff1a;超过库卡机械臂减速器额定负载可能导致齿轮磨损。 3. 操作不当&#xff1a;未按照说明书操作可能导致KUKA机器人减速器齿轮磨损。 4. 维护不足…

2024年全国青少信息素养大赛python编程复赛集训第四天编程题分享

整理资料不容易,感谢各位大佬给个点赞和分享吧,谢谢 大家如果不想阅读前边的比赛内容介绍,可以直接跳过:拉到底部看集训题目 (一)比赛内容: 【小学组】 1.了解输入与输出的概念,掌握使用基本输入输出和简单运算 为主的标准函数; 2.掌握注释的方法; 3.掌握基本数…

Ubuntu配置ssh+vnc(完整版)

Ubuntu配置sshvnc&#xff08;完整版&#xff09; 1 配置ssh 1. 安装openssh-server&#xff0c;配置开机自启 # 更新包 sudo apt-get update # 安装openssh-server sudo apt-get install -y openssh-server # 启动服务 sudo service ssh start # 配置开机自启 sudo systemc…

Github 2024-06-19 C开源项目日报 Top9

根据Github Trendings的统计,今日(2024-06-19统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量C项目9C++项目1Netdata: 开源实时监控平台 创建周期:4020 天开发语言:C协议类型:GNU General Public License v3.0Star数量:68982 个Fork数量…

可平滑替代传统FTP的国产FTP方案,了解一下

企业在处理数据传输时&#xff0c;效率和安全性是关键。尽管传统FTP曾被广泛采用&#xff0c;然而&#xff0c;随着企业业务需求的增长&#xff0c;传统FTP在传输速度、安全性、稳定性以及可控性方面的不足逐渐显现。许多企业正在寻找更为高效、安全且用户体验更好的的国产FTP方…

在webstorm配置nodejs(从零开始)

在webstorm配置nodejs之前&#xff0c;需要先下载node.js和webStorm。 按下winr&#xff0c;输入cmd打开命令行 输入node -v和npm -v会出现相应的版本&#xff0c;如果报错则需要去下载node.js。 打开webStorm&#xff0c;File—settings 搜索node 选择node.exe安装位置 重启…

Elasticsearch基础(一):阿里云Elasticsearch简介

文章目录 阿里云Elasticsearch简介 一、什么是阿里云Elasticsearch 1、开源Elasticsearch 2、阿里云Elasticsearch 3、阿里云Elasticsearch介绍 4、总结 二、 阿里云Elasticsearch组件 1、X-Pack&#xff08;商业版扩展包&#xff09; 2、 Beats&#xff08;数据采集中…

华为OD机试 - 地图寻宝 - 深度优先搜索BFS(Java 2024 D卷 200分)

华为OD机试 2024D卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;D卷C卷A卷B卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测…

秋招突击——6/21——新作{两两交换链表中的节点,K个一组反转链表}

文章目录 引言新做删除有序数组中的重复项个人实现 K 个一组翻转链表个人实现参考代码 总结 引言 上午完全去听讲座了&#xff0c;听了三场&#xff0c;拿了三个讲座单&#xff0c;从九点一直到十二点。笔记本电脑插电才能用&#xff0c;就没带&#xff0c;所以没有进行复习。…

【图解IO与Netty系列】Netty源码解析——事件循环

Netty源码解析——事件循环 Netty事件循环源码解析select()processSelectedKeys()NioMessageUnsafe#read()NioByteUnsafe#read() runAllTasks() Netty事件循环 当Netty服务端启动起来以后&#xff0c;就可以接受客户端发送的请求&#xff0c;接收到客户端发来的请求后就会有事…

Android平台下VR头显如何低延迟播放4K以上超高分辨率RTSP|RTMP流

技术背景 VR头显需要更高的分辨率以提供更清晰的视觉体验、满足沉浸感的要求、适应透镜放大效应以及适应更广泛的可视角度&#xff0c;超高分辨率的优势如下&#xff1a; 提供更清晰的视觉体验&#xff1a;VR头显的分辨率直接决定了用户所看到的图像的清晰度。更高的分辨率意…

微服务改造启动多个 SpringBoot 的陷阱与解决方案

在系统运行了一段时间后&#xff0c;业务量上升后&#xff0c;生产上发现java应用内存占用过高&#xff0c;服务器总共64G&#xff0c;发现每个SpringBoot占用近12G的内存&#xff0c;我们项目采用微服务架构&#xff0c;有多个springboot应用。 一下子内存就不够用了&#xf…

基于SpringBoot+Vue在线考试报名系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;…