当前位置: 首页 > 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, // 00x00, 0x42, 0x7F, 0x40, 0x00, 0x00, 0x00, 0x00, // 10x42, 0x61, 0x51, 0x49, 0x46, 0x00, 0x00, 0x00, // 20x21, 0x41, 0x45, 0x4B, 0x31, 0x00, 0x00, 0x00, // 30x18, 0x14, 0x12, 0x7F, 0x10, 0x00, 0x00, 0x00, // 40x27, 0x45, 0x45, 0x45, 0x39, 0x00, 0x00, 0x00, // 50x3C, 0x4A, 0x49, 0x49, 0x30, 0x00, 0x00, 0x00, // 60x01, 0x71, 0x09, 0x05, 0x03, 0x00, 0x00, 0x00, // 70x36, 0x49, 0x49, 0x49, 0x36, 0x00, 0x00, 0x00, // 80x06, 0x49, 0x49, 0x29, 0x1E, 0x00, 0x00, 0x00, // 90x00, 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, // A0x7F, 0x49, 0x49, 0x49, 0x36, 0x00, 0x00, 0x00, // B0x3E, 0x41, 0x41, 0x41, 0x22, 0x00, 0x00, 0x00, // C0x7F, 0x41, 0x41, 0x22, 0x1C, 0x00, 0x00, 0x00, // D0x7F, 0x49, 0x49, 0x49, 0x41, 0x00, 0x00, 0x00, // E0x7F, 0x09, 0x09, 0x09, 0x01, 0x00, 0x00, 0x00, // F0x3E, 0x41, 0x49, 0x49, 0x7A, 0x00, 0x00, 0x00, // G0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00, 0x00, 0x00, // H0x00, 0x41, 0x7F, 0x41, 0x00, 0x00, 0x00, 0x00, // I0x20, 0x40, 0x41, 0x3F, 0x01, 0x00, 0x00, 0x00, // J0x7F, 0x08, 0x14, 0x22, 0x41, 0x00, 0x00, 0x00, // K0x7F, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, // L0x7F, 0x02, 0x04, 0x02, 0x7F, 0x00, 0x00, 0x00, // M0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00, 0x00, 0x00, // N0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00, 0x00, 0x00, // O0x7F, 0x09, 0x09, 0x09, 0x06, 0x00, 0x00, 0x00, // P0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00, 0x00, 0x00, // Q0x7F, 0x09, 0x19, 0x29, 0x46, 0x00, 0x00, 0x00, // R0x46, 0x49, 0x49, 0x49, 0x31, 0x00, 0x00, 0x00, // S0x01, 0x01, 0x7F, 0x01, 0x01, 0x00, 0x00, 0x00, // T0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00, 0x00, 0x00, // U0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00, 0x00, 0x00, // V0x7F, 0x20, 0x18, 0x20, 0x7F, 0x00, 0x00, 0x00, // W0x63, 0x14, 0x08, 0x14, 0x63, 0x00, 0x00, 0x00, // X0x03, 0x04, 0x78, 0x04, 0x03, 0x00, 0x00, 0x00, // Y0x61, 0x51, 0x49, 0x45, 0x43, 0x00, 0x00, 0x00, // Z0x00, 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, // a0x7F, 0x48, 0x44, 0x44, 0x38, 0x00, 0x00, 0x00, // b0x38, 0x44, 0x44, 0x44, 0x20, 0x00, 0x00, 0x00, // c0x38, 0x44, 0x44, 0x48, 0x7F, 0x00, 0x00, 0x00, // d0x38, 0x54, 0x54, 0x54, 0x18, 0x00, 0x00, 0x00, // e0x08, 0x7E, 0x09, 0x01, 0x02, 0x00, 0x00, 0x00, // f0x08, 0x14, 0x54, 0x54, 0x3C, 0x00, 0x00, 0x00, // g0x7F, 0x08, 0x04, 0x04, 0x78, 0x00, 0x00, 0x00, // h0x00, 0x44, 0x7D, 0x40, 0x00, 0x00, 0x00, 0x00, // i0x20, 0x40, 0x44, 0x3D, 0x00, 0x00, 0x00, 0x00, // j0x00, 0x7F, 0x10, 0x28, 0x44, 0x00, 0x00, 0x00, // k0x00, 0x41, 0x7F, 0x40, 0x00, 0x00, 0x00, 0x00, // l0x7C, 0x04, 0x18, 0x04, 0x78, 0x00, 0x00, 0x00, // m0x7C, 0x08, 0x04, 0x04, 0x78, 0x00, 0x00, 0x00, // n0x38, 0x44, 0x44, 0x44, 0x38, 0x00, 0x00, 0x00, // o0x7C, 0x14, 0x14, 0x14, 0x08, 0x00, 0x00, 0x00, // p0x08, 0x14, 0x14, 0x18, 0x7C, 0x00, 0x00, 0x00, // q0x7C, 0x08, 0x04, 0x04, 0x08, 0x00, 0x00, 0x00, // r0x48, 0x54, 0x54, 0x54, 0x20, 0x00, 0x00, 0x00, // s0x04, 0x3F, 0x44, 0x40, 0x20, 0x00, 0x00, 0x00, // t0x3C, 0x40, 0x40, 0x20, 0x7C, 0x00, 0x00, 0x00, // u0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00, 0x00, 0x00, // v0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00, 0x00, 0x00, // w0x44, 0x28, 0x10, 0x28, 0x44, 0x00, 0x00, 0x00, // x0x0C, 0x50, 0x50, 0x50, 0x3C, 0x00, 0x00, 0x00, // y0x44, 0x64, 0x54, 0x4C, 0x44, 0x00, 0x00, 0x00, // z0x00, 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(); // 初始化I2Cdelay(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);}
}

