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

2024-06-22 13:44

本文主要是介绍【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) 

这篇关于【GD32F303红枫派使用手册】第二十二节 IIC-IIC OLED显示实验的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1084456

相关文章

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

衡石分析平台使用手册-单机安装及启动

单机安装及启动​ 本文讲述如何在单机环境下进行 HENGSHI SENSE 安装的操作过程。 在安装前请确认网络环境,如果是隔离环境,无法连接互联网时,请先按照 离线环境安装依赖的指导进行依赖包的安装,然后按照本文的指导继续操作。如果网络环境可以连接互联网,请直接按照本文的指导进行安装。 准备工作​ 请参考安装环境文档准备安装环境。 配置用户与安装目录。 在操作前请检查您是否有 sud

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

lvgl8.3.6 控件垂直布局 label控件在image控件的下方显示

在使用 LVGL 8.3.6 创建一个垂直布局,其中 label 控件位于 image 控件下方,你可以使用 lv_obj_set_flex_flow 来设置布局为垂直,并确保 label 控件在 image 控件后添加。这里是如何步骤性地实现它的一个基本示例: 创建父容器:首先创建一个容器对象,该对象将作为布局的基础。设置容器为垂直布局:使用 lv_obj_set_flex_flow 设置容器

C# dateTimePicker 显示年月日,时分秒

dateTimePicker默认只显示日期,如果需要显示年月日,时分秒,只需要以下两步: 1.dateTimePicker1.Format = DateTimePickerFormat.Time 2.dateTimePicker1.CustomFormat = yyyy-MM-dd HH:mm:ss Tips:  a. dateTimePicker1.ShowUpDown = t

HNU-2023电路与电子学-实验3

写在前面: 一、实验目的 1.了解简易模型机的内部结构和工作原理。 2.分析模型机的功能,设计 8 重 3-1 多路复用器。 3.分析模型机的功能,设计 8 重 2-1 多路复用器。 4.分析模型机的工作原理,设计模型机控制信号产生逻辑。 二、实验内容 1.用 VERILOG 语言设计模型机的 8 重 3-1 多路复用器; 2.用 VERILOG 语言设计模型机的 8 重 2-1 多

小程序button控件上下边框的显示和隐藏

问题 想使用button自带的loading图标功能,但又不需要button显示边框线 button控件有一条淡灰色的边框,在控件上了样式 border:none; 无法让button边框隐藏 代码如下: <button class="btn">.btn{border:none; /*一般使用这个就是可以去掉边框了*/} 解决方案 发现button控件有一个伪元素(::after

MFC中Spin Control控件使用,同时数据在Edit Control中显示

实现mfc spin control 上下滚动,只需捕捉spin control 的 UDN_DELTAPOD 消息,如下:  OnDeltaposSpin1(NMHDR *pNMHDR, LRESULT *pResult) {  LPNMUPDOWN pNMUpDown = reinterpret_cast(pNMHDR);  // TODO: 在此添加控件通知处理程序代码    if