当前位置: 首页 > article >正文

SSD1306 128*32屏幕驱动

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

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

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

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

#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

#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);
// }

使用时如下:

    // 初始化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);
    }
}


http://www.kler.cn/a/537486.html

相关文章:

  • 使用redis实现 令牌桶算法 漏桶算法
  • MySQL中DDL操作是否支持事务
  • 软件设计模式
  • Git--使用教程
  • Verilog代码实例
  • DeepSeek本地部署保姆级教程
  • Java 读取 Word 模板文档并替换内容生成新文档
  • 探索C语言:寻找数组中连续1的最大长度
  • 软考网络安全 软考网络安全员
  • 使用Python开发PPTX压缩工具
  • 【ORACLE】这个‘‘和null不等价的场景,deepseek你怎么看?
  • 解决Element UI中el-select下拉框因为选项内容过长导致下拉框宽度显示过长问题
  • 25/2/8 <机器人基础> 阻抗控制
  • 如何使用Gemini模型,国内如何订阅购买Gemini Pro的教程,Gemini Pro 免费试用操作步骤, 谷歌 aistudio 使用入口
  • 系统URL整合系列视频四(需求介绍补充)
  • 基于架构的软件设计(Architecture-Based Software Design, ABSD)
  • UA-Track:不确定性感知端到端3D多目标跟踪
  • Leetcode 2-两数相加
  • 高速艇在波浪中的垂直运动MATLAB模拟与仿真
  • 【Maven】项目管理工具-Maven
  • 渗透中社会工程学:揭秘与防范
  • 两台1200之间的S7通信
  • 大模型相关概念
  • 编写Bash实现Linux网络流量监控统计,无需额外工具
  • Java 大视界 -- Java 大数据在智能供应链中的应用与优化(76)
  • RabbitMQ技术深度解析:打造高效消息传递系统