一,字库和码表
在OLED显示屏上显示字符,和在点阵上显示图像是一样的
都是通过区域内的像素点的亮暗来呈现图案
以1608字体码表为例,代码中表现如下:
const unsigned char asc2_1608[95][16]={ {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/ {
0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xCC,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00},/*"!",1*/ {
0x00,0x00,0x08,0x00,0x30,0x00,0x60,0x00,0x08,0x00,0x30,0x00,0x60,0x00,0x00,0x00},/*""",2*/ {
0x02,0x20,0x03,0xFC,0x1E,0x20,0x02,0x20,0x03,0xFC,0x1E,0x20,0x02,0x20,0x00,0x00},/*"#",3*/ {
0x00,0x00,0x0E,0x18,0x11,0x04,0x3F,0xFF,0x10,0x84,0x0C,0x78,0x00,0x00,0x00,0x00},/*"$",4*/ {
0x0F,0x00,0x10,0x84,0x0F,0x38,0x00,0xC0,0x07,0x78,0x18,0x84,0x00,0x78,0x00,0x00},/*"%",5*/ {
0x00,0x78,0x0F,0x84,0x10,0xC4,0x11,0x24,0x0E,0x98,0x00,0xE4,0x00,0x84,0x00,0x08},/*"&",6*/ {
0x08,0x00,0x68,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/ {
0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xE0,0x18,0x18,0x20,0x04,0x40,0x02,0x00,0x00},/*"(",8*/ {
0x00,0x00,0x40,0x02,0x20,0x04,0x18,0x18,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x00},/*")",9*/ {
0x02,0x40,0x02,0x40,0x01,0x80,0x0F,0xF0,0x01,0x80,0x02,0x40,0x02,0x40,0x00,0x00},/*"*",10*/ }
讯享网
二,什么是1608
1608代表着字符显示的区域大小,即高度16位*宽度8位

即每2个字节绘制一列,共8列,即16字节显示一个字符
三,1608的赋值顺序
我们知道了16字节控制一个字符的显示,现在说一下如何显示
这16个字节按照从上到下,从左到右的方式进行赋值

如果我们想要显示一个字母A,那么:


使用工具,转化为16字节字模配置


讯享网{0x00,0x04,0x00,0x3C,0x03,0xC4,0x1C,0x40,0x07,0x40,0x00,0xE4,0x00,0x1C,0x00,0x04},/*"A",0*/
四,1206和2412字体
重点说一下1206:
1206,即高度12*宽度06
我们发现高度12不是8的倍数(12*6=72依然是8的倍数)
但我们还会按照从上到下,从左到右的顺序控制显示

如图,1206的第一列有1.5字节控制,第二列由剩余0.5字节+1字节控制
所以一个1206字符由3*3 = 9字节控制
五,代码操作
现在我们知道了OLED的显示和赋值原理,那么看一下代码控制显示的实现
/ * 在指定位置显示字符 * x:0~127 * y:0~63 * mode: 0:反白显示 1:正常显示 * size: 字号 12/16/24 / void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size,u8 mode) { u8 temp,t,t1; u8 y0=y; u8 csize=(size/8+((size%8)?1:0))*(size/2);//字符对应点阵字节数 chr=chr-' ';//得到在字库码表中的位置索引 for(t=0;t<csize;t++) { if(size==12) temp=asc2_1206[chr][t]; // 1206字体 else if(size==16) temp=asc2_1608[chr][t]; // 1608字体 else if(size==24) temp=asc2_2412[chr][t]; // 2412字体 else return; // 未匹配到字库-放弃 //画点 for(t1=0;t1<8;t1++) { if(temp&0x80) OLED_DrawPoint(x,y,mode); else OLED_DrawPoint(x,y,!mode); temp<<=1; y++; //判断是否画到了最底部 - 如1206,到达底部后,当前字节未画完,换新列继续画 if((y-y0)==size) { y=y0; x++; break; } } } }
修改记录:
:
修改错别字
添加使用PC2LCD生成字符码表的配置和截图
:
修改错别字
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/118551.html