OLED显示-字库码表原理

一,字库和码表

在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位

1608区域

上图显示为1608区域图,每一个点由一个位控制点亮/熄灭
结合之前给出的码表,每个字符记录为一个16字节表达式

1608解析

即每2个字节绘制一列,共8列,即16字节显示一个字符


三,1608的赋值顺序

我们知道了16字节控制一个字符的显示,现在说一下如何显示

这16个字节按照从上到下,从左到右的方式进行赋值

1608的赋值顺序

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

1608字母A

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

PC2LCD_A

PC2LCD_A_Config

{0x00,0x04,0x00,0x3C,0x03,0xC4,0x1C,0x40,0x07,0x40,0x00,0xE4,0x00,0x1C,0x00,0x04},/*"A",0*/

四,1206和2412字体

简单说一下2412,即高度24*宽度12
与1608同理,即高度24个位拆分为3字节,宽度12,即36字节控制一个字符显示

重点说一下1206:
1206,即高度12*宽度06
我们发现高度12不是8的倍数(12*6=72依然是8的倍数)
但我们还会按照从上到下,从左到右的顺序控制显示

1206分析

如图,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;
            }

        }    
    }          
}

修改记录:
20161216:
修改错别字
添加使用PC2LCD生成字符码表的配置和截图
20170306:
修改错别字

评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BraveWangDev

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值