#ifndef SSD1306_H #define SSD1306_H #include #include #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define DISPLAY_I2C_ADDRESS_32 (0x3C) #define DISPLAY_I2C_ADDRESS_64 (0x3D) #define DISPLAY_I2C_ADDRESS DISPLAY_I2C_ADDRESS_32 #define SSD1306_BLACK 0 ///< Draw 'off' pixels #define SSD1306_WHITE 1 ///< Draw 'on' pixels #define SSD1306_INVERSE 2 ///< Invert pixels #define SSD1306_MEMORYMODE 0x20 ///< See datasheet #define SSD1306_COLUMNADDR 0x21 ///< See datasheet #define SSD1306_PAGEADDR 0x22 ///< See datasheet #define SSD1306_SETCONTRAST 0x81 ///< See datasheet #define SSD1306_CHARGEPUMP 0x8D ///< See datasheet #define SSD1306_SEGREMAP 0xA0 ///< See datasheet #define SSD1306_DISPLAYALLON_RESUME 0xA4 ///< See datasheet #define SSD1306_DISPLAYALLON 0xA5 ///< Not currently used #define SSD1306_NORMALDISPLAY 0xA6 ///< See datasheet #define SSD1306_INVERTDISPLAY 0xA7 ///< See datasheet #define SSD1306_SETMULTIPLEX 0xA8 ///< See datasheet #define SSD1306_DISPLAYOFF 0xAE ///< See datasheet #define SSD1306_DISPLAYON 0xAF ///< See datasheet #define SSD1306_COMSCANINC 0xC0 ///< Not currently used #define SSD1306_COMSCANDEC 0xC8 ///< See datasheet #define SSD1306_SETDISPLAYOFFSET 0xD3 ///< See datasheet #define SSD1306_SETDISPLAYCLOCKDIV 0xD5 ///< See datasheet #define SSD1306_SETPRECHARGE 0xD9 ///< See datasheet #define SSD1306_SETCOMPINS 0xDA ///< See datasheet #define SSD1306_SETVCOMDETECT 0xDB ///< See datasheet #define SSD1306_SETLOWCOLUMN 0x00 ///< Not currently used #define SSD1306_SETHIGHCOLUMN 0x10 ///< Not currently used #define SSD1306_SETSTARTLINE 0x40 ///< See datasheet #define SSD1306_EXTERNALVCC 0x01 ///< External display voltage source #define SSD1306_SWITCHCAPVCC 0x02 ///< Gen. display voltage from 3.3V #define SSD1306_RIGHT_HORIZONTAL_SCROLL 0x26 ///< Init rt scroll #define SSD1306_LEFT_HORIZONTAL_SCROLL 0x27 ///< Init left scroll #define SSD1306_VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL 0x29 ///< Init diag scroll #define SSD1306_VERTICAL_AND_LEFT_HORIZONTAL_SCROLL 0x2A ///< Init diag scroll #define SSD1306_DEACTIVATE_SCROLL 0x2E ///< Stop scroll #define SSD1306_ACTIVATE_SCROLL 0x2F ///< Start scroll #define SSD1306_SET_VERTICAL_SCROLL_AREA 0xA3 ///< Set scroll range #define SSD1306_LCDWIDTH SCREEN_WIDTH ///< DEPRECATED: width w/SSD1306_128_64 defined #define SSD1306_LCDHEIGHT SCREEN_HEIGHT ///< DEPRECATED: height w/SSD1306_128_64 defined class SSD1306 : public Adafruit_GFX { public: // Constructor //CUI(Adafruit_SSD1306 &display); SSD1306(); void dim(bool dim); void setContrast(uint8_t contrast); protected: bool bOK; uint8_t buffer[SCREEN_WIDTH * SCREEN_HEIGHT / 8]; int8_t i2caddr; ///< I2C address initialized when begin method is called. uint8_t contrast; ///< normal contrast setting for this device bool begin(uint8_t switchvcc = SSD1306_SWITCHCAPVCC, uint8_t i2caddr = DISPLAY_I2C_ADDRESS); inline uint8_t *getBuffer(void) { return buffer; }; inline void clearDisplayBuffer(void) { memset(buffer, 0, WIDTH * ((HEIGHT + 7) / 8)); }; void updateScreen(); void updateRegion(uint8_t pageStart, uint8_t pageEnd, uint8_t colStart , uint8_t colEnd); void ssd1306_hscroll(uint8_t dir, uint8_t pageStart, uint8_t pageEnd, uint8_t offset, uint8_t interval); private: int8_t vccstate; ///< VCC selection, set by begin method. uint32_t wireClk; ///< Wire speed for SSD1306 transfers uint32_t restoreClk; ///< Wire speed following SSD1306 transfers virtual void drawPixel(int16_t x, int16_t y, uint16_t color); void ssd1306_commandList(const uint8_t *c, uint8_t n); void ssd1306_command1(uint8_t c); }; #endif