您当前的位置: 首页 >  ide

正点原子

暂无认证

  • 0浏览

    0关注

    382博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【正点原子MP157连载】第十九章 OLED实验-摘自【正点原子】STM32MP1 M4裸机CubeIDE开发指南

正点原子 发布时间:2022-03-04 12:27:55 ,浏览量:0

1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-318813-1-1.html 4)正点原子官方B站:https://space.bilibili.com/394620890 5)正点原子STM32MP157技术交流群:691905614 在这里插入图片描述

第十九章 OLED实验

本章我们来学习使用OLED液晶显示屏,在开发板上我们预留了OLED模块接口,需要准备一个OLED显示模块。下面我们一起来点亮OLED,并实现显示字符和图片。 本章分为如下几个小节: 19.1、字符编码; 19.2、制作字模; 19.3、OLED简介; 19.4、OLED字符、数字显示实验; 19.5、OLED显示图片实验; 19.6、OLED显示动图实验; 19.7、OLED显示中文字体;

19.1 字符编码 计算机中存储的信息是以二进制的0或1来表示的,我们在屏幕上看到的汉字、英文和数字等信息是经过二进制转换后的结果。按照某种规则将字符存储在计算机中,例如ASCII 字符集中,字符’a’用十进制的97来表示,字符’A’用十进制的65来表示,我们称为“编码”,反之,将计算机中的二进制数据解释出来,我们称为“解码”。 字符集是各种文字和符号的集合,常见的字符集有ASCII字符集、GB2312字符集、BIG5字符集、Unicode字符集等。下面我们会介绍ASCII字符集,关于其它字符集,如果想深入了解,大家可以参考百度百科详细说明。计算机要准确的处理各种字符集的文字,就需要进行字符编码。字符编码也称作字集码,它是一套编码规则,是信息处理的一项基本技术,其在符号集与数字系统之间建立对应关系,将符号转换为计算机可以够识别和存储的数字。 ASCII码使用7位2进制数表示一个字符,7位2进制数可以表示出27个字符,共128个字符,其中有 96 个可打印字符,包括常用的字母、数字、标点符号等,另外还有 32 个控制字符,控制字符中,如LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(振铃)等,如下图中是ASCII字符代码表: 在这里插入图片描述

图19.1. 1 ASCII字符代码表ASCII字符代码表 本章实验,我们会使用以下ASCII字符集来显示英文字符和数字(第一个字符是空格): !"#$%&’()+,-./0123456789:;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~ 19.2 制作字模 19.2.1 像素 图像显示是用点阵的方式来显示的,屏幕上一个个很细小的点就是像素,像素点就类似一个灯(在 OLED 显示器中,像素点就是一个小灯),通过控制这些小灯的亮和灭可以显示不同的图像。像素是图像最基本的单位,屏幕上像素点越小,像素密度越高的,图像的像素越高,显示的效果就越清晰。高分辨率的图像要比低分辨率的图像包含更多的像素,所以同样大小的图像,使用高分辨率的屏幕比低分辨率的屏幕来显示更清晰。提起显示器,我们都会听到 720P、1080P、2K 或 4K 这样的字眼,1080P 的意思就是一个屏幕上的像素数量是19201080 个,也就是这个屏幕一列 1080 个像素点,一共 1920 列,如下图所示: 在这里插入图片描述

图19.2.1. 1像素点和分辨率关系示意图 上图中,X 轴就是1080P显示器的横轴,Y 轴就是1080P显示器的竖轴。图中的小方块就是像素点,一共有 1920*1080=2073600 个像素点。左上角的 A 点是第一个像素点,右下角的 C 点就是最后一个像素点。 19.2.2 字模

  1. 字模简介 字模就是字符或者图像在点阵上显示时对应的编码,字模也就是我们要计算机识别的符号或者图像的数据,以数字来表示,因为计算机只能识别数字0和1,所以我们要先把图像或者符号通过字模软件转化成字模。如下图,如果我们要显示一个英文字母“B”,以816个二进制数据位来表示,每个二进制数据位记录一个像素点的状态,则一个英文字母需要816/8=16个字节的二进制数据位来表示。字符的宽为1个字节,高为2个字节: 在这里插入图片描述

