a partial porting OLED_I2C library

Dependents:   ou_mbed_oled ou_mbed_tmp102

Revision:
0:b5cb0f340c1a
Child:
1:c928953247eb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/oled_i2c.h	Mon Jun 18 11:30:39 2018 +0000
@@ -0,0 +1,238 @@
+/** A oled i2c class porting from Arduino's OLED_I2C library
+ *
+ *  @author  Poushen Ou
+ *  @version 1.0
+ *  @date    17-Jun-2018
+ *
+ *  This code provide operation for I2C OLED SSD1306
+ *
+ *  About OLED SSD1306
+ *      https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf
+ */
+#ifndef _OLED_I2C_H_
+#define _OLED_I2C_H_
+
+#include "mbed.h"
+#include "eeprom.h"
+
+#define LEFT    0
+#define RIGHT   9999
+#define CENTER  9998
+
+#define SSD1306_128_64
+
+#define SSD1306_ADDR        0x78
+#define SSD1306_MEM_SIZE    360
+#define SSD1306_WIDTH       72
+#define SSD1306_LENGTH      40
+
+#define SSD1306_COMMAND         0x00
+#define SSD1306_DATA            0xC0
+#define SSD1306_DATA_CONTINUE   0x40
+
+//#define SSD1306_DATA_OUT_OPTIMIZED
+
+// SSD1306 Commandset
+// ------------------
+// Fundamental Commands
+#define SSD1306_SET_CONTRAST_CONTROL        0x81
+#define SSD1306_DISPLAY_ALL_ON_RESUME       0xA4
+#define SSD1306_DISPLAY_ALL_ON              0xA5
+#define SSD1306_NORMAL_DISPLAY              0xA6
+#define SSD1306_INVERT_DISPLAY              0xA7
+#define SSD1306_DISPLAY_OFF                 0xAE
+#define SSD1306_DISPLAY_ON                  0xAF
+#define SSD1306_NOP                         0xE3
+// Scrolling Commands
+#define SSD1306_HORIZONTAL_SCROLL_RIGHT                 0x26
+#define SSD1306_HORIZONTAL_SCROLL_LEFT                  0x27
+#define SSD1306_HORIZONTAL_SCROLL_VERTICAL_AND_RIGHT    0x29
+#define SSD1306_HORIZONTAL_SCROLL_VERTICAL_AND_LEFT     0x2A
+#define SSD1306_DEACTIVATE_SCROLL                       0x2E
+#define SSD1306_ACTIVATE_SCROLL                         0x2F
+#define SSD1306_SET_VERTICAL_SCROLL_AREA                0xA3
+// Addressing Setting Commands
+#define SSD1306_SET_LOWER_COLUMN                        0x00
+#define SSD1306_SET_HIGHER_COLUMN                       0x10
+#define SSD1306_MEMORY_ADDR_MODE                        0x20
+#define SSD1306_SET_COLUMN_ADDR                         0x21
+#define SSD1306_SET_PAGE_ADDR                           0x22
+// Hardware Configuration Commands
+#define SSD1306_SET_START_LINE                          0x40
+#define SSD1306_SET_SEGMENT_REMAP                       0xA0
+#define SSD1306_SET_MULTIPLEX_RATIO                     0xA8
+#define SSD1306_COM_SCAN_DIR_INC                        0xC0
+#define SSD1306_COM_SCAN_DIR_DEC                        0xC8
+#define SSD1306_SET_DISPLAY_OFFSET                      0xD3
+#define SSD1306_SET_COM_PINS                            0xDA
+#define SSD1306_CHARGE_PUMP                             0x8D
+// Timing & Driving Scheme Setting Commands
+#define SSD1306_SET_DISPLAY_CLOCK_DIV_RATIO             0xD5
+#define SSD1306_SET_PRECHARGE_PERIOD                    0xD9
+#define SSD1306_SET_VCOM_DESELECT                       0xDB
+
+/** oled_i2c Class Library
+ * to provide access interface to OLED screen for mbed
+ *
+ * Example:
+ * @code
+ * #include "mbed.h"
+ * #include "oled_i2c.h"
+ * #include "oled_font.h"
+ *
+ * // make oled_i2c instance using I2C object.
+ * // with default slave address 0x78 (0x3C in 7bit format)
+ * // test ok with SSD1306 I2C 128*64 oled screen
+ * I2C i2c(dp5,dp27);   // for LPC1114 or LPC1115
+ * oled_i2c oled(i2c);
+ *
+ * int main()
+ * {
+ *     i2c.frequency(1000 * 1000);
+ *     oled.init_oled();
+ * 
+ *     oled.setFont(BigNumbers);
+ *     //oled.print("27", 20, 10);
+ *     //oled.printNumI(27, 0, 0);
+ *     oled.printNumF(27.45, 2, 0, 0);
+ *     oled.setFont(SmallFont);
+ *     oled.print("~c", 60, 30);
+ *     oled.update();
+ *
+ *     while(1);
+ * }
+ * @endcode
+ */
+class oled_i2c
+{
+public:
+    /** Create a oled_i2c instance connected to specified I2C pins with specified address
+     *
+     * @param i2c_obj I2C object (instance)
+     * @param address (option) I2C-bus slave address
+     */
+    oled_i2c(I2C &i2c_obj, char address = SSD1306_ADDR);
+
+    /** Destractor */
+    ~oled_i2c();
+
+    /** Initialization */
+    void init(void);
+    
+    /** send SSD1306 command 
+     *
+     * @param a the SSD1306 command byte to send out
+     */
+    void comm_out(uint8_t a);
+    
+    /** send many SSD1306 commands in one I2C transaction
+     *
+     * @param pPage pointer to command buffer
+     * @param size the command buffer size
+     */
+    void comm_page_out(uint8_t* pPage, uint8_t size);
+    
+    /** send SSD1306 data
+     *
+     * @param a the SSD1306 data byte to send out
+     */
+    void data_out(uint8_t a);
+    
+    /** send many SSD1306 data bytes in one I2c transaction
+     *
+     * @param pPage pointer to data buffer
+     * @param size the data buffer size
+     */
+    void data_page_out(uint8_t* pPage, uint8_t size);
+    
+    /** send init command to SSD1306 */
+    void init_oled(void);
+    
+    /** make all pixel on or off acording to screen buffer */
+    void pixel_on(void);
+    
+    /** update screen buffer */
+    void update(void);
+    
+    /** clear screen */
+    void clrScr(void);
+    
+    /** fill screen */
+    void fillScr(void);
+    
+    /** set pixel on coordinate x, y
+     *
+     * @param x coordinate x (column)
+     * @param y coordinate y (row)
+     */
+    void setPixel(uint16_t x, uint16_t y);
+    
+    /** clear pixel on coordinate x, y
+     *
+     * @param x coordinate x (column)
+     * @param y coordinate y (row)
+     */
+    void clrPixel(uint16_t x, uint16_t y);
+    
+    /** set font type
+     *
+     * @param font the font to print
+     */
+    void setFont(const uint8_t* font);
+    
+    /** print character to coordinate x, y
+     *
+     * @param c the character to print
+     * @param x coordinate x
+     * @param y coordinate y
+     */
+    void print_char(unsigned char c, int x, int y);
+    
+    /** print string to coordinate x, y
+     *
+     * @param st the string to print
+     * @param x coordinate x
+     * @param y coordinate y
+     */
+    void print(char* st, int x, int y);
+    
+    /** print integer number to coordinate x, y
+     *
+     * @param num the integer to be print
+     * @param x coordinate x
+     * @param y coordinate y
+     * @param length the length of integer to be print
+     * @param filler the prefix character
+     */
+    void printNumI(long num, int x, int y, int length=0, char filler=' ');
+    
+    /** print float number to coordinate x, y
+     *
+     * @param num the float number to be print
+     * @param dec the numbers of digits after point
+     * @param x coordinate x
+     * @param y coordinate y
+     * @param divider should be the point (.)
+     * @param length the length of float number to be print
+     * @param filler the prefix character
+     */
+    void printNumF(double num, uint8_t dec, int x, int y, char divider='.', int length=0, char filler=' ');
+     
+
+private:
+    I2C &i2c;
+    char adr;
+    eeprom *epm_p;
+    eeprom &epm;
+    struct _current_font
+    {
+        const uint8_t* font;
+        uint8_t x_size;
+        uint8_t y_size;
+        uint8_t offset;
+        uint8_t numchars;
+    } cfont;
+    uint8_t scrbuf[SSD1306_MEM_SIZE];
+};
+
+#endif