stm32汉字字库显示实验与OLED的使用(开始于2021-09-01)
stm32汉字字库显示实验与OLED的使用
1.字库的使用
GBK字库的简介:
GBK库的由两部分组成,如下图:
- 高位从0x81开始是为了兼容ASII字符,因为未扩展的ASII字符是从0-128,即0x00-0x80;
- 汉字编码均为连个字节,所以在ASII字符显示8 * 16的字符时,汉字为16 * 16;
这儿需要注意一点,我们使用的编辑器的方式,要与字库的编码方式对应才行(GBK);
因为在使用字库的过程中是1️⃣从字符的地址访问出它的(2字节)编码(编辑时使用GBK,则为GBK编码),2️⃣再根据这个编码去GBK点阵字库(原子存放在SD卡中,再系统初始化时加载到Flash中以便能快速读取)里找这个编码对应的点阵数组;3️⃣ 最后将这个点阵由OLED屏或LCD屏显示。
流程和对应点阵地址偏移的计算公式如下图:
注意:GBK编码的第四位跳过了0X7F这个字节。
2.OLED的使用:
1)OLED通用的初始化流程:
不论是使用I2C协议还是SPI协议,或者是6800和8080的并口协议进行通讯,OLED初始化的通用流程都如下图所示:
2)原子OLED屏芯片SSD1306的部分指令集
注意:当我们发送列地址时,列地址会被拆分成两个字节发送,注意列地址(1个字节)的高四位发送时需要在其前面加上0X10,以便让OLED芯片能识别到我们发送的这个命令是列地址的高四位 ,实际上第四位发送时也加上了0x00,不过,这个0x00加上去没有显示出来而已。
有些驱动芯片是在列地址开始是有偏移量的,如洋桃使用SH1106具有0X02的起始偏移(列地址加上即可)。
OLED驱动芯片中,将0.96寸的OLED上的点阵对应成内部的SRAM上的每个位,(纵向下高位的模式)安排字节,即,0.96寸的OLED上是 64*128个像素点,将其8个像素点一行,分成8个大行,对应内部SRAM的8页(B0-B7)一页有128个字节,这128个字节是”竖着放的“,即每个字节对应一列,每个字节中的每个位(bit)对应每个大行中中的1个像素点 。
OLED驱动芯片的显示SRAM对应如下:(分页,及下高位取模)
将每个页放大的下高位取模如下:
因此对于这样的芯片,就有以下两种不同的显示方式:
洋桃的方法:
显示时,为了方便,不用在不同页之间来回切换,取模方式使用: **从左往右,再从上到下 ** (因为从左往右在同一页) 纵向取模下高位 。(这样取模得到得点阵可以直接显示,较方便)
原子的方法:
现在单片机内部定义一个二维数组BUFFER,大小于SRAM相同;每次画点时都是往这个SRAM上置位,最后将这个SRAM一次性更新到OLED内部的SRAM上(更新方式于第一种方法相同)。(好处时,取模方式没有限制,可以兼容多种取模方式,画点时也比较快,不用每次画点都需要重新与OLED发起通讯,坏处是对单片机的SRAM要求比较高,容量要足够大。而且需要记得在每次画点结束后都要调用SRAM的更新函数。)
3.小项目练习
这次没有过于探究底层的程序,关于i2c,和6800,8080协议,以及字库的生成,读取和查找,以后再做总结吧,(毕竟现在学的还很浅)。
主要是利用原子的图库和洋桃的OLED——i2c驱动显示函数(因为手头只有一个i2c驱动的OLED),将不同取模方式的进行转换会比较麻烦些,显示函数还比较好处理。(如果有涉及侵权问题,联系我删除)
主要自己写的三个函数如下:
OLED0561.里的三个函数:
主要是实现了字库功能,这样就不用每个想要的汉字都去取模了。
/*******************************************************************************函 数 名 : void OLED_Show_str(u8 row,u8 colon,u8* str,u8 mode)函数功能 : 显示中英文混合字串输 入 : row行,colon列,str字符串,mode显示模式(1汉字反白显示)输 出 : 无说 明 : 1.ASII字符不会反白显示,2.行列输入可以超过8,128,超过时会换行回环显示,但建议不要使用过大;
*******************************************************************************/
void OLED_Show_str(u8 row,u16 colon,u8* str,u8 mode)
{ u8 is_Hz=0; //字符或者中文 u8 size =16; while(*str!=0)//数据未结束{ if(colon>=128)//换行{row+=2*(colon/128);colon%=128;if(row>=8)row%=8;//溢出回环重显}if(!is_Hz){if(*str>0x80)is_Hz=1;//标记为中文 else //字符处理{ OLED_DISPLAY_8x16(row,colon,*str);//字符写入 str++; colon+=size/2; //字符,为全字的一半 }}else//中文 { is_Hz=0;//清零变量用于下一次识别OLED_Show_HZ(row,colon,str,mode); //显示这个汉字,str+=2; colon+=size;//下一个汉字偏移 } }
}/*******************************************************************************函 数 名 : void OLED_Show_HZ(u8 x,u8 y,u8*ZH,u8 mode)函数功能 : 显示一个中文GBK16字符输 入 : x行,y列,ZH,单个汉字的字符串,mode模式(1反白显示)输 出 : 无说 明 : 注意x是行,不是x指横轴(我写的坑,懒得修了)
*******************************************************************************/
void OLED_Show_HZ(u8 x,u8 y,u8*ZH,u8 mode)
{u8 i=0;u8 j,t,c=0;u8 dzk[32];Get_HzMat(ZH,dzk,16);for(i=0;i<32;i++){if(mode)dzk[i] =~( char_revolve(dzk[i]) ) ;//mode1,反白显示;else dzk[i] = char_revolve(dzk[i]);}for(t=0;t<2;t++){I2C_SAND_BYTE(OLED0561_ADD,COM,0xb0+x); //页地址(从0xB0到0xB7)I2C_SAND_BYTE(OLED0561_ADD,COM,y/16+0x10); //起始列地址的高4位(OLED芯片用高四位区分它第四位是指列地址的高四位还是低四位)I2C_SAND_BYTE(OLED0561_ADD,COM,y%16); //起始列地址的低4位(实际上是加了高四位的0x00)for(j=0;j<16;j++){ //整页内容填充if(t==0){c=2*j;}else {c=2*j+1;}I2C_SAND_BYTE(OLED0561_ADD,DAT,dzk[c]);}x++; //页地址加1}I2C_SAND_BYTE(OLED0561_ADD,COM,0xAF); //开显示
}/*******************************************************************************函 数 名 : static u8 char_revolve(u8 temp_char)函数功能 : 字节1反序函数输 入 : 供 void OLED_Show_HZ(u8 x,u8 y,u8*ZH,u8 mode) 显示GBK16字库字符使用输 出 : 反序后的GBK16码表值说 明 : 无
*******************************************************************************/
static u8 char_revolve(u8 temp_char)
{u8 result=0;u8 i=0;u8 Mask_bit=0x01;for(i=0;i<8;i++){if(temp_char&0x80)result|=Mask_bit;temp_char<<=1;Mask_bit<<=1;}return result;
}
主函数中实现了个小弹幕:原理不难。同时也将OLED_Show_str()函数置于USMART中,供串口调用,有兴趣的同学可以试试看:
代码仓库的连接如下:(仓库中的Project4,之前忘了用分支把练习项目分开了)使用正点原子精英板,插SD卡(提供字库,FLASH内有的则不需要),I2C驱动的0.96寸OLED屏。
ZET6小项目: 是学习stm32zet6时做的一些小项目练习。 (gitee.com)
效果如下:
stm32汉字字库显示实验与OLED的使用(开始于2021-09-01)相关推荐
- 华科计算机组成原理 存储系统实验 汉字字库Logsim实验
华科计算机组成原理 存储系统实验 汉字字库 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自 ...
- STM32单片机TFTLCD显示实验:TFTLCD简介
STM32单片机TFTLCD显示实验学习笔记 1.TFTLCD模块接口图 以2.8寸的TFTLCD为例,采用16位的并方式与外界进行连接,模块接口图如下所示: 具有如下一些信号线: CS:TFTLCD ...
- 点阵字库显示系列之二:GB2312点阵字库显示
免责声明: 本文是作者在研究过程中的一篇文章,本着互联网共享.自由(free,应该不是"免费")之精神发布于此.作者才疏学浅,孤陋寡闻,能力有限,对文中出现的术语及 ...
- 【正点原子STM32连载】第四十七章 汉字显示实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1
1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...
- 【正点原子STM32连载】第二十三章 OLED显示实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1
1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...
- stm32 读取sd卡图片显示_「正点原子STM32Mini板资料连载」第三十五章 汉字显示实验...
1)实验平台:正点原子STM32mini开发板 2)摘自<正点原子STM32 不完全手册(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第三十五章 汉字显示实验 汉字显示在 ...
- fastreport masterdata每页都显示_ALIENTEK 阿波罗 STM32F767 开发板资料连载十六章 OLED 显示实验...
1)实验平台:alientek 阿波罗 STM32F767 开发板2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 http://weixi ...
- 灵感手环第一步——0.96寸OLED显示实验
这算是我这个系列的第一篇博客吧.首先要解决的就是屏幕显示问题.我选择了目前新兴起的OLED显示模块. OLED(OrganicLightEmittingDiode),中文译作有机发光二极管,目前被广泛 ...
- pdfstamper生成pdf无法显示汉字_正点原子STM32F4/F7水星开发板资料连载第四十六章 汉字显示实验...
1)实验平台:正点原子水星 STM32F4/F7 开发板 2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 3)全套实验源码+手册+视频下载 ...
最新文章
- 【阿里云总监课第四期】时髦的云原生应用怎么写?
- Cookie简介及JSP处理Cookie的方法(转)
- java ror框架搭建_ROR 环境的 搭建
- 浅谈安卓线程池相关问题
- 安川机器人程序还原_安川机器人 程序示例
- mysql 内置功能 存储过程介绍
- 情人节来了!没有50W彩礼,女朋友被强行拖走。。。
- 简述 Spring Cloud 是什么
- 后宫宛如传服务器维护,合服丨《后宫宛如传》合服公告
- Spring Boot+Mysql实现的电影在线资讯系统
- 2018年上半年读者最喜爱的异步新书TOP50
- 毕设题目:Matlab目标跟踪
- 64位Linux下安装iNode客户端
- java递归下降计算四则运算_用递归下降方法实现算术表达式解析器
- 矢量绘图界的性价比之王-Affinity Designer
- ZK宕机重启数据恢复
- 【剖析 | SOFARPC 框架】之SOFARPC 线程模型剖析
- 深层听觉(用无意识状态的大脑学习)秘诀
- Cesium模拟雷达追踪卫星
- php正则匹配是否为url地址,php正则匹配网址-正则php-php正则匹配url地址
热门文章
- Node.js 更新到最新版本
- oracle 导出身份证号_ORACLE对身份证号码处理相关的SQL【收藏】
- LVGL-输入设备LV_INDEV_TYPE_POINTER类型
- mASK调制在AWGN信道下的可达信息速率的Monte Carlo仿真计算法
- macbook pro window蓝牙驱动 下载
- 常用的图像质量评估方法
- The Humble Programmer
- postgresql 页损坏(corrupted page)之checksum功能
- js正则去掉头尾空白符
- 2020-12-01 Kronecker积和范数的一些定理