STM32+OLED巧妙显示汉字英文
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巧妙显示汉字英文相关推荐
- 基于STM32的0.96寸OLED显示屏显示汉字+数字
文章目录 一.SPI协议 1.什么是SPI协议 2. SPI 协议的物理层和协议层 二.0.96寸OLED屏 三.使用OLED屏显示数据 1.下载程序 2.打开工程 3.部分代码 4.编译并烧录 5. ...
- 用STM32F103达成基于I2C协议的AHT20温湿度传感器和OLED屏显示汉字
目录 一 I2C协议简介 硬件I2C与软件I2C 二 代码和ATH20芯片实现温湿度的串口显示 三 用stm32f103芯片的SPI和IIC接口接上OLED屏显示中文姓名温湿度 1 先用文字字模生成器 ...
- OLED液晶显示屏显示汉字
main.c void main(void) { OLED_Init(); OLED_Clear(); OLED_ShowCHinese(14,0,1);OLED_ShowString(28,0,&q ...
- 0.96寸OLED显示汉字,数字,英文,图片,GIF动画+取模软件使用+代码解析
前言 本次我们学习一下STM32F103关于OLED显示汉字,数字,英文,图片,GIF动画,和介绍各种取模软件的使用,主要教会大家使用和修改OLED驱动的代码,对汉字大小,图片分辨率进行代码修改并显示 ...
- STM32分别实现温湿度的采集和OLED显示屏显示数据
目录 一.温湿度的采集 1.1了解I2C总线协议 1.2实现AHT20采集程序 二.OLED显示屏显示数据 2.1了解SPI 2.2使用OLED显示 2.2.1实验题目: 2.2.2实验过程 三.总结 ...
- 【嵌入式】STM32基于SPI通信协议OLED屏显示
STM32基于SPI通信协议OLED屏显示 一.SPI协议和OLED介绍 1.SPI协议介绍 物理层 协议层 2.OLED显示屏介绍 二.显示个人学号姓名实验 1.题目要求 2.代码部分 1.完整代码 ...
- 基于STM32的0.96寸OLED显示屏显示固定数据、滑动数据、温湿度数据
目录 OLED显示原理 一.实验工具 二.OLED显示固定数据 1.显示数据相关函数 2.main函数 3.总显示函数 4.取字模 5.实现效果如下: 三.OLED实现滑动显示数据 1.添加滑动命令 ...
- fpga驱动oled iic显示代码_Arduino提高篇02—OLED屏汉字显示
上篇中我们已经使用驱动库在OLED屏上显示出英文字符,除去数字.字母.符号等,OLED还能显示汉字.图片及任意图形.本篇介绍取模软件的使用,教大家如何在OLED屏上显示汉字. 1. 字模显示原理及取模 ...
- Arduino使用OLED显示汉字——For初学者
故事背景 有一次做项目用到了OLED显示器,需要用它来显示汉字,网上找了很多的资料,用OLED显示英文或者数字比较方便,至于显示汉字也不是很难,只是网上的资料都太零散,而且有的代码运行不了,基于此写下 ...
最新文章
- spring-session源码解读 sesion
- Android -- ImageLoader本地缓存
- select poll epoll IO操作多路复用及猴子补丁
- 2021暑假每日一题 【week7 完结】
- 电脑常用工具(阅读代码、文件搜索、思维导图、图片处理、文件比较、流程图、桌面效率工具)
- LeetCode 323. 无向图中连通分量的数目(并查集)
- HttpServletResponse说明
- 多通路fpga 通信_多核DSP和FPGA之间的高速SRIO通信
- java 多态_Java基础深度总结:多态
- 【愣锤笔记】能解决80%场景的Git必会知识点
- 38. Element cloneNode() 方法
- .net 5和.net core_开源仿真器 EpicSim 运行 SM3_core
- 《软件方法》第8章 分析 之 分析类图——知识篇Part1(20211029更新)
- mongoDB备份方案
- 众多电子秤方案免费拿~挑一个?
- html背景左右渐变,css 背景 上下渐变 左右渐变
- 关于Egret项目升级引擎出现的问题
- android+微信字体大小,关于微信安卓端网页字体适配的通知
- JAVA基础金币游戏算总数
- 实时系统与非实时系统的区别