相关文章:

SSD1306 128*32屏幕驱动

最近在做一个小项目&#xff0c;使用合宙air001做主控&#xff0c;arduino开发环境&#xff0c;项目设计一个小屏作为显示&#xff0c;本身使用u8g2库&#xff0c;奈何这个air001空间太小&#xff0c;没写多少就把程序储存空间占满了&#xff0c;log也没办法打印&#xff0c;对…...

【GitHub】GitHub 2FA 双因素认证 ( 使用 Microsoft Authenticator 应用进行二次验证 )

文章目录 一、GitHub 的 2FA 双因素认证二、使用 Microsoft Authenticator 应用进行二次验证1、TOTP 应用2、下载 Microsoft Authenticator 应用3、安装使用 Authenticator 应用 三、恢复码重要性 一、GitHub 的 2FA 双因素认证 现在登录 GitHub 需要进行二次身份验证 ; 先登录…...

CNN-day5-经典神经网络LeNets5

经典神经网络-LeNets5 1998年Yann LeCun等提出的第一个用于手写数字识别问题并产生实际商业&#xff08;邮政行业&#xff09;价值的卷积神经网络 参考&#xff1a;论文笔记&#xff1a;Gradient-Based Learning Applied to Document Recognition-CSDN博客 1 网络模型结构 …...

AI绘画社区:解锁艺术共创的无限可能(9/10)

AI 绘画&#xff1a;不只是技术&#xff0c;更是社交新潮流 在科技飞速发展的今天&#xff0c;AI 绘画早已不再仅仅是一项孤立的技术&#xff0c;它正以惊人的速度融入我们的社交生活&#xff0c;成为艺术爱好者们交流互动的全新方式&#xff0c;构建起一个充满活力与创意的社…...

一种基于Leaflet.Legend的图例动态更新方法

目录 前言 一、场景再现 1、需求描述 2、核心方法介绍 3、存在的问题 二、问题解决 1、重复解决办法 2、图例不展示解决办法 3、成果展示 三、总结 前言 在当今数字化时代&#xff0c;地理信息系统&#xff08;GIS&#xff09;技术已经广泛应用于各个领域&#xff0c;…...

Three.js实现一个动态的 3D 点阵波浪效果

使用 Three.js 创建了一个动态的 3D 点阵波浪效果&#xff0c;可用作页面背景。它通过粒子系统生成点阵&#xff0c;并根据鼠标移动和时间动态调整点的位置和大小&#xff0c;形成波浪效果。用户可以通过组件的 props 控制波浪的长度、颜色和位置。 <template><div i…...

【韩顺平linux】部分上课笔记整理

整理一下一些韩顺平老师上课时候的笔记 课程&#xff1a;【小白入门 通俗易懂】韩顺平 一周学会Linux linux环境&#xff1a;使用阿里云服务器 笔记参考 &#xff1a; [学习笔记]2021韩顺平一周学会Linux 一、自定义函数 基本语法 应用实例&#xff1a; 计算两个参数的和…...

CPP集群聊天服务器开发实践(一):用户注册与登录

