Committer:
Wimpie
Date:
Sun Apr 17 18:03:24 2011 +0000
Revision:
0:6468a28a7b7d
Child:
1:ce391193b822

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Wimpie 0:6468a28a7b7d 1 /* mbed PCD8544 - Graphic Library for driving monochrome displays based on PCD8544
Wimpie 0:6468a28a7b7d 2 * used in Nokia 3310, 3315, 3330, 3350, 3410, 3210, 5110, 5120, 5130, 5160, 6110, 6150
Wimpie 0:6468a28a7b7d 3 *
Wimpie 0:6468a28a7b7d 4 * Copyright (c) 2011, Wim De Roeve
Wimpie 0:6468a28a7b7d 5 * partial port of the code found on http://serdisplib.sourceforge.net/ser/pcd8544.html#links
Wimpie 0:6468a28a7b7d 6 * and by Petras Saduikis <petras@petras.co.uk>
Wimpie 0:6468a28a7b7d 7 *
Wimpie 0:6468a28a7b7d 8 * Permission is hereby granted, free of charge, to any person obtaining a copy
Wimpie 0:6468a28a7b7d 9 * of this software and associated documentation files (the "Software"), to deal
Wimpie 0:6468a28a7b7d 10 * in the Software without restriction, including without limitation the rights
Wimpie 0:6468a28a7b7d 11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
Wimpie 0:6468a28a7b7d 12 * copies of the Software, and to permit persons to whom the Software is
Wimpie 0:6468a28a7b7d 13 * furnished to do so, subject to the following conditions:
Wimpie 0:6468a28a7b7d 14 *
Wimpie 0:6468a28a7b7d 15 * The above copyright notice and this permission notice shall be included in
Wimpie 0:6468a28a7b7d 16 * all copies or substantial portions of the Software.
Wimpie 0:6468a28a7b7d 17 *
Wimpie 0:6468a28a7b7d 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Wimpie 0:6468a28a7b7d 19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Wimpie 0:6468a28a7b7d 20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
Wimpie 0:6468a28a7b7d 21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
Wimpie 0:6468a28a7b7d 22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Wimpie 0:6468a28a7b7d 23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
Wimpie 0:6468a28a7b7d 24 * THE SOFTWARE.
Wimpie 0:6468a28a7b7d 25 */
Wimpie 0:6468a28a7b7d 26 #ifndef PCD8544LCD_H
Wimpie 0:6468a28a7b7d 27 #define PCD8544LCD_H
Wimpie 0:6468a28a7b7d 28
Wimpie 0:6468a28a7b7d 29 #include "mbed.h"
Wimpie 0:6468a28a7b7d 30
Wimpie 0:6468a28a7b7d 31 /* Number of pixels on the LCD */
Wimpie 0:6468a28a7b7d 32 #define LCD_X_RES 84
Wimpie 0:6468a28a7b7d 33 #define LCD_Y_RES 48
Wimpie 0:6468a28a7b7d 34 #define LCD_BANKS (LCD_Y_RES / 8)
Wimpie 0:6468a28a7b7d 35
Wimpie 0:6468a28a7b7d 36 #define LCD_CACHE_SIZE ((LCD_X_RES * LCD_Y_RES) / 8)
Wimpie 0:6468a28a7b7d 37
Wimpie 0:6468a28a7b7d 38 #define MAX_ADR_X (LCD_X_RES)-1
Wimpie 0:6468a28a7b7d 39 #define MAX_ADR_Y LCD_BANKS-1
Wimpie 0:6468a28a7b7d 40
Wimpie 0:6468a28a7b7d 41 #define HIGH 1
Wimpie 0:6468a28a7b7d 42 #define LOW 0
Wimpie 0:6468a28a7b7d 43 #define TRUE 1
Wimpie 0:6468a28a7b7d 44 #define FALSE 0
Wimpie 0:6468a28a7b7d 45
Wimpie 0:6468a28a7b7d 46 /* Display control command */
Wimpie 0:6468a28a7b7d 47 #define EXTENDEDSET 0x21
Wimpie 0:6468a28a7b7d 48 #define STANDARDSET 0x20
Wimpie 0:6468a28a7b7d 49 #define DISPLAYOFF 0x08 // switch off display
Wimpie 0:6468a28a7b7d 50 #define ALL_SEG_ON 0x09 // switch on display and set to all pixels on
Wimpie 0:6468a28a7b7d 51 #define NORMAL_MODE 0x0C // NOREVERSE
Wimpie 0:6468a28a7b7d 52 #define INVERSE_MODE 0x0D // REVERSE
Wimpie 0:6468a28a7b7d 53
Wimpie 0:6468a28a7b7d 54 #define SET_ADDRES_X 0x80
Wimpie 0:6468a28a7b7d 55 #define SET_ADDRES_Y 0x40
Wimpie 0:6468a28a7b7d 56
Wimpie 0:6468a28a7b7d 57
Wimpie 0:6468a28a7b7d 58 typedef uint8_t BYTE;
Wimpie 0:6468a28a7b7d 59
Wimpie 0:6468a28a7b7d 60 typedef enum {
Wimpie 0:6468a28a7b7d 61 PIXEL_OFF = 0,
Wimpie 0:6468a28a7b7d 62 PIXEL_ON = 1,
Wimpie 0:6468a28a7b7d 63 PIXEL_XOR = 2
Wimpie 0:6468a28a7b7d 64 }ePixelMode;
Wimpie 0:6468a28a7b7d 65
Wimpie 0:6468a28a7b7d 66 typedef enum {
Wimpie 0:6468a28a7b7d 67 FILL_OFF = 0,
Wimpie 0:6468a28a7b7d 68 FILL_ON = 1
Wimpie 0:6468a28a7b7d 69 }eFillMode;
Wimpie 0:6468a28a7b7d 70
Wimpie 0:6468a28a7b7d 71 typedef enum {
Wimpie 0:6468a28a7b7d 72 RASTER_OFF = 0,
Wimpie 0:6468a28a7b7d 73 RASTER_ON = 1
Wimpie 0:6468a28a7b7d 74 }eRasterMode;
Wimpie 0:6468a28a7b7d 75
Wimpie 0:6468a28a7b7d 76 typedef enum {
Wimpie 0:6468a28a7b7d 77 VERYSMALLFONT = 0, //3x5
Wimpie 0:6468a28a7b7d 78 TINYFONT = 1, //5x7
Wimpie 0:6468a28a7b7d 79 SMALLFONT = 2, //6x8
Wimpie 0:6468a28a7b7d 80 NORMALFONT = 3, //8x8
Wimpie 0:6468a28a7b7d 81 BIGFONT = 4, //8x12&#65533;
Wimpie 0:6468a28a7b7d 82 TIMENUMBERFONT= 5, //16x20
Wimpie 0:6468a28a7b7d 83 BIGNUMBERFONT= 6
Wimpie 0:6468a28a7b7d 84 }eFonts;
Wimpie 0:6468a28a7b7d 85
Wimpie 0:6468a28a7b7d 86
Wimpie 0:6468a28a7b7d 87 enum eDisplayMode {NORMAL, HIGHLIGHT};
Wimpie 0:6468a28a7b7d 88
Wimpie 0:6468a28a7b7d 89 class PCD8544LCD {
Wimpie 0:6468a28a7b7d 90
Wimpie 0:6468a28a7b7d 91 /* PCD8544 from Philips Semiconductors is
Wimpie 0:6468a28a7b7d 92 48 x 84 pixels monochrome matrix LCD controller/driver
Wimpie 0:6468a28a7b7d 93
Wimpie 0:6468a28a7b7d 94 The PCD8544 has a 504 byte memory with NO read function.
Wimpie 0:6468a28a7b7d 95 Each bit is a pixel
Wimpie 0:6468a28a7b7d 96 You can only write 1 byte at a time in vertical or horizontal mode.
Wimpie 0:6468a28a7b7d 97 There is no read functionality with the controller.
Wimpie 0:6468a28a7b7d 98 Caching a copy of the LCD-memory is the only solution if we want
Wimpie 0:6468a28a7b7d 99 to set one pixel at a time.
Wimpie 0:6468a28a7b7d 100
Wimpie 0:6468a28a7b7d 101 */
Wimpie 0:6468a28a7b7d 102 public:
Wimpie 0:6468a28a7b7d 103 PCD8544LCD(PinName mosi, PinName miso, PinName sclk,
Wimpie 0:6468a28a7b7d 104 PinName cs, PinName dc, PinName reset);
Wimpie 0:6468a28a7b7d 105
Wimpie 0:6468a28a7b7d 106 /** init()
Wimpie 0:6468a28a7b7d 107 *
Wimpie 0:6468a28a7b7d 108 * Initialise the device.
Wimpie 0:6468a28a7b7d 109 * @param PinName SPI mosi
Wimpie 0:6468a28a7b7d 110 * @param PinName SPI miso
Wimpie 0:6468a28a7b7d 111 * @param PinName SPI sclk
Wimpie 0:6468a28a7b7d 112 * @param PinName DigitalOut cs
Wimpie 0:6468a28a7b7d 113 * @param PinName DigitalOut dc
Wimpie 0:6468a28a7b7d 114 * @param PinName DigitalOut reset
Wimpie 0:6468a28a7b7d 115 */
Wimpie 0:6468a28a7b7d 116
Wimpie 0:6468a28a7b7d 117 void init();
Wimpie 0:6468a28a7b7d 118
Wimpie 0:6468a28a7b7d 119 /** cls()
Wimpie 0:6468a28a7b7d 120 * clears the cached copy of the screen
Wimpie 0:6468a28a7b7d 121 * and the screen itself
Wimpie 0:6468a28a7b7d 122 */
Wimpie 0:6468a28a7b7d 123 void cls();
Wimpie 0:6468a28a7b7d 124
Wimpie 0:6468a28a7b7d 125 /** update()
Wimpie 0:6468a28a7b7d 126 * copies the cached memory to the screen
Wimpie 0:6468a28a7b7d 127 * use this to update the screen after
Wimpie 0:6468a28a7b7d 128 * - drawBitmap
Wimpie 0:6468a28a7b7d 129 */
Wimpie 0:6468a28a7b7d 130 void update();
Wimpie 0:6468a28a7b7d 131
Wimpie 0:6468a28a7b7d 132 /** close()
Wimpie 0:6468a28a7b7d 133 * screen display OFF
Wimpie 0:6468a28a7b7d 134 */
Wimpie 0:6468a28a7b7d 135 void close();
Wimpie 0:6468a28a7b7d 136
Wimpie 0:6468a28a7b7d 137 /** locate(x,y)
Wimpie 0:6468a28a7b7d 138 * sets the cursor on position x,y
Wimpie 0:6468a28a7b7d 139 */
Wimpie 0:6468a28a7b7d 140 void locate (BYTE x0, BYTE y0);
Wimpie 0:6468a28a7b7d 141
Wimpie 0:6468a28a7b7d 142 void chooseFont(eFonts font);
Wimpie 0:6468a28a7b7d 143
Wimpie 0:6468a28a7b7d 144 void writeString (BYTE x0, BYTE y0, char* string, eFonts font, eDisplayMode mode, BYTE update);
Wimpie 0:6468a28a7b7d 145 void writeChar (BYTE x0, BYTE y0, BYTE ch, eFonts font,eDisplayMode mode, BYTE update);
Wimpie 0:6468a28a7b7d 146
Wimpie 0:6468a28a7b7d 147 /** drawBitmap(x,y,bitmap,xsize,ysize)
Wimpie 0:6468a28a7b7d 148 * draw a monochrome bitmap on position x,y
Wimpie 0:6468a28a7b7d 149 * with size xsize,ysize
Wimpie 0:6468a28a7b7d 150 */
Wimpie 0:6468a28a7b7d 151 void drawBitmap (BYTE x0, BYTE y0, BYTE* bitmap, BYTE bmpXSize, BYTE bmpYSize, BYTE update);
Wimpie 0:6468a28a7b7d 152
Wimpie 0:6468a28a7b7d 153 void drawpixel (BYTE x0, BYTE y0, ePixelMode pmode, BYTE update);
Wimpie 0:6468a28a7b7d 154 void drawline (BYTE x0, BYTE y0, BYTE x1,BYTE y1, ePixelMode pmode, BYTE update);
Wimpie 0:6468a28a7b7d 155 void drawcircle (BYTE x0, BYTE y0, BYTE radius, ePixelMode pmode, BYTE update);
Wimpie 0:6468a28a7b7d 156 void drawrectangle (BYTE x0, BYTE y0, BYTE x1,BYTE y1, eFillMode fill, ePixelMode pmode, BYTE update);
Wimpie 0:6468a28a7b7d 157 void drawprogressbar(BYTE x0, BYTE y0, BYTE w, BYTE h, BYTE percentage, BYTE update);
Wimpie 0:6468a28a7b7d 158 void drawchart (BYTE x0, BYTE y0, BYTE w, BYTE h, BYTE unitx, BYTE unity,
Wimpie 0:6468a28a7b7d 159 eRasterMode rmode,signed char * val, int start, int count);
Wimpie 0:6468a28a7b7d 160
Wimpie 0:6468a28a7b7d 161 private:
Wimpie 0:6468a28a7b7d 162
Wimpie 0:6468a28a7b7d 163 SPI _spi;
Wimpie 0:6468a28a7b7d 164 DigitalOut _cs; // chip select
Wimpie 0:6468a28a7b7d 165 DigitalOut _dc; // data / command
Wimpie 0:6468a28a7b7d 166 DigitalOut _reset; // reset
Wimpie 0:6468a28a7b7d 167
Wimpie 0:6468a28a7b7d 168 void writeCmd(BYTE data);
Wimpie 0:6468a28a7b7d 169 void writeData(BYTE data);
Wimpie 0:6468a28a7b7d 170
Wimpie 0:6468a28a7b7d 171 BYTE _LcdCache[ LCD_CACHE_SIZE ]; // local LCD buffer
Wimpie 0:6468a28a7b7d 172
Wimpie 0:6468a28a7b7d 173 int _LcdCacheIdx;
Wimpie 0:6468a28a7b7d 174 int _LoMark;
Wimpie 0:6468a28a7b7d 175 int _HiMark;
Wimpie 0:6468a28a7b7d 176
Wimpie 0:6468a28a7b7d 177 BYTE _font_width;
Wimpie 0:6468a28a7b7d 178 BYTE _font_height;
Wimpie 0:6468a28a7b7d 179 BYTE _font_start;
Wimpie 0:6468a28a7b7d 180 BYTE _font_end;
Wimpie 0:6468a28a7b7d 181 unsigned char* _pFont;
Wimpie 0:6468a28a7b7d 182
Wimpie 0:6468a28a7b7d 183 };
Wimpie 0:6468a28a7b7d 184
Wimpie 0:6468a28a7b7d 185 #endif