Revision:
0:6468a28a7b7d
Child:
1:ce391193b822
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PCD8544LCD.h	Sun Apr 17 18:03:24 2011 +0000
@@ -0,0 +1,185 @@
+/* mbed PCD8544 - Graphic Library for driving monochrome displays based on PCD8544
+ *  used in Nokia 3310, 3315, 3330, 3350, 3410, 3210,  5110, 5120, 5130, 5160, 6110, 6150
+ *
+ * Copyright (c) 2011, Wim De Roeve
+ * partial port of the code found on http://serdisplib.sourceforge.net/ser/pcd8544.html#links
+ * and by Petras Saduikis <petras@petras.co.uk>
+ *
+ * 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 PCD8544LCD_H
+#define PCD8544LCD_H
+
+#include "mbed.h"
+
+/* Number of pixels on the LCD */
+#define LCD_X_RES  84
+#define LCD_Y_RES  48
+#define LCD_BANKS (LCD_Y_RES / 8)
+
+#define LCD_CACHE_SIZE ((LCD_X_RES * LCD_Y_RES) / 8)
+
+#define MAX_ADR_X  (LCD_X_RES)-1
+#define MAX_ADR_Y  LCD_BANKS-1
+
+#define HIGH  1
+#define LOW   0
+#define TRUE  1
+#define FALSE 0
+
+/* Display control command */
+#define EXTENDEDSET   0x21
+#define STANDARDSET   0x20
+#define DISPLAYOFF    0x08  // switch off display 
+#define ALL_SEG_ON    0x09  // switch on display and set to all pixels on
+#define NORMAL_MODE   0x0C  // NOREVERSE
+#define INVERSE_MODE  0x0D  // REVERSE
+
+#define SET_ADDRES_X  0x80
+#define SET_ADDRES_Y  0x40
+
+
+typedef uint8_t BYTE;
+
+typedef enum {
+    PIXEL_OFF = 0,
+    PIXEL_ON = 1,
+    PIXEL_XOR = 2
+}ePixelMode;
+
+typedef enum {
+    FILL_OFF = 0,
+    FILL_ON = 1
+}eFillMode;
+
+typedef enum {
+    RASTER_OFF = 0,
+    RASTER_ON = 1
+}eRasterMode;
+
+typedef enum {
+    VERYSMALLFONT = 0, //3x5
+    TINYFONT =      1, //5x7
+    SMALLFONT =     2, //6x8
+    NORMALFONT =    3, //8x8
+    BIGFONT    =    4, //8x12&#65533;
+    TIMENUMBERFONT= 5, //16x20
+    BIGNUMBERFONT=  6
+}eFonts;
+
+
+enum eDisplayMode {NORMAL, HIGHLIGHT};
+
+class PCD8544LCD {
+
+    /* PCD8544 from Philips Semiconductors is
+        48 x 84 pixels monochrome matrix LCD controller/driver
+
+        The PCD8544 has a 504 byte memory with NO read function.
+        Each bit is a pixel
+        You can only write 1 byte at a time in vertical or horizontal mode.
+        There is no read functionality with the controller.
+        Caching a copy of the LCD-memory is the only solution if we want
+        to set one pixel at a time.
+
+    */
+public:
+    PCD8544LCD(PinName mosi, PinName miso, PinName sclk,
+               PinName cs, PinName dc, PinName reset);
+
+    /** init()
+     *
+     * Initialise the device.
+     * @param PinName SPI mosi
+     * @param PinName SPI miso
+     * @param PinName SPI sclk
+     * @param PinName DigitalOut cs
+     * @param PinName DigitalOut dc
+     * @param PinName DigitalOut reset
+    */
+
+    void init();
+
+    /** cls()
+     *  clears the cached copy of the screen
+     *  and the screen itself
+    */
+    void cls();
+
+    /** update()
+     *  copies the cached memory to the screen
+     *  use this to update the screen after
+     *  - drawBitmap
+    */
+    void update();
+
+    /** close()
+     *  screen display OFF
+    */
+    void close();
+
+    /** locate(x,y)
+     *  sets the cursor on position x,y
+    */
+    void locate         (BYTE x0, BYTE y0);
+
+    void chooseFont(eFonts font);
+
+    void writeString    (BYTE x0, BYTE y0, char* string, eFonts font, eDisplayMode mode, BYTE update);
+    void writeChar      (BYTE x0, BYTE y0, BYTE ch,  eFonts font,eDisplayMode mode, BYTE update);
+
+    /** drawBitmap(x,y,bitmap,xsize,ysize)
+     *  draw a monochrome bitmap on position x,y
+     *  with size xsize,ysize
+    */
+    void drawBitmap     (BYTE x0, BYTE y0, BYTE* bitmap, BYTE bmpXSize, BYTE bmpYSize, BYTE update);
+
+    void drawpixel      (BYTE x0, BYTE y0, ePixelMode pmode, BYTE update);
+    void drawline       (BYTE x0, BYTE y0, BYTE x1,BYTE y1, ePixelMode pmode, BYTE update);
+    void drawcircle     (BYTE x0, BYTE y0, BYTE radius, ePixelMode pmode, BYTE update);
+    void drawrectangle  (BYTE x0, BYTE y0, BYTE x1,BYTE y1, eFillMode fill, ePixelMode pmode, BYTE update);
+    void drawprogressbar(BYTE x0, BYTE y0, BYTE w, BYTE h, BYTE percentage, BYTE update);
+    void drawchart      (BYTE  x0, BYTE y0, BYTE w, BYTE h, BYTE unitx, BYTE unity,
+                         eRasterMode rmode,signed char * val, int start, int count);
+
+private:
+
+    SPI _spi;
+    DigitalOut _cs;    // chip select
+    DigitalOut _dc;    // data / command
+    DigitalOut _reset; // reset
+
+    void writeCmd(BYTE data);
+    void writeData(BYTE data);
+
+    BYTE _LcdCache[ LCD_CACHE_SIZE ];  // local LCD buffer
+
+    int _LcdCacheIdx;
+    int _LoMark;
+    int _HiMark;
+
+    BYTE _font_width;
+    BYTE _font_height;
+    BYTE _font_start;
+    BYTE _font_end;
+    unsigned char* _pFont;
+
+};
+
+#endif
\ No newline at end of file