SSD1306 128*32屏幕驱动

最近在做一个小项目,使用合宙air001做主控,arduino开发环境,项目设计一个小屏作为显示,本身使用u8g2库,奈何这个air001空间太小,没写多少就把程序储存空间占满了,log也没办法打印,对于调试分析问题很大,所以想着自己写一个驱动用,

在网上搜索后,现有的代码移植来难以正常显示,没过深研究,一直在摸索修改代码,

经过多天的试错后,基本上可以仿造u8g2的效果,避免以后重复造轮子,特来分享给大家参考。

主要是两个驱动文件,ssd1306.h是字库文件

cs 复制代码
#ifndef SSD1306_H
#define SSD1306_H

#include <stdint.h>

// 字符像素数据(以ASCII字符集中的部分字符为例)
const uint8_t font[105][5] = {
    {0x00, 0x00, 0x00, 0x00, 0x00}, // ASCII 32 (Space)
    {0x00, 0x00, 0x5F, 0x00, 0x00}, // ASCII 33 (!)
    {0x00, 0x07, 0x00, 0x07, 0x00}, // ASCII 34 (")
    {0x14, 0x7F, 0x14, 0x7F, 0x14}, // ASCII 35 (#)
    {0x24, 0x2A, 0x7F, 0x2A, 0x12}, // ASCII 36 ($)
    {0x23, 0x13, 0x08, 0x64, 0x62}, // ASCII 37 (%)
    {0x36, 0x49, 0x55, 0x22, 0x50}, // ASCII 38 (&)
    {0x00, 0x05, 0x03, 0x00, 0x00}, // ASCII 39 (')
    {0x00, 0x1C, 0x22, 0x41, 0x00}, // ASCII 40 (()
    {0x00, 0x41, 0x22, 0x1C, 0x00}, // ASCII 41 ())
    {0x14, 0x08, 0x3E, 0x08, 0x14}, // ASCII 42 (*)
    {0x08, 0x08, 0x3E, 0x08, 0x08}, // ASCII 43 (+)
    {0x00, 0x50, 0x30, 0x00, 0x00}, // ASCII 44 (,)
    {0x08, 0x08, 0x08, 0x08, 0x08}, // ASCII 45 (-)
    {0x00, 0x60, 0x60, 0x00, 0x00}, // ASCII 46 (.)
    {0x20, 0x10, 0x08, 0x04, 0x02}, // ASCII 47 (/)
    {0x3E, 0x51, 0x49, 0x45, 0x3E}, // ASCII 48 (0)
    {0x00, 0x42, 0x7F, 0x40, 0x00}, // ASCII 49 (1)
    {0x42, 0x61, 0x51, 0x49, 0x46}, // ASCII 50 (2)
    {0x21, 0x41, 0x45, 0x4B, 0x31}, // ASCII 51 (3)
    // {0x18, 0x14, 0x1E, 0x14, 0x18}, // ASCII 52 (4)
    // {0x12, 0x51, 0x51, 0x49, 0x46}, // ASCII 53 (5)
    // {0x12, 0x51, 0x59, 0x4F, 0x46}, // ASCII 54 (6)
    // {0x40, 0x48, 0x48, 0x48, 0x30}, // ASCII 55 (7)
    {0x10, 0x18, 0x1C, 0x18, 0x10}, // ASCII 52 (4)
    {0x12, 0x51, 0x51, 0x49, 0x46}, // ASCII 53 (5)
    {0x12, 0x51, 0x59, 0x4F, 0x46}, // ASCII 54 (6)
    {0x40, 0x48, 0x48, 0x48, 0x30}, // ASCII 55 (7)
    {0x36, 0x49, 0x49, 0x49, 0x36}, // ASCII 56 (8)
    {0x06, 0x49, 0x49, 0x29, 0x1E}, // ASCII 57 (9)
    {0x00, 0x36, 0x36, 0x00, 0x00}, // ASCII 58 (:)
    {0x00, 0x56, 0x36, 0x00, 0x00}, // ASCII 59 (;)
    {0x08, 0x14, 0x22, 0x41, 0x00}, // ASCII 60 (<)
    {0x14, 0x14, 0x14, 0x14, 0x14}, // ASCII 61 (=)
    {0x00, 0x41, 0x22, 0x14, 0x08}, // ASCII 62 (>)
    {0x02, 0x01, 0x51, 0x09, 0x06}, // ASCII 63 (?)
    {0x32, 0x49, 0x79, 0x41, 0x3E}, // ASCII 64 (@)
    {0x7E, 0x11, 0x11, 0x11, 0x7E}, // ASCII 65 (A)
    {0x7F, 0x49, 0x49, 0x49, 0x36}, // ASCII 66 (B)
    {0x3E, 0x41, 0x41, 0x41, 0x22}, // ASCII 67 (C)
    {0x7F, 0x41, 0x41, 0x22, 0x1C}, // ASCII 68 (D)
    {0x7F, 0x49, 0x49, 0x49, 0x41}, // ASCII 69 (E)
    {0x7F, 0x09, 0x09, 0x09, 0x01}, // ASCII 70 (F)
    {0x3E, 0x41, 0x49, 0x49, 0x7A}, // ASCII 71 (G)
    {0x7F, 0x08, 0x08, 0x08, 0x7F}, // ASCII 72 (H)
    {0x00, 0x41, 0x7F, 0x41, 0x00}, // ASCII 73 (I)
    {0x20, 0x40, 0x41, 0x3F, 0x01}, // ASCII 74 (J)
    {0x7F, 0x08, 0x14, 0x22, 0x41}, // ASCII 75 (K)
    {0x7F, 0x40, 0x40, 0x40, 0x40}, // ASCII 76 (L)
    {0x7F, 0x02, 0x0C, 0x02, 0x7F}, // ASCII 77 (M)
    {0x7F, 0x04, 0x08, 0x10, 0x7F}, // ASCII 78 (N)
    {0x3E, 0x41, 0x41, 0x41, 0x3E}, // ASCII 79 (O)
    {0x7F, 0x09, 0x09, 0x09, 0x06}, // ASCII 80 (P)
    {0x3E, 0x41, 0x51, 0x21, 0x5E}, // ASCII 81 (Q)
    {0x7F, 0x09, 0x19, 0x29, 0x46}, // ASCII 82 (R)
    {0x46, 0x49, 0x49, 0x49, 0x31}, // ASCII 83 (S)
    {0x01, 0x01, 0x7F, 0x01, 0x01}, // ASCII 84 (T)
    {0x3F, 0x40, 0x40, 0x40, 0x3F}, // ASCII 85 (U)
    {0x1F, 0x20, 0x40, 0x20, 0x1F}, // ASCII 86 (V)
    {0x3F, 0x40, 0x38, 0x40, 0x3F}, // ASCII 87 (W)
    {0x63, 0x14, 0x08, 0x14, 0x63}, // ASCII 88 (X)
    {0x07, 0x08, 0x70, 0x08, 0x07}, // ASCII 89 (Y)
    {0x61, 0x51, 0x49, 0x45, 0x43}, // ASCII 90 (Z)
    {0x00, 0x7F, 0x41, 0x41, 0x00}, // ASCII 91 ([)
    {0x02, 0x04, 0x08, 0x10, 0x20}, // ASCII 92 (\)
    {0x00, 0x41, 0x41, 0x7F, 0x00}, // ASCII 93 (])
    {0x04, 0x02, 0x01, 0x02, 0x04}, // ASCII 94 (^)
    {0x40, 0x40, 0x40, 0x40, 0x40}, // ASCII 95 (_)
    {0x00, 0x03, 0x07, 0x08, 0x00}, // ASCII 96 (`)
    {0x20, 0x54, 0x54, 0x54, 0x78}, // ASCII 97 (a)
    {0x7F, 0x48, 0x44, 0x44, 0x38}, // ASCII 98 (b)
    {0x38, 0x44, 0x44, 0x44, 0x20}, // ASCII 99 (c)
    {0x38, 0x44, 0x44, 0x48, 0x7F}, // ASCII 100 (d)
    {0x38, 0x54, 0x54, 0x54, 0x18}, // ASCII 101 (e)
    {0x08, 0x7E, 0x09, 0x01, 0x02}, // ASCII 102 (f)
    {0x0C, 0x52, 0x52, 0x52, 0x3E}, // ASCII 103 (g)
    {0x7F, 0x08, 0x04, 0x04, 0x78}, // ASCII 104 (h)
    {0x00, 0x44, 0x7D, 0x40, 0x00}, // ASCII 105 (i)
    {0x20, 0x40, 0x44, 0x3D, 0x00}, // ASCII 106 (j)
    {0x7F, 0x10, 0x28, 0x44, 0x00}, // ASCII 107 (k)
    {0x00, 0x41, 0x7F, 0x40, 0x00}, // ASCII 108 (l)
    {0x7C, 0x04, 0x18, 0x04, 0x78}, // ASCII 109 (m)
    {0x7C, 0x08, 0x04, 0x04, 0x78}, // ASCII 110 (n)
    {0x38, 0x44, 0x44, 0x44, 0x38}, // ASCII 111 (o)
    {0x7C, 0x14, 0x14, 0x14, 0x08}, // ASCII 112 (p)
    {0x08, 0x14, 0x14, 0x14, 0x7C}, // ASCII 113 (q)
    {0x7C, 0x08, 0x04, 0x04, 0x08}, // ASCII 114 (r)
    {0x48, 0x54, 0x54, 0x54, 0x20}, // ASCII 115 (s)
    {0x04, 0x3F, 0x44, 0x40, 0x20}, // ASCII 116 (t)
    {0x3C, 0x40, 0x40, 0x20, 0x7C}, // ASCII 117 (u)
    {0x1C, 0x20, 0x40, 0x20, 0x1C}, // ASCII 118 (v)
    {0x3C, 0x40, 0x30, 0x40, 0x3C}, // ASCII 119 (w)
    {0x44, 0x28, 0x10, 0x28, 0x44}, // ASCII 120 (x)
    {0x0C, 0x50, 0x50, 0x50, 0x3C}, // ASCII 121 (y)
    {0x44, 0x64, 0x54, 0x4C, 0x44}, // ASCII 122 (z)
    {0x00, 0x08, 0x36, 0x41, 0x00}, // ASCII 123 ({)
    {0x00, 0x00, 0x7F, 0x00, 0x00}, // ASCII 124 (|)
    {0x00, 0x41, 0x36, 0x08, 0x00}, // ASCII 125 (})
    {0x08, 0x08, 0x2A, 0x1C, 0x08}, // ASCII 126 (~)
    // 以下是ASCII的扩展字符,通常用于表示一些特殊符号或控制字符
    {0x00, 0x00, 0x00, 0x00, 0x00}, // ASCII 127 (DEL)
    {0x18, 0x18, 0x7E, 0x18, 0x18}, // 示例字符:块字符(自定义)
    {0x18, 0x18, 0x18, 0x18, 0x18}, // 示例字符:全亮(自定义)
    {0x00, 0x00, 0x18, 0x00, 0x00}, // 示例字符:上点(自定义)
    {0x00, 0x00, 0x18, 0x18, 0x00}, // 示例字符:右点(自定义)
    {0x00, 0x0F, 0x08, 0x0F, 0x00}, // 示例字符:左箭头(自定义)
    {0x00, 0x0F, 0x18, 0x0F, 0x00}, // 示例字符:右箭头(自定义)
    {0x18, 0x06, 0x0F, 0x06, 0x18}, // 示例字符:上箭头(自定义)
    {0x06, 0x18, 0x0F, 0x18, 0x06}  // 示例字符:下箭头(自定义)
};
const uint8_t lage_font[105][8] = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 空格
  0x00, 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x00, // !
  0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, // "
  0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00, 0x00, 0x00, // #
  0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00, 0x00, 0x00, // $
  0x23, 0x13, 0x08, 0x64, 0x62, 0x00, 0x00, 0x00, // %
  0x36, 0x49, 0x55, 0x22, 0x50, 0x00, 0x00, 0x00, // &
  0x00, 0x05, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, // '
  0x00, 0x1C, 0x22, 0x41, 0x00, 0x00, 0x00, 0x00, // (
  0x00, 0x41, 0x22, 0x1C, 0x00, 0x00, 0x00, 0x00, // )
  0x08, 0x2A, 0x1C, 0x2A, 0x08, 0x00, 0x00, 0x00, // *
  0x08, 0x08, 0x3E, 0x08, 0x08, 0x00, 0x00, 0x00, // +
  0x00, 0x50, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, // ,
  0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, // -
  0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, // .
  0x20, 0x10, 0x08, 0x04, 0x02, 0x00, 0x00, 0x00, // /
  0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00, 0x00, 0x00, // 0
  0x00, 0x42, 0x7F, 0x40, 0x00, 0x00, 0x00, 0x00, // 1
  0x42, 0x61, 0x51, 0x49, 0x46, 0x00, 0x00, 0x00, // 2
  0x21, 0x41, 0x45, 0x4B, 0x31, 0x00, 0x00, 0x00, // 3
  0x18, 0x14, 0x12, 0x7F, 0x10, 0x00, 0x00, 0x00, // 4
  0x27, 0x45, 0x45, 0x45, 0x39, 0x00, 0x00, 0x00, // 5
  0x3C, 0x4A, 0x49, 0x49, 0x30, 0x00, 0x00, 0x00, // 6
  0x01, 0x71, 0x09, 0x05, 0x03, 0x00, 0x00, 0x00, // 7
  0x36, 0x49, 0x49, 0x49, 0x36, 0x00, 0x00, 0x00, // 8
  0x06, 0x49, 0x49, 0x29, 0x1E, 0x00, 0x00, 0x00, // 9
  0x00, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, // :
  0x00, 0x56, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, // ;
  0x00, 0x08, 0x14, 0x22, 0x41, 0x00, 0x00, 0x00, // <
  0x14, 0x14, 0x14, 0x14, 0x14, 0x00, 0x00, 0x00, // =
  0x41, 0x22, 0x14, 0x08, 0x00, 0x00, 0x00, 0x00, // >
  0x02, 0x01, 0x51, 0x09, 0x06, 0x00, 0x00, 0x00, // ?
  0x32, 0x49, 0x79, 0x41, 0x3E, 0x00, 0x00, 0x00, // @
  0x7E, 0x11, 0x11, 0x11, 0x7E, 0x00, 0x00, 0x00, // A
  0x7F, 0x49, 0x49, 0x49, 0x36, 0x00, 0x00, 0x00, // B
  0x3E, 0x41, 0x41, 0x41, 0x22, 0x00, 0x00, 0x00, // C
  0x7F, 0x41, 0x41, 0x22, 0x1C, 0x00, 0x00, 0x00, // D
  0x7F, 0x49, 0x49, 0x49, 0x41, 0x00, 0x00, 0x00, // E
  0x7F, 0x09, 0x09, 0x09, 0x01, 0x00, 0x00, 0x00, // F
  0x3E, 0x41, 0x49, 0x49, 0x7A, 0x00, 0x00, 0x00, // G
  0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00, 0x00, 0x00, // H
  0x00, 0x41, 0x7F, 0x41, 0x00, 0x00, 0x00, 0x00, // I
  0x20, 0x40, 0x41, 0x3F, 0x01, 0x00, 0x00, 0x00, // J
  0x7F, 0x08, 0x14, 0x22, 0x41, 0x00, 0x00, 0x00, // K
  0x7F, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, // L
  0x7F, 0x02, 0x04, 0x02, 0x7F, 0x00, 0x00, 0x00, // M
  0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00, 0x00, 0x00, // N
  0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00, 0x00, 0x00, // O
  0x7F, 0x09, 0x09, 0x09, 0x06, 0x00, 0x00, 0x00, // P
  0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00, 0x00, 0x00, // Q
  0x7F, 0x09, 0x19, 0x29, 0x46, 0x00, 0x00, 0x00, // R
  0x46, 0x49, 0x49, 0x49, 0x31, 0x00, 0x00, 0x00, // S
  0x01, 0x01, 0x7F, 0x01, 0x01, 0x00, 0x00, 0x00, // T
  0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00, 0x00, 0x00, // U
  0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00, 0x00, 0x00, // V
  0x7F, 0x20, 0x18, 0x20, 0x7F, 0x00, 0x00, 0x00, // W
  0x63, 0x14, 0x08, 0x14, 0x63, 0x00, 0x00, 0x00, // X
  0x03, 0x04, 0x78, 0x04, 0x03, 0x00, 0x00, 0x00, // Y
  0x61, 0x51, 0x49, 0x45, 0x43, 0x00, 0x00, 0x00, // Z
  0x00, 0x00, 0x7F, 0x41, 0x41, 0x00, 0x00, 0x00, // [
  0x02, 0x04, 0x08, 0x10, 0x20, 0x00, 0x00, 0x00, // 
  0x41, 0x41, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, // ]
  0x04, 0x02, 0x01, 0x02, 0x04, 0x00, 0x00, 0x00, // ^
  0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, // _
  0x00, 0x01, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, // `
  0x20, 0x54, 0x54, 0x54, 0x78, 0x00, 0x00, 0x00, // a
  0x7F, 0x48, 0x44, 0x44, 0x38, 0x00, 0x00, 0x00, // b
  0x38, 0x44, 0x44, 0x44, 0x20, 0x00, 0x00, 0x00, // c
  0x38, 0x44, 0x44, 0x48, 0x7F, 0x00, 0x00, 0x00, // d
  0x38, 0x54, 0x54, 0x54, 0x18, 0x00, 0x00, 0x00, // e
  0x08, 0x7E, 0x09, 0x01, 0x02, 0x00, 0x00, 0x00, // f
  0x08, 0x14, 0x54, 0x54, 0x3C, 0x00, 0x00, 0x00, // g
  0x7F, 0x08, 0x04, 0x04, 0x78, 0x00, 0x00, 0x00, // h
  0x00, 0x44, 0x7D, 0x40, 0x00, 0x00, 0x00, 0x00, // i
  0x20, 0x40, 0x44, 0x3D, 0x00, 0x00, 0x00, 0x00, // j
  0x00, 0x7F, 0x10, 0x28, 0x44, 0x00, 0x00, 0x00, // k
  0x00, 0x41, 0x7F, 0x40, 0x00, 0x00, 0x00, 0x00, // l
  0x7C, 0x04, 0x18, 0x04, 0x78, 0x00, 0x00, 0x00, // m
  0x7C, 0x08, 0x04, 0x04, 0x78, 0x00, 0x00, 0x00, // n
  0x38, 0x44, 0x44, 0x44, 0x38, 0x00, 0x00, 0x00, // o
  0x7C, 0x14, 0x14, 0x14, 0x08, 0x00, 0x00, 0x00, // p
  0x08, 0x14, 0x14, 0x18, 0x7C, 0x00, 0x00, 0x00, // q
  0x7C, 0x08, 0x04, 0x04, 0x08, 0x00, 0x00, 0x00, // r
  0x48, 0x54, 0x54, 0x54, 0x20, 0x00, 0x00, 0x00, // s
  0x04, 0x3F, 0x44, 0x40, 0x20, 0x00, 0x00, 0x00, // t
  0x3C, 0x40, 0x40, 0x20, 0x7C, 0x00, 0x00, 0x00, // u
  0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00, 0x00, 0x00, // v
  0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00, 0x00, 0x00, // w
  0x44, 0x28, 0x10, 0x28, 0x44, 0x00, 0x00, 0x00, // x
  0x0C, 0x50, 0x50, 0x50, 0x3C, 0x00, 0x00, 0x00, // y
  0x44, 0x64, 0x54, 0x4C, 0x44, 0x00, 0x00, 0x00, // z
  0x00, 0x08, 0x36, 0x41, 0x00, 0x00, 0x00, 0x00, // {
  0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, // |
  0x00, 0x41, 0x36, 0x08, 0x00, 0x00, 0x00, 0x00, // }
  0x08, 0x08, 0x2A, 0x1C, 0x08, 0x00, 0x00, 0x00, // ~
  0x08, 0x1C, 0x2A, 0x08, 0x08, 0x00, 0x00, 0x00  // DEL
};

