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