#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); // 显示到屏幕上
}
}
}
// 小箭头,从左向右逐渐显示,并且向右移动
static void OledDemo(void)
{
GpioInit();
OledInit();
uint32_t delay = 30000;
// 一直循环
while(1){
OledFillScreen(0x00);
Write(0x00,0xb0 + 1);
// 显示箭头尾部
for(uint8_t i = 0 ;i<20;i++){
// 一列8位,1表示亮灯、0表示灭灯
Write(0x40,0b00111100);
usleep(delay);
}
uint32_t delay2 = 45000;
// 显示指向右侧的箭头
Write(0x40,0b1111111);
Write(0x40,0b1111111);
usleep(delay2);
Write(0x40,0b0111110);
Write(0x40,0b0111110);
usleep(delay2);
Write(0x40,0b0011100);
Write(0x40,0b0011100);
usleep(delay2);
Write(0x40,0b0001000);
Write(0x40,0b0001000);
usleep(500000);
}
}
APP_FEATURE_INIT(OledDemo);
原文出处:/show_1GW20LbPvFa5.html