// 初始化OLED屏幕
void OLED_Init();

// 在屏幕上显示字符串
void OLED_Display_String(unsigned char x, unsigned char y, const char *str);

#endif // SSD1306_H

ssd1306.cpp

cs 复制代码
#include <Wire.h>
#include "ssd1306.h"
#define OLED_ADDRESS 0x3C // OLED的I2C地址,根据连接方式可能为0x3C或0x3D

// 发送命令到OLED
void ssd1306_command(uint8_t command)
{
  Wire.beginTransmission(OLED_ADDRESS);
  Wire.write(0x00); // 控制字节,表示命令
  Wire.write(command);
  Wire.endTransmission();
}

// 发送数据到OLED
void ssd1306_sendData(uint8_t data)
{
  Wire.beginTransmission(OLED_ADDRESS);
  Wire.write(0x40); // 控制字节,表示数据
  Wire.write(data);
  Wire.endTransmission();
}

// 设置OLED显示位置
void OLED_Set_Pos(unsigned char x, unsigned char y)
{
  ssd1306_command(0xb0 + y);
  ssd1306_command(((x & 0xf0) >> 4) | 0x10);
  ssd1306_command((x & 0x0f));
}

void OLED_Display_On(void)
{
  ssd1306_command(0X8D);
  ssd1306_command(0X14);
  ssd1306_command(0XAF);
}

