SD1305 OLED 驅動芯片詳細介紹
SSD1305 是 Solomon Systech 公司生產的一款 OLED 顯示控制器/驅動器,專為 128x64 或 128x32 點陣的 OLED 顯示屏設計。下面我將從多個方面詳細介紹這款驅動芯片。
一、SSD1305 基本特性
顯示分辨率:
最大支持 128 segments × 64 commons
常用于 0.96 寸 128x64 OLED 屏幕
接口類型:
支持 6800/8080 并行接口
支持 3/4 線 SPI 接口
支持 I2C 接口(最常用)
本文示例使用的是 I2C 接口
供電要求:
邏輯電壓:1.65V~3.3V
OLED 驅動電壓:7.0V~15V(芯片內部有電荷泵)
灰度控制:
支持 256 級亮度控制
通過軟件可調節對比度
顯存管理:
內置 128x64 bits 的 GDDRAM(Graphic Display Data RAM)
支持水平/垂直/頁尋址模式
二、SSD1305 與 SSD1306 的區別
SSD1305 常被與 SSD1306 比較,主要區別如下:
特性 | SSD1305 | SSD1306 |
---|---|---|
最大分辨率 | 128x64 | 128x64 |
接口 | I2C/SPI/并行 | I2C/SPI/并行 |
電荷泵 | 內置 | 內置 |
顯存組織 | 頁模式(8頁) | 頁模式(8頁) |
對比度調節 | 支持 | 支持 |
封裝 | COG (Chip On Glass) | COG (Chip On Glass) |
主要應用 | 中小尺寸OLED | 中小尺寸OLED |
指令集 | 略有不同 | 更常用 |
頭文件 (ssd1305.h)
#ifndef __SSD1305_H
#define __SSD1305_H#include "stm32f1xx_hal.h"// OLED參數定義
#define SSD1305_I2C_ADDR 0x3C
#define SSD1305_WIDTH 128
#define SSD1305_HEIGHT 64
#define SSD1305_PAGE_NUM (SSD1305_HEIGHT/8)// 命令定義
#define SSD1305_SETCONTRAST 0x81
#define SSD1305_DISPLAYALLON_RESUME 0xA4
#define SSD1305_DISPLAYALLON 0xA5
#define SSD1305_NORMALDISPLAY 0xA6
#define SSD1305_INVERTDISPLAY 0xA7
#define SSD1305_DISPLAYOFF 0xAE
#define SSD1305_DISPLAYON 0xAF
#define SSD1305_SETDISPLAYOFFSET 0xD3
#define SSD1305_SETCOMPINS 0xDA
#define SSD1305_SETVCOMDETECT 0xDB
#define SSD1305_SETDISPLAYCLOCKDIV 0xD5
#define SSD1305_SETPRECHARGE 0xD9
#define SSD1305_SETMULTIPLEX 0xA8
#define SSD1305_SETLOWCOLUMN 0x00
#define SSD1305_SETHIGHCOLUMN 0x10
#define SSD1305_SETSTARTLINE 0x40
#define SSD1305_MEMORYMODE 0x20
#define SSD1305_COLUMNADDR 0x21
#define SSD1305_PAGEADDR 0x22
#define SSD1305_COMSCANINC 0xC0
#define SSD1305_COMSCANDEC 0xC8
#define SSD1305_SEGREMAP 0xA0
#define SSD1305_CHARGEPUMP 0x8D// 函數聲明
void SSD1305_Init(I2C_HandleTypeDef *hi2c);
void SSD1305_WriteCommand(uint8_t cmd);
void SSD1305_WriteData(uint8_t data);
void SSD1305_Clear(void);
void SSD1305_UpdateScreen(void);
void SSD1305_DrawPixel(uint8_t x, uint8_t y, uint8_t color);
void SSD1305_GotoXY(uint8_t x, uint8_t y);
void SSD1305_PutChar(char ch, uint8_t color);
void SSD1305_PutString(char *str, uint8_t color);
void SSD1305_DrawBitmap(const uint8_t *bitmap);#endif
源文件 (ssd1305.c)
#include "ssd1305.h"
#include "font.h" static I2C_HandleTypeDef *hi2c_oled;
static uint8_t SSD1305_Buffer[SSD1305_WIDTH * SSD1305_PAGE_NUM];// 寫入命令
void SSD1305_WriteCommand(uint8_t cmd) {uint8_t buf[2] = {0x00, cmd}; // Co = 0, D/C = 0HAL_I2C_Master_Transmit(hi2c_oled, SSD1305_I2C_ADDR, buf, 2, HAL_MAX_DELAY);
}// 寫入數據
void SSD1305_WriteData(uint8_t data) {uint8_t buf[2] = {0x40, data}; // Co = 0, D/C = 1HAL_I2C_Master_Transmit(hi2c_oled, SSD1305_I2C_ADDR, buf, 2, HAL_MAX_DELAY);
}// 初始化OLED
void SSD1305_Init(I2C_HandleTypeDef *hi2c) {hi2c_oled = hi2c;// 初始化序列SSD1305_WriteCommand(SSD1305_DISPLAYOFF); // 0xAESSD1305_WriteCommand(SSD1305_SETDISPLAYCLOCKDIV); // 0xD5SSD1305_WriteCommand(0x80); // 建議比率SSD1305_WriteCommand(SSD1305_SETMULTIPLEX); // 0xA8SSD1305_WriteCommand(SSD1305_HEIGHT - 1);SSD1305_WriteCommand(SSD1305_SETDISPLAYOFFSET); // 0xD3SSD1305_WriteCommand(0x00); // 無偏移SSD1305_WriteCommand(SSD1305_SETSTARTLINE | 0x00); // 0x40SSD1305_WriteCommand(SSD1305_CHARGEPUMP); // 0x8DSSD1305_WriteCommand(0x14); // 使用內部VCCSSD1305_WriteCommand(SSD1305_MEMORYMODE); // 0x20SSD1305_WriteCommand(0x00); // 水平尋址模式SSD1305_WriteCommand(SSD1305_SEGREMAP | 0x01); // 0xA0/0xA1SSD1305_WriteCommand(SSD1305_COMSCANDEC); // 0xC8SSD1305_WriteCommand(SSD1305_SETCOMPINS); // 0xDASSD1305_WriteCommand(0x12); // 64行模式SSD1305_WriteCommand(SSD1305_SETCONTRAST); // 0x81SSD1305_WriteCommand(0xCF); // 對比度值SSD1305_WriteCommand(SSD1305_SETPRECHARGE); // 0xD9SSD1305_WriteCommand(0xF1); // 預充電周期SSD1305_WriteCommand(SSD1305_SETVCOMDETECT); // 0xDBSSD1305_WriteCommand(0x40); // VCOMH電平SSD1305_WriteCommand(SSD1305_DISPLAYALLON_RESUME); // 0xA4SSD1305_WriteCommand(SSD1305_NORMALDISPLAY); // 0xA6SSD1305_WriteCommand(SSD1305_DISPLAYON); // 0xAF// 清屏SSD1305_Clear();SSD1305_UpdateScreen();
}// 清空顯示緩沖區
void SSD1305_Clear(void) {memset(SSD1305_Buffer, 0, sizeof(SSD1305_Buffer));
}// 更新屏幕顯示
void SSD1305_UpdateScreen(void) {uint8_t i;for(i = 0; i < SSD1305_PAGE_NUM; i++) {SSD1305_WriteCommand(0xB0 + i); // 設置頁地址SSD1305_WriteCommand(0x00); // 設置列地址低位SSD1305_WriteCommand(0x10); // 設置列地址高位HAL_I2C_Mem_Write(hi2c_oled, SSD1305_I2C_ADDR, 0x40, I2C_MEMADD_SIZE_8BIT, &SSD1305_Buffer[SSD1305_WIDTH * i], SSD1305_WIDTH, HAL_MAX_DELAY);}
}// 繪制像素點
void SSD1305_DrawPixel(uint8_t x, uint8_t y, uint8_t color) {if(x >= SSD1305_WIDTH || y >= SSD1305_HEIGHT) {return; // 超出范圍}if(color) {SSD1305_Buffer[x + (y / 8) * SSD1305_WIDTH] |= 1 << (y % 8);} else {SSD1305_Buffer[x + (y / 8) * SSD1305_WIDTH] &= ~(1 << (y % 8));}
}// 設置光標位置
void SSD1305_GotoXY(uint8_t x, uint8_t y) {// 這里可以添加自己的光標位置跟蹤變量
}// 顯示單個字符
void SSD1305_PutChar(char ch, uint8_t color) {uint32_t i, b, j;// 檢查剩余空間// 這里需要實現光標跟蹤或使用全局變量// 只處理可打印字符if(ch < 32 || ch > 126) {ch = ' '; // 不可打印字符顯示為空格}// 從字體數據中獲取字符for(i = 0; i < 6; i++) {if(i == 5) {b = 0x00;} else {b = Font[(ch - 32) * 5 + i];}for(j = 0; j < 8; j++) {if((b >> j) & 0x01) {SSD1305_DrawPixel(/*x + i*/, /*y + j*/, color);} else {SSD1305_DrawPixel(/*x + i*/, /*y + j*/, !color);}}}// 移動光標// 這里需要實現光標跟蹤
}// 顯示字符串
void SSD1305_PutString(char *str, uint8_t color) {while(*str) {SSD1305_PutChar(*str++, color);}
}// 顯示位圖
void SSD1305_DrawBitmap(const uint8_t *bitmap) {memcpy(SSD1305_Buffer, bitmap, sizeof(SSD1305_Buffer));
}
字體文件 (font.h)?
#ifndef __FONT_H
#define __FONT_H#include <stdint.h>// 標準ASCII 5x7字體
// 每個字符5字節寬,8像素高(最后1像素通常為空白行)
// 只包含可打印字符(32-126)
static const uint8_t Font[] = {0x00, 0x00, 0x00, 0x00, 0x00, // (space)0x00, 0x00, 0x5F, 0x00, 0x00, // !0x00, 0x07, 0x00, 0x07, 0x00, // "0x14, 0x7F, 0x14, 0x7F, 0x14, // #0x24, 0x2A, 0x7F, 0x2A, 0x12, // $0x23, 0x13, 0x08, 0x64, 0x62, // %0x36, 0x49, 0x55, 0x22, 0x50, // &0x00, 0x05, 0x03, 0x00, 0x00, // '0x00, 0x1C, 0x22, 0x41, 0x00, // (0x00, 0x41, 0x22, 0x1C, 0x00, // )0x08, 0x2A, 0x1C, 0x2A, 0x08, // *0x08, 0x08, 0x3E, 0x08, 0x08, // +0x00, 0x50, 0x30, 0x00, 0x00, // ,0x08, 0x08, 0x08, 0x08, 0x08, // -0x00, 0x60, 0x60, 0x00, 0x00, // .0x20, 0x10, 0x08, 0x04, 0x02, // /0x3E, 0x51, 0x49, 0x45, 0x3E, // 00x00, 0x42, 0x7F, 0x40, 0x00, // 10x42, 0x61, 0x51, 0x49, 0x46, // 20x21, 0x41, 0x45, 0x4B, 0x31, // 30x18, 0x14, 0x12, 0x7F, 0x10, // 40x27, 0x45, 0x45, 0x45, 0x39, // 50x3C, 0x4A, 0x49, 0x49, 0x30, // 60x01, 0x71, 0x09, 0x05, 0x03, // 70x36, 0x49, 0x49, 0x49, 0x36, // 80x06, 0x49, 0x49, 0x29, 0x1E, // 90x00, 0x36, 0x36, 0x00, 0x00, // :0x00, 0x56, 0x36, 0x00, 0x00, // ;0x00, 0x08, 0x14, 0x22, 0x41, // <0x14, 0x14, 0x14, 0x14, 0x14, // =0x41, 0x22, 0x14, 0x08, 0x00, // >0x02, 0x01, 0x51, 0x09, 0x06, // ?0x32, 0x49, 0x79, 0x41, 0x3E, // @0x7E, 0x11, 0x11, 0x11, 0x7E, // A0x7F, 0x49, 0x49, 0x49, 0x36, // B0x3E, 0x41, 0x41, 0x41, 0x22, // C0x7F, 0x41, 0x41, 0x22, 0x1C, // D0x7F, 0x49, 0x49, 0x49, 0x41, // E0x7F, 0x09, 0x09, 0x09, 0x01, // F0x3E, 0x41, 0x49, 0x49, 0x7A, // G0x7F, 0x08, 0x08, 0x08, 0x7F, // H0x00, 0x41, 0x7F, 0x41, 0x00, // I0x20, 0x40, 0x41, 0x3F, 0x01, // J0x7F, 0x08, 0x14, 0x22, 0x41, // K0x7F, 0x40, 0x40, 0x40, 0x40, // L0x7F, 0x02, 0x04, 0x02, 0x7F, // M0x7F, 0x04, 0x08, 0x10, 0x7F, // N0x3E, 0x41, 0x41, 0x41, 0x3E, // O0x7F, 0x09, 0x09, 0x09, 0x06, // P0x3E, 0x41, 0x51, 0x21, 0x5E, // Q0x7F, 0x09, 0x19, 0x29, 0x46, // R0x46, 0x49, 0x49, 0x49, 0x31, // S0x01, 0x01, 0x7F, 0x01, 0x01, // T0x3F, 0x40, 0x40, 0x40, 0x3F, // U0x1F, 0x20, 0x40, 0x20, 0x1F, // V0x7F, 0x20, 0x18, 0x20, 0x7F, // W0x63, 0x14, 0x08, 0x14, 0x63, // X0x03, 0x04, 0x78, 0x04, 0x03, // Y0x61, 0x51, 0x49, 0x45, 0x43, // Z0x00, 0x7F, 0x41, 0x41, 0x00, // [0x02, 0x04, 0x08, 0x10, 0x20, // "\"0x00, 0x41, 0x41, 0x7F, 0x00, // ]0x04, 0x02, 0x01, 0x02, 0x04, // ^0x40, 0x40, 0x40, 0x40, 0x40, // _0x00, 0x01, 0x02, 0x04, 0x00, // `0x20, 0x54, 0x54, 0x54, 0x78, // a0x7F, 0x48, 0x44, 0x44, 0x38, // b0x38, 0x44, 0x44, 0x44, 0x20, // c0x38, 0x44, 0x44, 0x48, 0x7F, // d0x38, 0x54, 0x54, 0x54, 0x18, // e0x08, 0x7E, 0x09, 0x01, 0x02, // f0x08, 0x14, 0x54, 0x54, 0x3C, // g0x7F, 0x08, 0x04, 0x04, 0x78, // h0x00, 0x44, 0x7D, 0x40, 0x00, // i0x20, 0x40, 0x44, 0x3D, 0x00, // j0x00, 0x7F, 0x10, 0x28, 0x44, // k0x00, 0x41, 0x7F, 0x40, 0x00, // l0x7C, 0x04, 0x18, 0x04, 0x78, // m0x7C, 0x08, 0x04, 0x04, 0x78, // n0x38, 0x44, 0x44, 0x44, 0x38, // o0x7C, 0x14, 0x14, 0x14, 0x08, // p0x08, 0x14, 0x14, 0x18, 0x7C, // q0x7C, 0x08, 0x04, 0x04, 0x08, // r0x48, 0x54, 0x54, 0x54, 0x20, // s0x04, 0x3F, 0x44, 0x40, 0x20, // t0x3C, 0x40, 0x40, 0x20, 0x7C, // u0x1C, 0x20, 0x40, 0x20, 0x1C, // v0x3C, 0x40, 0x30, 0x40, 0x3C, // w0x44, 0x28, 0x10, 0x28, 0x44, // x0x0C, 0x50, 0x50, 0x50, 0x3C, // y0x44, 0x64, 0x54, 0x4C, 0x44, // z0x00, 0x08, 0x36, 0x41, 0x00, // {0x00, 0x00, 0x7F, 0x00, 0x00, // |0x00, 0x41, 0x36, 0x08, 0x00, // }0x08, 0x08, 0x2A, 0x1C, 0x08, // →0x08, 0x1C, 0x2A, 0x08, 0x08 // ←
};#endif
使用示例 (main.c)
// 初始化OLEDSSD1305_Init(&hi2c1);// 顯示內容SSD1305_Clear();SSD1305_GotoXY(0, 0);SSD1305_PutString("Hello OLED!", 1);SSD1305_GotoXY(0, 16);SSD1305_PutString("STM32 HAL I2C", 1);SSD1305_GotoXY(0, 32);SSD1305_PutString("SSD1305 Driver", 1);// 更新顯示SSD1305_UpdateScreen();