图19.2.2. 1 显示英文字符 如果是汉字,汉字字符是英文字符的两倍,一个汉字则需要16*16/8=32个字节的二进制数据位来表示,字符的宽为2个字节,高也为2个字节,即汉字字符的宽是英文字符的宽的2倍: 在这里插入图片描述

图19.2.2. 2显示中文字体 2. 制作字模 制作字模,有很多的优秀的软件,本实验我们使用“开发板光盘A-基础资料\3、软件\PCtoLCD2002完美版”字模软件来制作字模,该软件可以提供各种字符包括汉字(字体和大小都可以自己设置)点阵提取,且取模方式可以设置好几种,常用的取模方式,该软件都支持。该软件除了支持字符模式,还支持图形模式,也就是用户如果要显示一张图片的话,可以自己定义图片的大小,然后手动画图,或者可以导入一张已有的图片,该软件根据图片提取出点阵数据。下面我们来介绍此字模软件的使用方法。 (1)字符模式 ①双击打开字模软件PCtoLCD2002完美版: 在这里插入图片描述

图19.2.2. 3 PCtoLCD2002完美版 ②对于要显示字符,我们先把要显示的字符输入字符输入框中,然后点击设置选项设置取模方式: 在这里插入图片描述

图19.2.2. 4 输入字符 ③然后我们设置取模方式,如下图,红框处可以配置,其它部分我们先保持默认: 在这里插入图片描述

图19.2.2. 5设置取模方式 点阵格式可以选择阴码或者阳码,字模也就是像素点的数据,每一个点都需要一个bit位来存储,该位为0代表该像素点不显示,为1代表显示。字模点阵中有笔迹像素位的状态是“1”(亮),没有笔记像素位的状态是“0”(灭)的方式为阴码;字模点阵中有笔迹像素位的状态是“0”(灭),没有笔记像素位的状态是“1”(亮)的方式为阳码。本节实验中选择阴码。 取模走向可以选择顺向或者逆向,也就是屏幕上同列中上行与下行哪个行对应生成字节的高位还是低位的问题,顺向就是屏幕下行属于高位,逆向就是屏幕上行属于低位。本节试验选择顺向。 每行显示数据可以自行配置,点阵表示生成的字模中,每行最大可以显示多少个数据,索引则表示产生的索引中,每行显示多少个索引值。 在这里插入图片描述

图19.2.2. 6点阵数据 例如配置为“点阵:12 索引:12”,以下字模每行最大为12个数据: {0x00,0x04,0x00,0x3C,0x03,0xC4,0x1C,0x40,0x07,0x40,0x00,0xE4}, {0x00,0x1C,0x00,0x04},/“A”,0/ 字宽和字高,字宽和字高可以自行配置,会有英文的字宽和字宽以及中文的字宽和字宽,我们前面也说过,汉字的字宽是英文字宽的两倍,如果配置汉字的字宽和字高都是16,那么英文的字宽和字高分别是8和16: 在这里插入图片描述

图19.2.2. 7设置字宽和字高 自定义格式中,A51按汇编生成,C51按c格式生成,显然我们是c编程,选择C51即可。自定义格式处如果勾选后,我们可以配置生成的字模数据的格式。例如,如果生成的数据中不想要大括号“{}”,可以自定义去掉大括号: 在这里插入图片描述

图19.2.2. 8自定义点阵数据的前缀和后缀 生成的点阵数据中就没有了大括号: 0x10,0x04,0x1F,0xFC,0x10,0x04,0x00,0x04,0x00,0x04,0x00,0x04, 0x00,0x0C,0x00,0x00,/“L”,1/ 取模方式有逐列式、逐行式、列行式和行列式。不同的取模方式需要结合不同的算法。在右上角的取模说明里面有,即:从第一列开始向下每取8个点作为一个字节,如果最后不足8个点就补满8位。取模顺序是从高到低,即第一个点作为最高位。如*-------取为10000000。其实就是按如下图所示路径的这种方式: 在这里插入图片描述

