STM32+OLED巧妙显示汉字英文

目标:实现OLED_Print函数,可以在OLED屏幕上显示中英文和符号混合的任意字符串

汉字编码原理

ASCII码显示的原理这里不再说明,一般的OLED例程都有使用方法。下面说一下中文编码的原理。
在keil的环境使用的是GBK或者GB2312的编码方式,GBK编码汉字使用两个字节:
第一个字节为区码,第二个好像叫段码,区码是大于127的,段码不一定。
具体编码方式可以查阅资料:
下面编写一个简单的程序进行验证:

int main(void)
{   char *s = "哈h";int i;delay_init();            //延时函数初始化    NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级    uart_init(115200);OLED_Init();//初始化OLED  OLED_Clear();while(1) {        for(i=0;i<strlen(s);i++)printf("*(s+%d) = 0x%x\r\n", i,*(s+i));delay_ms(1000);}
}

串口输出的结果如下:

h的ASCII值为0x68,那么前面的两个字节则为这个汉字对应的GBK码,即为0xb9fe,使用内码查询软件查询验证:

利用结构体

知道了GBK汉字编码的方式,这么实现汉字的查找呢?答案是利用结构体进行封装。定义一种结构体类型:

成员Index使用short类型用来存放汉字的GBK码,Msk数组是char类型用来存放字模数据,因为是OLED所以使用char类型存放数据。

使用PctoLCD软件生成16x16大小的汉字字模数据,字模软件的设置如下:

在字体头文件中定义我们的汉字库数组,在每个字模数据前面加上'x',x为字模对应的汉字,类型要用前面创建的结构体类型:

这样这个结构体数组中的数据就会对应到结构体成员中的内码索引Index和字模数组Msk成员了,然后通过结构体成员Index的判断就可以实现对汉字的查找,查找到汉字之后就可以使用OLED将字模数据写入显示到屏幕上。

OLED_Print函数

编程思路:
通过对字符串s的取指操作,判断当前字节是否大于127,大于127说明对应的是汉字,将接下来的两个字节取出组合为汉字内码,通过内码查询字模数组中是否包含该字,查找到之后再将数据写入,显示到屏幕上。如果当前的字节小于128,则对应的是英文字符,直接使用例程的OLED_ShowChar函数写数据,就可以显示出来。
注意:这里汉字对应的是16x16大小,英文字符对应1608字体,坐标偏移需要注意。

/*x:横坐标,0-127y:0-7(中景园OLED)*s:要显示的字符(中英文均可,前提是数组中包含的汉字)
*/
void OLED_Print(u8 x, u8 y, char *s)
{unsigned char i,k,t,length;unsigned short Index = 0;length = strlen(s);//取字符串总长//printf("length = %d\r\n",length);for(k=0; k<length; k++){//printf("k = %d\r\n",k);if(*(s+k) <= 127){//小于128是ASCII符号//printf("ascii\r\n");OLED_ShowChar(x,y,*(s+k),16);x += 8;//x坐标右移8}else if(*(s+k) > 127){//大于127,为汉字,前后两个组成汉字内码//printf("汉字\r\n");Index = (*(s+k) << 8) | (*(s+k+1));//取汉字的内码for(i=0;i<sizeof(CN16_Msk)/34;i++){//查数组if(Index == CN16_Msk[i].Index){//查询到这个字OLED_Set_Pos(x,y);   for(t=0;t<16;t++)OLED_WR_Byte(CN16_Msk[i].Msk[t],OLED_DATA);//写入字模OLED_Set_Pos(x,y+1);   for(t=16;t<32;t++)OLED_WR_Byte(CN16_Msk[i].Msk[t],OLED_DATA);x += 16;k += 1; //汉字占2B,跳过一个 }}}}
}

结果

温度单位也是用中文的,但是在字模里不能显示,不用在意:

工程文件(stm32f103c8t6+iic OLED):https://download.csdn.net/download/qq_41790078/12336885

