ssd1306 stm32l010
Dependents: oled_test7_16x24_010_1 i2c_HT16K33_test1_767_3 HAL_oled_16x24_010_1
SSD1308.h
- Committer:
- caa45040
- Date:
- 2022-08-02
- Revision:
- 0:5d70351255d1
- Child:
- 1:20e48680a5f8
File content as of revision 0:5d70351255d1:
/** @file SSD1308 I2C device class header file * Based on Solomon Systech SSD1308 datasheet, rev. 1, 10/2008 * The SSD1308 is used for example in the Seeed 128x64 OLED Display * http://www.seeedstudio.com/depot/grove-oled-display-12864-p-781.html?cPath=163_167 */ // The original code by Andrew Schamp is using (and has been submitted as a part of) Jeff Rowberg's I2Cdevlib library, // which should (hopefully) always be available at https://github.com/jrowberg/i2cdevlib // Some parts also mashed up from Graphic Library for driving monochrome displays based on the PCD8544, // Copyright (c) 2011, Wim De Roeve, who in turn did partial port of code found on // http://serdisplib.sourceforge.net/ser/pcd8544.html#links and by Petras Saduikis <petras@petras.co.uk> // // Changelog: // 2011-08-25 - Initial release by Andrew Schamp <schamp@gmail.com> // 2012-06-19 - Ported to mbed and optimised (WH) // 2013-07-12 - Minor comment fix and placeholder for SSD1306 (WH) // 2015-01-01 - Switch for optimised I2C calls to test on F401 (WH) // 2017-12-18 - Fixed non-copyable issue (Thx kenjiArai) // /* ================================================================================ I2Cdev device library code is placed under the MIT license Copyright (c) 2011 Andrew Schamp Copyright (c) 2012,2013,2017 WH (mbed port) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================================================ */ #ifndef SSD1308_H #define SSD1308_H // This is the I2C address (8 bit) // There are two possible addresses: with D/C# (pin 13) grounded, the address is 0x78, // with D/C# tied high it is 0x7A. Assume grounded by default. #define SSD1308_SA0 0x78 #define SSD1308_SA1 0x7A #define SSD1308_DEF_SA SSD1308_SA0 // Display dimensions #define ROWS 64 #define COLUMNS 128 #define PAGES (ROWS / 8) #define MAX_PAGE (PAGES - 1) #define MAX_ROW (ROWS - 1) #define MAX_COL (COLUMNS - 1) // Character dimensions 8x8 font #define CHARS (COLUMNS / FONT8x8_WIDTH) // Command and Datamode #define COMMAND_MODE 0x80 // continuation bit is set! #define DATA_MODE 0x40 // Commands and Parameter defines #define SET_LOWER_COLUMN 0x00 // | with lower nibble (Page mode only) #define SET_HIGHER_COLUMN 0x10 // | with higher nibble (Page mode only) #define HORIZONTAL_ADDRESSING_MODE 0x00 #define VERTICAL_ADDRESSING_MODE 0x01 #define PAGE_ADDRESSING_MODE 0x02 #define SET_MEMORY_ADDRESSING_MODE 0x20 // takes one byte as given above #define SET_COLUMN_ADDRESS 0x21 // takes two bytes, start address and end address of display data RAM #define SET_PAGE_ADDRESS 0x22 // takes two bytes, start address and end address of display data RAM // Command maybe unsupported by SSD1308 #define FADE_INTERVAL_8_FRAMES 0x00 #define FADE_INTERVAL_16_FRAMES 0x01 #define FADE_INTERVAL_24_FRAMES 0x02 #define FADE_INTERVAL_32_FRAMES 0x03 #define FADE_INTERVAL_64_FRAMES 0x07 #define FADE_INTERVAL_128_FRAMES 0x0F #define FADE_BLINK_DISABLE 0x00 #define FADE_OUT_ENABLE 0x20 #define BLINK_ENABLE 0x30 #define SET_FADE_BLINK 0x23 // takes one byte // bit5-4 = 0, fade/blink mode // bit3-0 = Time interval in frames #define SET_DISPLAY_START_LINE 0x40 // | with a row number 0-63 to set start row. (Reset = 0) #define SET_CONTRAST 0x81 // takes one byte, 0x00 - 0xFF #define SET_SEGMENT_REMAP_0 0xA0 // column address 0 is mapped to SEG0 (Reset) #define SET_SEGMENT_REMAP_127 0xA1 // column address 127 is mapped to SEG0 #define SET_DISPLAY_GDDRAM 0xA4 // restores display to contents of RAM #define SET_ENTIRE_DISPLAY_ON 0xA5 // turns all pixels on, does not affect RAM #define SET_NORMAL_DISPLAY 0xA6 // a databit of 1 indicates pixel 'ON' #define SET_INVERSE_DISPLAY 0xA7 // a databit of 1 indicates pixel 'OFF' #define SET_MULTIPLEX_RATIO 0xA8 // takes one byte, from 16xMUX to 64xMUX (MUX Ratio = byte+1; Default 64) #define EXTERNAL_IREF 0x10 #define INTERNAL_IREF 0x00 #define SET_IREF_SELECTION 0xAD // sets internal or external Iref #define SET_DISPLAY_POWER_OFF 0xAE #define SET_DISPLAY_POWER_ON 0xAF #define PAGE0 0x00 #define PAGE1 0x01 #define PAGE2 0x02 #define PAGE3 0x03 #define PAGE4 0x04 #define PAGE5 0x05 #define PAGE6 0x06 #define PAGE7 0x07 #define SET_PAGE_START_ADDRESS 0xB0 // | with a page number to get start address (Page mode only) #define SET_COMMON_REMAP_0 0xC0 // row address 0 is mapped to COM0 (Reset) #define SET_COMMON_REMAP_63 0xC8 // row address 63 is mapped to COM0 #define SET_DISPLAY_OFFSET 0xD3 // takes one byte from 0-63 for vertical shift, Reset = 0 #define SET_DISPLAY_CLOCK 0xD5 // takes one byte // bit7-4 = Osc Freq DCLK (Reset = 1000b) // bit3-0 = Divide ration (Reset = oooob, Ratio = 1) #define SET_PRECHARGE_TIME 0xD9 // takes one byte // bit7-4 = Phase2, upto 15 DCLKs (Reset = 0010b) // bit3-0 = Phase1, upto 15 DCLKs (Reset = 0010b) #define COMMON_BASE 0x02 // #define COMMON_SEQUENTIAL 0x00 // Sequential common pins config #define COMMON_ALTERNATIVE 0x10 // Odd/Even common pins config (Reset) #define COMMON_LEFTRIGHT_NORMAL 0x00 // LeftRight Normal (Reset) #define COMMON_LEFTRIGHT_FLIP 0x20 // LeftRight Flip #define SET_COMMON_CONF 0xDA // takes one byte as given above #define VCOMH_DESELECT_0_65_CODE 0x00 #define VCOMH_DESELECT_0_77_CODE 0x20 #define VCOMH_DESELECT_0_83_CODE 0x30 #define SET_VCOMH_DESELECT_LEVEL 0xDB // takes one byte as given above #define NOP 0xE3 #define SCROLL_INTERVAL_5_FRAMES 0x00 #define SCROLL_INTERVAL_64_FRAMES 0x01 #define SCROLL_INTERVAL_128_FRAMES 0x02 #define SCROLL_INTERVAL_256_FRAMES 0x03 #define SCROLL_INTERVAL_3_FRAMES 0x04 #define SCROLL_INTERVAL_4_FRAMES 0x05 #define SCROLL_INTERVAL_25_FRAMES 0x06 #define SCROLL_INTERVAL_2_FRAMES 0x07 #define SET_RIGHT_HOR_SCROLL 0x26 // takes 6 bytes: 0x00, PageStart, Scroll_Interval, PageEnd, 0x00, 0xFF #define SET_LEFT_HOR_SCROLL 0x27 // takes 6 bytes: 0x00, PageStart, Scroll_Interval, PageEnd, 0x00, 0xFF #define SET_VERT_RIGHT_HOR_SCROLL 0x29 // takes 5 bytes: 0x00, PageStart, Scroll_Interval, PageEnd, VertOffset #define SET_VERT_LEFT_HOR_SCROLL 0x2A // takes 5 bytes: 0x00, PageStart, Scroll_Interval, PageEnd, VertOffset #define SET_DEACTIVATE_SCROLL 0x2E #define SET_ACTIVATE_SCROLL 0x2F #define SET_VERTICAL_SCROLL_AREA 0xA3 // takes 2 bytes: Rows in Top Area (Reset=0), Rows in Scroll Area (Reset=64) /** Class to control an SSD1308 based oled Display * * Example: * @code * #include "mbed.h" * #include "mbed_logo.h" * #include "SSD1308.h" * //Pin Defines for I2C Bus * #define D_SDA p28 * #define D_SCL p27 * I2C i2c(D_SDA, D_SCL); * * // Host PC Communication channels * Serial pc(USBTX, USBRX); // tx, rx * * // Instantiate OLED * SSD1308 oled = SSD1308(&i2c, SSD1308_SA0); * * int main() { * pc.printf("OLED test start\r"); * oled.writeString(0, 0, "Hello World !"); * // oled.printf("Hello World !"); * * oled.fillDisplay(0xAA); * oled.setDisplayOff(); * wait(1); * oled.setDisplayOn(); * * oled.clearDisplay(); * oled.setDisplayInverse(); * wait(0.5); * oled.setDisplayNormal(); * * oled.writeBitmap((uint8_t*) mbed_logo); * * pc.printf("OLED test done\r\n"); * } * * @endcode */ //class SSD1308 : public Stream { struct SSD1308 { // public: /** *@brief Constructor *@param I2C &i2c reference to i2c, *@param uint8_t deviceAddress slaveaddress (8bit to use for the controller (0x78 by default, assumes D/C# (pin 13) grounded) */ SSD1308( uint8_t address = SSD1308_DEF_SA); // High Level methods /** @brief High level Init, most settings remain at Power-On reset value */ void initialize(); /** @brief clear the display */ void clearDisplay(); /** @brief fill the display * @param uint8_t pattern fillpattern vertical patch or 8 bits * @param uint8_t start_page begin page (0..MAX_PAGE) * @param uint8_t end_page end page (start_page..MAX_PAGE) * @param uint8_t start_col begin column (0..MAX_COL) * @param uint8_t end_col end column (start_col..MAX_COL) */ void fillDisplay(uint8_t pattern = 0x00, uint8_t start_page=0, uint8_t end_page=MAX_PAGE, uint8_t start_col=0, uint8_t end_col=MAX_COL); /** @brief write a bitmap to the display * @param uint8_t* data pointer to bitmap * @param uint8_t start_page begin page (0..MAX_PAGE) * @param uint8_t end_page end page (start_page..MAX_PAGE) * @param uint8_t start_col begin column (0..MAX_COL) * @param uint8_t end_col end column (start_col..MAX_COL) */ void writeBitmap(uint8_t* data, uint8_t start_page=0, uint8_t end_page=MAX_PAGE, uint8_t start_col=0, uint8_t end_col=MAX_COL); // Select inverted or normal text //void setInverted(bool inverted) { _inverted = inverted; }; /** @brief Write large character (16x24 font) * @param uint8_t row row number (0...MAX_ROW) * @param uint8_t col column number (0...MAX_COL) * @param char chr Used for displaying numbers 0 - 9 and '+', '-', '.' */ void writeBigChar(uint8_t row, uint8_t col, char chr); // Medium Level methods /** @brief Set Horizontal Addressing Mode (cursor incr left-to-right, top-to-bottom) * */ void setHorizontalAddressingMode(); /** @brief Set Page Addressing Mode (cursor incr left-to-right) * */ void setPageAddressingMode(); /** @brief Set Addressing Mode * @param uint8_t mode */ void setMemoryAddressingMode(uint8_t mode); /** @param uint8_t start startcolumn (valid range 0..MAX_COL) * @param uint8_t end endcolumn (valid range start..MAX_COL) */ void setColumnAddress(uint8_t start, uint8_t end); /** @param uint8_t start startpage (valid range 0..MAX_PAGE) * @param uint8_t end endpage (valid range start..MAX_PAGE) */ void setPageAddress(uint8_t start, uint8_t end); /** @brief Enable Display */ void setDisplayOn(); /** @brief Disable Display */ void setDisplayOff(); /** @brief Display Flip (Left/Right, Up/Down) * @param bool left flip Left/Right * @param bool down flip Up/Down */ void setDisplayFlip(bool left, bool down); // private: // Low Level methods /** @brief Write command that has no parameters */ void _sendCommand(uint8_t command); /** @brief Write command that has one parameter */ void _sendCommand(uint8_t command, uint8_t param1); /** @brief Write command that has two parameters */ void _sendCommand(uint8_t command, uint8_t param1, uint8_t param2); // void sendCommands(uint8_t len, uint8_t* buf); /** @brief Write command that has five parameters */ void _sendCommand(uint8_t command, uint8_t param1, uint8_t param2, uint8_t param3, uint8_t param4, uint8_t param5); /** @brief Write command that has six parameters */ void _sendCommand(uint8_t command, uint8_t param1, uint8_t param2, uint8_t param3, uint8_t param4, uint8_t param5, uint8_t param6); /** @brief Write databyte to display * @brief Start at current cursor location * @param uint8_t data databyte to write */ void _sendData(uint8_t data); /** @brief Write len bytes from buffer data to display, * @brief Start at current cursor location * @param uint8_t len number of bytes to write * @param uint8_t* data pointer to data */ void _sendData(uint8_t len, uint8_t* data); //I2C *_i2c; // I2C bus reference uint8_t _readOpcode; // contains the I2C address of the device uint8_t _writeOpcode; // contains the I2C address of the device //bool _inverted; // inverted or normal text }; #endif