图19.2.2. 9取模方式图解 从上到下,从左到右,高位在前。我们按这样的取模方式,然后把ASCII字符集按126大小、168和2412大小取模出来(对应汉字大小为1212、1616和2424,字符的只有汉字的一半大!),每个126的字符占用12个字节,每个168的字符占用16个字节,每个24*12的字符占用36个字节。 ④点击生成字模,再保存字模,可以选择保存生成的字模: 在这里插入图片描述

图19.2.2. 10生成和保存字模 (2)图形模式 PCtoLCD2002完美版字模软件支持BMP格式的图片,如果要对某一张点阵图片取模,需要将此图片转化成.bmp格式的图片才可以。 在这里插入图片描述

图19.2.2. 11图形模式 如下图,选择图形模式后,点击文件打开,选择打开一张.bmp格式的文件即可: 在这里插入图片描述

图19.2.2. 12选择打开图形 或者可以选择文件新建,新建一张大小规定的图像(如果屏幕很小,建议设置的长和宽要比屏幕小,这样才可以显示完全),然后手动画图: 在这里插入图片描述

图19.2.2. 13手动画图 19.2.3 根据取模方式控制点阵显示字符 下面,我们先以显示简单的字符为例子,对字符显示做一个简单的讲解,为了方便讲解,此处讲解的代码先不在开发板上运行,我们先在以前学习C语言的工具(例如Visual C++ 6.0)上操作实现。此处的代码非常简单,如果没有安装此软件的也无关紧要,理解一遍代码即可。

  1. 显示英文字符 (1)字模提取 如果我们要显示一个英文字符“A”,如下图,设置字体为宋体,字宽和字高都为16,这个是汉字格式,那么对应的英文格式字长就是8,字宽就是16。如果A这个字符按阴码、顺向、逐列式、十六进制方式取模(即从下到上、从左到右、从低位到高位取模),如下图,因为点阵格式是阴码,为1的地方表示亮,为0的地方表示灭: 在这里插入图片描述

19.2.3. 1设置取模方式 在这里插入图片描述

19.2.3. 2英文字符A 在这里插入图片描述

19.2.3. 3字符A对应的点阵数据 那么,取模得到的十六进制数据为: 0x00,0x04,0x00,0x3C,0x03,0xC4,0x1C,0x40,0x07,0x40,0x00,0xE4,0x00,0x1C,0x00,0x04,/“A”,0/ 不同的取模方式得到的数据不一样,如果设置字体为宋体,字宽和字高都为16,我们的取模方式为阴码、顺向、行列式、十六进制方式提取(即从上到下、从右到左、从),则取模得到的十六进制的数据为: 在这里插入图片描述

19.2.3. 4设置取模方式 在这里插入图片描述

19.2.3. 5字符A对应的点阵数据 取模得到的点阵数据如下: 0x00,0x00,0x00,0x10,0x10,0x18,0x28,0x28,0x24,0x3C,0x44,0x42,0x42,0xE7,0x00,0x00,/“A”,0/ (2)程序实现 以上字模提取过程称为编码,不同的取模方式,算法会有些差别,我们使用程序将字符“A”打印出来,使用以上阴码、顺向、行列式、十六进制取模方式的编码数据,在Visual C++ 6.0下的程序如下:

1   #include   
2   #include   
3     
4   unsigned char ch[] = {0x00,0x00,0x00,0x10,0x10,0x18,0x28,0x28,0x24,0x3C,0x44,0x42,0x42,0xE7,0x00,0x00};  
5 
6   void showA(){  
7       int i,j;  
8       unsigned char t;  
9       for (i = 0; i             
关注
打赏
1665308814
查看更多评论
0.0449s