STM32+OLED巧妙显示汉字英文相关推荐

  1. 基于STM32的0.96寸OLED显示屏显示汉字+数字

    文章目录 一.SPI协议 1.什么是SPI协议 2. SPI 协议的物理层和协议层 二.0.96寸OLED屏 三.使用OLED屏显示数据 1.下载程序 2.打开工程 3.部分代码 4.编译并烧录 5. ...

  2. 用STM32F103达成基于I2C协议的AHT20温湿度传感器和OLED屏显示汉字

    目录 一 I2C协议简介 硬件I2C与软件I2C 二 代码和ATH20芯片实现温湿度的串口显示 三 用stm32f103芯片的SPI和IIC接口接上OLED屏显示中文姓名温湿度 1 先用文字字模生成器 ...

  3. OLED液晶显示屏显示汉字

    main.c void main(void) { OLED_Init(); OLED_Clear(); OLED_ShowCHinese(14,0,1);OLED_ShowString(28,0,&q ...

  4. 0.96寸OLED显示汉字,数字,英文,图片,GIF动画+取模软件使用+代码解析

    前言 本次我们学习一下STM32F103关于OLED显示汉字,数字,英文,图片,GIF动画,和介绍各种取模软件的使用,主要教会大家使用和修改OLED驱动的代码,对汉字大小,图片分辨率进行代码修改并显示 ...

  5. STM32分别实现温湿度的采集和OLED显示屏显示数据

    目录 一.温湿度的采集 1.1了解I2C总线协议 1.2实现AHT20采集程序 二.OLED显示屏显示数据 2.1了解SPI 2.2使用OLED显示 2.2.1实验题目: 2.2.2实验过程 三.总结 ...

  6. 【嵌入式】STM32基于SPI通信协议OLED屏显示

    STM32基于SPI通信协议OLED屏显示 一.SPI协议和OLED介绍 1.SPI协议介绍 物理层 协议层 2.OLED显示屏介绍 二.显示个人学号姓名实验 1.题目要求 2.代码部分 1.完整代码 ...

  7. 基于STM32的0.96寸OLED显示屏显示固定数据、滑动数据、温湿度数据

    目录 OLED显示原理 一.实验工具 二.OLED显示固定数据 1.显示数据相关函数 2.main函数 3.总显示函数 4.取字模 5.实现效果如下: 三.OLED实现滑动显示数据 1.添加滑动命令 ...

  8. fpga驱动oled iic显示代码_Arduino提高篇02—OLED屏汉字显示

    上篇中我们已经使用驱动库在OLED屏上显示出英文字符,除去数字.字母.符号等,OLED还能显示汉字.图片及任意图形.本篇介绍取模软件的使用,教大家如何在OLED屏上显示汉字. 1. 字模显示原理及取模 ...

  9. Arduino使用OLED显示汉字——For初学者

    故事背景 有一次做项目用到了OLED显示器,需要用它来显示汉字,网上找了很多的资料,用OLED显示英文或者数字比较方便,至于显示汉字也不是很难,只是网上的资料都太零散,而且有的代码运行不了,基于此写下 ...

最新文章

  1. spring-session源码解读 sesion
  2. Android -- ImageLoader本地缓存
  3. select poll epoll IO操作多路复用及猴子补丁
  4. 2021暑假每日一题 【week7 完结】
  5. 电脑常用工具(阅读代码、文件搜索、思维导图、图片处理、文件比较、流程图、桌面效率工具)
  6. LeetCode 323. 无向图中连通分量的数目(并查集)
  7. HttpServletResponse说明
  8. 多通路fpga 通信_多核DSP和FPGA之间的高速SRIO通信
  9. java 多态_Java基础深度总结:多态
  10. 【愣锤笔记】能解决80%场景的Git必会知识点
  11. 38. Element cloneNode() 方法
  12. .net 5和.net core_开源仿真器 EpicSim 运行 SM3_core
  13. 《软件方法》第8章 分析 之 分析类图——知识篇Part1(20211029更新)
  14. mongoDB备份方案
  15. 众多电子秤方案免费拿~挑一个?
  16. html背景左右渐变,css 背景 上下渐变 左右渐变
  17. 关于Egret项目升级引擎出现的问题
  18. android+微信字体大小,关于微信安卓端网页字体适配的通知
  19. JAVA基础金币游戏算总数
  20. 实时系统与非实时系统的区别

热门文章

  1. CMakeList语法介绍
  2. Linux内核(八) PHY状态机以及网络相关操作命令解析
  3. php中文符号转英文符号,php如何中英文符号替换?
  4. 靶机Hacknos-3
  5. 『C语言』题集 of ⑩
  6. C#实现的滑块验证码
  7. java 获取复选框值
  8. Maya如何给模型添加IK?
  9. 通用弱点评价体系(CVSS)简介
  10. IE的缺省设置(转)