OpenHarmony鸿蒙硬件-OLED显示屏开发-显示向右移动的箭头 作者:马育民 • 2025-10-08 18:12 • 阅读:10006 ``` #include #include #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); ``` 原文出处:http://malaoshi.top/show_1GW20LbPvFa5.html