这个分享由于不是我自己写的驱动库,所以没啥好说的,这是ESP32的开源库里面有的,而且已经被认证了的,我也用过,没什么大问题,不过我还是很讨厌用这种小屏幕,小家吧气的,我之前更过驱动TFTLCD,那个好用一些,我下面直接贴代码,然后简略说一下用法
代码部分
Wire.begin(); // 开启IIC用来驱动0.96oeld
oled.init(); // SSD1306 0.96 OLED 初始化
oled.clearDisplay(); // 清除屏幕
oled.setTextXY( 0 , 0 ); // 设置显示位置
oled.putString("XIHUA "); // 显示信息
核心只有上面几行,由于是IIC驱动,所以肯定第一步是初始化IIC来驱动屏幕,然后是屏幕初始化,清屏,设置在哪里显示,注意他不是128*64的X Y 轴,而是按字符大小为单位算的,0 , 1 ,2这样改一下就知道了。然后就是显示字符信息了
这是OLED_SSD1306.h,
#ifndef OLED_SSD1306_H
#define OLED_SSD1306_H
/*
编写者:bird (对于0.96oled官方库做的一点更改适用于手上的oled)
代码功能:热点配置ESP32内部数据 并且 用nvs存入设备flash中
编写日期:2020.10
最近一次更新:2020.10.28
使用示例:
Wire.begin();
oled.init(); // Initialze SSD1306 OLED display
oled.clearDisplay(); // Clear screen
oled.setTextXY(0,0); // Set cursor position, start of line 0
oled.putString("ACROBOTIC");
*/
#if ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
#ifdef __AVR__
#include <avr/pgmspace.h>
#define OLEDFONT(name) static const uint8_t __attribute__ ((progmem))_n[]
#elif defined(ESP8266)
#include <pgmspace.h>
#define OLEDFONT(name) static const uint8_t name[]
#else
#define pgm_read_byte(addr) (*(const unsigned char *)(addr))
#define OLEDFONT(name) static const uint8_t name[]
#endif
#include "Wire.h"
#include "font8x8.h"
#include "font8x16.h"
#define SSD1306_Max_X 127 //128 Pixels
#define SSD1306_Max_Y 63 //64 Pixels
#define PAGE_MODE 01
#define HORIZONTAL_MODE 02
#define SSD1306_Address 0x3C
#define SSD1306_Command_Mode 0x80
#define SSD1306_Data_Mode 0x40
#define SSD1306_Display_Off_Cmd 0xAE
#define SSD1306_Display_On_Cmd 0xAF
#define SSD1306_Normal_Display_Cmd 0xA6
#define SSD1306_Inverse_Display_Cmd 0xA7
#define SSD1306_Activate_Scroll_Cmd 0x2F
#define SSD1306_Dectivate_Scroll_Cmd 0x2E
#define SSD1306_Set_Brightness_Cmd 0x81
#define Scroll_Left 0x00
#define Scroll_Right 0x01
#define Scroll_2Frames 0x7
#define Scroll_3Frames 0x4
#define Scroll_4Frames 0x5
#define Scroll_5Frames 0x0
#define Scroll_25Frames 0x6
#define Scroll_64Frames 0x1
#define Scroll_128Frames 0x2
#define Scroll_256Frames 0x3
class ACROBOTIC_SSD1306 {
public:
char addressingMode;
void init(void);
void setNormalDisplay();
void setInverseDisplay();
void sendCommand(unsigned char command);
void WriteCmd(unsigned char command);
void sendData(unsigned char Data);
void setPageMode();
void setHorizontalMode();
void setTextXY(unsigned char Row, unsigned char Column);
void clearDisplay();
void setBrightness(unsigned char Brightness);
bool putChar(unsigned char c);
void putString(const char *string);
void putString(String string);
unsigned char putNumber(long n);
unsigned char putFloat(float floatNumber,unsigned char decimal);
unsigned char putFloat(float floatNumber);
void drawBitmap(unsigned char *bitmaparray,int bytes);
void setHorizontalScrollProperties(
bool direction,
unsigned char startPage,
unsigned char endPage,
unsigned char scrollSpeed);
void activateScroll();
void deactivateScroll();
void setFont(const uint8_t* font);
private:
const uint8_t* m_font; // Current font.
uint8_t m_font_offset = 2; // Font bytes for meta data.
uint8_t m_font_width; // Font witdth.
uint8_t m_col; // Cursor column.
uint8_t m_row; // Cursor row (RAM).
};
extern ACROBOTIC_SSD1306 oled; // ACROBOTIC_SSD1306 object
#endif
这是OLED_SSD1306.cpp:
#include "0.96OLED/OLED_SSD1306.h"
/*
编写者:陈枭 (对于0.96oled官方库做的一点更改适用于手上的oled)
代码功能:热点配置ESP32内部数据 并且 用nvs存入设备flash中
编写日期:2020.10
最近一次更新:2020.10.28
使用示例:
Wire.begin();
oled.init(); // Initialze SSD1306 OLED display
oled.clearDisplay(); // Clear screen
oled.setTextXY(0,0); // Set cursor position, start of line 0
oled.putString("ACROBOTIC");
*/
void ACROBOTIC_SSD1306::init(void)
{
sendCommand(0xAE); //display off
sendCommand(0x20); //Set Memory Addressing Mode
sendCommand(0x10); //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
sendCommand(0xb0); //Set Page Start Address for Page Addressing Mode,0-7
sendCommand(0xc8); //Set COM Output Scan Direction
sendCommand(0x00); //---set low column address
sendCommand(0x10); //---set high column address
sendCommand(0x40); //--set start line address
sendCommand(0x81); //--set contrast control register
sendCommand(0xff); //亮度调节 0x00~0xff
sendCommand(0xa1); //--set segment re-map 0 to 127
sendCommand(0xa6); //--set normal display
sendCommand(0xa8); //--set multiplex ratio(1 to 64)
sendCommand(0x3F); //
sendCommand(0xa4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM content
sendCommand(0xd3); //-set display offset
sendCommand(0x00); //-not offset
sendCommand(0xd5); //--set display clock divide ratio/oscillator frequency
sendCommand(0xf0); //--set divide ratio
sendCommand(0xd9); //--set pre-charge period
sendCommand(0x22); //
sendCommand(0xda); //--set com pins hardware configuration
sendCommand(0x12);
sendCommand(0xdb); //--set vcomh
sendCommand(0x20); //0x20,0.77xVcc
sendCommand(0x8d); //--set DC-DC enable
sendCommand(0x14); //
sendCommand(0xaf); //--turn on oled panel
clearDisplay();
sendCommand(0x2E); //Stop scroll
sendCommand(0x20); //Set Memory Addressing Mode
sendCommand(0x00); //Set Memory Addressing Mode ab Horizontal addressing mode
setFont(font8x8);
}
void ACROBOTIC_SSD1306::setFont(const uint8_t* font)
{
m_font = font;
m_font_width = pgm_read_byte(&m_font[0]);
}
void ACROBOTIC_SSD1306::sendCommand(unsigned char command)
{
Wire.beginTransmission(SSD1306_Address); // begin I2C communication
Wire.write(SSD1306_Command_Mode); // Set OLED Command mode
Wire.write(command);
Wire.endTransmission(); // End I2C communication
}
void ACROBOTIC_SSD1306::WriteCmd(unsigned char command)
{
Wire.beginTransmission(SSD1306_Address); // begin I2C communication
Wire.write(SSD1306_Command_Mode); // Set OLED Command mode
Wire.write(command);
Wire.endTransmission(); // End I2C communication
}
void ACROBOTIC_SSD1306::setBrightness(unsigned char Brightness)
{
sendCommand(SSD1306_Set_Brightness_Cmd);
sendCommand(Brightness);
}
void ACROBOTIC_SSD1306::setHorizontalMode()
{
addressingMode = HORIZONTAL_MODE;
sendCommand(0x20); //set addressing mode
sendCommand(0x00); //set horizontal addressing mode
}
void ACROBOTIC_SSD1306::setPageMode()
{
addressingMode = PAGE_MODE;
sendCommand(0x20); //set addressing mode
sendCommand(0x02); //set page addressing mode
}
void ACROBOTIC_SSD1306::setTextXY(unsigned char row, unsigned char col)
{
sendCommand(0xB0 + row); //set page address
sendCommand(0x00 + (m_font_width*col & 0x0F)); //set column lower addr
sendCommand(0x10 + ((m_font_width*col>>4)&0x0F)); //set column higher addr
}
void ACROBOTIC_SSD1306::clearDisplay()
{
unsigned char i,j;
sendCommand(SSD1306_Display_Off_Cmd); //display off
for(j=0;j<8;j++)
{
setTextXY(j,0);
{
for(i=0;i<16;i++) //clear all columns
{
putChar(' ');
}
}
}
sendCommand(SSD1306_Display_On_Cmd); //display on
setTextXY(0,0);
}
void ACROBOTIC_SSD1306::sendData(unsigned char Data)
{
Wire.beginTransmission(SSD1306_Address); // begin I2C transmission
Wire.write(SSD1306_Data_Mode); // data mode
Wire.write(Data);
Wire.endTransmission(); // stop I2C transmission
}
bool ACROBOTIC_SSD1306::putChar(unsigned char ch)
{
if (!m_font) return 0;
//Ignore non-printable ASCII characters. This can be modified for
//multilingual font.
if(ch < 32 || ch > 127)
{
ch = ' ';
}
for(unsigned char i=0;i<m_font_width;i++)
{
// Font array starts at 0, ASCII starts at 32
sendData(pgm_read_byte(&m_font[(ch-32)*m_font_width+m_font_offset+i]));
}
}
void ACROBOTIC_SSD1306::putString(const char *string)
{
unsigned char i=0;
while(string[i])
{
putChar(string[i]);
i++;
}
}
void ACROBOTIC_SSD1306::putString(String string)
{
char char_array[string.length()+1];
string.toCharArray(char_array, sizeof(char_array));
putString(char_array);
}
unsigned char ACROBOTIC_SSD1306::putNumber(long long_num)
{
unsigned char char_buffer[10]="";
unsigned char i = 0;
unsigned char f = 0;
if (long_num < 0)
{
f=1;
putChar('-');
long_num = -long_num;
}
else if (long_num == 0)
{
f=1;
putChar('0');
return f;
}
while (long_num > 0)
{
char_buffer[i++] = long_num % 10;
long_num /= 10;
}
f=f+i;
for(; i > 0; i--)
{
putChar('0'+ char_buffer[i - 1]);
}
return f;
}
unsigned char ACROBOTIC_SSD1306::putFloat(float floatNumber,unsigned char decimal)
{
unsigned int temp=0;
float decy=0.0;
float rounding = 0.5;
unsigned char f=0;
if(floatNumber<0.0)
{
putString("-");
floatNumber = -floatNumber;
f +=1;
}
for (unsigned char i=0; i<decimal; ++i)
{
rounding /= 10.0;
}
floatNumber += rounding;
temp = floatNumber;
f += putNumber(temp);
if(decimal>0)
{
putChar('.');
f +=1;
}
decy = floatNumber-temp;//decimal part,
for(unsigned char i=0;i<decimal;i++)//4
{
decy *=10;// for the next decimal
temp = decy;//get the decimal
putNumber(temp);
decy -= temp;
}
f +=decimal;
return f;
}
unsigned char ACROBOTIC_SSD1306::putFloat(float floatNumber)
{
unsigned char decimal=2;
unsigned int temp=0;
float decy=0.0;
float rounding = 0.5;
unsigned char f=0;
if(floatNumber<0.0)
{
putString("-");
floatNumber = -floatNumber;
f +=1;
}
for (unsigned char i=0; i<decimal; ++i)
{
rounding /= 10.0;
}
floatNumber += rounding;
temp = floatNumber;
f += putNumber(temp);
if(decimal>0)
{
putChar('.');
f +=1;
}
decy = floatNumber-temp;//decimal part,
for(unsigned char i=0;i<decimal;i++)//4
{
decy *=10;// for the next decimal
temp = decy;//get the decimal
putNumber(temp);
decy -= temp;
}
f +=decimal;
return f;
}
void ACROBOTIC_SSD1306::drawBitmap(unsigned char *bitmaparray,int bytes)
{
char localAddressMode = addressingMode;
if(addressingMode != HORIZONTAL_MODE)
{
//Bitmap is drawn in horizontal mode
setHorizontalMode();
}
for(int i=0;i<bytes;i++)
{
sendData(pgm_read_byte(&bitmaparray[i]));
}
if(localAddressMode == PAGE_MODE)
{
//If pageMode was used earlier, restore it.
setPageMode();
}
}
void ACROBOTIC_SSD1306::setHorizontalScrollProperties(bool direction,unsigned char startPage, unsigned char endPage, unsigned char scrollSpeed)
{
if(Scroll_Right == direction)
{
//Scroll right
sendCommand(0x26);
}
else
{
//Scroll left
sendCommand(0x27);
}
sendCommand(0x00);
sendCommand(startPage);
sendCommand(scrollSpeed);
sendCommand(endPage);
sendCommand(0x00);
sendCommand(0xFF);
}
void ACROBOTIC_SSD1306::activateScroll()
{
sendCommand(SSD1306_Activate_Scroll_Cmd);
}
void ACROBOTIC_SSD1306::deactivateScroll()
{
sendCommand(SSD1306_Dectivate_Scroll_Cmd);
}
void ACROBOTIC_SSD1306::setNormalDisplay()
{
sendCommand(SSD1306_Normal_Display_Cmd);
}
void ACROBOTIC_SSD1306::setInverseDisplay()
{
sendCommand(SSD1306_Inverse_Display_Cmd);
}
ACROBOTIC_SSD1306 oled; // Pre-instantiate object
这是取好的字母符号库font8x8.h,字符大小为8x8
#ifndef FONT8x8_H
#define FONT8x8_H
// 8x8 Font ASCII 32 - 127 Implemented
// Users can modify this to support more characters (glyphs)
OLEDFONT(font8x8) PROGMEM =
{
0x08, // width
0x08, // height
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //
0x00,0x00,0x00,0x00,0x5F,0x00,0x00,0x00, // !
0x00,0x00,0x00,0x03,0x00,0x03,0x00,0x00, // "
0x00,0x24,0x7E,0x24,0x24,0x7E,0x24,0x00, // #
0x00,0x2E,0x2A,0x7F,0x2A,0x3A,0x00,0x00, // $
0x00,0x46,0x26,0x10,0x08,0x64,0x62,0x00, // %
0x00,0x20,0x54,0x4A,0x54,0x20,0x50,0x00, // &
0x00,0x00,0x00,0x04,0x02,0x00,0x00,0x00, // ’
0x00,0x00,0x00,0x3C,0x42,0x00,0x00,0x00, // (
0x00,0x00,0x00,0x42,0x3C,0x00,0x00,0x00, // )
0x00,0x10,0x54,0x38,0x54,0x10,0x00,0x00, // *
0x00,0x10,0x10,0x7C,0x10,0x10,0x00,0x00, // +
0x00,0x00,0x00,0x80,0x60,0x00,0x00,0x00, // ,
0x00,0x10,0x10,0x10,0x10,0x10,0x00,0x00, // -
0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00, // .
0x00,0x40,0x20,0x10,0x08,0x04,0x00,0x00, // /
0x3C,0x62,0x52,0x4A,0x46,0x3C,0x00,0x00, // 0
0x44,0x42,0x7E,0x40,0x40,0x00,0x00,0x00, // 1
0x64,0x52,0x52,0x52,0x52,0x4C,0x00,0x00, // 2
0x24,0x42,0x42,0x4A,0x4A,0x34,0x00,0x00, // 3
0x30,0x28,0x24,0x7E,0x20,0x20,0x00,0x00, // 4
0x2E,0x4A,0x4A,0x4A,0x4A,0x32,0x00,0x00, // 5
0x3C,0x4A,0x4A,0x4A,0x4A,0x30,0x00,0x00, // 6
0x02,0x02,0x62,0x12,0x0A,0x06,0x00,0x00, // 7
0x34,0x4A,0x4A,0x4A,0x4A,0x34,0x00,0x00, // 8
0x0C,0x52,0x52,0x52,0x52,0x3C,0x00,0x00, // 9
0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x00, // :
0x00,0x00,0x80,0x64,0x00,0x00,0x00,0x00, // ;
0x00,0x00,0x10,0x28,0x44,0x00,0x00,0x00, // <
0x00,0x28,0x28,0x28,0x28,0x28,0x00,0x00, // =
0x00,0x00,0x44,0x28,0x10,0x00,0x00,0x00, // >
0x00,0x04,0x02,0x02,0x52,0x0A,0x04,0x00, // ?
0x00,0x3C,0x42,0x5A,0x56,0x5A,0x1C,0x00, // @
0x7C,0x12,0x12,0x12,0x12,0x7C,0x00,0x00, // A
0x7E,0x4A,0x4A,0x4A,0x4A,0x34,0x00,0x00, // B
0x3C,0x42,0x42,0x42,0x42,0x24,0x00,0x00, // C
0x7E,0x42,0x42,0x42,0x24,0x18,0x00,0x00, // D
0x7E,0x4A,0x4A,0x4A,0x4A,0x42,0x00,0x00, // E
0x7E,0x0A,0x0A,0x0A,0x0A,0x02,0x00,0x00, // F
0x3C,0x42,0x42,0x52,0x52,0x34,0x00,0x00, // G
0x7E,0x08,0x08,0x08,0x08,0x7E,0x00,0x00, // H
0x00,0x42,0x42,0x7E,0x42,0x42,0x00,0x00, // I
0x30,0x40,0x40,0x40,0x40,0x3E,0x00,0x00, // J
0x7E,0x08,0x08,0x14,0x22,0x40,0x00,0x00, // K
0x7E,0x40,0x40,0x40,0x40,0x40,0x00,0x00, // L
0x7E,0x04,0x08,0x08,0x04,0x7E,0x00,0x00, // M
0x7E,0x04,0x08,0x10,0x20,0x7E,0x00,0x00, // N
0x3C,0x42,0x42,0x42,0x42,0x3C,0x00,0x00, // O
0x7E,0x12,0x12,0x12,0x12,0x0C,0x00,0x00, // P
0x3C,0x42,0x52,0x62,0x42,0x3C,0x00,0x00, // Q
0x7E,0x12,0x12,0x12,0x32,0x4C,0x00,0x00, // R
0x24,0x4A,0x4A,0x4A,0x4A,0x30,0x00,0x00, // S
0x02,0x02,0x02,0x7E,0x02,0x02,0x02,0x00, // T
0x3E,0x40,0x40,0x40,0x40,0x3E,0x00,0x00, // U
0x1E,0x20,0x40,0x40,0x20,0x1E,0x00,0x00, // V
0x3E,0x40,0x20,0x20,0x40,0x3E,0x00,0x00, // W
0x42,0x24,0x18,0x18,0x24,0x42,0x00,0x00, // X
0x02,0x04,0x08,0x70,0x08,0x04,0x02,0x00, // Y
0x42,0x62,0x52,0x4A,0x46,0x42,0x00,0x00, // Z
0x00,0x00,0x7E,0x42,0x42,0x00,0x00,0x00, // [
0x00,0x04,0x08,0x10,0x20,0x40,0x00,0x00, //
0x00,0x00,0x42,0x42,0x7E,0x00,0x00,0x00, // ]
0x00,0x08,0x04,0x7E,0x04,0x08,0x00,0x00, // ^
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00, // _
0x3C,0x42,0x99,0xA5,0xA5,0x81,0x42,0x3C, // `
0x00,0x20,0x54,0x54,0x54,0x78,0x00,0x00, // a
0x00,0x7E,0x48,0x48,0x48,0x30,0x00,0x00, // b
0x00,0x00,0x38,0x44,0x44,0x44,0x00,0x00, // c
0x00,0x30,0x48,0x48,0x48,0x7E,0x00,0x00, // d
0x00,0x38,0x54,0x54,0x54,0x48,0x00,0x00, // e
0x00,0x00,0x00,0x7C,0x0A,0x02,0x00,0x00, // f
0x00,0x18,0xA4,0xA4,0xA4,0xA4,0x7C,0x00, // g
0x00,0x7E,0x08,0x08,0x08,0x70,0x00,0x00, // h
0x00,0x00,0x00,0x48,0x7A,0x40,0x00,0x00, // i
0x00,0x00,0x40,0x80,0x80,0x7A,0x00,0x00, // j
0x00,0x7E,0x18,0x24,0x40,0x00,0x00,0x00, // k
0x00,0x00,0x00,0x3E,0x40,0x40,0x00,0x00, // l
0x00,0x7C,0x04,0x78,0x04,0x78,0x00,0x00, // m
0x00,0x7C,0x04,0x04,0x04,0x78,0x00,0x00, // n
0x00,0x38,0x44,0x44,0x44,0x38,0x00,0x00, // o
0x00,0xFC,0x24,0x24,0x24,0x18,0x00,0x00, // p
0x00,0x18,0x24,0x24,0x24,0xFC,0x80,0x00, // q
0x00,0x00,0x78,0x04,0x04,0x04,0x00,0x00, // r
0x00,0x48,0x54,0x54,0x54,0x20,0x00,0x00, // s
0x00,0x00,0x04,0x3E,0x44,0x40,0x00,0x00, // t
0x00,0x3C,0x40,0x40,0x40,0x3C,0x00,0x00, // u
0x00,0x0C,0x30,0x40,0x30,0x0C,0x00,0x00, // v
0x00,0x3C,0x40,0x38,0x40,0x3C,0x00,0x00, // w
0x00,0x44,0x28,0x10,0x28,0x44,0x00,0x00, // x
0x00,0x1C,0xA0,0xA0,0xA0,0x7C,0x00,0x00, // y
0x00,0x44,0x64,0x54,0x4C,0x44,0x00,0x00, // z
0x00,0x08,0x08,0x76,0x42,0x42,0x00,0x00, // {
0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00, // |
0x00,0x42,0x42,0x76,0x08,0x08,0x00,0x00, // }
0x00,0x00,0x04,0x02,0x04,0x02,0x00,0x00, // ~
};
#endif