![wKgaomZVdiiAfR9BAB3mDFhHnZc972.png](https://file1.elecfans.com/web2/M00/EA/B7/wKgaomZVdiiAfR9BAB3mDFhHnZc972.png)
22.1实验内容
通过本实验主要学习以下内容:
22.2实验原理
OLED模块的驱动芯片为SSD1306,其显存大小总共为128*64bit大小,SSD1306将这些显存分为了8页,其对应关系如下所示:
![wKgaomZ2L02ACCtDAACHwKo-mE4970.png](https://file1.elecfans.com/web2/M00/F2/C9/wKgaomZ2L02ACCtDAACHwKo-mE4970.png)
SSD1306 的命令比较多,这里我们仅介绍几个比较常用的命令,这些命令如下所示:
![wKgZomZ2L06ACwlGAAH46UEmfLQ851.png](https://file1.elecfans.com/web2/M00/F1/DF/wKgZomZ2L06ACwlGAAH46UEmfLQ851.png)
我们再来介绍一下 OLED 模块的初始化过程,SSD1306的典型初始化框图如下图:
![wKgaomZ2L02AEga3AABQ2HiSAXE511.png](https://file1.elecfans.com/web2/M00/F2/C9/wKgaomZ2L02AEga3AABQ2HiSAXE511.png)
22.3硬件设计
OLED电路如下所示,该OLED驱动使用PB10和PB11引脚,本例程采用IIC的驱动方式。
![wKgZomZ2L02AGZCvAAC-wsej3Hk092.png](https://file1.elecfans.com/web2/M00/F1/DF/wKgZomZ2L02AGZCvAAC-wsej3Hk092.png)
![wKgaomZ2L02AYyaiAADdp5teGmY672.png](https://file1.elecfans.com/web2/M00/F2/CA/wKgaomZ2L02AYyaiAADdp5teGmY672.png)
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.2OLED初始化函数
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.3OLED显示图片函数
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 /* 设置页面寻址模式的页面起始地址(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 if(i*x_res+n { bsp_oled_write_byte(pbuff[i*x_res+n],OLED_DATA); }else{ break; } } } } |
在图片显示的应用中需要对图片进行取模,开发板配套资料中有取模软件以及使用说明,本文档中简要介绍取模方法:
- 调整图片为合适分辨率和格式
将图片调整到合适分辨率,如果分辨率比较大的话,可以使用PS等工具,调整到128*64分辨率以内,格式的话建议调整为bmp格式文件。
- 使用取模工具进行取模
取模可使用资料中带的以下工具。
![wKgZomZ2L02AD2x6AAA5KqtKsf4646.png](https://file1.elecfans.com/web2/M00/F1/DF/wKgZomZ2L02AD2x6AAA5KqtKsf4646.png)
选择图片模式。
![wKgaomZ2L02AYri2AAB4SgUNmsM326.png](https://file1.elecfans.com/web2/M00/F2/CA/wKgaomZ2L02AYri2AAB4SgUNmsM326.png)
点击文件,打开要取模的图片,点击选项,进行设置。
![wKgaomZ2L06AD69XAAMvhExUKa8220.png](https://file1.elecfans.com/web2/M00/F2/CA/wKgaomZ2L06AD69XAAMvhExUKa8220.png)
最后点击生成字模。
![wKgZomZ2L06AGp8nAAb2bzHXNAg255.png](https://file1.elecfans.com/web2/M00/F1/DF/wKgZomZ2L06AGp8nAAb2bzHXNAg255.png)
将生成的字模复制到代码的数组中。
![wKgZomZ2L06AOgNmAADEha-Phdk086.png](https://file1.elecfans.com/web2/M00/F1/DF/wKgZomZ2L06AOgNmAADEha-Phdk086.png)
另外也可以对汉字和英文进行取模,使用方法类似,可以参考资料中的说明。
22.4.4字符串显示函数
字符串显示函数如下所示,通过该函数可在任意起始地址显示字符串。
C void bsp_oled_showstring(uint8_t x, uint8_t y, uint8_t *ch, oled_font size) { uint8_t j=0; while(ch[j]!='\0'){ bsp_oled_showchar(x,y,ch[j],size); x += 8; if(x>120){ x = 0; y += 2; } j++; } } |
22.5实验结果
将本例程下载到红枫派开发板中,并将H10跳线帽加上,上电运行后将会看到OLED屏上循环显示聚沃科技logo、GD Logo、字符串以及数字。
![wKgZomZ2L0-ASt4_AAcsxFVoS28708.png](https://file1.elecfans.com/web2/M00/F1/DF/wKgZomZ2L0-ASt4_AAcsxFVoS28708.png)
![wKgaomZ2L06AbdyeAAZc6ch3cyI764.png](https://file1.elecfans.com/web2/M00/F2/CA/wKgaomZ2L06AbdyeAAZc6ch3cyI764.png)
![wKgaomZ2L06AQ69JAAZnxnC5AL0622.png](https://file1.elecfans.com/web2/M00/F2/CA/wKgaomZ2L06AQ69JAAZnxnC5AL0622.png)
-
OLED
+关注
关注
119文章
6072浏览量
222253 -
显示
+关注
关注
0文章
415浏览量
44974 -
IIC
+关注
关注
11文章
290浏览量
37951 -
开发板
+关注
关注
25文章
4601浏览量
95113 -
GD32
+关注
关注
7文章
365浏览量
23841
发布评论请先 登录
相关推荐
【星空派GD32F303开发板试用体验】开发记录汇总
【星空派GD32F303开发板试用体验】开箱+环境搭建
【 星空派GD32F303开发板试用体验】OLED 屏显示与电子时钟
【星空派GD32F303开发板试用体验】开箱+环境搭建
【星空派GD32F303开发板试用体验】+板卡概览
迅为iMX6ULL开发板使用手册资料下载
GD32F303开发板介绍
火力发电厂水汽分析方法 第二十二部分:化学耗氧量的测定(高锰
第二十二讲 同步时序逻辑电路的分析方法
![<b class='flag-5'>第二十二</b>讲 同步时序逻辑电路的分析方法](https://file1.elecfans.com//web2/M00/A4/AE/wKgZomUMNUKASybrAAAQYJr-wSY245.gif)
模拟电路网络课件 第二十二节:功率放大电路的一般问题
【GD32F303红枫派开发板使用手册】第五讲 FMC-片内Flash擦写读实验
![【<b class='flag-5'>GD32F303</b><b class='flag-5'>红枫</b>派<b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第五讲 FMC-片内Flash擦写读<b class='flag-5'>实验</b>](https://file1.elecfans.com/web2/M00/EB/E3/wKgaomZb036AbrwmAAAy6saV5XI905.png)
评论