49007|15

855

帖子

5

TA的资源

一粒金砂(高级)

楼主
 

在OLED屏上显示汉字、字符、图片 [复制链接]

 
本帖最后由 人民币的幻想 于 2015-4-16 09:25 编辑

最近几天在DIY MP3播放器这个东西,说来其实很简单,去年就做好了。只不过当初是通过1602液晶显示一些简单的东西,歌曲名字还有很多相关信息没法显示。言归正传,这回打算用OLED屏试试看,经实践,显示效果帮帮哒~~。
首先先说一下所用方案:MCU用的STM32F103RBT6,OLED用的SSD1306控制的,MCU和屏是通过硬件SPI通信的。具体底层实现请看我曾经发过的一篇帖子。SD卡采用硬件SPI+DMA方式驱动,底层驱动移植自振南的SD卡驱动。
字符和数字显示很简单,用的取模软件直接取得,毕竟数量不多,占用体积也不大,相对128K的ROM来说够了。我是用的PCtoLCD2002完美版取得模,点阵采样阴码-列行式-逆向-C51格式。当然还可以自己选择自己喜欢字体大小和格式,就不再多说了。显示原理是这样的:假设以8*8大小某字符为例,占用8*8=64个bits,占用64/8=8Bytes,其他格式请自己推算,列行式即先扫一列在扫下一列,扫完这一行再扫下一行(假设有的话)。至于为什么选择阴码,我用的OLED屏手册上有这样一句话 Display Mode: Passive Matrix,即共阴点阵。大家应该都用过数码管,有共阴和共阳之分,此处原理相同。逆向是低位在前高位在后,即先取低位再取高位。取模原理大致就是这样。显示是某些像素点的显示与不显示,我们把一个字符的8个字节依次取出,通过SPI送屏显示,这样,一个字符就得到显示。
图片显示同字符显示,如果想显示到LCD屏上,就需要一些办法了,首先用画图板打开某张图片,然后调整分辨率为水平128,垂直64。并且保存为单色位图格式。然后用PCtoLCD软件打开图片,然后生成字模就好了。以下同字符显示。
至于汉字显示就比较复杂,为什么复杂,拿常见的16*16点阵大小的汉字举例,一个汉字占用256bits=32Bytes,想制作MP3,那么长名文件名显示是绕不开的,因此汉字规模按8000算,共占用8000*32=256000Bytes=250.98KB,以单片机的存储空间是放不下的,即使换用更大存储空间的单片机比如1M flashROM,那么24*24点阵的汉字占用562.5KB空间,再加上GBKUNI互转表,那么可供利用的ROM空间就很小了。所以把这些点阵放到一个空间很大又不贵的存储介质中去,不失为一个很好的办法,基于此,我用的SD卡存放这几个文件,分别是12字体,16字体,24字体,GBK转UNI互转表,UNI转GBK互转表。这些是显示汉字及长名所必须的文件。存储的问题解决了,那么怎么找到哪个汉字对应哪些字节的点阵数据呢?这就要稍微了解一下汉字在计算机内表示的知识了,我们知道,由于直接存放点阵太大,所以在计算机内部是利用区位码来存放汉字的,关于这个区位码,我们国家发布了一些标准,当然,在MP3播放器中用到的是简体中文,而且可能出现一些不太常见的汉字,因此我利用GBK标准达到了显示这些汉字的效果。每个GBK码由2个字节组成,第一个字节为0X81~0XFE,第二个字节分为两部分,一是0X40~0X7E,二是0X80~0XFE。其中与GB2312相同的区域,字完全相同。我们把第一个字节代表的意义称为区,那么GBK里面总共有126个区(0XFE-0X81+1),每个区内有190个汉字(0XFE-0X80+0X7E-0X40+2),总共就有126*190=23940个汉字。我们的点阵库只要按照这个编码规则从0X8140开始,逐一建立,每个区的点阵大小为每个汉字所用的字节数*190。这样,我们就可以得到在这个字库里面定位汉字的方法:
当GBKL<0X7F时:Hp=((GBKH-0x81)*190+GBKL-0X40)*(size);
当GBKL>0X80时:Hp=((GBKH-0x81)*190+GBKL-0X41)*(size);
其中GBKH、GBKL分别代表GBK的第一个字节和第二个字节(也就是高位和低位),size代表一个汉字点阵规模大小,Hp则为对应汉字点阵数据在字库里面的起始地址(假设是从0开始存放)。这样我们只要得到了汉字的GBK码,就可以显示这个汉字了。从而实现汉字在液晶上的显示。
说到底,我们知道汉字点阵在哪放,怎么找到某个汉字对应偏移,那么怎么读取数据送到屏幕来呢,接下来就需要一些文件系统的知识了。。。。。。(省略1w字)。当然,也可以不用去了解,用现成的文件系统数据读取函数直接去定位文件位置,读取相应大小数据就好了。这里我用的是znFAT V11.21,实践看来,用起来很不错,移植到你的CPU平台也很简单。这样,就得到显示一个汉字到OLED屏的效果了,为了显示一个汉字,我们不得不去了解文件系统,了解字库中汉字表示,计算偏移量,定位数据,读取数据,处理,送显示。
这里就完成了整个汉字、字符、图片的显示原理及实践,在腊月二十九终于做好了,等待回学校有网时发出。
以下附上参考资料若干,有愿意一起折腾的朋友可以参考帮助改进,一起努力学习。
STM32开发指南V1.0库函数版本。(汉字显示章节)
SSD1306数据手册。
嵌入式FAT32文件系统设计与实现-基于振南znFAT(上册)。

长文件名显示.rar

8.68 MB, 下载次数: 5967

SAS1-9046-B UG-2864HSWEG01-Univision.pdf

1.66 MB, 下载次数: 811

