1 IIC发送数据 / 命令时序
2 12864 图形显示(显存)
RAM的大小是128×64位,RAM分为8页,从PAGE0到PAGE7,用于单色128x64点阵显示。
3 行列设置
1 设置起始行坐标(设置页)
命令 0XB0 ~ 0XB7 用于设置分页,所以我们显示的分页要 + 偏移(0XB0)
2 设置起始列坐标
4 制作字模
1 字模软件设置方式:
2 生成的字模的批处理:
生成的字模如图所示,我们要转成 0X00 这种格式:
使用 sublime 这个软件,可以进行批处理(先全选,然后再 快捷键 Ctrl + Shift + L):
字模生成完毕。
驱动程序如下所示:
bsp_12864.c
#include "bsp_12864.h"
#include "bsp_font.h"
/**
* @brief 向 oled 写入命令
*/
void OLED_Write_Cmd(uint8_t cmd)
{
uint8_t temp = cmd;
HAL_I2C_Mem_Write(&I2C_X, OLED_ADDR, CMD_CTRL, I2C_MEMADD_SIZE_8BIT, &temp, 1, 0xFFFF);
}
/**
* @brief 向 oled 写入数据
*/
void OLED_Write_Data(uint8_t data)
{
uint8_t temp = data;
HAL_I2C_Mem_Write(&I2C_X, OLED_ADDR, DATA_CTRL, I2C_MEMADD_SIZE_8BIT, &temp, 1, 0xFFFF);
}
/**
* @brief 设置 oled 写入坐标
* @param x 列坐标:0 ~ 127
* @param y 行坐标:0 ~ 63
*/
void OLED_Set_Pos(uint8_t x, uint8_t y)
{
OLED_Write_Cmd(0xb0 + y); // 写入页地址
OLED_Write_Cmd((x & 0x0f)); // 写入列的地址 (低半字节)
OLED_Write_Cmd(((x & 0xf0) >> 4) | 0x10); // 写入列的地址(高半字节)
}
/**
* @brief oled 清屏
*/
void OLED_Clear(void)
{
unsigned char page, row;
for (page = 0; page < 8; page++)
{
OLED_Write_Cmd(0xb0 + page); // 从0 ~ 7页依次写入
OLED_Write_Cmd(0x00); // 低位列地址
OLED_Write_Cmd(0x10); // 高位列地址
for (row = 0; row < 128; row++)
{
OLED_Write_Data(0X00);
}
}
}
void OLED_Init(void)
{
HAL_Delay(100); // 延迟(必须要有)
OLED_Write_Cmd(0xAE); // 关闭显示
OLED_Write_Cmd(0x00); // 设置低列地址
OLED_Write_Cmd(0x10); // 设置高列地址
OLED_Write_Cmd(0x40); // 设置起始行地址
OLED_Write_Cmd(0xB0); // 设置页地址
OLED_Write_Cmd(0x81); // 对比度设置,可设置亮度
OLED_Write_Cmd(0xFF); // 265
OLED_Write_Cmd(0xA1); // 设置段(SEG)的起始映射地址
OLED_Write_Cmd(0xA6); // 正常显示;0xa7逆显示
OLED_Write_Cmd(0xA8); // 设置驱动路数(16~64)
OLED_Write_Cmd(0x3F); // 64duty
OLED_Write_Cmd(0xC8); // 重映射模式,COM[N-1]~COM0扫描
OLED_Write_Cmd(0xD3); // 设置显示偏移
OLED_Write_Cmd(0x00); // 无偏移
OLED_Write_Cmd(0xD5); // 设置震荡器分频
OLED_Write_Cmd(0x80); // 使用默认值
OLED_Write_Cmd(0xD9); // 设置 Pre-Charge Period
OLED_Write_Cmd(0xF1); // 使用官方推荐值
OLED_Write_Cmd(0xDA); // 设置 com pin configuartion
OLED_Write_Cmd(0x12); // 使用默认值
OLED_Write_Cmd(0xDB); // 设置 Vcomh,可调节亮度(默认)
OLED_Write_Cmd(0x40); // 使用官方推荐值
OLED_Write_Cmd(0x8D); // 设置OLED电荷泵
OLED_Write_Cmd(0x14); // 开显示
OLED_Write_Cmd(0xAF); // 开启OLED面板显示
}
/**
* @brief 将 OLED 从休眠中唤醒
*/
void OLED_ON(void)
{
OLED_Write_Cmd(0X8D); // 设置电荷泵
OLED_Write_Cmd(0X14); // 开启电荷泵
OLED_Write_Cmd(0XAF); // OLED 唤醒
}
/**
* @brief 让OLED休眠
*/
void OLED_OFF(void)
{
OLED_Write_Cmd(0X8D); // 设置电荷泵
OLED_Write_Cmd(0X10); // 关闭电荷泵
OLED_Write_Cmd(0XAE); // OLED 休眠
}
/**
* @brief 显示 bsp_font.h 中的ASCII字符 字体为 Consolas
* @param x: 起始点列坐标:0 ~ 127
* y: 起始点页坐标:0 ~ 7
* @param *ch:要显示的字符串
*/
void OLED_Show_String(uint8_t x, uint8_t y, uint8_t *ch)
{
uint8_t i = 0, c = 0, k = 0;
while (ch[k] != '\0')
{
c = ch[k] - ' ';
if (x > 120)
{
x = 0;
y++;
}
OLED_Set_Pos(x, y);
for (i = 0; i < 8; i++)
{
OLED_Write_Data(Consolas_8X16[c * 16 + i]);
}
OLED_Set_Pos(x, y + 1);
for (i = 0; i < 8; i++)
{
OLED_Write_Data(Consolas_8X16[c * 16 + i + 8]);
}
x += 8;
k++;
}
}
/**
* @brief 显示 bsp_font.h 中的汉字(宋体)
* @param x: 起始点列坐标:0 ~ 127
* y: 起始点页坐标:0 ~ 7
* @param n: 汉字在字库中的索引
*/
void OLED_Show_CN(uint8_t x, uint8_t y, uint8_t n)
{
uint8_t i = 0;
uint16_t k = 32 * n;
OLED_Set_Pos(x, y);
for (i = 0; i < 16; i++)
{
OLED_Write_Data(CN_16X16[k]);
k += 1;
}
OLED_Set_Pos(x, y + 1);
for (i = 0; i < 16; i++)
{
OLED_Write_Data(CN_16X16[k]);
k += 1;
}
}
#if 0
// 以下是测试程序
OLED_Init();
OLED_Clear();
for (i = 3; i < 7; i++)
{
OLED_Show_CN((i - 3) * 16, 2, i); // 测试显示中文
}
OLED_Show_String(0, 4, "hello world"); // 测试 8*16 字符
#endif
bsp_12864.h
#ifndef __BSP_12864_H
#define __BSP_12864_H
#include "i2c.h"
#define I2C_X hi2c1
#define OLED_ADDR 0x78
#define CMD_CTRL 0X00
#define DATA_CTRL 0X40
void OLED_Init(void);
void OLED_Clear(void);
void OLED_ON(void);
void OLED_OFF(void);
void OLED_Show_String(uint8_t x, uint8_t y, uint8_t *ch);
void OLED_Show_CN(uint8_t x, uint8_t y, uint8_t n);
#endif /* __BSP_12864_H */
字库文件(部分):
bsp_font.h
// ASCII Consolas字体
const unsigned char Consolas_8X16[] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xf8,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x1b,0x00,0x00,0x00,
0x00,0x00,0x78,0x08,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x40,0xe0,0x50,0x40,0xf0,0x50,0x40,0x00,0x04,0x1f,0x04,0x04,0x1f,0x04,0x00,
0x00,0xe0,0xb0,0x10,0xf8,0x10,0x10,0x00,0x00,0x10,0x10,0x7f,0x11,0x13,0x0e,0x00,
0x30,0x58,0x48,0x70,0x80,0x60,0x30,0x08,0x10,0x18,0x04,0x03,0x0c,0x12,0x12,0x0c,
0x00,0x60,0xf0,0x90,0x90,0x70,0x00,0x00,0x04,0x1f,0x11,0x11,0x16,0x1c,0x1f,0x10,
0x00,0x00,0x00,0x78,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x80,0xe0,0x30,0x08,0x00,0x00,0x00,0x00,0x07,0x3f,0x60,0xc0,0x00,0x00,
0x00,0x00,0x08,0x10,0xe0,0x80,0x00,0x00,0x00,0x00,0x80,0x60,0x38,0x0f,0x00,0x00,
0x00,0x80,0xa0,0x60,0xd8,0x60,0x90,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
0x00,0x00,0x00,0xc0,0xc0,0x00,0x00,0x00,0x00,0x02,0x02,0x1f,0x1f,0x02,0x02,0x02,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x58,0x38,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xc0,0x70,0x18,0x00,0x00,0x20,0x18,0x06,0x01,0x00,0x00,0x00,
0x00,0xe0,0x30,0x10,0x10,0xb0,0xe0,0x80,0x00,0x0f,0x1a,0x13,0x11,0x18,0x0f,0x03,
0x00,0x60,0x20,0x30,0xf0,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x1f,0x10,0x10,0x00,
0x00,0x20,0x10,0x10,0x10,0xf0,0xe0,0x00,0x00,0x10,0x18,0x14,0x12,0x11,0x10,0x00,
0x00,0x10,0x10,0x10,0x10,0xf0,0x60,0x00,0x00,0x10,0x11,0x11,0x11,0x19,0x0e,0x00,
0x00,0x00,0x80,0x60,0x30,0xf0,0x00,0x00,0x04,0x07,0x05,0x04,0x04,0x1f,0x04,0x04,
0x00,0xf0,0xf0,0x10,0x10,0x10,0x10,0x00,0x00,0x11,0x11,0x11,0x11,0x19,0x0f,0x00,
0x00,0xc0,0x60,0x30,0x90,0x10,0x10,0x00,0x00,0x0f,0x19,0x11,0x10,0x11,0x0f,0x00,
0x00,0x10,0x10,0x10,0x10,0xd0,0x70,0x00,0x00,0x00,0x10,0x1c,0x07,0x01,0x00,0x00,
0x00,0x60,0xb0,0x90,0x10,0x90,0xe0,0x00,0x00,0x0e,0x12,0x11,0x11,0x13,0x0e,0x00,
0x00,0xe0,0x30,0x10,0x10,0x30,0xe0,0x00,0x00,0x11,0x11,0x12,0x12,0x09,0x07,0x00,
0x00,0x00,0x00,0xc0,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,
0x00,0x00,0x00,0xc0,0xc0,0x00,0x00,0x00,0x00,0x00,0x40,0x58,0x38,0x00,0x00,0x00,
0x00,0x00,0x00,0x80,0x80,0x40,0x00,0x00,0x00,0x02,0x03,0x05,0x08,0x18,0x10,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x05,0x05,0x05,0x05,0x05,0x00,
0x00,0x00,0x40,0xc0,0x80,0x00,0x00,0x00,0x00,0x00,0x10,0x08,0x04,0x07,0x02,0x00,
0x00,0x00,0x08,0x18,0x10,0xf0,0xe0,0x00,0x00,0x00,0x00,0x1b,0x01,0x00,0x00,0x00,
0x80,0xe0,0x10,0x88,0x88,0x88,0x10,0xe0,0x3f,0x60,0x8f,0x91,0x88,0x9f,0x08,0x0f,
0x00,0x00,0xc0,0x70,0x30,0xe0,0x00,0x00,0x10,0x1e,0x07,0x04,0x04,0x05,0x0f,0x18,
0x00,0xf0,0x10,0x10,0x10,0xb0,0xe0,0x00,0x00,0x1f,0x11,0x11,0x11,0x11,0x0e,0x00,
0x00,0xc0,0x20,0x10,0x10,0x10,0x10,0x00,0x00,0x0f,0x18,0x10,0x10,0x10,0x10,0x00,
0x00,0xf0,0x10,0x10,0x10,0x30,0xe0,0x80,0x00,0x1f,0x10,0x10,0x10,0x08,0x0f,0x03,
0x00,0xf0,0xf0,0x10,0x10,0x10,0x10,0x00,0x00,0x1f,0x1f,0x11,0x11,0x11,0x11,0x00,
0x00,0xf0,0xf0,0x10,0x10,0x10,0x10,0x00,0x00,0x1f,0x1f,0x01,0x01,0x01,0x01,0x00,
0x00,0xe0,0x20,0x10,0x10,0x10,0x10,0x00,0x01,0x0f,0x18,0x10,0x11,0x11,0x1f,0x00,
0x00,0xf0,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x1f,0x01,0x01,0x01,0x01,0x1f,0x00,
0x00,0x10,0x10,0xf0,0xf0,0x10,0x10,0x00,0x00,0x10,0x10,0x1f,0x1f,0x10,0x10,0x00,
0x00,0x10,0x10,0x10,0x10,0xf0,0x00,0x00,0x00,0x18,0x10,0x10,0x10,0x0f,0x00,0x00,
0x00,0xf0,0x00,0x80,0x40,0x20,0x10,0x00,0x00,0x1f,0x01,0x03,0x06,0x0c,0x10,0x00,
0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x10,0x10,0x10,0x10,0x00,
0x00,0xf0,0x70,0x80,0x80,0xe0,0xf0,0xc0,0x1c,0x1f,0x00,0x03,0x03,0x00,0x03,0x1f,
0x00,0xf0,0x70,0xc0,0x00,0x00,0xf0,0x00,0x00,0x1f,0x00,0x01,0x07,0x1c,0x1f,0x00,
0x80,0xe0,0x30,0x10,0x10,0x10,0xe0,0xc0,0x03,0x0f,0x18,0x10,0x10,0x10,0x0f,0x07,
0x00,0xf0,0x10,0x10,0x10,0x30,0xe0,0x00,0x00,0x1f,0x02,0x02,0x02,0x01,0x01,0x00,
0x80,0xe0,0x30,0x10,0x10,0x10,0xe0,0xc0,0x03,0x0f,0x18,0x30,0x70,0x50,0x4f,0x47,
0x00,0xf0,0xf0,0x10,0x10,0xb0,0xe0,0x00,0x00,0x1f,0x1f,0x01,0x03,0x0f,0x18,0x00,
0x00,0xe0,0xb0,0x10,0x10,0x10,0x10,0x00,0x00,0x10,0x10,0x11,0x11,0x13,0x0e,0x00,
0x00,0x10,0x10,0xf0,0xf0,0x10,0x10,0x10,0x00,0x00,0x00,0x1f,0x1f,0x00,0x00,0x00,
0x00,0xf0,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x0f,0x18,0x10,0x10,0x10,0x0f,0x00,
0x10,0xf0,0x80,0x00,0x00,0x00,0xe0,0x30,0x00,0x00,0x07,0x1c,0x18,0x0f,0x01,0x00,
0x30,0xf0,0x00,0x00,0x80,0x00,0x00,0xf0,0x00,0x1f,0x1c,0x07,0x03,0x1c,0x1f,0x03,
0x00,0x30,0x60,0xc0,0x80,0x60,0x30,0x10,0x10,0x18,0x0c,0x03,0x03,0x0e,0x18,0x10,
0x10,0x70,0xc0,0x80,0x00,0xc0,0x60,0x10,0x00,0x00,0x00,0x1f,0x1f,0x01,0x00,0x00,
0x00,0x10,0x10,0x10,0x90,0xd0,0x30,0x00,0x00,0x18,0x1c,0x13,0x11,0x10,0x10,0x00,
0x00,0x00,0x00,0xf8,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0xff,0x80,0x80,0x00,0x00,
0x00,0x08,0x30,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x1c,0x30,0x00,
0x00,0x00,0x08,0x08,0xf8,0xf8,0x00,0x00,0x00,0x00,0x80,0x80,0xff,0xff,0x00,0x00,
0x00,0x80,0xc0,0x30,0x30,0x60,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
0x00,0x00,0x08,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x40,0x40,0x40,0xc0,0x80,0x00,0x00,0x1c,0x12,0x12,0x12,0x0a,0x1f,0x00,
0x00,0xf8,0x80,0x40,0x40,0x40,0x80,0x00,0x00,0x1f,0x10,0x10,0x10,0x10,0x0f,0x00,
0x00,0x00,0x80,0x40,0x40,0x40,0x40,0x00,0x00,0x07,0x1d,0x10,0x10,0x10,0x10,0x00,
0x00,0x80,0xc0,0x40,0x40,0x40,0xf8,0x00,0x00,0x0f,0x18,0x10,0x10,0x08,0x1f,0x00,
0x00,0x80,0xc0,0x40,0x40,0x40,0x80,0x00,0x00,0x0f,0x1a,0x12,0x12,0x12,0x13,0x00,
0x00,0x80,0x80,0xf0,0x98,0x88,0x88,0x08,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x00,
0x00,0x80,0xc0,0x40,0x40,0xc0,0xc0,0x40,0x00,0x6f,0x92,0x94,0x94,0x92,0x73,0x20,
0x00,0xf8,0x80,0x40,0x40,0x40,0x80,0x00,0x00,0x1f,0x00,0x00,0x00,0x00,0x1f,0x00,
0x00,0x40,0x40,0x58,0xd8,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x1f,0x10,0x10,0x00,
0x00,0x40,0x40,0x40,0x50,0xd8,0x00,0x00,0x00,0x80,0x80,0x80,0xc0,0x7f,0x00,0x00,
0x00,0xf8,0xf8,0x00,0x80,0x80,0x40,0x00,0x00,0x1f,0x1f,0x03,0x05,0x08,0x10,0x00,
0x00,0x08,0x08,0x08,0xf8,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x1f,0x10,0x10,0x00,
0x00,0xc0,0x40,0x40,0x80,0x40,0xc0,0x80,0x00,0x1f,0x00,0x00,0x1f,0x00,0x1f,0x1f,
0x00,0xc0,0x80,0x40,0x40,0x40,0x80,0x00,0x00,0x1f,0x00,0x00,0x00,0x00,0x1f,0x00,
0x00,0x80,0xc0,0x40,0x40,0x40,0x80,0x00,0x00,0x0f,0x18,0x10,0x10,0x10,0x0f,0x02,
0x00,0xc0,0x80,0x40,0x40,0x40,0x80,0x00,0x00,0xff,0x10,0x10,0x10,0x10,0x0f,0x00,
0x00,0x80,0xc0,0x40,0x40,0x40,0xc0,0x00,0x00,0x0f,0x18,0x10,0x10,0x08,0xff,0x00,
0x00,0xc0,0xc0,0x80,0x40,0x40,0xc0,0x00,0x00,0x1f,0x1f,0x00,0x00,0x00,0x01,0x01,
0x00,0x00,0xc0,0x40,0x40,0x40,0x40,0x00,0x00,0x10,0x13,0x12,0x12,0x16,0x0c,0x00,
0x40,0x40,0x40,0xf0,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x1f,0x10,0x10,0x10,0x00,
0x00,0xc0,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x0f,0x18,0x10,0x10,0x08,0x1f,0x00,
0x00,0xc0,0x00,0x00,0x00,0x00,0xc0,0x40,0x00,0x01,0x07,0x1c,0x18,0x07,0x01,0x00,
0xc0,0xc0,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x1f,0x18,0x07,0x07,0x1c,0x1f,0x01,
0x00,0x40,0xc0,0x00,0x00,0x80,0xc0,0x00,0x00,0x10,0x18,0x07,0x07,0x0d,0x18,0x00,
0x00,0xc0,0x00,0x00,0x00,0x00,0xc0,0x40,0x80,0x81,0xc7,0x7c,0x38,0x0f,0x01,0x00,
0x00,0x40,0x40,0x40,0x40,0xc0,0xc0,0x00,0x00,0x10,0x18,0x16,0x13,0x11,0x10,0x00,
0x00,0x00,0x00,0xf0,0x18,0x08,0x08,0x00,0x00,0x02,0x03,0x7f,0xc0,0x80,0x80,0x00,
0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,
0x00,0x00,0x08,0x18,0xf0,0x00,0x00,0x00,0x00,0x00,0x80,0xc0,0x7f,0x03,0x02,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x01,0x01,0x02,0x04,0x06,0x03,
0xf8,0x08,0x08,0x08,0xf8,0x00,0x00,0x00,0x1f,0x10,0x10,0x10,0x1f,0x00,0x00,0x00,
};
测试效果如下所示: