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)相关推荐

  1. 华科计算机组成原理 存储系统实验 汉字字库Logsim实验

    华科计算机组成原理 存储系统实验 汉字字库 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自 ...

  2. STM32单片机TFTLCD显示实验:TFTLCD简介

    STM32单片机TFTLCD显示实验学习笔记 1.TFTLCD模块接口图 以2.8寸的TFTLCD为例,采用16位的并方式与外界进行连接,模块接口图如下所示: 具有如下一些信号线: CS:TFTLCD ...

  3. 点阵字库显示系列之二:GB2312点阵字库显示

    免责声明:         本文是作者在研究过程中的一篇文章,本着互联网共享.自由(free,应该不是"免费")之精神发布于此.作者才疏学浅,孤陋寡闻,能力有限,对文中出现的术语及 ...

  4. 【正点原子STM32连载】第四十七章 汉字显示实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

    1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...

  5. 【正点原子STM32连载】第二十三章 OLED显示实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

    1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...

  6. stm32 读取sd卡图片显示_「正点原子STM32Mini板资料连载」第三十五章 汉字显示实验...

    1)实验平台:正点原子STM32mini开发板 2)摘自<正点原子STM32 不完全手册(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第三十五章 汉字显示实验 汉字显示在 ...

  7. fastreport masterdata每页都显示_ALIENTEK 阿波罗 STM32F767 开发板资料连载十六章 OLED 显示实验...

    1)实验平台:alientek 阿波罗 STM32F767 开发板2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 http://weixi ...

  8. 灵感手环第一步——0.96寸OLED显示实验

    这算是我这个系列的第一篇博客吧.首先要解决的就是屏幕显示问题.我选择了目前新兴起的OLED显示模块. OLED(OrganicLightEmittingDiode),中文译作有机发光二极管,目前被广泛 ...

  9. pdfstamper生成pdf无法显示汉字_正点原子STM32F4/F7水星开发板资料连载第四十六章 汉字显示实验...

    1)实验平台:正点原子水星 STM32F4/F7 开发板 2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 3)全套实验源码+手册+视频下载 ...

最新文章

  1. 【阿里云总监课第四期】时髦的云原生应用怎么写?
  2. Cookie简介及JSP处理Cookie的方法(转)
  3. java ror框架搭建_ROR 环境的 搭建
  4. 浅谈安卓线程池相关问题
  5. 安川机器人程序还原_安川机器人 程序示例
  6. mysql 内置功能 存储过程介绍
  7. 情人节来了!没有50W彩礼,女朋友被强行拖走。。。
  8. 简述 Spring Cloud 是什么
  9. 后宫宛如传服务器维护,合服丨《后宫宛如传》合服公告
  10. Spring Boot+Mysql实现的电影在线资讯系统
  11. 2018年上半年读者最喜爱的异步新书TOP50
  12. 毕设题目:Matlab目标跟踪
  13. 64位Linux下安装iNode客户端
  14. java递归下降计算四则运算_用递归下降方法实现算术表达式解析器
  15. 矢量绘图界的性价比之王-Affinity Designer
  16. ZK宕机重启数据恢复
  17. 【剖析 | SOFARPC 框架】之SOFARPC 线程模型剖析
  18. 深层听觉(用无意识状态的大脑学习)秘诀
  19. Cesium模拟雷达追踪卫星
  20. php正则匹配是否为url地址,php正则匹配网址-正则php-php正则匹配url地址

热门文章

  1. Node.js 更新到最新版本
  2. oracle 导出身份证号_ORACLE对身份证号码处理相关的SQL【收藏】
  3. LVGL-输入设备LV_INDEV_TYPE_POINTER类型
  4. mASK调制在AWGN信道下的可达信息速率的Monte Carlo仿真计算法
  5. macbook pro window蓝牙驱动 下载
  6. 常用的图像质量评估方法
  7. The Humble Programmer
  8. postgresql 页损坏(corrupted page)之checksum功能
  9. js正则去掉头尾空白符
  10. 2020-12-01 Kronecker积和范数的一些定理