oled 显示不同尺寸字库的方法(中景园 256*64 驱动芯片为:SH1122)

oled 显示不同尺寸字库的方法(中景园 256*64 驱动芯片为:SH1122)_第1张图片oled 显示不同尺寸字库的方法(中景园 256*64 驱动芯片为:SH1122)_第2张图片

点阵格式选择阳码或阴码具体视oled型号而定,

取模方式要配合具体 oled 的驱动芯片的滚动方向而定(中景园的2.08寸 256*64 oled 驱动芯片 SH1122 的滚动方向为竖向)

void oled_show_10_char(uint8_t x, uint8_t y, uint8_t chr, const struct sh1122_dev *dev)
{
    uint8_t c = 0, i = 0;	
    uint8_t x1, y1;
    uint8_t j;
    uint8_t Data1, Data2, DATA1 = 0;

    c = chr - ' ';        // get the offset value
    x1 = x;
    y1 = y;
    for (i = 0; i < 5; i++)
    {
        Data1 = F10X20[c*30 + 2*i];
        Data2 = F10X20[c*30 + 2*i + 1];
        for (j = 0; j < 8; j++)
        {
            if (Data1 & (0x01 << j))	
            {
                DATA1 = 0xF0;
            }
            if (Data2 & (0x01 << j))
            {
                DATA1 |= 0x0F;
            }	
            oled_set_pos(x1, y1, dev) ;
            y1++;

            set_regs(false, NULL, &DATA1, 1, dev);
            DATA1 = 0;
        }
        x1++;
        y1 = y;
    }

    x1 = x;
    y1 = y + 8;
    for (i = 0; i < 5; i++)
    {
        Data1 = F10X20[c*30 + 10 + 2*i];
        Data2 = F10X20[c*30 + 10 + 2*i + 1];
        for (j = 0; j < 8; j++)
        {
            if (Data1 & (0x01 << j))	
            {
                DATA1 = 0xF0;
            }
            if (Data2 & (0x01 << j))
            {
                DATA1 |= 0x0F;
            }	
            oled_set_pos(x1, y1, dev) ;
            y1++;

            set_regs(false, NULL, &DATA1, 1, dev);
            DATA1 = 0;
        }
        x1++;
        y1 = y + 8;
    }

    x1 = x;
    y1 = y + 16;
    for (i = 0; i < 5; i++)
    {
        Data1 = F10X20[c*30 + 20 + 2*i];
        Data2 = F10X20[c*30 + 20 + 2*i + 1];
        for (j = 0; j < 8; j++)
        {
            if (Data1 & (0x01 << j))	
            {
                DATA1 = 0xF0;
            }
            if (Data2 & (0x01 << j))
            {
                DATA1 |= 0x0F;
            }	
            oled_set_pos(x1, y1, dev) ;
            y1++;

            set_regs(false, NULL, &DATA1, 1, dev);
            DATA1 = 0;
        }
        x1++;
        y1 = y + 16;
    }
}

void oled_show_string(uint8_t x, uint8_t y, uint8_t *chr, const struct sh1122_dev *dev)
{
    uint8_t j = 0;

    while (chr[j] != '\0')
    {
        oled_show_10_char(x, y, chr[j], dev);
        x += 5;
    }
}

程序讲解:

1、首先定位数据在字库中的具体位置先取得 c = chr - ' ';

2、再取得再字库中的偏移量

第一部分:

for (i = 0; i < 6 ; i++)
{
    Data1 = F10X20[c*30 + 2*i];
    Data2 = F10X20[c*30 + 2*i + 1];
}

第二部分:

for (i = 0; i < 6; i++)
{
    Data1 = F12X20[c*36 + 12+ 2*i];
    Data2 = F12X20[c*36 + 12 + 2*i + 1];
}

第三部分:

for (i = 0; i < 6; i++)
{
    Data1 = F12X20[c*36 + 24 + 2*i];
    Data2 = F12X20[c*36 + 24 + 2*i + 1];
}

其中循环中的 i < 6, 6 = 12(字宽) / 2,

第二及第三部分的 F12X20[c*36 + 12+ 2*i],Data2 = F12X20[c*36 + 12 + 2*i + 1],

Data1 = F12X20[c*36 + 24 + 2*i],Data2 = F12X20[c*36 + 24 + 2*i + 1],12 与 24 =

(第n部分 - 1)* 12(字宽)

之所以要这么取,是需要匹配到 oled 屏的实际尺寸,采取跳一个画的方法。10*20 的字库数

据按这种方式画,实际上的字体尺寸是5*20

3、若跳过的那个字节是 “1” 则画亮一点,若是 “0” 则画暗一点

if (Data1 & (0x01 << j))	
{
    DATA1 = 0xF0;
}
if (Data2 & (0x01 << j))
{
    DATA1 |= 0x0F;
}

每个字画 y / 8字节 部分,不足 1 按 1 算,(例:10*20 即字高 20 个字节 20/8 = 3部分)

每部分竖向需画八个字节,横向需画 自宽大小 次(例:10*20 横向需要画 10 次)

oled 显示不同尺寸字库的方法(中景园 256*64 驱动芯片为:SH1122)_第3张图片

参考 2_Vibration_measurer-Github 项目

你可能感兴趣的:(oled 显示不同尺寸字库的方法(中景园 256*64 驱动芯片为:SH1122))