Driver for the Digole Serial universal LCD display adapter

Dependents:   DataBus

Revision:
0:3cf7c2683c3a
Child:
1:959715b1d042
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DigoleSerialDisp.h	Mon Feb 25 05:48:10 2013 +0000
@@ -0,0 +1,361 @@
+/** Digole Serial Display library, I2C
+ *
+ * @Author: Digole Digital Solutions : www.digole.com ported to mbed by Michael Shimniok www.bot-thoughts.com
+ */
+#ifndef DigoleSerialDisp_h
+#define DigoleSerialDisp_h
+
+#include "mbed.h"
+#include <inttypes.h>
+
+#define DEC 10
+#define HEX 16
+#define OCT 8
+#define BIN 2
+
+#define delay(x) wait_ms(x)
+
+// Communication set up command
+// Text function command
+// Graph function command
+
+#define Serial_UART 0;
+#define Serial_I2C 1;
+#define Serial_SPI 2;
+#define _TEXT_ 0
+#define _GRAPH_ 1
+
+/** Digole Serial LCD/OLED Library
+ *
+ * Inherits from the Print class for all the fancy print/println stuff
+ *
+ * Communication set up command
+ *   "SB":Baud (ascII bytes end with 0x00/0x0A/0x0D) -- set UART Baud Rate
+ *   "SI2CA":Address(1 byte <127) -- Set I2C address, default address is:0x27
+ *   "DC":1/0(1byte) -- set config display on/off, if set to 1, displayer will display current commucation setting when power on
+ * Text Function command
+ *   "CL": -- Clear screen--OK
+ *   "CS":1/0 (1 byte)-- Cursor on/off
+ *   "TP":x(1 byte) y(1 byte) -- set text position
+ *   "TT":string(bytes) end with 0x00/0x0A/0x0D -- display string under regular mode
+ * Graphic function command
+ *   "GP":x(1byte) y(1byte) -- set current graphic position
+ *   "DM":"C/!/~/&/|/^"(ASCII 1byte) -- set drawing mode--C="Copy",! and ~ = "Not", & = "And", | = "Or", ^ = "Xor"
+ *   "SC":1/0 (1byte) -- set draw color--only 1 and 0
+ *   "LN":x0(1byte) y0(1byte) x1(1byte) y2(1byte)--draw line from x0,y0 to x1,y1,set new pot to x1,y1
+ *   "LT":x(1byte) y(1byte) -- draw line from current pos to x,y
+ *   "CC":x(1byte) y(1byte) ratio(byte) -- draw circle at x,y with ratio
+ *   "DP":x(1byte) y(1byte) Color(1byte) -- draw a pixel--OK
+ *   "DR":x0(1byte) y0(1byte) x1(1byte) y2(1byte)--draw rectangle, top-left:x0,y0; right-bottom:x1,y1
+ *   "FR":x0(1byte) y0(1byte) x1(1byte) y2(1byte)--draw filled rectangle, top-left:x0,y0; right-bottom:x1,y1
+ */
+class DigoleSerialDisp {
+public:
+
+    /** Create a new Digole Serial Display interface
+     *
+     * @param sda - pin for I2C SDA
+     * @param scl - pin for I2C SCL
+     * @param address - 7-bit address (default is 0x27 for the device)
+     */
+    DigoleSerialDisp(PinName sda, PinName scl, uint8_t address=0x27);
+
+
+    /** Carryover from Arduino library, not needed
+     */
+    void begin(void) { } // nothing to do here
+
+
+    /** Write out a raw character
+     * @param x - character
+     * @returns - 1
+     */
+    size_t write(const char x);
+
+
+    /** Write out raw data from a buffer
+     * @param buffer -- buffer to write
+     * @param size -- the number of bytes to write
+     * @returns size
+     */
+    size_t write(const char *buffer, size_t size);
+
+
+    /** Write out raw string
+     * @param str -- string to write
+     * @returns number of bytes written
+     */
+    size_t write(const char *str);
+   
+   
+    /** Prints a char to the display in a single I2C transmission using "TTb\0"
+     *
+     * @param c - character to print
+     * @returns 1
+     */
+    size_t print(const char c);
+
+
+    /** Prints a string of data to the display in a single I2C transmission using "TTbbb...\0"
+     *
+     * @param s -- array of data, null terminated
+     * @returns length of s 
+     */
+    size_t print(const char s[]);
+
+
+    /** Print out an unsigned char as a number
+     * @param u -- integer to print
+     * @param base -- base is DEC (default), HEX, BIN
+     */
+    size_t print(unsigned char u, int base = DEC);
+
+
+    /** Print out an integer
+     * @param i -- integer to print
+     * @param base -- base is DEC (default), HEX, BIN
+     */
+    size_t print(int i, int base = DEC);
+
+
+    /** Print out an unsigned integer
+     * @param u -- integer to print
+     * @param base -- base is DEC (default), HEX, BIN
+     */
+    size_t print(unsigned int u, int base = DEC);
+    
+
+    /** Print out a long as a number
+     * @param l -- integer to print
+     * @param base -- base is DEC (default), HEX, BIN
+     */
+    size_t print(long l, int base = DEC);
+    
+
+    /** Print out an unsigned long
+     * @param l -- integer to print
+     * @param base -- base is DEC (default), HEX, BIN
+     */
+    size_t print(unsigned long l, int base = DEC);
+
+
+    /** Print out a double
+     * @param f -- integer to print
+     * @param digits -- number of digits after the decimal
+     */
+    size_t print(double f, int digits = 2);
+
+
+    /** Prints a string of data to the display in a single I2C transmission using "TTbbb...\0"
+     *
+     * @param s -- array of data, null terminated
+     * @returns length of s 
+     */
+    size_t println(const char s[]);
+
+
+    /** Prints a char the display in a single I2C transmission using "TTb\0"
+     *
+     * @param c -- character to print
+     * @returns 1
+     */
+    size_t println(char c);
+
+
+    /** Prints an unsigned char as a number
+     *
+     * @param u -- unsigned char number
+     * @returns 1
+     */
+    size_t println(unsigned char u, int base = DEC);
+
+
+    /** Print out an integer
+     * @param i -- integer to print
+     * @param base -- base is DEC (default), HEX, BIN
+     */
+    size_t println(int i, int base = DEC);
+
+
+    /** Print out an unsigned char as a number
+     * @param u -- integer to print
+     * @param base -- base is DEC (default), HEX, BIN
+     */
+    size_t println(unsigned int u, int base = DEC);
+
+
+    /** Print out a long as a number
+     * @param l -- integer to print
+     * @param base -- base is DEC (default), HEX, BIN
+     */
+    size_t println(long l, int base = DEC);
+
+
+    /** Print out an unsigned long
+     * @param l -- integer to print
+     * @param base -- base is DEC (default), HEX, BIN
+     */
+    size_t println(unsigned long l, int base = DEC);
+
+
+    /** Print out a double
+     * @param f -- integer to print
+     * @param digits -- number of digits after the decimal
+     */
+    size_t println(double f, int digits = 2);
+
+
+    /** prints -- well, nothing in this case, but let's pretend we printed a \n
+     * @returns 1
+     */
+    size_t println(void);
+   
+
+    /*---------functions for Text and Graphic LCD adapters---------*/    
+
+    /** Turns off the cursor */
+    void disableCursor(void);
+    
+    /** Turns on the cursor */
+    void enableCursor(void);
+    
+    /** Displays a string at specified coordinates
+     * @param x -- x coordinate to display string
+     * @param y -- y coordinate to display string
+     * @param s -- string to display
+     */
+    void drawStr(uint8_t x, uint8_t y, const char *s);
+    
+    /** Sets the print position for graphics or text
+     * @param x -- x coordinate to display string
+     * @param y -- y coordinate to display string
+     * @param graph -- if _TEXT_ affects subsequent text position, otherwise, affects graphics position
+     */
+    void setPrintPos(uint8_t x, uint8_t y, uint8_t graph = _TEXT_);
+    
+    /** Clears the display screen */
+    void clearScreen(void);
+    
+    /** Configure your LCD if other than 1602 and the chip is other than KS0066U/F / HD44780 
+     * @param col -- number of columns
+     * @param row -- number of rows
+     */
+    void setLCDColRow(uint8_t col, uint8_t row);
+    
+    /** Sets a new I2C address for the display (default is 0x27), the adapter will store the new address in memory
+     * @param address -- the new address 
+     */
+    void setI2CAddress(uint8_t add);
+    
+    /** Display Config on/off, the factory default set is on, 
+     * so, when the module is powered up, it will display 
+     * current communication mode on LCD, after you 
+     * design finished, you can turn it off
+     * @param v -- 1 is on, 0 is off
+     */
+    void displayConfig(uint8_t v);
+    
+    /** Holdover from Arduino library; not needed */
+    void preprint(void);
+    
+    /*----------Functions for Graphic LCD/OLED adapters only---------*/
+    //the functions in this section compatible with u8glib
+    void drawBitmap(uint8_t x, uint8_t y, uint8_t w, uint8_t h, const uint8_t *bitmap);
+    void setRot90(void);
+    void setRot180(void);
+    void setRot270(void);
+    void undoRotation(void);
+    void setRotation(uint8_t);
+    void setContrast(uint8_t);
+    void drawBox(uint8_t x, uint8_t y, uint8_t w, uint8_t h);
+    void drawCircle(uint8_t x, uint8_t y, uint8_t r, uint8_t = 0);
+    void drawDisc(uint8_t x, uint8_t y, uint8_t r);
+    void drawFrame(uint8_t x, uint8_t y, uint8_t w, uint8_t h);
+    void drawPixel(uint8_t x, uint8_t y, uint8_t = 1);
+    void drawLine(uint8_t x, uint8_t y, uint8_t x1, uint8_t y1);
+    void drawLineTo(uint8_t x, uint8_t y);
+    void drawHLine(uint8_t x, uint8_t y, uint8_t w);
+    void drawVLine(uint8_t x, uint8_t y, uint8_t h);
+    //-------------------------------
+    //special functions for our adapters
+    
+    /** Sets the font
+     *
+     * @parameter font - available fonts: 6,10,18,51,120,123, user font 200-203
+     */
+    void setFont(uint8_t font);
+    
+    /** go to next text line, depending on the font size */
+    void nextTextLine(void);
+    
+    /** set color for graphic function */ 
+    void setColor(uint8_t); 
+    
+    /** Turn on back light */
+    void backLightOn(void); 
+    
+    /** Turn off back light */
+    void backLightOff(void); 
+    
+    /** send command to LCD drectly 
+     * @param d - command
+     */
+    void directCommand(uint8_t d); 
+    
+    /** send data to LCD drectly
+     * @param d -- data
+     */
+    void directData(uint8_t d); 
+    
+    /** Move rectangle area on screen to another place
+     * @param x0, y1 -- top left of the area to move
+     * @param x1, y1 -- bottom right of the area to move
+     * @param xoffset, yoffset -- the distance to move
+     */
+    void moveArea(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, char xoffset, char yoffset);
+
+    /** Display startup screen */
+    void displayStartScreen(uint8_t m);
+    
+    /** Set display mode */
+    void setMode(uint8_t m);
+
+    /** set text position back to previous, only one back allowed */
+    void setTextPosBack(void);    
+    
+    void setTextPosOffset(char xoffset, char yoffset);
+    void setTextPosAbs(uint8_t x, uint8_t y);
+    void setLinePattern(uint8_t pattern);
+    /** Only for universal serial adapter */
+    void setLCDChip(uint8_t chip);
+
+
+    /** Set Start Screen, 1st B is the lower byte of data length. 
+     * Convert images to C array here: <a href="http://www.digole.com/tools/PicturetoC_Hex_converter.php">http://www.digole.com/tools/PicturetoC_Hex_converter.php</a>
+     * @param lon -- length of data
+     * @param data -- binary data
+     */
+    void uploadStartScreen(int lon, const unsigned char *data); //upload start screen
+    
+    /** Upload a user font
+     * @param lon -- length of data
+     * @param data -- user font data
+     * @param sect -- section of memory you want to upload to
+     */
+    void uploadUserFont(int lon, const unsigned char *data, uint8_t sect); //upload user font
+
+    /** Send a Byte to output head on board
+     * @param x -- byte to output
+     */
+    void digitalOutput(uint8_t x);
+
+private:
+    I2C _device;
+    uint8_t _address;
+    uint8_t _Comdelay;
+
+    size_t printNumber(unsigned long n, uint8_t base);
+    size_t printFloat(double number, uint8_t digits);
+};
+
+#endif