Linux-oled096驱动硬件分析
常用寻址方式
页寻址方式代码分析
void oled_set_pos(u8 x, u8 y)
{
oled_write_byte(OLED_CMD, 0xb0 + y);
oled_write_byte(OLED_CMD, ((x & 0xf0) >> 4) | 0x10);
oled_write_byte(OLED_CMD, x & 0x0f);
}
- 第一行代码
oled_write_byte(OLED_CMD, 0xb0 + y);
第一行代码设置页寻址方式页起始地址,从表格中可以看出,需要输入命令0,需要输入数据(10000 x2 x1 x0)=0xb0+x[2:0]。
0xb0+y(最终确定是PAGE0~PAGE7)。
- 第二行代码
oled_write_byte(OLED_CMD, ((x & 0xf0) >> 4) | 0x10);
第二行代码设置高列起始地址,从表格中可以看出,需要输入命令0,需要输入数据(0001 x3 x2 x1 x0)=0x10。
将x & 0xf0 获取高四位数据,再将高四位数据右移,最后与上0x10,得到高列起始地址。
- 第三行代码
oled_write_byte(OLED_CMD, x & 0x0f);
第三行代码设置低列起始地址,从表格中可以看出,需要输入命令0,需要输入数据(0000 x3 x2 x1 x0)。
将x & 0x0f获取低四位数据,得到低列起始地址。
显示代码分析
以下代码是基于16*8字号字符编写的显示函数
共需写入16字节数据,1字节8位(16*8)
void oled_showchar(u8 x, u8 y, u8 chr)
{
u8 c = 0, i = 0;
c = chr - ' ';
if (x > Max_Column - 1)
{
x = 0;
y = y + 2;
}
oled_set_pos(x, y);
for (i = 0; i < 8; i++)
{
oled_write_byte(OLED_DATA, asc2_1608[c * 16 + i]);
}
oled_set_pos(x, y + 1);
for (i = 0; i < 8; i++)
{
oled_write_byte(OLED_DATA, asc2_1608[c * 16 + i + 8]);
}
}
|