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

点阵格式选择阳码或阴码具体视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 次)

参考 2_Vibration_measurer-Github 项目

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
0.96'OLED是一款高性能的显示设备。我们提供的资料里详细介绍YFROBOT 0.96’OLE(带字库)的使用方法,并提供详细的例程详解。该模块特点: 三色可选,模块有两种单色和黄蓝双色两种颜色可选,单色为纯白色和纯蓝色,双色为黄蓝双色; 超小尺寸显示尺寸为0.96 寸,模块尺寸为27mm(长)*26mm(宽)*4mm(高); 高分辨率,分辨率为128*64; 两种接口模式,4 线串行SPI 接口模式,IIC 接口模式; 带字库芯片,可显示标准的国标简体(GB2312)汉字、8*16 点ASCII 粗体字库、7*8点ASCII 字库、5*7 点ASCII 字库; 兼容3.3V~5V 电压。 0.96’OLED 模块通过外部排针和单片机通讯,各引脚详细描述如下: 序号名称 说明 1 GND 地 2 VCC 电源,3.3V~5V 3 CLK 4线ISP接口模式:时钟线IIC接口模式:时钟线GT20L16S1Y的时钟线 4 DIN 4线ISP接口模式:串行数据线IIC接口模式:数据线GT20L16S1Y的串行数据输入端口 5 D/C 4线ISP接口模式:命令/数据标志位IIC接口模式:接GND 6 CS1 4线ISP接口模式:OLED片选IIC接口模式:接GND 7 SO GT20L16S1Y的串行数据输出端口 8 CS2 GT20L16S1Y的片选端口 附件包含以下资料: Aarduino OLED显示(实验1:HelloWord;实验2:贪吃蛇) STM32 OLED显示 资料手册 ASCII码表.pdf; GB2312简体中文编码表.pdf; GT20L16S1Y用户手册V35.pdf; SAS1-9046-B UG-2864HSWEG01-Univision.pdf; SSD1306-Revision 1.1 (Charge Pump).pdf 0.96'OLED(带字库)使用手册V1.0.pdf 字符图片取模软件
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值