此帖出自stm32/stm8论坛

最新回复

楼主 你那个中文字库在哪下载的?能分享下么   详情 回复 发表于 2018-6-28 02:14
点赞 关注(5)
个人签名作为一个菜逼,干货并没有多少。唯一会的就是水,所以回帖水分大。望见谅!
 

回复
举报

255

帖子

0

TA的资源

五彩晶圆(初级)

沙发
 
帮顶
lz前面一大堆文字 要是能分下段落就 可读性好多了

要不然能持续看完的坛友不多
此帖出自stm32/stm8论坛

点评

好的,这个是以前写好的,直接复制过来的  详情 回复 发表于 2015-4-16 11:20
 
个人签名每天进步一点点
 

回复

855

帖子

5

TA的资源

一粒金砂(高级)

板凳
 
hanker510 发表于 2015-4-16 11:13
帮顶
lz前面一大堆文字 要是能分下段落就 可读性好多了

要不然能持续看完的坛友不多

好的,这个是以前写好的,直接复制过来的
此帖出自stm32/stm8论坛
 
个人签名作为一个菜逼,干货并没有多少。唯一会的就是水,所以回帖水分大。望见谅!
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

4
 
你的这个程序能不能显示别的bmp图片   如果能应该怎么取模 (取模时应该怎么调那个取模软件)急需谢谢
此帖出自stm32/stm8论坛
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

5
 
分辨率为128*64  我想显示像素为128*64的bmp图片用你的这个函数应该怎么改?急需
此帖出自stm32/stm8论坛
 
 
 

回复

19

帖子

0

TA的资源

一粒金砂(中级)

6
 
这个方案,没有SD卡行么,我只有个1M的flash
此帖出自stm32/stm8论坛

点评

可以的,你把字库放到flash里边,这样就省去了sd卡。  详情 回复 发表于 2017-6-13 23:12
 
 
 

回复

855

帖子

5

TA的资源

一粒金砂(高级)

7
 
xueshawu 发表于 2017-6-13 16:36
这个方案,没有SD卡行么,我只有个1M的flash

可以的,你把字库放到flash里边,这样就省去了sd卡。
此帖出自stm32/stm8论坛
 
个人签名作为一个菜逼,干货并没有多少。唯一会的就是水,所以回帖水分大。望见谅!
 
 

回复

19

帖子

0

TA的资源

一粒金砂(中级)

8
 
人民币的幻想 发表于 2017-6-13 23:12
可以的,你把字库放到flash里边,这样就省去了sd卡。

其实,我昨天想问的是FON格式的字库文件如何通过串口放到flash;因为串口是不能直接发送FON文件的;不过;这个问题,我已经解决了;但是我刚测试调用GB2312字库;本想显示“啊”,结果显示“鞍”;应该是我 计算偏移量计算错了;楼主这里是GB2312的字库文件;能分享下么;确保我的字库文件没问题;另外,楼主这里是支持fatfs;我应该直接从flash读取数据就行了,不需要转码了
此帖出自stm32/stm8论坛
 
 
 

回复

19

帖子

0

TA的资源

一粒金砂(中级)

9
 
你用的是GBK;
此帖出自stm32/stm8论坛

点评

我用的是GBK,文件系统用的znFAT,支持FAT32。汉字是区位码存的,确保计算是准确的,一般没啥大问题。  详情 回复 发表于 2017-6-14 20:47
 
 
 

回复

855

帖子

5

TA的资源

一粒金砂(高级)

10
 

我用的是GBK,文件系统用的znFAT,支持FAT32。汉字是区位码存的,确保计算是准确的,一般没啥大问题。
此帖出自stm32/stm8论坛
 
个人签名作为一个菜逼,干货并没有多少。唯一会的就是水,所以回帖水分大。望见谅!
 
 

回复

8

帖子

0

TA的资源

一粒金砂(初级)

11
 
楼主,不知道你现在还上不上电子工程世界,相信楼主现在已经是大神了。
作为一个新手我想请问楼主一个问题,基于stm8s207如何用I2C控制1602的字符显示屏?
此帖出自stm32/stm8论坛

点评

没用过I2C接口的1602,不过总体思路应该是这样的:先尝试能不能控制某一坐标处字符显示,即调用1602内部字库;做完上述部分可以考虑控制指定位置处像素点的显示与否,这就是更细粒度下的控制,其实这跟彩屏的控制是  详情 回复 发表于 2017-12-23 09:21
 
 
 

回复

552

帖子

3

TA的资源

纯净的硅(初级)

12
 
祝楼主双旦快乐,新年更上一层楼!
此帖出自stm32/stm8论坛
 
 
 

回复

458

帖子

1

TA的资源

一粒金砂(高级)

13
 
谢谢楼主分享,楼主节日快乐
此帖出自stm32/stm8论坛
 
 
 

回复

855

帖子

5

TA的资源

一粒金砂(高级)

14
 
13640963844 发表于 2017-12-22 16:38
楼主,不知道你现在还上不上电子工程世界,相信楼主现在已经是大神了。
作为一个新手我想请问楼主一个问题 ...

没用过I2C接口的1602,不过总体思路应该是这样的:先尝试能不能控制某一坐标处字符显示,即调用1602内部字库;做完上述部分可以考虑控制指定位置处像素点的显示与否,这就是更细粒度下的控制,其实这跟彩屏的控制是一样的,区别只是1602只要显示或不显示两种选项。
此帖出自stm32/stm8论坛
 
个人签名作为一个菜逼,干货并没有多少。唯一会的就是水,所以回帖水分大。望见谅!
 
 

回复
尼玛死 该用户已被删除
15
 
提示: 作者被禁止或删除 内容自动屏蔽
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

16
 
楼主 你那个中文字库在哪下载的?能分享下么
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表