赞
踩
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。