在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代表着字符显示的区域大小,即高度16位*宽度8位
上图显示为1608区域图,每一个点由一个位控制点亮/熄灭
结合之前给出的码表,每个字符记录为一个16字节表达式
即每2个字节绘制一列,共8列,即16字节显示一个字符
我们知道了16字节控制一个字符的显示,现在说一下如何显示
这16个字节按照从上到下,从左到右的方式进行赋值
如果我们想要显示一个字母A,那么:
使用工具,转化为16字节字模配置
{0x00,0x04,0x00,0x3C,0x03,0xC4,0x1C,0x40,0x07,0x40,0x00,0xE4,0x00,0x1C,0x00,0x04},/*"A",0*/
简单说一下2412,即高度24*宽度12
与1608同理,即高度24个位拆分为3字节,宽度12,即36字节控制一个字符显示
重点说一下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;tif(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;
}
}
}
}
修改记录:
20161216:
修改错别字
添加使用PC2LCD生成字符码表的配置和截图
20170306:
修改错别字