目录 1 客户端用户注册与登录 1.1 主要思想 1.2 网络层 1.3 业务层 1.4 数据层 1.5 测试结果 1 客户端用户注册与登录 1.1 主要思想 实现网络层、业务层、数据层的解耦&#xff0c;提高系统的可维护性。 网络层&#xff1a;主要实现对客户端连接、客户端读写请求的捕获…...

C++ Attribute 属性说明符

目录 属性说明符 Attribute编译警告相关[[deprecated]][[maybe_unused]][[fallthrough]][[nodiscard]] 可能触发编译优化[[noreturn]][[likely]]、[[unlikely]][[assume]][[carries_dependency]][[no_unique_address]] 属性说明符 Attribute 属性说明符Attribute自C11起&#…...

Elasticsearch去分析目标服务器的日志,需要在目标服务器上面安装Elasticsearch 软件吗

Elasticsearch 本身并不直接收集目标服务器的日志&#xff0c;它主要用于存储、搜索和分析数据。要收集目标服务器的日志&#xff0c;通常会借助其他工具&#xff0c;并且一般不需要在目标服务器上安装 Elasticsearch 软件&#xff0c;常见的日志收集方案&#xff1a; Filebeat…...

学JDBC 第二日

数据库连接池 作用 使数据库连接达到重用的效果&#xff0c;较少的消耗资源 原理 在创建连接池对象时&#xff0c;创建好指定个数的连接对象 之后直接获取连接对象使用即可&#xff0c;不用每次都创建连接对象 从数据库连接池中获取的对象的close方法真的关闭连接对象了吗…...

Android双屏异显Presentation接口使用说明

在点餐、收银、KTV等场景,对于双屏异显的需求是非常多的,首先可以节省硬件成本。而现在的智能板卡很多运行Android系统,从Android4.2开始支持WiFi Display(Miracast)功能后,就开始支持双屏异显Presentation这套应用层接口了,下面以Android5.1系统来说明这套接口的使用要…...

【Uniapp-Vue3】z-paging插件组件实现触底和下拉加载数据

一、下载z-paing插件 注意下载下载量最多的这个 进入Hbuilder以后点击“确定” 插件的官方文档地址&#xff1a; https://z-paging.zxlee.cn 二、z-paging插件的使用 在文档中向下滑动&#xff0c;会有使用方法。 使用z-paging标签将所有的内容包起来 配置标签中的属性 在s…...

JDK 9新特性学习大纲

第1部分&#xff1a;引言与背景 第1章&#xff1a;JDK 9的诞生与目标 1.1 JDK 9的核心目标与设计哲学 1.2 JDK 9的重要更新概览 1.3 兼容性与升级策略 第2部分&#xff1a;模块化系统&#xff08;Project Jigsaw&#xff09; 第2章&#xff1a;模块化基础 2.1 模块化的背景…...

【C语言标准库函数】三角函数

目录 一、头文件 二、函数简介 2.1. 正弦函数&#xff1a;sin(double angle) 2.2. 余弦函数&#xff1a;cos(double angle) 2.3. 正切函数&#xff1a;tan(double angle) 2.4. 反正弦函数&#xff1a;asin(double value) 2.5. 反余弦函数&#xff1a;acos(double value)…...

Redisson全面解析:从使用方法到工作原理的深度探索

文章目录 写在文章开头详解Redisson基本数据类型基础配置字符串操作列表操作映射集阻塞队列延迟队列更多关于Redisson详解Redisson 中的原子类详解redisson中的发布订阅模型小结参考写在文章开头 Redisson是基于原生redis操作指令上进一步的封装,屏蔽了redis数据结构的实现细…...

声明式导航,编程式导航,导航传参,下拉刷新

1.页面导航 1.声明式导航 1.1跳转到tabBar页面 1.2跳转到非tabBar页面 1.2后退导航 、 2.编程式导航 2.1跳转到tabBar页面 2.1跳转到非tabBar页面 2.3后退导航 3.导航传参 3.1声名式导航传参 3.2编程式导航传参 3.3在onLoad中接受参数 4.下拉刷新 4.1回顾下拉刷新…...

金和OA C6 DownLoadBgImage任意文件读取漏洞

金和OA C6 DownLoadBgImage任意文件读取漏洞 漏洞描述 金和C6数据库是一款针对企业信息化管理而设计的高级数据库管理系统&#xff0c;主要应用于企业资源规划&#xff08;ERP&#xff09;、客户关系管理&#xff08;CRM&#xff09;以及办公自动化&#xff08;OA&#xff09…...

