OpenHarmony鸿蒙硬件-OLED显示屏开发-显示字母A

说明

通过二进制的 01 拼成字母 A ,如下图:

通过上图可知:

  • 二进制数据,低位显示在上面,高位显示在下面
  • 字母 A 是 5像素宽,8像素高

关键代码

Write(0x40,0b01111100); // 0x7c
Write(0x40,0b00010010); // 0x12
Write(0x40,0b00010001); // 0x11
Write(0x40,0b00010010); // 0x12
Write(0x40,0b01111100); // 0x7c

完整代码

#include <stdio.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "wifiiot_gpio.h"
#include "wifiiot_gpio_ex.h"
#include "wifiiot_i2c.h"

#define ARRAY_SIZE(a) sizeof(a)/sizeof(a[0])


/*

cmdType:指令类型:0x00表示写指令,0x40表示写数据
data:数据。
      当cmdType是0x00时,data表示指令内容
      当cmdType是0x40时,data表示显示的内容
*/
static uint32_t Write(uint8_t cmdType, uint8_t data)
{
    uint8_t buffer[] = {cmdType, data};
    WifiIotI2cData i2cData = {0};

    i2cData.sendBuf = buffer;
    i2cData.sendLen = sizeof(buffer)/sizeof(buffer[0]);

    return I2cWrite(WIFI_IOT_I2C_IDX_0, 0x78, &i2cData);
}

/**
 * @brief ssd1306 OLED 初始化操作.
 */
uint32_t OledInit(void)
{
    // 初始化命令
    static const uint8_t initCmds[] = {
        0xAE, // --display off
        0x00, // ---set low column address
        0x10, // ---set high column address
        0x40, // --set start line address  
        0xB0, // --set page address
        0x81, // contract control
        0xFF, // --128   
        0xA1, // set segment remap 
        0xA6, // --normal / reverse
        0xA8, // --set multiplex ratio(1 to 64)
        0x3F, // --1/32 duty
        0xC8, // Com scan direction
        0xD3, // -set display offset
        0x00, // 
        0xD5, // set osc division
        0x80, // 
        0xD8, // set area color mode off
        0x05, // 
        0xD9, // Set Pre-Charge Period
        0xF1, // 
        0xDA, // set com pin configuartion
        0x12, // 
        0xDB, // set Vcomh
        0x30, // 
        0x8D, // set charge pump enable
        0x14, // 
        0xAF, // --turn on oled panel
    };

    // 设置 13 引脚为 SDA 总线
    IoSetFunc(WIFI_IOT_IO_NAME_GPIO_13, WIFI_IOT_IO_FUNC_GPIO_13_I2C0_SDA);
    // 设置 14 引脚为 SCL 时钟线
    IoSetFunc(WIFI_IOT_IO_NAME_GPIO_14, WIFI_IOT_IO_FUNC_GPIO_14_I2C0_SCL);

    // 设置 I2C 波特率,能够与外部 I2C 设备(如 OLED 屏幕、传感器等)正常通信。
    I2cInit(WIFI_IOT_I2C_IDX_0, 400*1000); // 400k
    // I2cSetBaudrate(WIFI_IOT_I2C_IDX_0, OLED_I2C_BAUDRATE);

    for (size_t i = 0; i < ARRAY_SIZE(initCmds); i++) {
        uint32_t status = Write(0x00,initCmds[i]);
        if (status != 0) {
            return status;
        }
    }
    return 0;
}



/*全屏填充*/
void OledFillScreen(uint8_t fillData)
{
    uint8_t m = 0;
    uint8_t n = 0;

    for (m=0; m < 8; m++) {
        Write(0x00,0xb0 + m); // 设置起始行
        // Write(0x00,0x00);
        // Write(0x00,0x10);

        for (n=0; n < 128; n++) {
            Write(0x40, fillData); // 显示到屏幕上
        }
    }
}

// 显示字母 A
static void OledDemo(void)
{
    GpioInit();
    OledInit();


    OledFillScreen(0x00);
    Write(0x00,0xb0 + 1);


    Write(0x40,0b01111100); // 0x7c
    Write(0x40,0b00010010); // 0x12
    Write(0x40,0b00010001); // 0x11
    Write(0x40,0b00010010); // 0x12
    Write(0x40,0b01111100); // 0x7c


    usleep(500000);
}
APP_FEATURE_INIT(OledDemo);

原文出处:/show_1GW219TN19hj.html