ssd1306 简单驱动(dma旧版)

YIN 发布于 2025-07-17 119 次阅读


简介

一个适用于esp32系列的oled12864 iic (ssd1306)驱动程序,只需要稍微部署即可使用

使用方法

  1. 将附件里的程序加入到工程中
  2. 修改.h文件内的引脚与实际情况对应
  3. 使用函数 ssd1306IICInit()ssd1306DeviceInit() 分别初始化iic和屏幕(分先后顺序!
  4. 引出内存缓冲区vBuf,修改内部的值
  5. 调用ssd1306FreshScreen()刷新屏幕(上一个刷新若没有完成程序会进入阻塞态)

附件

c

#include "ssd1306_driver.h"

SemaphoreHandle_t ssd1306Semaphore;

uint8_t vMemory[1024+1] = {0x40,0x00};
uint8_t* vBuf = vMemory + 1; // 流出去的接口

void ssd1306IICInit(){
    esp_err_t err;
    i2c_config_t ssd1306IICConfig = {
       .mode = I2C_MODE_MASTER,
       .sda_io_num = SSD1306_SDA,
       .scl_io_num = SSD1306_SCL,
       .sda_pullup_en = SSD1306_IIC_PULLUP_ENABLE,
       .scl_pullup_en = SSD1306_IIC_PULLUP_ENABLE,
       .master.clk_speed = SSD1306_IIC_SPEED,
    };
    ESP_ERROR_CHECK(i2c_param_config(SSD1306_IIC_PORT, &ssd1306IICConfig));
    ESP_ERROR_CHECK(i2c_driver_install(SSD1306_IIC_PORT, I2C_MODE_MASTER, 0, 0, 0));
    ssd1306Semaphore = xSemaphoreCreateMutex();
    vMemory[0] = 0x40;
}

static esp_err_t ssd1306Write(uint8_t *data,uint16_t len){
    xSemaphoreTake(ssd1306Semaphore,portMAX_DELAY);
    esp_err_t ret = 0;
    ret = i2c_master_write_to_device(I2C_NUM_0,SSD1306_ADDR1,data,len,500/portTICK_PERIOD_MS);
    xSemaphoreGive(ssd1306Semaphore);
    return ret;
}

static void ssd1306WriteBytes(uint8_t data1,uint8_t data2){
    uint8_t *buf = (uint8_t*)malloc(3);
    buf[0] = 0x00;
    buf[1] = data1;
    buf[2] = data2;
    ssd1306Write(buf,3);
    free(buf);
}

static void ssd1306WriteByte(uint8_t data1){
    uint8_t *buf = (uint8_t*)malloc(2);
    buf[0] = 0x00;
    buf[1] = data1;
    ssd1306Write(buf,2);
    free(buf);
}

static void SSD1306SetColumnRange(uint8_t start,uint8_t end){
    uint8_t ssd1306CommandTemp[4] = {0x00};
    ssd1306CommandTemp[1] = SSD1306_SET_COLUMN_ADDRESS;
    ssd1306CommandTemp[2] = start;
    ssd1306CommandTemp[3] = end;
    ssd1306Write(ssd1306CommandTemp,4);
}

static void SSD1306SetPageRange(uint8_t start,uint8_t end){
    uint8_t ssd1306CommandTemp[4] = {0x00};
    ssd1306CommandTemp[1] = SSD1306_SET_PAGE_ADDRESS;
    ssd1306CommandTemp[2] = start;
    ssd1306CommandTemp[3] = end;
    ssd1306Write(ssd1306CommandTemp,4);
}

void ssd1306FreshScreen(){
    ssd1306Write(vMemory,1025);
    memset(vBuf,0x00,1024);
}



void ssd1306DeviceInit(){
    ssd1306WriteByte(SSD1306_DISPLAY_OFF);
    ssd1306WriteBytes(SSD1306_SET_DISPLAY_CLOCK,0x80);
    ssd1306WriteBytes(SSD1306_SET_MULTIPLEX,0x3F);
    ssd1306WriteBytes(SSD1306_SET_DISPLAY_OFFSET,0x00);
    ssd1306WriteByte(SSD1306_SET_DISPLAY_START_LINE|0x00);
    ssd1306WriteBytes(SSD1306_SET_CHARGE_PUMP_STATUS,SSD1306_SET_CHARGE_PUMP_STATUS_SET);
    ssd1306WriteByte(0xA1);
    ssd1306WriteByte(0xC8);
    ssd1306WriteBytes(0xDA,0x12);
    ssd1306WriteBytes(SSD1306_SET_CONTRAST,0x01);
    ssd1306WriteBytes(0xD9,0xF1);
    ssd1306WriteBytes(SSD1306_SET_VCOMH,SSD1306_SET_VCOMH_0_65);
    ssd1306WriteByte(SSD1306_DISPLAY_MEMORY_ON);
    ssd1306WriteByte(SSD1306_DISPLAY_ON);
    ssd1306WriteBytes(SSD1306_SET_ADDRESS_METHOD,SSD1306_ADDRESS_VERTICAL);
    SSD1306SetPageRange(0,7);
    SSD1306SetColumnRange(0,127);
}

h

#ifndef _SSD1306_DRIVER_H_
#define _SSD1306_DRIVER_H_

#include "driver/i2c.h"
#include "driver/i2c_master.h"
#include "esp_err.h"
#include "esp_log.h"

#include <string.h>
#include <stdio.h>
#include <stdarg.h>

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"


#define SSD1306_SDA GPIO_NUM_1
#define SSD1306_SCL GPIO_NUM_0
#define SSD1306_IIC_SPEED 600000
#define SSD1306_IIC_PULLUP_ENABLE true
#define SSD1306_IIC_PORT I2C_NUM_0

#define SSD1306_ADDR1 0x3C
#define SSD1306_ADDR0 0x3D

#define SSD1306_SET_CONTRAST 0x81 //对比度
#define SSD1306_DISPLAY_MEMORY_ON 0xA4
#define SSD1306_DISPLAY_MEMORY_OFF 0xA5
#define SSD1306_DISPLAY_NORMAL 0xA6
#define SSD1306_DISPLAY_INVERSE 0xA7
#define SSD1306_DISPLAY_OFF 0xAE
#define SSD1306_DISPLAY_ON 0xAF

#define SSD1306_SET_DISPLAY_OFFSET 0xD3
#define SSD1306_SET_DISPLAY_CLOCK 0xD5
#define SSD1306_SET_CHARGE_PUMP_STATUS 0x8D
#define SSD1306_SET_VCOMH 0xDB
#define SSD1306_SET_MULTIPLEX 0xA8
#define SSD1306_SET_DISPLAY_START_LINE 0x40

#define SSD1306_SET_CHARGE_PUMP_STATUS_RESET 0x10
#define SSD1306_SET_CHARGE_PUMP_STATUS_SET 0x14

#define SSD1306_SET_VCOMH_0_65 0x00
#define SSD1306_SET_VCOMH_0_77 0x20
#define SSD1306_SET_VCOMH_0_83 0x30

#define SSD1306_SET_ADDRESS_METHOD 0x20
#define SSD1306_ADDRESS_PAGE 0x10
#define SSD1306_ADDRESS_HORIZONTAL 0x00
#define SSD1306_ADDRESS_VERTICAL 0x01

#define SSD1306_SET_COLUMN_ADDRESS 0x21
#define SSD1306_SET_PAGE_ADDRESS 0x22

void ssd1306IICInit();
void ssd1306DeviceInit();
void ssd1306FreshScreen();

#endif
此作者没有提供个人介绍。
最后更新于 2025-07-17