PCD8544 multiscreen

Committer:
Wimpie
Date:
Fri Jun 15 18:37:00 2012 +0000
Revision:
0:61dcd2c0299a

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Wimpie 0:61dcd2c0299a 1 /* mbed PCD8544MS - Graphic Library for driving multi monochrome displays based on PCD8544
Wimpie 0:61dcd2c0299a 2 * used in Nokia 3310, 3315, 3330, 3350, 3410, 3210, 5110, 5120, 5130, 5160, 6110, 6150
Wimpie 0:61dcd2c0299a 3 *
Wimpie 0:61dcd2c0299a 4 * Copyright (c) 2011, Wim De Roeve
Wimpie 0:61dcd2c0299a 5 * partial port of the code found on http://serdisplib.sourceforge.net/ser/pcd8544.html#links
Wimpie 0:61dcd2c0299a 6 * and by Petras Saduikis <petras@petras.co.uk>
Wimpie 0:61dcd2c0299a 7 *
Wimpie 0:61dcd2c0299a 8 * it uses a PCF8574 / PCF8575 for control line handling (/CS RESET and DC)
Wimpie 0:61dcd2c0299a 9 * and SPI for data handling
Wimpie 0:61dcd2c0299a 10 * up to 6 screens
Wimpie 0:61dcd2c0299a 11 *
Wimpie 0:61dcd2c0299a 12 * Permission is hereby granted, free of charge, to any person obtaining a copy
Wimpie 0:61dcd2c0299a 13 * of this software and associated documentation files (the "Software"), to deal
Wimpie 0:61dcd2c0299a 14 * in the Software without restriction, including without limitation the rights
Wimpie 0:61dcd2c0299a 15 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
Wimpie 0:61dcd2c0299a 16 * copies of the Software, and to permit persons to whom the Software is
Wimpie 0:61dcd2c0299a 17 * furnished to do so, subject to the following conditions:
Wimpie 0:61dcd2c0299a 18 *
Wimpie 0:61dcd2c0299a 19 * The above copyright notice and this permission notice shall be included in
Wimpie 0:61dcd2c0299a 20 * all copies or substantial portions of the Software.
Wimpie 0:61dcd2c0299a 21 *
Wimpie 0:61dcd2c0299a 22 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Wimpie 0:61dcd2c0299a 23 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Wimpie 0:61dcd2c0299a 24 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
Wimpie 0:61dcd2c0299a 25 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
Wimpie 0:61dcd2c0299a 26 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Wimpie 0:61dcd2c0299a 27 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
Wimpie 0:61dcd2c0299a 28 * THE SOFTWARE.
Wimpie 0:61dcd2c0299a 29 */
Wimpie 0:61dcd2c0299a 30 #ifndef PCD8544MS_H
Wimpie 0:61dcd2c0299a 31 #define PCD8544MS_H
Wimpie 0:61dcd2c0299a 32
Wimpie 0:61dcd2c0299a 33 // the Nokia 3310 has a resolution of 84 x 48
Wimpie 0:61dcd2c0299a 34 // the Nokia 3410 has a resolution of 102 x 72 officialy 84x64
Wimpie 0:61dcd2c0299a 35
Wimpie 0:61dcd2c0299a 36 #include "mbed.h"
Wimpie 0:61dcd2c0299a 37
Wimpie 0:61dcd2c0299a 38 #define LCD_X_RES 102 //84
Wimpie 0:61dcd2c0299a 39 #define LCD_Y_RES 72 //48
Wimpie 0:61dcd2c0299a 40 #define LCD_BANKS (LCD_Y_RES / 8)
Wimpie 0:61dcd2c0299a 41
Wimpie 0:61dcd2c0299a 42 #define LCD_CACHE_SIZE ((LCD_X_RES * LCD_Y_RES) / 8)
Wimpie 0:61dcd2c0299a 43
Wimpie 0:61dcd2c0299a 44 #define MAX_ADR_X (LCD_X_RES)-1
Wimpie 0:61dcd2c0299a 45 #define MAX_ADR_Y LCD_BANKS-1
Wimpie 0:61dcd2c0299a 46 //#define MAXSCREENS 1
Wimpie 0:61dcd2c0299a 47
Wimpie 0:61dcd2c0299a 48 typedef uint8_t BYTE;
Wimpie 0:61dcd2c0299a 49
Wimpie 0:61dcd2c0299a 50 class PCD8544MS {
Wimpie 0:61dcd2c0299a 51
Wimpie 0:61dcd2c0299a 52 /* PCD8544 from Philips Semiconductors is
Wimpie 0:61dcd2c0299a 53 48 x 84 pixels monochrome matrix LCD controller/driver
Wimpie 0:61dcd2c0299a 54
Wimpie 0:61dcd2c0299a 55 The PCD8544 has a 504 byte memory with NO read function.
Wimpie 0:61dcd2c0299a 56 Each bit is a pixel
Wimpie 0:61dcd2c0299a 57 You can only write 1 byte at a time in vertical or horizontal mode.
Wimpie 0:61dcd2c0299a 58 There is no read functionality with the controller.
Wimpie 0:61dcd2c0299a 59 Caching a copy of the LCD-memory is the only solution to set one pixel at a time.
Wimpie 0:61dcd2c0299a 60
Wimpie 0:61dcd2c0299a 61
Wimpie 0:61dcd2c0299a 62 * wiring SPI
Wimpie 0:61dcd2c0299a 63 * mosi // yellow
Wimpie 0:61dcd2c0299a 64 * miso NC
Wimpie 0:61dcd2c0299a 65 * sclk //green
Wimpie 0:61dcd2c0299a 66
Wimpie 0:61dcd2c0299a 67 * PCF8575/PCF8574 to PCD8544 LCD
Wimpie 0:61dcd2c0299a 68 * ----------------------
Wimpie 0:61dcd2c0299a 69 * P0 - CS1 //gray
Wimpie 0:61dcd2c0299a 70 * P1 - DC //blue
Wimpie 0:61dcd2c0299a 71 * P2 - RESET //white
Wimpie 0:61dcd2c0299a 72 * P3 - CS2
Wimpie 0:61dcd2c0299a 73 * P4 - CS3
Wimpie 0:61dcd2c0299a 74 * P5 - CS4
Wimpie 0:61dcd2c0299a 75 * P6 - CS5
Wimpie 0:61dcd2c0299a 76 * P7 - CS6
Wimpie 0:61dcd2c0299a 77 *
Wimpie 0:61dcd2c0299a 78 */
Wimpie 0:61dcd2c0299a 79 // yellow green //gray //blue //white
Wimpie 0:61dcd2c0299a 80 // PCD8544MS lcd(p11,NC,p13,p15,p16,p17); //mosi miso sclk cs dc reset
Wimpie 0:61dcd2c0299a 81
Wimpie 0:61dcd2c0299a 82
Wimpie 0:61dcd2c0299a 83 public:
Wimpie 0:61dcd2c0299a 84
Wimpie 0:61dcd2c0299a 85 /** LCD panel format */
Wimpie 0:61dcd2c0299a 86 typedef enum {
Wimpie 0:61dcd2c0299a 87 PIXEL_OFF = 0,
Wimpie 0:61dcd2c0299a 88 PIXEL_ON = 1,
Wimpie 0:61dcd2c0299a 89 PIXEL_XOR = 2
Wimpie 0:61dcd2c0299a 90 }ePixelMode;
Wimpie 0:61dcd2c0299a 91
Wimpie 0:61dcd2c0299a 92 typedef enum {
Wimpie 0:61dcd2c0299a 93 FILL_OFF = 0,
Wimpie 0:61dcd2c0299a 94 FILL_ON = 1
Wimpie 0:61dcd2c0299a 95 }eFillMode;
Wimpie 0:61dcd2c0299a 96
Wimpie 0:61dcd2c0299a 97 typedef enum {
Wimpie 0:61dcd2c0299a 98 RASTER_OFF = 0,
Wimpie 0:61dcd2c0299a 99 RASTER_ON = 1
Wimpie 0:61dcd2c0299a 100 }eRasterMode;
Wimpie 0:61dcd2c0299a 101
Wimpie 0:61dcd2c0299a 102 typedef enum {
Wimpie 0:61dcd2c0299a 103 DRAW_OVERWRITE = 0,
Wimpie 0:61dcd2c0299a 104 DRAW_MERGE = 1
Wimpie 0:61dcd2c0299a 105 }eDrawMode;
Wimpie 0:61dcd2c0299a 106
Wimpie 0:61dcd2c0299a 107
Wimpie 0:61dcd2c0299a 108 typedef enum {
Wimpie 0:61dcd2c0299a 109 VERYSMALLFONT = 0, //3x5
Wimpie 0:61dcd2c0299a 110 TINYFONT = 1, //5x7
Wimpie 0:61dcd2c0299a 111 SMALLFONT = 2, //6x8
Wimpie 0:61dcd2c0299a 112 NORMALFONT = 3, //8x8
Wimpie 0:61dcd2c0299a 113 BIGFONT = 4, //8x12&#65533;
Wimpie 0:61dcd2c0299a 114 TIMENUMBERFONT= 5, //16x20
Wimpie 0:61dcd2c0299a 115 BIGNUMBERFONT= 6
Wimpie 0:61dcd2c0299a 116 }eFonts;
Wimpie 0:61dcd2c0299a 117
Wimpie 0:61dcd2c0299a 118 typedef enum {
Wimpie 0:61dcd2c0299a 119 C_POINT = 0, //point
Wimpie 0:61dcd2c0299a 120 C_LINE = 1, //line
Wimpie 0:61dcd2c0299a 121 C_VLINE = 2, //Vertical Line
Wimpie 0:61dcd2c0299a 122 C_HLINE = 3, //Horizontal Line
Wimpie 0:61dcd2c0299a 123 }eChartMode;
Wimpie 0:61dcd2c0299a 124
Wimpie 0:61dcd2c0299a 125 typedef enum {
Wimpie 0:61dcd2c0299a 126 SPACE_NONE = 0,
Wimpie 0:61dcd2c0299a 127 SPACE_NORMAL = 1
Wimpie 0:61dcd2c0299a 128 }eSpaceMode;
Wimpie 0:61dcd2c0299a 129
Wimpie 0:61dcd2c0299a 130 enum eDisplayMode {DISPLAY_NORMAL, DISPLAY_HIGHLIGHT};
Wimpie 0:61dcd2c0299a 131
Wimpie 0:61dcd2c0299a 132 enum LCDType {
Wimpie 0:61dcd2c0299a 133 LCD3310,
Wimpie 0:61dcd2c0299a 134 LCD3410,
Wimpie 0:61dcd2c0299a 135 LCD6100, /**< Nokia 6100, as found on sparkfun board (default) */
Wimpie 0:61dcd2c0299a 136 LCD6610, /**< Nokia 6610, as found on olimex board */
Wimpie 0:61dcd2c0299a 137 PCF8833
Wimpie 0:61dcd2c0299a 138 };
Wimpie 0:61dcd2c0299a 139
Wimpie 0:61dcd2c0299a 140
Wimpie 0:61dcd2c0299a 141 PCD8544MS(PinName mosi, PinName miso, PinName sclk, PinName sda, PinName scl,int i2cAddress,bool TextLCD, bool backlight);
Wimpie 0:61dcd2c0299a 142
Wimpie 0:61dcd2c0299a 143 /** init()
Wimpie 0:61dcd2c0299a 144 *
Wimpie 0:61dcd2c0299a 145 * Initialise the device.
Wimpie 0:61dcd2c0299a 146 * @param PinName SPI mosi
Wimpie 0:61dcd2c0299a 147 * @param PinName SPI miso
Wimpie 0:61dcd2c0299a 148 * @param PinName SPI sclk
Wimpie 0:61dcd2c0299a 149 * @param PinName sda
Wimpie 0:61dcd2c0299a 150 * @param PinName sck
Wimpie 0:61dcd2c0299a 151 * @param PinName i2cAddress
Wimpie 0:61dcd2c0299a 152 * @param int maxscreens // number of screens used
Wimpie 0:61dcd2c0299a 153 */
Wimpie 0:61dcd2c0299a 154
Wimpie 0:61dcd2c0299a 155 #if 0 // Inhereted from Stream, for documentation only
Wimpie 0:61dcd2c0299a 156 /* Function: putc
Wimpie 0:61dcd2c0299a 157 * Write a character
Wimpie 0:61dcd2c0299a 158 *
Wimpie 0:61dcd2c0299a 159 * Variables:
Wimpie 0:61dcd2c0299a 160 * c - The character to write to the serial port
Wimpie 0:61dcd2c0299a 161 */
Wimpie 0:61dcd2c0299a 162 int putc(int c);
Wimpie 0:61dcd2c0299a 163
Wimpie 0:61dcd2c0299a 164 /* Function: printf
Wimpie 0:61dcd2c0299a 165 * Write a formated string
Wimpie 0:61dcd2c0299a 166 *
Wimpie 0:61dcd2c0299a 167 * Variables:
Wimpie 0:61dcd2c0299a 168 * format - A printf-style format string, followed by the
Wimpie 0:61dcd2c0299a 169 * variables to use in formating the string.
Wimpie 0:61dcd2c0299a 170 */
Wimpie 0:61dcd2c0299a 171 int printf(const char* format, ...);
Wimpie 0:61dcd2c0299a 172 #endif
Wimpie 0:61dcd2c0299a 173
Wimpie 0:61dcd2c0299a 174
Wimpie 0:61dcd2c0299a 175 virtual void TLCD_locate(int column, int row);
Wimpie 0:61dcd2c0299a 176
Wimpie 0:61dcd2c0299a 177 /* Function: cls
Wimpie 0:61dcd2c0299a 178 * Clear the screen, and locate to 0,0
Wimpie 0:61dcd2c0299a 179 */
Wimpie 0:61dcd2c0299a 180 virtual void TLCD_cls();
Wimpie 0:61dcd2c0299a 181
Wimpie 0:61dcd2c0299a 182 /* Function: backlight
Wimpie 0:61dcd2c0299a 183 * Sets the backlight on or off
Wimpie 0:61dcd2c0299a 184 *
Wimpie 0:61dcd2c0299a 185 * Variables:
Wimpie 0:61dcd2c0299a 186 * on (true or false)
Wimpie 0:61dcd2c0299a 187 */
Wimpie 0:61dcd2c0299a 188
Wimpie 0:61dcd2c0299a 189
Wimpie 0:61dcd2c0299a 190 virtual void TLCD_backlight(bool on);
Wimpie 0:61dcd2c0299a 191
Wimpie 0:61dcd2c0299a 192
Wimpie 0:61dcd2c0299a 193 /** cls()
Wimpie 0:61dcd2c0299a 194 * clears the cached copy of the screen
Wimpie 0:61dcd2c0299a 195 * and the screen itself
Wimpie 0:61dcd2c0299a 196 */
Wimpie 0:61dcd2c0299a 197 void GLCD_cls(int screen,bool fupdate=true);
Wimpie 0:61dcd2c0299a 198
Wimpie 0:61dcd2c0299a 199 /** update()
Wimpie 0:61dcd2c0299a 200 * copies the cached memory to the screen
Wimpie 0:61dcd2c0299a 201 * use this to update the screen after
Wimpie 0:61dcd2c0299a 202 * - drawBitmap
Wimpie 0:61dcd2c0299a 203 */
Wimpie 0:61dcd2c0299a 204 void GLCD_update(int screen);
Wimpie 0:61dcd2c0299a 205
Wimpie 0:61dcd2c0299a 206 /** close()
Wimpie 0:61dcd2c0299a 207 * screen display OFF
Wimpie 0:61dcd2c0299a 208 */
Wimpie 0:61dcd2c0299a 209 void GLCD_close();
Wimpie 0:61dcd2c0299a 210
Wimpie 0:61dcd2c0299a 211 /** locate(x,y)
Wimpie 0:61dcd2c0299a 212 * sets the cursor on position x,y
Wimpie 0:61dcd2c0299a 213 */
Wimpie 0:61dcd2c0299a 214 void GLCD_locate (BYTE x0, BYTE y0);
Wimpie 0:61dcd2c0299a 215
Wimpie 0:61dcd2c0299a 216 void chooseFont(eFonts font);
Wimpie 0:61dcd2c0299a 217 void GLCD_writeString (BYTE x0, BYTE y0, char* string, eFonts font,ePixelMode pmode,eDisplayMode dmode,eSpaceMode smode, BYTE fupdate,int screen );
Wimpie 0:61dcd2c0299a 218 void GLCD_writeChar (BYTE x0, BYTE y0, BYTE ch, eFonts font,ePixelMode pmode,eDisplayMode mode, BYTE fupdate,int screen);
Wimpie 0:61dcd2c0299a 219
Wimpie 0:61dcd2c0299a 220 /** drawBitmap(x,y,bitmap,xsize,ysize)
Wimpie 0:61dcd2c0299a 221 * draw a monochrome bitmap on position x,y
Wimpie 0:61dcd2c0299a 222 * with size xsize,ysize
Wimpie 0:61dcd2c0299a 223 */
Wimpie 0:61dcd2c0299a 224 void GLCD_drawBitmap (BYTE x0, BYTE y0, const unsigned char* bitmap, BYTE bmpXSize, BYTE bmpYSize, BYTE fupdate,int screen );
Wimpie 0:61dcd2c0299a 225
Wimpie 0:61dcd2c0299a 226 void GLCD_drawpixel (BYTE x0, BYTE y0, ePixelMode pmode, BYTE fupdate,int screen );
Wimpie 0:61dcd2c0299a 227 void GLCD_drawline (BYTE x0, BYTE y0, BYTE x1,BYTE y1, ePixelMode pmode, BYTE fupdate,int screen );
Wimpie 0:61dcd2c0299a 228 void GLCD_drawcircle (BYTE x0, BYTE y0, BYTE radius, eFillMode fill,ePixelMode pmode, BYTE fupdate,int screen );
Wimpie 0:61dcd2c0299a 229 void GLCD_drawrectangle (BYTE x0, BYTE y0, BYTE x1,BYTE y1, eFillMode fill, ePixelMode pmode, BYTE fupdate,int screen );
Wimpie 0:61dcd2c0299a 230 void GLCD_drawprogressbar(BYTE x0, BYTE y0, BYTE w, BYTE h, BYTE percentage, BYTE fupdate,int screen );
Wimpie 0:61dcd2c0299a 231 void GLCD_drawchart (BYTE x0, BYTE y0, BYTE w, BYTE h, BYTE unitx, BYTE unity,
Wimpie 0:61dcd2c0299a 232 eRasterMode rMode, eChartMode cMode, eDrawMode dMode,int16_t * val, int size, int t,int screen );
Wimpie 0:61dcd2c0299a 233
Wimpie 0:61dcd2c0299a 234 private:
Wimpie 0:61dcd2c0299a 235
Wimpie 0:61dcd2c0299a 236 SPI _spi;
Wimpie 0:61dcd2c0299a 237 I2C _i2c;
Wimpie 0:61dcd2c0299a 238 int _i2cAddress;
Wimpie 0:61dcd2c0299a 239 // LCDType _type;
Wimpie 0:61dcd2c0299a 240
Wimpie 0:61dcd2c0299a 241 // int _lcd_x_res,_lcd_y_res,_lcd_cache_size;
Wimpie 0:61dcd2c0299a 242
Wimpie 0:61dcd2c0299a 243
Wimpie 0:61dcd2c0299a 244 void TLCD_reset();
Wimpie 0:61dcd2c0299a 245 void TLCD_writeData(int data);
Wimpie 0:61dcd2c0299a 246 void TLCD_writeCommand(int command);
Wimpie 0:61dcd2c0299a 247 void TLCD_writeByte(int value, bool rs);
Wimpie 0:61dcd2c0299a 248 void TLCD_writeNibble(int value, bool rs);
Wimpie 0:61dcd2c0299a 249
Wimpie 0:61dcd2c0299a 250 void GLCD_reset();
Wimpie 0:61dcd2c0299a 251 void GLCD_writeCmd(BYTE data, BYTE CF,int screen);
Wimpie 0:61dcd2c0299a 252 void GLCD_writeData(BYTE data, BYTE CF,int screen);
Wimpie 0:61dcd2c0299a 253 void GLCD_writeI2C(bool reset, bool dc, bool cs,int screen );
Wimpie 0:61dcd2c0299a 254
Wimpie 0:61dcd2c0299a 255 void writeI2CByte(int data);
Wimpie 0:61dcd2c0299a 256 int readI2C();
Wimpie 0:61dcd2c0299a 257
Wimpie 0:61dcd2c0299a 258 virtual int _putc(int c);
Wimpie 0:61dcd2c0299a 259 virtual int _getc();
Wimpie 0:61dcd2c0299a 260 virtual void TLCD_newline();
Wimpie 0:61dcd2c0299a 261
Wimpie 0:61dcd2c0299a 262 int _row;
Wimpie 0:61dcd2c0299a 263 int _column;
Wimpie 0:61dcd2c0299a 264 int _columns;
Wimpie 0:61dcd2c0299a 265 int _rows;
Wimpie 0:61dcd2c0299a 266
Wimpie 0:61dcd2c0299a 267 bool _backlight;
Wimpie 0:61dcd2c0299a 268
Wimpie 0:61dcd2c0299a 269 //BYTE LcdCache[][_lcd_cache_size]; // __attribute__((section("AHBSRAM0")));
Wimpie 0:61dcd2c0299a 270 BYTE LcdCache[LCD_CACHE_SIZE]; // __attribute__((section("AHBSRAM0")));
Wimpie 0:61dcd2c0299a 271
Wimpie 0:61dcd2c0299a 272 int LcdCacheIdx;
Wimpie 0:61dcd2c0299a 273 int _LoMark;
Wimpie 0:61dcd2c0299a 274 int _HiMark;
Wimpie 0:61dcd2c0299a 275 int Scale;
Wimpie 0:61dcd2c0299a 276
Wimpie 0:61dcd2c0299a 277 BYTE _font_width;
Wimpie 0:61dcd2c0299a 278 BYTE _font_height;
Wimpie 0:61dcd2c0299a 279 BYTE _font_start;
Wimpie 0:61dcd2c0299a 280 BYTE _font_end;
Wimpie 0:61dcd2c0299a 281 BYTE _font_bytes;
Wimpie 0:61dcd2c0299a 282 unsigned char* _pFont;
Wimpie 0:61dcd2c0299a 283
Wimpie 0:61dcd2c0299a 284
Wimpie 0:61dcd2c0299a 285
Wimpie 0:61dcd2c0299a 286 };
Wimpie 0:61dcd2c0299a 287
Wimpie 0:61dcd2c0299a 288 #endif