激活函数篇 03 —— ReLU、LeakyReLU、ELU

本篇文章收录于专栏【机器学习】 以下是激活函数系列的相关的所有内容: 一文搞懂激活函数在神经网络中的关键作用 逻辑回归&#xff1a;Sigmoid函数在分类问题中的应用 整流线性单位函数&#xff08;Rectified Linear Unit, ReLU&#xff09;&#xff0c;又称修正线性单元&a…...

UdpServer

Udp服务端&#xff1a; using System; using System.Collections.Generic; using System.Linq; using System.Net.Sockets; using System.Net; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Diagnostics; using System.IO; using …...

PromptSource安装报错

一、现象 运行命令&#xff1a;streamlit run promptsource/app.py 报错&#xff1a; streamlit run promptsource/app.py Traceback (most recent call last): File "/usr/local/bin/streamlit", line 5, in <module> from streamlit.cli import main File …...

前端学习-页面尺寸事件以及阻止默认行为(三十三)

目录 前言 页面尺寸事件 语法 检测屏幕宽度 获取宽高 元素尺寸的位置 总结 示例代码 阻止默认行为 阻止冒泡 语法 阻止冒泡如何做 阻止元素默认行为如何做 总结 前言 晚上好各位 页面尺寸事件 会在窗口尺寸改变的时候触发条件 语法 window.addEventListener(…...

Kafka 入门与实战

一、Kafka 基础 1.1 创建topic kafka-topics.bat --bootstrap-server localhost:9092 --topic test --create 1.2 查看消费者偏移量位置 kafka-consumer-groups.bat --bootstrap-server localhost:9092 --describe --group test 1.3 消息的生产与发送 #生产者 kafka-cons…...

5 计算机网络

5 计算机网络 5.1 OSI/RM七层模型 5.2 TCP/IP协议簇 5.2.1:常见协议基础 一、 TCP是可靠的&#xff0c;效率低的&#xff1b; 1.HTTP协议端口默认80&#xff0c;HTTPSSL之后成为HTTPS协议默认端口443。 2.对于0~1023一般是默认的公共端口不需要注册&#xff0c;1024以后的则需…...

【华为OD机考】华为OD笔试真题解析(1)--AI处理器组合

一、题目描述 某公司研发了一款高性能AI处理器&#xff0c;每台物理设备具备8颗AI处理器&#xff0c;编号分别为0、1、2、3、4、5、6、7。 编号0~3的处理器处于同一链路中&#xff0c;编号4~7的处理器处于另外一个链路中&#xff0c;不同链路中的处理器不能通信&#xff0c;如…...

程序员也可以这样赚钱

最近有朋友和我交流了关于程序员副业的想法&#xff0c;我想借这个机会对目前软件开发常用的兼职平台做一个梳理。 以下是程序员接副业的靠谱平台推荐&#xff0c;结合政策合规性、平台口碑及实际操作性整理&#xff0c;覆盖国内外主流选择&#xff1a; 一、国内综合型平台 程序…...

VMware虚拟机安装、创建Ubuntu虚拟机及汉化设置全流程详细教程

一、安装VMware Workstation 下载VMware 访问官网&#xff1a;https://www.vmware.com 选择适合的版本&#xff08;如 Workstation Pro 或 VMware Player&#xff0c;后者免费&#xff09;。完成下载后运行安装程序。 网盘下载&#xff1a; 链接: https://pan.baidu.com/s/1MQ…...

HTTP协议学习大纲

第一阶段&#xff1a;HTTP基础概念 互联网与Web基础 理解Web工作原理&#xff1a;客户端-服务器模型URL与URI的结构及区别端口、协议、域名概念 HTTP协议概览 HTTP的作用与特点&#xff08;无状态、无连接、可扩展&#xff09;HTTP协议版本演进&#xff08;0.9 → 1.0 → 1.1 …...

系统URL整合系列视频四(需求介绍补充)

视频 系统URL整合系列视频四&#xff08;需求补充说明&#xff09; 视频介绍 &#xff08;全国&#xff09;大型分布式系统Web资源URL整合需求&#xff08;补充&#xff09;讲解。当今社会各行各业对软件系统的web资源访问权限控制越来越严格&#xff0c;控制粒度也越来越细。…...

21.2.7 综合示例

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 【例 21.7】【项目&#xff1a;code21-007】填充职员表并打印。 本例使用到的Excel文件为&#xff1a;职员信息登记表.xlsx&#x…...