stm32专题三十:12864 IIC驱动

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,
};

测试效果如下所示:

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值