void OLED_Display_Off(void)
{
  ssd1306_command(0X8D);
  ssd1306_command(0X10);
  ssd1306_command(0XAE);
}

void OLED_Clear(void)
{
  uint8_t page, n;
  for (page = 0; page < 8; page++)
  {                               // 遍历所有页
    ssd1306_command(0x21);        // 设置列地址
    ssd1306_command(0x00);        // 列地址起始位置
    ssd1306_command(0x7F);        // 列地址结束位置
    ssd1306_command(0x22);        // 设置页地址
    ssd1306_command(0xB0 | page); // 页地址起始位置
    ssd1306_command(0x07);        // 页地址结束位置
    for (n = 0; n < 128; n++)
      ssd1306_sendData(0);
  }
}
void OLED_On(void)
{
  uint8_t page, n;
  for (page = 0; page < 8; page++)
  {                               // 遍历所有页
    ssd1306_command(0x21);        // 设置列地址
    ssd1306_command(0x00);        // 列地址起始位置
    ssd1306_command(0x7F);        // 列地址结束位置
    ssd1306_command(0x22);        // 设置页地址
    ssd1306_command(0xB0 | page); // 页地址起始位置
    ssd1306_command(0x07);        // 页地址结束位置

    for (n = 0; n < 128; n++)
      ssd1306_sendData(0xFF);
  }
}

