在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(上册)。
赞 (0)