// 显示单个字符
void OLED_Display_Char(unsigned char x, unsigned char y, unsigned char ch)
{
  OLED_Set_Pos(x, y);
  for (int i = 0; i < 8; i++)
  {
    ssd1306_sendData(lage_font[ch - 32][i]);
  }
}

// 显示字符串
void OLED_Display_String(unsigned char x, unsigned char y, const char *str)
{
  while (*str)
  {
    OLED_Display_Char(x, y, *str++);
    x += 6; // 每个字符占用9个像素宽度(8个像素+1个像素间隔)
  }
}

void OLED_Init()
{
  Wire.begin(); // 初始化I2C
  delay(100);   // 稳定I2C总线
  // 初始化OLED屏幕
  ssd1306_command(0xAE); // 关闭显示
  ssd1306_command(0x20); // 设置内存地址模式
  ssd1306_command(0x10); // 水平地址模式
  ssd1306_command(0xB0); // 设置页地址
  ssd1306_command(0xC8); // 设置COM输出扫描方向
  ssd1306_command(0x00); // 设置低列地址
  ssd1306_command(0x10); // 设置高列地址
  ssd1306_command(0x40); // 设置起始行地址
  ssd1306_command(0x81); // 设置对比度控制
  ssd1306_command(0xFF);
  ssd1306_command(0xA1); // 设置段重映射
  ssd1306_command(0xA6); // 正常显示
  ssd1306_command(0xA8); // 设置复用率
  ssd1306_command(0x1F);
  ssd1306_command(0xAD); // 设置DC-DC转换器
  ssd1306_command(0x8A);
  ssd1306_command(0xD3); // 设置显示偏移
  ssd1306_command(0x00);
  ssd1306_command(0xD5); // 设置显示时钟分频因子/振荡器频率
  ssd1306_command(0xF0);
  ssd1306_command(0xD9); // 设置预充电周期
  ssd1306_command(0x22);
  ssd1306_command(0xDA); // 设置COM引脚硬件配置
  ssd1306_command(0x02);
  ssd1306_command(0xDB); // 设置VCOMH取消选择级别
  ssd1306_command(0x20);
  ssd1306_command(0x8D); // 设置充电泵
  ssd1306_command(0x14);
  ssd1306_command(0xAF); // 打开显示
  OLED_Clear();
}

// void setup()
// {
//   Wire.begin(); // 初始化I2C
//   delay(100);   // 稳定I2C总线

//   OLED_Init();
//   // 清屏
//   OLED_Clear();
// }
// uint8_t progress = 0;
// void loop()
// {
//   // 更新进度条进度(示例中每秒增加10)
//   progress += 2;
//   if (progress > 128)
//   {
//     progress = 0;
//   }
//   delay(50); // 每秒更新一次

//   // 清除屏幕
//   // OLED_Clear();

//   // 绘制进度条
//   // for (int x = 0; x < 128; x++)
//   // {
//   //   OLED_Set_Pos(x, 2);
//   //   if (x < progress)
//   //   {
//   //     ssd1306_sendData(0xFF); // 进度条部分填充白色
//   //   }
//   //   else
//   //   {
//   //     ssd1306_sendData(0x00); // 其余部分填充黑色
//   //   }
//   // }

//   // 显示字符串
//   //OLED_Display_String(0, 0, "Hello, OLED!");
//   char line1[32];
//   snprintf(line1, sizeof(line1), "F:%3d   D:%3d", 20, progress);
//   OLED_Display_String(0, 0, line1);
//   // 显示第二行
//   char line2[32];
//   snprintf(line2, sizeof(line2), "EF:%3d   ED:%3d", 20, progress);
//   OLED_Display_String(0, 2, line2);
//   char line3[32];
//   snprintf(line3, sizeof(line3), "step:%3d", progress);
//   OLED_Display_String(0, 3, line3);
// }

使用时如下:

cs 复制代码
    // 初始化OLED显示屏
    OLED_Init();

void updateOLEDDisplay()
{
    if (CounterChanged)
    {
        CounterChanged = false;

        // 显示第一行
        char line1[32];
        // u8x8.setFont(u8x8_font_torussansbold8_r);
        snprintf(line1, sizeof(line1), "F:%3d    D:%3d", frequency, dutyCycle);
        OLED_Display_String(0, 0, line1);

        // 显示第二行
        char line2[32];
        snprintf(line2, sizeof(line2), "EF:%3d   ED:%3d", storedFrequency, storedDutyCycle);
        OLED_Display_String(0, 2, line2);
        char line3[32];
        snprintf(line3, sizeof(line3), "step:%3d", Count_step);
        OLED_Display_String(0, 3, line3);
    }
}
相关推荐
cxr8283 天前
SPARC方法论在Claude Code基于规则驱动开发中的应用
人工智能·驱动开发·claude·智能体
sukalot3 天前
window显示驱动开发—显示适配器的子设备
驱动开发
Evan_ZGYF丶4 天前
【RK3576】【Android14】如何在Android14下单独编译kernel-6.1?
linux·驱动开发·android14·rk3576
sukalot5 天前
window显示驱动开发—视频呈现网络简介
驱动开发
sukalot5 天前
window显示驱动开发—为头装载和专用监视器生成自定义合成器应用(二)
驱动开发
zwhSunday5 天前
Linux驱动开发(1)概念、环境与代码框架
linux·运维·驱动开发
sukalot6 天前
window显示驱动开发—为头装载和专用监视器生成自定义合成器应用(三)
驱动开发
sukalot6 天前
window显示驱动开发—为头装载和专用监视器生成自定义合成器应用(一)
驱动开发
cxr8287 天前
基于Claude Code的 规范驱动开发(SDD)指南
人工智能·hive·驱动开发·敏捷流程·智能体
zwhSunday7 天前
Linux驱动开发(2)进一步理解驱动
linux·驱动开发