PCD8544 multiscreen
PCD8544MS.cpp@0:61dcd2c0299a, 2012-06-15 (annotated)
- Committer:
- Wimpie
- Date:
- Fri Jun 15 18:37:00 2012 +0000
- Revision:
- 0:61dcd2c0299a
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Wimpie | 0:61dcd2c0299a | 1 | /* mbed PCD8544 - Graphic Library for driving monochrome displays based on |
Wimpie | 0:61dcd2c0299a | 2 | * the PCD8544 48 x 84 pixels matrix LCD controller/driver |
Wimpie | 0:61dcd2c0299a | 3 | * used in Nokia 3310, 3315, 3330, 3350, 3410, 3210, 5110, 5120, 5130, 5160, 6110, 6150 |
Wimpie | 0:61dcd2c0299a | 4 | * |
Wimpie | 0:61dcd2c0299a | 5 | * Copyright (c) 2011, Wim De Roeve |
Wimpie | 0:61dcd2c0299a | 6 | * partial port of the code found on http://serdisplib.sourceforge.net/ser/pcd8544.html#links |
Wimpie | 0:61dcd2c0299a | 7 | * and by Petras Saduikis <petras@petras.co.uk> |
Wimpie | 0:61dcd2c0299a | 8 | * |
Wimpie | 0:61dcd2c0299a | 9 | * Permission is hereby granted, free of charge, to any person obtaining a copy |
Wimpie | 0:61dcd2c0299a | 10 | * of this software and associated documentation files (the "Software"), to deal |
Wimpie | 0:61dcd2c0299a | 11 | * in the Software without restriction, including without limitation the rights |
Wimpie | 0:61dcd2c0299a | 12 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
Wimpie | 0:61dcd2c0299a | 13 | * copies of the updaSoftware, and to permit persons to whom the Software is |
Wimpie | 0:61dcd2c0299a | 14 | * furnished to do so, subject to the following conditions: |
Wimpie | 0:61dcd2c0299a | 15 | * |
Wimpie | 0:61dcd2c0299a | 16 | * The above copyright notice and this permission notice shall be included in |
Wimpie | 0:61dcd2c0299a | 17 | * all copies or substantial portions of the Software. |
Wimpie | 0:61dcd2c0299a | 18 | * |
Wimpie | 0:61dcd2c0299a | 19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
Wimpie | 0:61dcd2c0299a | 20 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
Wimpie | 0:61dcd2c0299a | 21 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
Wimpie | 0:61dcd2c0299a | 22 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
Wimpie | 0:61dcd2c0299a | 23 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
Wimpie | 0:61dcd2c0299a | 24 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
Wimpie | 0:61dcd2c0299a | 25 | * THE SOFTWARE. |
Wimpie | 0:61dcd2c0299a | 26 | */ |
Wimpie | 0:61dcd2c0299a | 27 | |
Wimpie | 0:61dcd2c0299a | 28 | #include "PCD8544MS.h" |
Wimpie | 0:61dcd2c0299a | 29 | |
Wimpie | 0:61dcd2c0299a | 30 | #include "fonts/font_3x5.h" |
Wimpie | 0:61dcd2c0299a | 31 | #include "fonts/font_5x7.h" |
Wimpie | 0:61dcd2c0299a | 32 | #include "fonts/font_6x8.h" |
Wimpie | 0:61dcd2c0299a | 33 | #include "fonts/font_8x8.h" |
Wimpie | 0:61dcd2c0299a | 34 | #include "fonts/font_8x12.h" |
Wimpie | 0:61dcd2c0299a | 35 | #include "fonts/font_16x20.h" |
Wimpie | 0:61dcd2c0299a | 36 | #include "fonts/font_16x24.h" |
Wimpie | 0:61dcd2c0299a | 37 | |
Wimpie | 0:61dcd2c0299a | 38 | #include "DebugTrace.h" |
Wimpie | 0:61dcd2c0299a | 39 | #include "sstream" |
Wimpie | 0:61dcd2c0299a | 40 | #include "stdio.h" |
Wimpie | 0:61dcd2c0299a | 41 | #include "stringman.h" |
Wimpie | 0:61dcd2c0299a | 42 | |
Wimpie | 0:61dcd2c0299a | 43 | #define GLCD_CS6_ON 0x01 //P0 |
Wimpie | 0:61dcd2c0299a | 44 | #define GLCD_RESET_ON 0x02 //P1 |
Wimpie | 0:61dcd2c0299a | 45 | #define GLCD_CS1_ON 0x04 //P2 |
Wimpie | 0:61dcd2c0299a | 46 | #define GLCD_CS5_ON 0x08 //P3 |
Wimpie | 0:61dcd2c0299a | 47 | #define GLCD_DC_ON 0x10 //P4 |
Wimpie | 0:61dcd2c0299a | 48 | #define GLCD_CS2_ON 0x20 //P5 |
Wimpie | 0:61dcd2c0299a | 49 | #define GLCD_CS3_ON 0x40 //P6 |
Wimpie | 0:61dcd2c0299a | 50 | #define GLCD_CS4_ON 0x80 //P7 |
Wimpie | 0:61dcd2c0299a | 51 | |
Wimpie | 0:61dcd2c0299a | 52 | #define TLCD_RS_ON 0x1000 //P12 |
Wimpie | 0:61dcd2c0299a | 53 | #define TLCD_E1_ON 0x2000 //P13 |
Wimpie | 0:61dcd2c0299a | 54 | #define TLCD_E2_ON 0x4000 //P14 |
Wimpie | 0:61dcd2c0299a | 55 | #define TLCD_BACKLIGHT_ON 0x8000 //P15 |
Wimpie | 0:61dcd2c0299a | 56 | |
Wimpie | 0:61dcd2c0299a | 57 | /* Display ON/OFF Control defines */ |
Wimpie | 0:61dcd2c0299a | 58 | #define DON 0x0F //0b00001111 Display on |
Wimpie | 0:61dcd2c0299a | 59 | #define DOFF 0x0B //0b00001011 Display off |
Wimpie | 0:61dcd2c0299a | 60 | #define CURSOR_ON 0x0F //0b00001111 Cursor on |
Wimpie | 0:61dcd2c0299a | 61 | #define CURSOR_OFF OxOD //0b00001101 Cursor off |
Wimpie | 0:61dcd2c0299a | 62 | #define BLINK_ON 0x0F //0b00001111 Cursor Blink |
Wimpie | 0:61dcd2c0299a | 63 | #define BLINK_OFF 0x0E //0b00001110 Cursor No Blink |
Wimpie | 0:61dcd2c0299a | 64 | |
Wimpie | 0:61dcd2c0299a | 65 | /* Cursor or Display Shift defines */ |
Wimpie | 0:61dcd2c0299a | 66 | #define SHIFT_CUR_LEFT Ox13 //0b00010011 Cursor shifts to the left |
Wimpie | 0:61dcd2c0299a | 67 | #define SHIFT_CUR_RIGHT Ox17 //0b00010111 Cursor shifts to the right |
Wimpie | 0:61dcd2c0299a | 68 | #define SHIFT_DISP_LEFT Ox1B //0b00011011 Display shifts to the left |
Wimpie | 0:61dcd2c0299a | 69 | #define SHIFT_DISP_RIGHT 0x1F //0b00011111 Display shifts to the right |
Wimpie | 0:61dcd2c0299a | 70 | |
Wimpie | 0:61dcd2c0299a | 71 | /* Function Set defines */ |
Wimpie | 0:61dcd2c0299a | 72 | #define EIGHT_BITMODE 0x03 //0b00000011 8-bit Interface D4-D7 |
Wimpie | 0:61dcd2c0299a | 73 | #define FOUR_BITMODE 0x02 //0b00000010 4-bit Interface D4-D7 |
Wimpie | 0:61dcd2c0299a | 74 | #define LINE_5X7 0x30 //0b00110000 |
Wimpie | 0:61dcd2c0299a | 75 | #define LINE_5X10 0x34 //0b00110100 |
Wimpie | 0:61dcd2c0299a | 76 | #define LINES_5X7 0x38 //0b00111000 |
Wimpie | 0:61dcd2c0299a | 77 | |
Wimpie | 0:61dcd2c0299a | 78 | // Addtional define to support display mode |
Wimpie | 0:61dcd2c0299a | 79 | |
Wimpie | 0:61dcd2c0299a | 80 | #define DISP_FLIP_NONE 0x00 //0b00111100 No flip |
Wimpie | 0:61dcd2c0299a | 81 | #define CLEAR_LCD 0x01 //0b00000001 |
Wimpie | 0:61dcd2c0299a | 82 | |
Wimpie | 0:61dcd2c0299a | 83 | /* Number of pixels on the LCD */ |
Wimpie | 0:61dcd2c0299a | 84 | |
Wimpie | 0:61dcd2c0299a | 85 | #define HIGH 1 |
Wimpie | 0:61dcd2c0299a | 86 | #define LOW 0 |
Wimpie | 0:61dcd2c0299a | 87 | #define TRUE 1 |
Wimpie | 0:61dcd2c0299a | 88 | #define FALSE 0 |
Wimpie | 0:61dcd2c0299a | 89 | |
Wimpie | 0:61dcd2c0299a | 90 | /* Display control command */ |
Wimpie | 0:61dcd2c0299a | 91 | #define EXTENDEDSET 0x21 |
Wimpie | 0:61dcd2c0299a | 92 | #define STANDARDSET 0x20 |
Wimpie | 0:61dcd2c0299a | 93 | #define DISPLAYOFF 0x08 // switch off display |
Wimpie | 0:61dcd2c0299a | 94 | #define ALL_SEG_ON 0x09 // switch on display and set to all pixels on |
Wimpie | 0:61dcd2c0299a | 95 | #define NORMAL_MODE 0x0C // NOREVERSE |
Wimpie | 0:61dcd2c0299a | 96 | #define INVERSE_MODE 0x0D // REVERSE |
Wimpie | 0:61dcd2c0299a | 97 | |
Wimpie | 0:61dcd2c0299a | 98 | #define SET_ADDRES_X 0x80 |
Wimpie | 0:61dcd2c0299a | 99 | #define SET_ADDRES_Y 0x40 |
Wimpie | 0:61dcd2c0299a | 100 | |
Wimpie | 0:61dcd2c0299a | 101 | |
Wimpie | 0:61dcd2c0299a | 102 | DebugTrace pc_PCD8544(ON, TO_SERIAL); |
Wimpie | 0:61dcd2c0299a | 103 | |
Wimpie | 0:61dcd2c0299a | 104 | /* |
Wimpie | 0:61dcd2c0299a | 105 | PCD8544 from Philips Semiconductors is |
Wimpie | 0:61dcd2c0299a | 106 | 48 x 84 pixels monochrome matrix LCD controller/driver |
Wimpie | 0:61dcd2c0299a | 107 | |
Wimpie | 0:61dcd2c0299a | 108 | generic for LPH7366, LPH7677, and LPH7779; no backlight |
Wimpie | 0:61dcd2c0299a | 109 | |
Wimpie | 0:61dcd2c0299a | 110 | model name (of display) type used in cellphones |
Wimpie | 0:61dcd2c0299a | 111 | LPH 7366 2 Nokia 5110, 5120, 5130, 5160, 6110, 6150 |
Wimpie | 0:61dcd2c0299a | 112 | LPH 7677 1 Nokia 3210 |
Wimpie | 0:61dcd2c0299a | 113 | LPH 7779 1 Nokia 3310, 3315, 3330, 3350, 3410 |
Wimpie | 0:61dcd2c0299a | 114 | |
Wimpie | 0:61dcd2c0299a | 115 | |
Wimpie | 0:61dcd2c0299a | 116 | +-------------------------+ |
Wimpie | 0:61dcd2c0299a | 117 | | 1 2 3 4 5 6 7 8 | |
Wimpie | 0:61dcd2c0299a | 118 | | # # # # # # # # | |
Wimpie | 0:61dcd2c0299a | 119 | | ===#=#=#=#=#=#=#=#=== | Red 1 .. VDD - chip power supply +3.3V |
Wimpie | 0:61dcd2c0299a | 120 | +--=====================--+ Green 2 .. SCLK - serial clock line of LCD |
Wimpie | 0:61dcd2c0299a | 121 | | | Yellow 3 .. SI - serial data input of LCD |
Wimpie | 0:61dcd2c0299a | 122 | | | Gray 4 .. D/C - command/data switch |
Wimpie | 0:61dcd2c0299a | 123 | | rear view | Blue 5 .. /CS - active low chip select |
Wimpie | 0:61dcd2c0299a | 124 | | connector is visible | Black 6 .. GND - for VDD |
Wimpie | 0:61dcd2c0299a | 125 | | | 7 .. Vout - output of display-internal dc/dc converter |
Wimpie | 0:61dcd2c0299a | 126 | | LPH7779 | White 8 .. /RES - active low reset |
Wimpie | 0:61dcd2c0299a | 127 | | | |
Wimpie | 0:61dcd2c0299a | 128 | +-------------------------+ |
Wimpie | 0:61dcd2c0299a | 129 | |
Wimpie | 0:61dcd2c0299a | 130 | */ |
Wimpie | 0:61dcd2c0299a | 131 | |
Wimpie | 0:61dcd2c0299a | 132 | |
Wimpie | 0:61dcd2c0299a | 133 | PCD8544MS::PCD8544MS(PinName mosi, PinName miso, PinName sclk, PinName sda, PinName scl,int i2cAddress, bool TextLCD, bool backlight): |
Wimpie | 0:61dcd2c0299a | 134 | _spi(mosi, miso, sclk),_i2c(sda, scl) { |
Wimpie | 0:61dcd2c0299a | 135 | |
Wimpie | 0:61dcd2c0299a | 136 | _i2cAddress = i2cAddress; |
Wimpie | 0:61dcd2c0299a | 137 | // _type = type; |
Wimpie | 0:61dcd2c0299a | 138 | |
Wimpie | 0:61dcd2c0299a | 139 | if (TextLCD) { |
Wimpie | 0:61dcd2c0299a | 140 | TLCD_reset(); |
Wimpie | 0:61dcd2c0299a | 141 | _columns = 16; |
Wimpie | 0:61dcd2c0299a | 142 | _rows = 2; |
Wimpie | 0:61dcd2c0299a | 143 | _backlight=backlight; |
Wimpie | 0:61dcd2c0299a | 144 | } |
Wimpie | 0:61dcd2c0299a | 145 | |
Wimpie | 0:61dcd2c0299a | 146 | GLCD_reset(); |
Wimpie | 0:61dcd2c0299a | 147 | } |
Wimpie | 0:61dcd2c0299a | 148 | |
Wimpie | 0:61dcd2c0299a | 149 | void PCD8544MS::writeI2CByte(int data) { |
Wimpie | 0:61dcd2c0299a | 150 | char cmd[2]; |
Wimpie | 0:61dcd2c0299a | 151 | cmd[0] = (data & 0xFF); |
Wimpie | 0:61dcd2c0299a | 152 | cmd[1] = (data >> 8); |
Wimpie | 0:61dcd2c0299a | 153 | _i2c.write(_i2cAddress, cmd, 2); |
Wimpie | 0:61dcd2c0299a | 154 | // pc_PCD8544.traceOut("I2C=%i ",data); |
Wimpie | 0:61dcd2c0299a | 155 | |
Wimpie | 0:61dcd2c0299a | 156 | } |
Wimpie | 0:61dcd2c0299a | 157 | |
Wimpie | 0:61dcd2c0299a | 158 | // ############# TEXTLCD FUNCTIONS ################### |
Wimpie | 0:61dcd2c0299a | 159 | |
Wimpie | 0:61dcd2c0299a | 160 | void PCD8544MS::TLCD_reset() { |
Wimpie | 0:61dcd2c0299a | 161 | for (int i=0; i<3; i++) { |
Wimpie | 0:61dcd2c0299a | 162 | TLCD_writeNibble(EIGHT_BITMODE,false); |
Wimpie | 0:61dcd2c0299a | 163 | wait(0.00164); // this command takes 1.64ms, so wait for it |
Wimpie | 0:61dcd2c0299a | 164 | } |
Wimpie | 0:61dcd2c0299a | 165 | TLCD_writeNibble(FOUR_BITMODE,false); // 4-bit mode |
Wimpie | 0:61dcd2c0299a | 166 | |
Wimpie | 0:61dcd2c0299a | 167 | TLCD_writeCommand(0x28); // Function set 001 BW N F - - |
Wimpie | 0:61dcd2c0299a | 168 | TLCD_writeCommand(0x0C); |
Wimpie | 0:61dcd2c0299a | 169 | TLCD_writeCommand(0x6); // Cursor Direction and Display Shift : 0000 01 CD S (CD 0-left, 1-right S(hift) 0-no, 1-yes |
Wimpie | 0:61dcd2c0299a | 170 | } |
Wimpie | 0:61dcd2c0299a | 171 | |
Wimpie | 0:61dcd2c0299a | 172 | void PCD8544MS::TLCD_writeNibble(int data, bool rs) { |
Wimpie | 0:61dcd2c0299a | 173 | |
Wimpie | 0:61dcd2c0299a | 174 | data = ((data & 0xF) << 8) || GLCD_RESET_ON || GLCD_CS1_ON || GLCD_CS2_ON || GLCD_CS3_ON || GLCD_CS4_ON || GLCD_CS5_ON || GLCD_CS6_ON ; |
Wimpie | 0:61dcd2c0299a | 175 | |
Wimpie | 0:61dcd2c0299a | 176 | if (_backlight) |
Wimpie | 0:61dcd2c0299a | 177 | data= data | TLCD_BACKLIGHT_ON; |
Wimpie | 0:61dcd2c0299a | 178 | |
Wimpie | 0:61dcd2c0299a | 179 | if (rs) { |
Wimpie | 0:61dcd2c0299a | 180 | data = data | TLCD_RS_ON; // set rs bit |
Wimpie | 0:61dcd2c0299a | 181 | } |
Wimpie | 0:61dcd2c0299a | 182 | |
Wimpie | 0:61dcd2c0299a | 183 | writeI2CByte(data | TLCD_E1_ON); // E=1 |
Wimpie | 0:61dcd2c0299a | 184 | |
Wimpie | 0:61dcd2c0299a | 185 | wait(0.000040f); |
Wimpie | 0:61dcd2c0299a | 186 | writeI2CByte(data); // E=0 |
Wimpie | 0:61dcd2c0299a | 187 | |
Wimpie | 0:61dcd2c0299a | 188 | wait(0.000040f); |
Wimpie | 0:61dcd2c0299a | 189 | writeI2CByte(data | TLCD_E1_ON); // E=1 |
Wimpie | 0:61dcd2c0299a | 190 | } |
Wimpie | 0:61dcd2c0299a | 191 | |
Wimpie | 0:61dcd2c0299a | 192 | |
Wimpie | 0:61dcd2c0299a | 193 | void PCD8544MS::TLCD_writeByte(int data, bool rs) { |
Wimpie | 0:61dcd2c0299a | 194 | TLCD_writeNibble(data >> 4 , rs); |
Wimpie | 0:61dcd2c0299a | 195 | TLCD_writeNibble(data >> 0 , rs); |
Wimpie | 0:61dcd2c0299a | 196 | } |
Wimpie | 0:61dcd2c0299a | 197 | |
Wimpie | 0:61dcd2c0299a | 198 | void PCD8544MS::TLCD_writeCommand(int command) { |
Wimpie | 0:61dcd2c0299a | 199 | // RS = 0; |
Wimpie | 0:61dcd2c0299a | 200 | TLCD_writeByte(command,false); |
Wimpie | 0:61dcd2c0299a | 201 | } |
Wimpie | 0:61dcd2c0299a | 202 | |
Wimpie | 0:61dcd2c0299a | 203 | void PCD8544MS::TLCD_writeData(int data) { |
Wimpie | 0:61dcd2c0299a | 204 | //RS = 1 |
Wimpie | 0:61dcd2c0299a | 205 | TLCD_writeByte(data,true); |
Wimpie | 0:61dcd2c0299a | 206 | |
Wimpie | 0:61dcd2c0299a | 207 | _column++; |
Wimpie | 0:61dcd2c0299a | 208 | if (_column >= _columns) { |
Wimpie | 0:61dcd2c0299a | 209 | TLCD_newline(); |
Wimpie | 0:61dcd2c0299a | 210 | } |
Wimpie | 0:61dcd2c0299a | 211 | } |
Wimpie | 0:61dcd2c0299a | 212 | |
Wimpie | 0:61dcd2c0299a | 213 | int PCD8544MS::_putc(int value) { |
Wimpie | 0:61dcd2c0299a | 214 | if (value == '\n') { |
Wimpie | 0:61dcd2c0299a | 215 | TLCD_newline(); |
Wimpie | 0:61dcd2c0299a | 216 | } else { |
Wimpie | 0:61dcd2c0299a | 217 | TLCD_writeData(value); |
Wimpie | 0:61dcd2c0299a | 218 | } |
Wimpie | 0:61dcd2c0299a | 219 | return value; |
Wimpie | 0:61dcd2c0299a | 220 | } |
Wimpie | 0:61dcd2c0299a | 221 | |
Wimpie | 0:61dcd2c0299a | 222 | int PCD8544MS::_getc() { |
Wimpie | 0:61dcd2c0299a | 223 | return 0; |
Wimpie | 0:61dcd2c0299a | 224 | } |
Wimpie | 0:61dcd2c0299a | 225 | |
Wimpie | 0:61dcd2c0299a | 226 | void PCD8544MS::TLCD_backlight(bool status) { |
Wimpie | 0:61dcd2c0299a | 227 | _backlight=status; |
Wimpie | 0:61dcd2c0299a | 228 | if (_backlight) |
Wimpie | 0:61dcd2c0299a | 229 | writeI2CByte(TLCD_BACKLIGHT_ON | TLCD_E1_ON | TLCD_E2_ON | GLCD_CS1_ON); |
Wimpie | 0:61dcd2c0299a | 230 | else |
Wimpie | 0:61dcd2c0299a | 231 | writeI2CByte(TLCD_E1_ON | TLCD_E2_ON | GLCD_CS1_ON); |
Wimpie | 0:61dcd2c0299a | 232 | } |
Wimpie | 0:61dcd2c0299a | 233 | |
Wimpie | 0:61dcd2c0299a | 234 | |
Wimpie | 0:61dcd2c0299a | 235 | void PCD8544MS::TLCD_newline() { |
Wimpie | 0:61dcd2c0299a | 236 | _column = 0; |
Wimpie | 0:61dcd2c0299a | 237 | _row++; |
Wimpie | 0:61dcd2c0299a | 238 | if (_row >= _rows) { |
Wimpie | 0:61dcd2c0299a | 239 | _row = 0; |
Wimpie | 0:61dcd2c0299a | 240 | } |
Wimpie | 0:61dcd2c0299a | 241 | TLCD_locate(_column, _row); |
Wimpie | 0:61dcd2c0299a | 242 | } |
Wimpie | 0:61dcd2c0299a | 243 | |
Wimpie | 0:61dcd2c0299a | 244 | |
Wimpie | 0:61dcd2c0299a | 245 | void PCD8544MS::TLCD_locate(int column, int row) { |
Wimpie | 0:61dcd2c0299a | 246 | if (column < 0 || column >= _columns || row < 0 || row >= _rows) { |
Wimpie | 0:61dcd2c0299a | 247 | error("locate(%d,%d) out of range on %dx%d display", column, row, _columns, _rows); |
Wimpie | 0:61dcd2c0299a | 248 | return; |
Wimpie | 0:61dcd2c0299a | 249 | } |
Wimpie | 0:61dcd2c0299a | 250 | |
Wimpie | 0:61dcd2c0299a | 251 | _row = row; |
Wimpie | 0:61dcd2c0299a | 252 | _column = column; |
Wimpie | 0:61dcd2c0299a | 253 | int address = 0x80 + (_row * 40) + _column; // memory starts at 0x80, and is 40 chars long per row |
Wimpie | 0:61dcd2c0299a | 254 | // pc_LCD.traceOut("locate %dx%d\r\n", column, row); |
Wimpie | 0:61dcd2c0299a | 255 | TLCD_writeCommand(address); |
Wimpie | 0:61dcd2c0299a | 256 | } |
Wimpie | 0:61dcd2c0299a | 257 | |
Wimpie | 0:61dcd2c0299a | 258 | |
Wimpie | 0:61dcd2c0299a | 259 | void PCD8544MS::TLCD_cls() { |
Wimpie | 0:61dcd2c0299a | 260 | TLCD_writeCommand(0x01); // Clear Display |
Wimpie | 0:61dcd2c0299a | 261 | wait(0.00164f); // This command takes 1.64 ms |
Wimpie | 0:61dcd2c0299a | 262 | TLCD_locate(0, 0); |
Wimpie | 0:61dcd2c0299a | 263 | } |
Wimpie | 0:61dcd2c0299a | 264 | |
Wimpie | 0:61dcd2c0299a | 265 | |
Wimpie | 0:61dcd2c0299a | 266 | |
Wimpie | 0:61dcd2c0299a | 267 | // ############# GRAPHICLCD FUNCTIONS ################### |
Wimpie | 0:61dcd2c0299a | 268 | |
Wimpie | 0:61dcd2c0299a | 269 | void PCD8544MS::GLCD_reset() { |
Wimpie | 0:61dcd2c0299a | 270 | |
Wimpie | 0:61dcd2c0299a | 271 | /* reset lcd |
Wimpie | 0:61dcd2c0299a | 272 | |
Wimpie | 0:61dcd2c0299a | 273 | After reset, the LCD driver has the following state: |
Wimpie | 0:61dcd2c0299a | 274 | - Power-down mode (bit PD = 1) |
Wimpie | 0:61dcd2c0299a | 275 | - Horizontal addressing (bit V = 0) |
Wimpie | 0:61dcd2c0299a | 276 | - normal instruction set (bit H = 0) |
Wimpie | 0:61dcd2c0299a | 277 | - Display blank (bit E = D = 0) |
Wimpie | 0:61dcd2c0299a | 278 | - Address counter X6 to X0 = 0; Y2 to Y0 = 0 |
Wimpie | 0:61dcd2c0299a | 279 | - Temperature control mode (TC1 TC0 = 0) |
Wimpie | 0:61dcd2c0299a | 280 | - Bias system (BS2 to BS0 = 0) |
Wimpie | 0:61dcd2c0299a | 281 | - VLCD is equal to 0, the HV generator is switched off |
Wimpie | 0:61dcd2c0299a | 282 | (VOP6 to VOP0 = 0) |
Wimpie | 0:61dcd2c0299a | 283 | - After power-on, the RAM contents are undefined. |
Wimpie | 0:61dcd2c0299a | 284 | */ |
Wimpie | 0:61dcd2c0299a | 285 | |
Wimpie | 0:61dcd2c0299a | 286 | |
Wimpie | 0:61dcd2c0299a | 287 | GLCD_writeI2C(HIGH,LOW,HIGH,0); // all screens |
Wimpie | 0:61dcd2c0299a | 288 | |
Wimpie | 0:61dcd2c0299a | 289 | _spi.format(8,0); |
Wimpie | 0:61dcd2c0299a | 290 | _spi.frequency(1000000); |
Wimpie | 0:61dcd2c0299a | 291 | |
Wimpie | 0:61dcd2c0299a | 292 | pc_PCD8544.traceOut("\r\nreset GLCD "); |
Wimpie | 0:61dcd2c0299a | 293 | |
Wimpie | 0:61dcd2c0299a | 294 | //_cs=HIGH; |
Wimpie | 0:61dcd2c0299a | 295 | //_reset=HIGH; |
Wimpie | 0:61dcd2c0299a | 296 | |
Wimpie | 0:61dcd2c0299a | 297 | |
Wimpie | 0:61dcd2c0299a | 298 | // for (int i=1;i<=maxscreen;i++) { |
Wimpie | 0:61dcd2c0299a | 299 | |
Wimpie | 0:61dcd2c0299a | 300 | wait_ms(1); |
Wimpie | 0:61dcd2c0299a | 301 | //_reset=LOW; |
Wimpie | 0:61dcd2c0299a | 302 | GLCD_writeI2C(LOW,LOW,HIGH,0); |
Wimpie | 0:61dcd2c0299a | 303 | |
Wimpie | 0:61dcd2c0299a | 304 | wait_ms(1); |
Wimpie | 0:61dcd2c0299a | 305 | //_reset = HIGH; |
Wimpie | 0:61dcd2c0299a | 306 | GLCD_writeI2C(HIGH,LOW,HIGH,0); |
Wimpie | 0:61dcd2c0299a | 307 | |
Wimpie | 0:61dcd2c0299a | 308 | GLCD_writeCmd(EXTENDEDSET,1,0); // folowing commands are extended ones |
Wimpie | 0:61dcd2c0299a | 309 | GLCD_writeCmd(0xc8,0,0); // Set Voltage 0x80+value: set contrast |
Wimpie | 0:61dcd2c0299a | 310 | GLCD_writeCmd(0x06,0,0); // set temp coefficient |
Wimpie | 0:61dcd2c0299a | 311 | GLCD_writeCmd(0x13,0,0); // set BIAS mode 1:48 |
Wimpie | 0:61dcd2c0299a | 312 | GLCD_writeCmd(STANDARDSET,0,0); // STANDARDSET: following commands are standard ones |
Wimpie | 0:61dcd2c0299a | 313 | |
Wimpie | 0:61dcd2c0299a | 314 | GLCD_writeCmd(NORMAL_MODE,2,0); |
Wimpie | 0:61dcd2c0299a | 315 | _LoMark = 0; |
Wimpie | 0:61dcd2c0299a | 316 | _HiMark = LCD_CACHE_SIZE - 1; |
Wimpie | 0:61dcd2c0299a | 317 | |
Wimpie | 0:61dcd2c0299a | 318 | GLCD_cls(0,TRUE); |
Wimpie | 0:61dcd2c0299a | 319 | } |
Wimpie | 0:61dcd2c0299a | 320 | |
Wimpie | 0:61dcd2c0299a | 321 | void PCD8544MS::GLCD_writeCmd(BYTE data, BYTE CF, int screen) { |
Wimpie | 0:61dcd2c0299a | 322 | //_cs = LOW; |
Wimpie | 0:61dcd2c0299a | 323 | //_dc = LOW; |
Wimpie | 0:61dcd2c0299a | 324 | // _spi.write(data); |
Wimpie | 0:61dcd2c0299a | 325 | |
Wimpie | 0:61dcd2c0299a | 326 | // pc_PCD8544.traceOut("\r\n %i %i %i ",(CF & 1),data,(CF & 2)); |
Wimpie | 0:61dcd2c0299a | 327 | |
Wimpie | 0:61dcd2c0299a | 328 | if ((CF & 1)==1) { |
Wimpie | 0:61dcd2c0299a | 329 | GLCD_writeI2C(HIGH,LOW,LOW,screen); |
Wimpie | 0:61dcd2c0299a | 330 | wait_ms(1); |
Wimpie | 0:61dcd2c0299a | 331 | } |
Wimpie | 0:61dcd2c0299a | 332 | |
Wimpie | 0:61dcd2c0299a | 333 | _spi.write(data); |
Wimpie | 0:61dcd2c0299a | 334 | |
Wimpie | 0:61dcd2c0299a | 335 | if ((CF & 2)==2) { |
Wimpie | 0:61dcd2c0299a | 336 | GLCD_writeI2C(HIGH,LOW,HIGH,screen); |
Wimpie | 0:61dcd2c0299a | 337 | } |
Wimpie | 0:61dcd2c0299a | 338 | |
Wimpie | 0:61dcd2c0299a | 339 | //_cs = HIGH; |
Wimpie | 0:61dcd2c0299a | 340 | |
Wimpie | 0:61dcd2c0299a | 341 | } |
Wimpie | 0:61dcd2c0299a | 342 | |
Wimpie | 0:61dcd2c0299a | 343 | void PCD8544MS::GLCD_writeData(BYTE data, BYTE CF, int screen) { |
Wimpie | 0:61dcd2c0299a | 344 | // _cs = LOW; |
Wimpie | 0:61dcd2c0299a | 345 | //_dc = HIGH; |
Wimpie | 0:61dcd2c0299a | 346 | //_spi.write(data); |
Wimpie | 0:61dcd2c0299a | 347 | |
Wimpie | 0:61dcd2c0299a | 348 | if ((CF & 1)==1) { |
Wimpie | 0:61dcd2c0299a | 349 | GLCD_writeI2C(HIGH,HIGH,LOW,screen); |
Wimpie | 0:61dcd2c0299a | 350 | wait_ms(1); |
Wimpie | 0:61dcd2c0299a | 351 | } |
Wimpie | 0:61dcd2c0299a | 352 | |
Wimpie | 0:61dcd2c0299a | 353 | _spi.write(data); |
Wimpie | 0:61dcd2c0299a | 354 | |
Wimpie | 0:61dcd2c0299a | 355 | if ((CF & 2)==2) { |
Wimpie | 0:61dcd2c0299a | 356 | GLCD_writeI2C(HIGH,HIGH,HIGH,screen); |
Wimpie | 0:61dcd2c0299a | 357 | } |
Wimpie | 0:61dcd2c0299a | 358 | |
Wimpie | 0:61dcd2c0299a | 359 | // _cs = HIGH; |
Wimpie | 0:61dcd2c0299a | 360 | |
Wimpie | 0:61dcd2c0299a | 361 | } |
Wimpie | 0:61dcd2c0299a | 362 | |
Wimpie | 0:61dcd2c0299a | 363 | void PCD8544MS::GLCD_writeI2C(bool reset, bool dc, bool cs,int screen) { |
Wimpie | 0:61dcd2c0299a | 364 | |
Wimpie | 0:61dcd2c0299a | 365 | int cb=TLCD_E1_ON | TLCD_E2_ON; // prevent TextLCD for |
Wimpie | 0:61dcd2c0299a | 366 | |
Wimpie | 0:61dcd2c0299a | 367 | if (reset==HIGH) cb = cb | GLCD_RESET_ON; |
Wimpie | 0:61dcd2c0299a | 368 | if (dc==HIGH) cb = cb | GLCD_DC_ON; |
Wimpie | 0:61dcd2c0299a | 369 | |
Wimpie | 0:61dcd2c0299a | 370 | if (cs==HIGH) { |
Wimpie | 0:61dcd2c0299a | 371 | cb = cb | GLCD_CS1_ON | GLCD_CS2_ON | GLCD_CS3_ON | GLCD_CS4_ON | GLCD_CS5_ON | GLCD_CS6_ON ; |
Wimpie | 0:61dcd2c0299a | 372 | } else { |
Wimpie | 0:61dcd2c0299a | 373 | switch (screen) { |
Wimpie | 0:61dcd2c0299a | 374 | case 1: { |
Wimpie | 0:61dcd2c0299a | 375 | cb = cb | GLCD_CS2_ON | GLCD_CS3_ON | GLCD_CS4_ON | GLCD_CS5_ON | GLCD_CS6_ON; |
Wimpie | 0:61dcd2c0299a | 376 | break; |
Wimpie | 0:61dcd2c0299a | 377 | } |
Wimpie | 0:61dcd2c0299a | 378 | case 2: { |
Wimpie | 0:61dcd2c0299a | 379 | cb = cb | GLCD_CS1_ON | GLCD_CS3_ON | GLCD_CS4_ON | GLCD_CS5_ON | GLCD_CS6_ON; |
Wimpie | 0:61dcd2c0299a | 380 | break; |
Wimpie | 0:61dcd2c0299a | 381 | } |
Wimpie | 0:61dcd2c0299a | 382 | case 3: { |
Wimpie | 0:61dcd2c0299a | 383 | cb = cb | GLCD_CS1_ON | GLCD_CS2_ON | GLCD_CS4_ON | GLCD_CS5_ON | GLCD_CS6_ON; |
Wimpie | 0:61dcd2c0299a | 384 | break; |
Wimpie | 0:61dcd2c0299a | 385 | } |
Wimpie | 0:61dcd2c0299a | 386 | case 4: { |
Wimpie | 0:61dcd2c0299a | 387 | cb = cb | GLCD_CS1_ON | GLCD_CS2_ON | GLCD_CS3_ON | GLCD_CS5_ON | GLCD_CS6_ON; |
Wimpie | 0:61dcd2c0299a | 388 | break; |
Wimpie | 0:61dcd2c0299a | 389 | } |
Wimpie | 0:61dcd2c0299a | 390 | case 5: { |
Wimpie | 0:61dcd2c0299a | 391 | cb = cb | GLCD_CS1_ON | GLCD_CS2_ON | GLCD_CS3_ON | GLCD_CS4_ON | GLCD_CS6_ON; |
Wimpie | 0:61dcd2c0299a | 392 | break; |
Wimpie | 0:61dcd2c0299a | 393 | } |
Wimpie | 0:61dcd2c0299a | 394 | case 6: { |
Wimpie | 0:61dcd2c0299a | 395 | cb = cb | GLCD_CS1_ON | GLCD_CS2_ON | GLCD_CS3_ON | GLCD_CS4_ON | GLCD_CS5_ON; |
Wimpie | 0:61dcd2c0299a | 396 | break; |
Wimpie | 0:61dcd2c0299a | 397 | } |
Wimpie | 0:61dcd2c0299a | 398 | default: { |
Wimpie | 0:61dcd2c0299a | 399 | break; |
Wimpie | 0:61dcd2c0299a | 400 | } |
Wimpie | 0:61dcd2c0299a | 401 | } |
Wimpie | 0:61dcd2c0299a | 402 | } |
Wimpie | 0:61dcd2c0299a | 403 | |
Wimpie | 0:61dcd2c0299a | 404 | |
Wimpie | 0:61dcd2c0299a | 405 | writeI2CByte(cb); |
Wimpie | 0:61dcd2c0299a | 406 | |
Wimpie | 0:61dcd2c0299a | 407 | } |
Wimpie | 0:61dcd2c0299a | 408 | |
Wimpie | 0:61dcd2c0299a | 409 | void PCD8544MS::GLCD_close() { |
Wimpie | 0:61dcd2c0299a | 410 | GLCD_writeCmd(DISPLAYOFF,3,0); |
Wimpie | 0:61dcd2c0299a | 411 | GLCD_writeI2C(HIGH,HIGH,HIGH,0); |
Wimpie | 0:61dcd2c0299a | 412 | // _cs = HIGH; |
Wimpie | 0:61dcd2c0299a | 413 | // _reset = HIGH; |
Wimpie | 0:61dcd2c0299a | 414 | |
Wimpie | 0:61dcd2c0299a | 415 | } |
Wimpie | 0:61dcd2c0299a | 416 | |
Wimpie | 0:61dcd2c0299a | 417 | // GRAPHICAL functions |
Wimpie | 0:61dcd2c0299a | 418 | |
Wimpie | 0:61dcd2c0299a | 419 | void PCD8544MS::GLCD_cls(int screen,bool fupdate) { |
Wimpie | 0:61dcd2c0299a | 420 | // pc_PCD8544.traceOut("\r\ncls %i ",LCD_CACHE_SIZE); |
Wimpie | 0:61dcd2c0299a | 421 | |
Wimpie | 0:61dcd2c0299a | 422 | for (int i = 0; i < LCD_CACHE_SIZE ; i++) { |
Wimpie | 0:61dcd2c0299a | 423 | // pc_PCD8544.traceOut("%i",i); |
Wimpie | 0:61dcd2c0299a | 424 | LcdCache[i]=0x00; |
Wimpie | 0:61dcd2c0299a | 425 | } |
Wimpie | 0:61dcd2c0299a | 426 | _LoMark = 0; |
Wimpie | 0:61dcd2c0299a | 427 | _HiMark = LCD_CACHE_SIZE - 1; |
Wimpie | 0:61dcd2c0299a | 428 | |
Wimpie | 0:61dcd2c0299a | 429 | // pc_PCD8544.traceOut("\r\nfupdate"); |
Wimpie | 0:61dcd2c0299a | 430 | if (fupdate) |
Wimpie | 0:61dcd2c0299a | 431 | GLCD_update(screen); |
Wimpie | 0:61dcd2c0299a | 432 | } |
Wimpie | 0:61dcd2c0299a | 433 | |
Wimpie | 0:61dcd2c0299a | 434 | void PCD8544MS::GLCD_update(int screen) { |
Wimpie | 0:61dcd2c0299a | 435 | // pc_PCD8544.traceOut("\r\nupdate"); |
Wimpie | 0:61dcd2c0299a | 436 | if ( _LoMark < 0 ) |
Wimpie | 0:61dcd2c0299a | 437 | _LoMark = 0; |
Wimpie | 0:61dcd2c0299a | 438 | else if ( _LoMark >= LCD_CACHE_SIZE ) |
Wimpie | 0:61dcd2c0299a | 439 | _LoMark = LCD_CACHE_SIZE - 1; |
Wimpie | 0:61dcd2c0299a | 440 | if ( _HiMark < 0 ) |
Wimpie | 0:61dcd2c0299a | 441 | _HiMark = 0; |
Wimpie | 0:61dcd2c0299a | 442 | else if ( _HiMark >= LCD_CACHE_SIZE ) |
Wimpie | 0:61dcd2c0299a | 443 | _HiMark = LCD_CACHE_SIZE - 1; |
Wimpie | 0:61dcd2c0299a | 444 | |
Wimpie | 0:61dcd2c0299a | 445 | GLCD_writeCmd(SET_ADDRES_X | (_LoMark % LCD_X_RES),1,screen); |
Wimpie | 0:61dcd2c0299a | 446 | GLCD_writeCmd(SET_ADDRES_Y | (_LoMark / LCD_X_RES),2,screen); |
Wimpie | 0:61dcd2c0299a | 447 | |
Wimpie | 0:61dcd2c0299a | 448 | GLCD_writeI2C(HIGH,HIGH,LOW,screen); |
Wimpie | 0:61dcd2c0299a | 449 | wait_ms(1); |
Wimpie | 0:61dcd2c0299a | 450 | |
Wimpie | 0:61dcd2c0299a | 451 | for (int i = _LoMark; i <= _HiMark; i++ ) { |
Wimpie | 0:61dcd2c0299a | 452 | _spi.write(LcdCache[i]); |
Wimpie | 0:61dcd2c0299a | 453 | //writeData( ); |
Wimpie | 0:61dcd2c0299a | 454 | } |
Wimpie | 0:61dcd2c0299a | 455 | GLCD_writeI2C(HIGH,HIGH,HIGH,screen); |
Wimpie | 0:61dcd2c0299a | 456 | _LoMark = LCD_CACHE_SIZE - 1; |
Wimpie | 0:61dcd2c0299a | 457 | _HiMark = 0; |
Wimpie | 0:61dcd2c0299a | 458 | } |
Wimpie | 0:61dcd2c0299a | 459 | |
Wimpie | 0:61dcd2c0299a | 460 | |
Wimpie | 0:61dcd2c0299a | 461 | |
Wimpie | 0:61dcd2c0299a | 462 | void PCD8544MS::GLCD_locate(BYTE x0, BYTE y0) { |
Wimpie | 0:61dcd2c0299a | 463 | LcdCacheIdx = x0*LCD_BANKS + y0 * LCD_X_RES; |
Wimpie | 0:61dcd2c0299a | 464 | } |
Wimpie | 0:61dcd2c0299a | 465 | |
Wimpie | 0:61dcd2c0299a | 466 | // Bitmap |
Wimpie | 0:61dcd2c0299a | 467 | |
Wimpie | 0:61dcd2c0299a | 468 | void PCD8544MS::GLCD_drawBitmap(BYTE x0, BYTE y0, const unsigned char* bitmap, BYTE bmpXSize, BYTE bmpYSize,BYTE fupdate,int screen) { |
Wimpie | 0:61dcd2c0299a | 469 | BYTE row; |
Wimpie | 0:61dcd2c0299a | 470 | // pc_PCD8544.traceOut("\r\ndrawbitmap"); |
Wimpie | 0:61dcd2c0299a | 471 | |
Wimpie | 0:61dcd2c0299a | 472 | if (0 == bmpYSize % 8) |
Wimpie | 0:61dcd2c0299a | 473 | row = bmpYSize/8; |
Wimpie | 0:61dcd2c0299a | 474 | else |
Wimpie | 0:61dcd2c0299a | 475 | row = bmpYSize/8 + 1; |
Wimpie | 0:61dcd2c0299a | 476 | |
Wimpie | 0:61dcd2c0299a | 477 | _LoMark= 0; |
Wimpie | 0:61dcd2c0299a | 478 | _HiMark= LCD_CACHE_SIZE - 1; |
Wimpie | 0:61dcd2c0299a | 479 | |
Wimpie | 0:61dcd2c0299a | 480 | for (BYTE n = 0; n < row; n++) { |
Wimpie | 0:61dcd2c0299a | 481 | GLCD_locate(x0, y0); |
Wimpie | 0:61dcd2c0299a | 482 | |
Wimpie | 0:61dcd2c0299a | 483 | for (BYTE i = 0; i < bmpXSize; i++) { |
Wimpie | 0:61dcd2c0299a | 484 | LcdCache[LcdCacheIdx+ i]=bitmap[i + (n * bmpXSize)]; |
Wimpie | 0:61dcd2c0299a | 485 | } |
Wimpie | 0:61dcd2c0299a | 486 | y0++; |
Wimpie | 0:61dcd2c0299a | 487 | } |
Wimpie | 0:61dcd2c0299a | 488 | if (fupdate==TRUE) |
Wimpie | 0:61dcd2c0299a | 489 | GLCD_update(screen); |
Wimpie | 0:61dcd2c0299a | 490 | } |
Wimpie | 0:61dcd2c0299a | 491 | |
Wimpie | 0:61dcd2c0299a | 492 | void PCD8544MS::GLCD_writeString(BYTE x0, BYTE y0, char* string, eFonts font,ePixelMode pmode,eDisplayMode dmode,eSpaceMode smode, BYTE fupdate,int screen) { |
Wimpie | 0:61dcd2c0299a | 493 | |
Wimpie | 0:61dcd2c0299a | 494 | // pc_PCD8544.traceOut("\r\nwriteString"); |
Wimpie | 0:61dcd2c0299a | 495 | GLCD_locate(x0, y0); |
Wimpie | 0:61dcd2c0299a | 496 | chooseFont(font); |
Wimpie | 0:61dcd2c0299a | 497 | |
Wimpie | 0:61dcd2c0299a | 498 | while (*string) { |
Wimpie | 0:61dcd2c0299a | 499 | GLCD_writeChar(x0,y0,*string++,font,pmode, dmode, FALSE,screen); |
Wimpie | 0:61dcd2c0299a | 500 | x0+=_font_width; // width +1; |
Wimpie | 0:61dcd2c0299a | 501 | if (smode==SPACE_NORMAL) |
Wimpie | 0:61dcd2c0299a | 502 | x0++; |
Wimpie | 0:61dcd2c0299a | 503 | } |
Wimpie | 0:61dcd2c0299a | 504 | if (fupdate==TRUE) |
Wimpie | 0:61dcd2c0299a | 505 | GLCD_update(screen); |
Wimpie | 0:61dcd2c0299a | 506 | } |
Wimpie | 0:61dcd2c0299a | 507 | |
Wimpie | 0:61dcd2c0299a | 508 | void PCD8544MS::chooseFont(eFonts font) { |
Wimpie | 0:61dcd2c0299a | 509 | |
Wimpie | 0:61dcd2c0299a | 510 | switch (font) { |
Wimpie | 0:61dcd2c0299a | 511 | |
Wimpie | 0:61dcd2c0299a | 512 | case VERYSMALLFONT: { |
Wimpie | 0:61dcd2c0299a | 513 | _font_width = FONT3x5_WIDTH; |
Wimpie | 0:61dcd2c0299a | 514 | _font_height = FONT3x5_HEIGHT; |
Wimpie | 0:61dcd2c0299a | 515 | _font_start = FONT3x5_START; |
Wimpie | 0:61dcd2c0299a | 516 | _font_end = FONT3x5_END; |
Wimpie | 0:61dcd2c0299a | 517 | _font_bytes = FONT3x5_BYTES; |
Wimpie | 0:61dcd2c0299a | 518 | |
Wimpie | 0:61dcd2c0299a | 519 | _pFont = (unsigned char*) font_3x5; |
Wimpie | 0:61dcd2c0299a | 520 | |
Wimpie | 0:61dcd2c0299a | 521 | break; |
Wimpie | 0:61dcd2c0299a | 522 | } |
Wimpie | 0:61dcd2c0299a | 523 | case TINYFONT: { |
Wimpie | 0:61dcd2c0299a | 524 | _font_width = FONT5x7_WIDTH; |
Wimpie | 0:61dcd2c0299a | 525 | _font_height = FONT5x7_HEIGHT; |
Wimpie | 0:61dcd2c0299a | 526 | _font_start = FONT5x7_START; |
Wimpie | 0:61dcd2c0299a | 527 | _font_end = FONT5x7_END; |
Wimpie | 0:61dcd2c0299a | 528 | _font_bytes = FONT5x7_BYTES; |
Wimpie | 0:61dcd2c0299a | 529 | |
Wimpie | 0:61dcd2c0299a | 530 | _pFont = (unsigned char*) font_5x7; |
Wimpie | 0:61dcd2c0299a | 531 | |
Wimpie | 0:61dcd2c0299a | 532 | break; |
Wimpie | 0:61dcd2c0299a | 533 | } |
Wimpie | 0:61dcd2c0299a | 534 | |
Wimpie | 0:61dcd2c0299a | 535 | case SMALLFONT: { |
Wimpie | 0:61dcd2c0299a | 536 | _font_width = FONT6x8_WIDTH; |
Wimpie | 0:61dcd2c0299a | 537 | _font_height = FONT6x8_HEIGHT; |
Wimpie | 0:61dcd2c0299a | 538 | _font_start = FONT6x8_START; |
Wimpie | 0:61dcd2c0299a | 539 | _font_end = FONT6x8_END; |
Wimpie | 0:61dcd2c0299a | 540 | _font_bytes = FONT6x8_BYTES; |
Wimpie | 0:61dcd2c0299a | 541 | |
Wimpie | 0:61dcd2c0299a | 542 | _pFont = (unsigned char*) font_6x8; |
Wimpie | 0:61dcd2c0299a | 543 | |
Wimpie | 0:61dcd2c0299a | 544 | break; |
Wimpie | 0:61dcd2c0299a | 545 | } |
Wimpie | 0:61dcd2c0299a | 546 | case NORMALFONT: { |
Wimpie | 0:61dcd2c0299a | 547 | _font_width = FONT8x8_WIDTH; |
Wimpie | 0:61dcd2c0299a | 548 | _font_height = FONT8x8_HEIGHT; |
Wimpie | 0:61dcd2c0299a | 549 | _font_start = FONT8x8_START; |
Wimpie | 0:61dcd2c0299a | 550 | _font_end = FONT8x8_END; |
Wimpie | 0:61dcd2c0299a | 551 | _font_bytes = FONT8x8_BYTES; |
Wimpie | 0:61dcd2c0299a | 552 | |
Wimpie | 0:61dcd2c0299a | 553 | _pFont = (unsigned char*) font_8x8; |
Wimpie | 0:61dcd2c0299a | 554 | |
Wimpie | 0:61dcd2c0299a | 555 | break; |
Wimpie | 0:61dcd2c0299a | 556 | } |
Wimpie | 0:61dcd2c0299a | 557 | case BIGFONT: { |
Wimpie | 0:61dcd2c0299a | 558 | _font_width = FONT8x12_WIDTH; |
Wimpie | 0:61dcd2c0299a | 559 | _font_height = FONT8x12_HEIGHT; |
Wimpie | 0:61dcd2c0299a | 560 | _font_start = FONT8x12_START; |
Wimpie | 0:61dcd2c0299a | 561 | _font_end = FONT8x12_END; |
Wimpie | 0:61dcd2c0299a | 562 | _font_bytes = FONT8x12_BYTES; |
Wimpie | 0:61dcd2c0299a | 563 | |
Wimpie | 0:61dcd2c0299a | 564 | _pFont = (unsigned char*) font_8x12; |
Wimpie | 0:61dcd2c0299a | 565 | |
Wimpie | 0:61dcd2c0299a | 566 | break; |
Wimpie | 0:61dcd2c0299a | 567 | } |
Wimpie | 0:61dcd2c0299a | 568 | |
Wimpie | 0:61dcd2c0299a | 569 | case TIMENUMBERFONT: { |
Wimpie | 0:61dcd2c0299a | 570 | _font_width = FONT16x20_WIDTH; |
Wimpie | 0:61dcd2c0299a | 571 | _font_height = FONT16x20_HEIGHT; |
Wimpie | 0:61dcd2c0299a | 572 | _font_start = FONT16x20_START; |
Wimpie | 0:61dcd2c0299a | 573 | _font_end = FONT16x20_END; |
Wimpie | 0:61dcd2c0299a | 574 | _font_bytes = FONT16x20_BYTES; |
Wimpie | 0:61dcd2c0299a | 575 | |
Wimpie | 0:61dcd2c0299a | 576 | _pFont = (unsigned char*) font_16x20; |
Wimpie | 0:61dcd2c0299a | 577 | |
Wimpie | 0:61dcd2c0299a | 578 | break; |
Wimpie | 0:61dcd2c0299a | 579 | } |
Wimpie | 0:61dcd2c0299a | 580 | |
Wimpie | 0:61dcd2c0299a | 581 | case BIGNUMBERFONT: { |
Wimpie | 0:61dcd2c0299a | 582 | _font_width = FONT16x24_WIDTH; |
Wimpie | 0:61dcd2c0299a | 583 | _font_height = FONT16x24_HEIGHT; |
Wimpie | 0:61dcd2c0299a | 584 | _font_start = FONT16x24_START; |
Wimpie | 0:61dcd2c0299a | 585 | _font_end = FONT16x24_END; |
Wimpie | 0:61dcd2c0299a | 586 | _font_bytes = FONT16x24_BYTES; |
Wimpie | 0:61dcd2c0299a | 587 | |
Wimpie | 0:61dcd2c0299a | 588 | _pFont = (unsigned char*) font_16x24; |
Wimpie | 0:61dcd2c0299a | 589 | |
Wimpie | 0:61dcd2c0299a | 590 | break; |
Wimpie | 0:61dcd2c0299a | 591 | } |
Wimpie | 0:61dcd2c0299a | 592 | } |
Wimpie | 0:61dcd2c0299a | 593 | } |
Wimpie | 0:61dcd2c0299a | 594 | |
Wimpie | 0:61dcd2c0299a | 595 | void PCD8544MS::GLCD_writeChar(BYTE x0, BYTE y0, BYTE ch, eFonts font, ePixelMode pmode,eDisplayMode mode,BYTE fupdate,int screen) { |
Wimpie | 0:61dcd2c0299a | 596 | BYTE sendByte; |
Wimpie | 0:61dcd2c0299a | 597 | |
Wimpie | 0:61dcd2c0299a | 598 | chooseFont(font); |
Wimpie | 0:61dcd2c0299a | 599 | |
Wimpie | 0:61dcd2c0299a | 600 | if ((ch <= _font_start) || (ch > _font_end)) |
Wimpie | 0:61dcd2c0299a | 601 | ch=_font_start; |
Wimpie | 0:61dcd2c0299a | 602 | |
Wimpie | 0:61dcd2c0299a | 603 | ch -= _font_start; |
Wimpie | 0:61dcd2c0299a | 604 | |
Wimpie | 0:61dcd2c0299a | 605 | |
Wimpie | 0:61dcd2c0299a | 606 | /* for (BYTE i = 0; i < 3; i++) { |
Wimpie | 0:61dcd2c0299a | 607 | locate(x, y + i); |
Wimpie | 0:61dcd2c0299a | 608 | |
Wimpie | 0:61dcd2c0299a | 609 | for (BYTE j = 0; j < 16; j++) { |
Wimpie | 0:61dcd2c0299a | 610 | sendByte = *(pFont + ch*48 + i*16 + j); |
Wimpie | 0:61dcd2c0299a | 611 | writeData((mode == NORMAL)? sendByte : (sendByte^0xff)); |
Wimpie | 0:61dcd2c0299a | 612 | } |
Wimpie | 0:61dcd2c0299a | 613 | }*/ |
Wimpie | 0:61dcd2c0299a | 614 | |
Wimpie | 0:61dcd2c0299a | 615 | |
Wimpie | 0:61dcd2c0299a | 616 | for (int i = 0; i < _font_width; i++ ) { |
Wimpie | 0:61dcd2c0299a | 617 | for (int f=0; f<_font_bytes; f++) { |
Wimpie | 0:61dcd2c0299a | 618 | sendByte = *(_pFont + ch*_font_width*_font_bytes +f*_font_width+i); |
Wimpie | 0:61dcd2c0299a | 619 | sendByte = ((mode == DISPLAY_NORMAL)? sendByte:(sendByte ^ 0xff)); |
Wimpie | 0:61dcd2c0299a | 620 | |
Wimpie | 0:61dcd2c0299a | 621 | for (int j=0 ; j<_font_height; j++) { |
Wimpie | 0:61dcd2c0299a | 622 | if ((sendByte & 0x01) == 0x01) { |
Wimpie | 0:61dcd2c0299a | 623 | GLCD_drawpixel(x0,y0+j+f*8,PIXEL_ON,FALSE,screen); |
Wimpie | 0:61dcd2c0299a | 624 | } else { |
Wimpie | 0:61dcd2c0299a | 625 | GLCD_drawpixel(x0,y0+j+f*8,PIXEL_OFF,FALSE,screen); |
Wimpie | 0:61dcd2c0299a | 626 | } |
Wimpie | 0:61dcd2c0299a | 627 | sendByte=sendByte>>1; |
Wimpie | 0:61dcd2c0299a | 628 | } |
Wimpie | 0:61dcd2c0299a | 629 | } |
Wimpie | 0:61dcd2c0299a | 630 | x0++; |
Wimpie | 0:61dcd2c0299a | 631 | } |
Wimpie | 0:61dcd2c0299a | 632 | |
Wimpie | 0:61dcd2c0299a | 633 | |
Wimpie | 0:61dcd2c0299a | 634 | if (fupdate==TRUE) |
Wimpie | 0:61dcd2c0299a | 635 | GLCD_update(screen); |
Wimpie | 0:61dcd2c0299a | 636 | } |
Wimpie | 0:61dcd2c0299a | 637 | |
Wimpie | 0:61dcd2c0299a | 638 | |
Wimpie | 0:61dcd2c0299a | 639 | void PCD8544MS::GLCD_drawpixel(BYTE x0, BYTE y0, ePixelMode mode,BYTE fupdate,int screen) { |
Wimpie | 0:61dcd2c0299a | 640 | uint16_t index; |
Wimpie | 0:61dcd2c0299a | 641 | BYTE offset; |
Wimpie | 0:61dcd2c0299a | 642 | BYTE data; |
Wimpie | 0:61dcd2c0299a | 643 | |
Wimpie | 0:61dcd2c0299a | 644 | if ( x0 > LCD_X_RES-1 ) return; |
Wimpie | 0:61dcd2c0299a | 645 | if ( y0 > LCD_Y_RES-1 ) return; |
Wimpie | 0:61dcd2c0299a | 646 | |
Wimpie | 0:61dcd2c0299a | 647 | index = ((y0 / 8) * LCD_X_RES) + x0; |
Wimpie | 0:61dcd2c0299a | 648 | offset = y0 - ((y0 / 8) * 8); |
Wimpie | 0:61dcd2c0299a | 649 | |
Wimpie | 0:61dcd2c0299a | 650 | data = LcdCache[index]; |
Wimpie | 0:61dcd2c0299a | 651 | |
Wimpie | 0:61dcd2c0299a | 652 | if ( mode == PIXEL_OFF ) { |
Wimpie | 0:61dcd2c0299a | 653 | data &= (~(0x01 << offset)); |
Wimpie | 0:61dcd2c0299a | 654 | } else if ( mode == PIXEL_ON ) { |
Wimpie | 0:61dcd2c0299a | 655 | data |= (0x01 << offset); |
Wimpie | 0:61dcd2c0299a | 656 | } else if ( mode == PIXEL_XOR ) { |
Wimpie | 0:61dcd2c0299a | 657 | data ^= (0x01 << offset); |
Wimpie | 0:61dcd2c0299a | 658 | } |
Wimpie | 0:61dcd2c0299a | 659 | LcdCache[index] = data; |
Wimpie | 0:61dcd2c0299a | 660 | |
Wimpie | 0:61dcd2c0299a | 661 | if ( index < _LoMark ) { |
Wimpie | 0:61dcd2c0299a | 662 | _LoMark = index; |
Wimpie | 0:61dcd2c0299a | 663 | } |
Wimpie | 0:61dcd2c0299a | 664 | if ( index > _HiMark ) { |
Wimpie | 0:61dcd2c0299a | 665 | _HiMark = index; |
Wimpie | 0:61dcd2c0299a | 666 | } |
Wimpie | 0:61dcd2c0299a | 667 | if (fupdate==TRUE) |
Wimpie | 0:61dcd2c0299a | 668 | GLCD_update(screen); |
Wimpie | 0:61dcd2c0299a | 669 | } |
Wimpie | 0:61dcd2c0299a | 670 | |
Wimpie | 0:61dcd2c0299a | 671 | void PCD8544MS::GLCD_drawline(BYTE x0, BYTE y0, BYTE x1, BYTE y1, ePixelMode mode,BYTE fupdate,int screen) { |
Wimpie | 0:61dcd2c0299a | 672 | int dx, dy, stepx, stepy, fraction; |
Wimpie | 0:61dcd2c0299a | 673 | |
Wimpie | 0:61dcd2c0299a | 674 | dy = y1 - y0; |
Wimpie | 0:61dcd2c0299a | 675 | dx = x1 - x0; |
Wimpie | 0:61dcd2c0299a | 676 | if ( dy < 0 ) { |
Wimpie | 0:61dcd2c0299a | 677 | dy = -dy; |
Wimpie | 0:61dcd2c0299a | 678 | stepy = -1; |
Wimpie | 0:61dcd2c0299a | 679 | } else { |
Wimpie | 0:61dcd2c0299a | 680 | stepy = 1; |
Wimpie | 0:61dcd2c0299a | 681 | } |
Wimpie | 0:61dcd2c0299a | 682 | if ( dx < 0 ) { |
Wimpie | 0:61dcd2c0299a | 683 | dx = -dx; |
Wimpie | 0:61dcd2c0299a | 684 | stepx = -1; |
Wimpie | 0:61dcd2c0299a | 685 | } else { |
Wimpie | 0:61dcd2c0299a | 686 | stepx = 1; |
Wimpie | 0:61dcd2c0299a | 687 | } |
Wimpie | 0:61dcd2c0299a | 688 | dx <<= 1; |
Wimpie | 0:61dcd2c0299a | 689 | dy <<= 1; |
Wimpie | 0:61dcd2c0299a | 690 | |
Wimpie | 0:61dcd2c0299a | 691 | GLCD_drawpixel( x0, y0, mode , FALSE,screen); |
Wimpie | 0:61dcd2c0299a | 692 | if ( dx > dy ) { |
Wimpie | 0:61dcd2c0299a | 693 | fraction = dy - (dx >> 1); |
Wimpie | 0:61dcd2c0299a | 694 | while ( x0 != x1 ) { |
Wimpie | 0:61dcd2c0299a | 695 | if ( fraction >= 0 ) { |
Wimpie | 0:61dcd2c0299a | 696 | y0 += stepy; |
Wimpie | 0:61dcd2c0299a | 697 | fraction -= dx; |
Wimpie | 0:61dcd2c0299a | 698 | } |
Wimpie | 0:61dcd2c0299a | 699 | x0 += stepx; |
Wimpie | 0:61dcd2c0299a | 700 | fraction += dy; |
Wimpie | 0:61dcd2c0299a | 701 | GLCD_drawpixel( x0, y0, mode , FALSE,screen); |
Wimpie | 0:61dcd2c0299a | 702 | } |
Wimpie | 0:61dcd2c0299a | 703 | } else { |
Wimpie | 0:61dcd2c0299a | 704 | fraction = dx - (dy >> 1); |
Wimpie | 0:61dcd2c0299a | 705 | while ( y0 != y1 ) { |
Wimpie | 0:61dcd2c0299a | 706 | if ( fraction >= 0 ) { |
Wimpie | 0:61dcd2c0299a | 707 | x0 += stepx; |
Wimpie | 0:61dcd2c0299a | 708 | fraction -= dy; |
Wimpie | 0:61dcd2c0299a | 709 | } |
Wimpie | 0:61dcd2c0299a | 710 | y0 += stepy; |
Wimpie | 0:61dcd2c0299a | 711 | fraction += dx; |
Wimpie | 0:61dcd2c0299a | 712 | GLCD_drawpixel( x0, y0, mode , FALSE,screen); |
Wimpie | 0:61dcd2c0299a | 713 | } |
Wimpie | 0:61dcd2c0299a | 714 | } |
Wimpie | 0:61dcd2c0299a | 715 | if (fupdate==TRUE) |
Wimpie | 0:61dcd2c0299a | 716 | GLCD_update(screen); |
Wimpie | 0:61dcd2c0299a | 717 | } |
Wimpie | 0:61dcd2c0299a | 718 | |
Wimpie | 0:61dcd2c0299a | 719 | void PCD8544MS::GLCD_drawrectangle(BYTE x0, BYTE y0, BYTE x1, BYTE y1, eFillMode fill, ePixelMode mode,BYTE fupdate,int screen) { |
Wimpie | 0:61dcd2c0299a | 720 | if (fill==1) { |
Wimpie | 0:61dcd2c0299a | 721 | BYTE i, xmin, xmax, ymin, ymax; |
Wimpie | 0:61dcd2c0299a | 722 | if (x0 < x1) { // Find x min and max |
Wimpie | 0:61dcd2c0299a | 723 | xmin = x0; |
Wimpie | 0:61dcd2c0299a | 724 | xmax = x1; |
Wimpie | 0:61dcd2c0299a | 725 | } else { |
Wimpie | 0:61dcd2c0299a | 726 | xmin = x1; |
Wimpie | 0:61dcd2c0299a | 727 | xmax = x0; |
Wimpie | 0:61dcd2c0299a | 728 | } |
Wimpie | 0:61dcd2c0299a | 729 | if (y0 < y1) { // Find the y min and max |
Wimpie | 0:61dcd2c0299a | 730 | ymin = y0; |
Wimpie | 0:61dcd2c0299a | 731 | ymax = y1; |
Wimpie | 0:61dcd2c0299a | 732 | } else { |
Wimpie | 0:61dcd2c0299a | 733 | ymin = y1; |
Wimpie | 0:61dcd2c0299a | 734 | ymax = y0; |
Wimpie | 0:61dcd2c0299a | 735 | } |
Wimpie | 0:61dcd2c0299a | 736 | for (; xmin <= xmax; ++xmin) { |
Wimpie | 0:61dcd2c0299a | 737 | for (i=ymin; i<=ymax; ++i) { |
Wimpie | 0:61dcd2c0299a | 738 | GLCD_drawpixel(xmin, i, mode, FALSE,screen); |
Wimpie | 0:61dcd2c0299a | 739 | } |
Wimpie | 0:61dcd2c0299a | 740 | } |
Wimpie | 0:61dcd2c0299a | 741 | } else { |
Wimpie | 0:61dcd2c0299a | 742 | GLCD_drawline(x0, y0, x1, y0, mode, FALSE,screen); // Draw the 4 sides |
Wimpie | 0:61dcd2c0299a | 743 | GLCD_drawline(x0, y1, x1, y1, mode, FALSE,screen); |
Wimpie | 0:61dcd2c0299a | 744 | GLCD_drawline(x0, y0, x0, y1, mode, FALSE,screen); |
Wimpie | 0:61dcd2c0299a | 745 | GLCD_drawline(x1, y0, x1, y1, mode, FALSE,screen); |
Wimpie | 0:61dcd2c0299a | 746 | } |
Wimpie | 0:61dcd2c0299a | 747 | if (fupdate==TRUE) |
Wimpie | 0:61dcd2c0299a | 748 | GLCD_update(screen); |
Wimpie | 0:61dcd2c0299a | 749 | } |
Wimpie | 0:61dcd2c0299a | 750 | |
Wimpie | 0:61dcd2c0299a | 751 | |
Wimpie | 0:61dcd2c0299a | 752 | void PCD8544MS::GLCD_drawcircle(BYTE x0, BYTE y0, BYTE radius, eFillMode fill, ePixelMode mode, BYTE fupdate,int screen) { |
Wimpie | 0:61dcd2c0299a | 753 | int err, x, y; |
Wimpie | 0:61dcd2c0299a | 754 | |
Wimpie | 0:61dcd2c0299a | 755 | err = -radius; |
Wimpie | 0:61dcd2c0299a | 756 | x = radius; |
Wimpie | 0:61dcd2c0299a | 757 | y = 0; |
Wimpie | 0:61dcd2c0299a | 758 | |
Wimpie | 0:61dcd2c0299a | 759 | while (x >= y) { |
Wimpie | 0:61dcd2c0299a | 760 | if (fill==1) { |
Wimpie | 0:61dcd2c0299a | 761 | GLCD_drawline(x0 - x, y0 + y, x0 + x, y0 + y, mode,FALSE,screen); |
Wimpie | 0:61dcd2c0299a | 762 | GLCD_drawline(x0 - x, y0 - y, x0 + x, y0 - y, mode,FALSE,screen); |
Wimpie | 0:61dcd2c0299a | 763 | GLCD_drawline(x0 - y, y0 + x, x0 + y, y0 + x, mode,FALSE,screen); |
Wimpie | 0:61dcd2c0299a | 764 | GLCD_drawline(x0 - y, y0 - x, x0 + y, y0 - x, mode,FALSE,screen); |
Wimpie | 0:61dcd2c0299a | 765 | } else { |
Wimpie | 0:61dcd2c0299a | 766 | GLCD_drawpixel(x0 + x, y0 + y, mode,FALSE,screen); |
Wimpie | 0:61dcd2c0299a | 767 | GLCD_drawpixel(x0 - x, y0 + y, mode,FALSE,screen); |
Wimpie | 0:61dcd2c0299a | 768 | GLCD_drawpixel(x0 + x, y0 - y, mode,FALSE,screen); |
Wimpie | 0:61dcd2c0299a | 769 | GLCD_drawpixel(x0 - x, y0 - y, mode,FALSE,screen); |
Wimpie | 0:61dcd2c0299a | 770 | GLCD_drawpixel(x0 + y, y0 + x, mode,FALSE,screen); |
Wimpie | 0:61dcd2c0299a | 771 | GLCD_drawpixel(x0 - y, y0 + x, mode,FALSE,screen); |
Wimpie | 0:61dcd2c0299a | 772 | GLCD_drawpixel(x0 + y, y0 - x, mode,FALSE,screen); |
Wimpie | 0:61dcd2c0299a | 773 | GLCD_drawpixel(x0 - y, y0 - x, mode,FALSE,screen); |
Wimpie | 0:61dcd2c0299a | 774 | } |
Wimpie | 0:61dcd2c0299a | 775 | err += y; |
Wimpie | 0:61dcd2c0299a | 776 | y++; |
Wimpie | 0:61dcd2c0299a | 777 | err += y; |
Wimpie | 0:61dcd2c0299a | 778 | if (err >= 0) { |
Wimpie | 0:61dcd2c0299a | 779 | x--; |
Wimpie | 0:61dcd2c0299a | 780 | err -= x; |
Wimpie | 0:61dcd2c0299a | 781 | err -= x; |
Wimpie | 0:61dcd2c0299a | 782 | } |
Wimpie | 0:61dcd2c0299a | 783 | } |
Wimpie | 0:61dcd2c0299a | 784 | |
Wimpie | 0:61dcd2c0299a | 785 | if (fupdate==TRUE) |
Wimpie | 0:61dcd2c0299a | 786 | GLCD_update(screen); |
Wimpie | 0:61dcd2c0299a | 787 | |
Wimpie | 0:61dcd2c0299a | 788 | } |
Wimpie | 0:61dcd2c0299a | 789 | |
Wimpie | 0:61dcd2c0299a | 790 | void PCD8544MS::GLCD_drawprogressbar(BYTE x0, BYTE y0, BYTE w, BYTE h, BYTE percentage,BYTE fupdate,int screen) { |
Wimpie | 0:61dcd2c0299a | 791 | GLCD_drawrectangle(x0,y0,x0+w,y0+h,FILL_OFF,PIXEL_ON, FALSE,screen); |
Wimpie | 0:61dcd2c0299a | 792 | GLCD_drawrectangle(x0+2,y0+2,x0+w-2,y0+h-2,FILL_ON,PIXEL_OFF, FALSE,screen); |
Wimpie | 0:61dcd2c0299a | 793 | GLCD_drawrectangle(x0+2,y0+2,x0+2+(percentage*(w-4)/100),y0+h-2,FILL_ON,PIXEL_ON, FALSE,screen); |
Wimpie | 0:61dcd2c0299a | 794 | if (fupdate==TRUE) |
Wimpie | 0:61dcd2c0299a | 795 | GLCD_update(screen); |
Wimpie | 0:61dcd2c0299a | 796 | } |
Wimpie | 0:61dcd2c0299a | 797 | |
Wimpie | 0:61dcd2c0299a | 798 | void PCD8544MS::GLCD_drawchart(BYTE x0, BYTE y0, BYTE w, BYTE h, BYTE unitx, BYTE unity, |
Wimpie | 0:61dcd2c0299a | 799 | eRasterMode rMode, eChartMode cMode,eDrawMode dMode, int16_t * val, int size, int t,int screen) { |
Wimpie | 0:61dcd2c0299a | 800 | int maxy; |
Wimpie | 0:61dcd2c0299a | 801 | int _scale=1; |
Wimpie | 0:61dcd2c0299a | 802 | int prescale=1; |
Wimpie | 0:61dcd2c0299a | 803 | |
Wimpie | 0:61dcd2c0299a | 804 | signed char v1,v2; |
Wimpie | 0:61dcd2c0299a | 805 | char buffer[4]; |
Wimpie | 0:61dcd2c0299a | 806 | |
Wimpie | 0:61dcd2c0299a | 807 | if (size>w) |
Wimpie | 0:61dcd2c0299a | 808 | size=w; |
Wimpie | 0:61dcd2c0299a | 809 | |
Wimpie | 0:61dcd2c0299a | 810 | // search maximum value to calculate scale |
Wimpie | 0:61dcd2c0299a | 811 | if (dMode==DRAW_OVERWRITE) { |
Wimpie | 0:61dcd2c0299a | 812 | maxy=0; |
Wimpie | 0:61dcd2c0299a | 813 | for (int i=0; i<size; i++) { |
Wimpie | 0:61dcd2c0299a | 814 | if (val[i]>maxy) |
Wimpie | 0:61dcd2c0299a | 815 | maxy=val[i]; |
Wimpie | 0:61dcd2c0299a | 816 | |
Wimpie | 0:61dcd2c0299a | 817 | } |
Wimpie | 0:61dcd2c0299a | 818 | |
Wimpie | 0:61dcd2c0299a | 819 | if (maxy>h) { //scale can be 1,2,5 *10i |
Wimpie | 0:61dcd2c0299a | 820 | prescale= ((maxy-1)/((h/unity)*unity)); |
Wimpie | 0:61dcd2c0299a | 821 | _scale=1; |
Wimpie | 0:61dcd2c0299a | 822 | while (prescale>10) { |
Wimpie | 0:61dcd2c0299a | 823 | _scale=_scale*10; |
Wimpie | 0:61dcd2c0299a | 824 | prescale=prescale/10; |
Wimpie | 0:61dcd2c0299a | 825 | } |
Wimpie | 0:61dcd2c0299a | 826 | if (prescale>1) |
Wimpie | 0:61dcd2c0299a | 827 | _scale=_scale*5; |
Wimpie | 0:61dcd2c0299a | 828 | else if (prescale==1) |
Wimpie | 0:61dcd2c0299a | 829 | _scale =_scale*2; |
Wimpie | 0:61dcd2c0299a | 830 | |
Wimpie | 0:61dcd2c0299a | 831 | |
Wimpie | 0:61dcd2c0299a | 832 | } |
Wimpie | 0:61dcd2c0299a | 833 | Scale=_scale; |
Wimpie | 0:61dcd2c0299a | 834 | } |
Wimpie | 0:61dcd2c0299a | 835 | |
Wimpie | 0:61dcd2c0299a | 836 | if (dMode==DRAW_OVERWRITE) { |
Wimpie | 0:61dcd2c0299a | 837 | GLCD_drawrectangle(x0-11,y0-h,x0+w,y0+4+7,FILL_ON,PIXEL_OFF,FALSE,screen); |
Wimpie | 0:61dcd2c0299a | 838 | GLCD_drawline(x0,y0,x0,y0-h,PIXEL_ON,FALSE,screen); |
Wimpie | 0:61dcd2c0299a | 839 | GLCD_drawline(x0,y0,x0+w,y0,PIXEL_ON,FALSE,screen); |
Wimpie | 0:61dcd2c0299a | 840 | |
Wimpie | 0:61dcd2c0299a | 841 | //drawrectangle(x0,y0-h,x0+w,y0,FILL_OFF,PIXEL_ON,FALSE); |
Wimpie | 0:61dcd2c0299a | 842 | |
Wimpie | 0:61dcd2c0299a | 843 | for (int i=0; i<=h; i++) { |
Wimpie | 0:61dcd2c0299a | 844 | if ((i % unity) == 0) { |
Wimpie | 0:61dcd2c0299a | 845 | GLCD_drawpixel(x0-2,y0-i,PIXEL_ON,FALSE,screen); |
Wimpie | 0:61dcd2c0299a | 846 | // drawpixel(x0+w+2,y0-i,PIXEL_ON,FALSE); |
Wimpie | 0:61dcd2c0299a | 847 | |
Wimpie | 0:61dcd2c0299a | 848 | if (rMode==RASTER_ON) { |
Wimpie | 0:61dcd2c0299a | 849 | for (int r=0; r<=w; r++) { |
Wimpie | 0:61dcd2c0299a | 850 | if ((r % 2) ==0) |
Wimpie | 0:61dcd2c0299a | 851 | GLCD_drawpixel(x0+r,y0-i,PIXEL_ON,FALSE,screen); |
Wimpie | 0:61dcd2c0299a | 852 | } |
Wimpie | 0:61dcd2c0299a | 853 | } |
Wimpie | 0:61dcd2c0299a | 854 | // draw vertical axis labels |
Wimpie | 0:61dcd2c0299a | 855 | |
Wimpie | 0:61dcd2c0299a | 856 | itostr(buffer,i*Scale); |
Wimpie | 0:61dcd2c0299a | 857 | |
Wimpie | 0:61dcd2c0299a | 858 | // pc_PCD8544.traceOut(" %i %s |",i*Scale,buffer); |
Wimpie | 0:61dcd2c0299a | 859 | GLCD_writeString(x0-11,y0-i+1,buffer,VERYSMALLFONT,PIXEL_OFF,DISPLAY_NORMAL,SPACE_NONE,FALSE,screen); |
Wimpie | 0:61dcd2c0299a | 860 | |
Wimpie | 0:61dcd2c0299a | 861 | } |
Wimpie | 0:61dcd2c0299a | 862 | if ((i % 2) == 0) { |
Wimpie | 0:61dcd2c0299a | 863 | GLCD_drawpixel(x0-1,y0-i,PIXEL_ON,FALSE,screen); |
Wimpie | 0:61dcd2c0299a | 864 | // drawpixel(x0+w+1,y0-i,PIXEL_ON,FALSE); |
Wimpie | 0:61dcd2c0299a | 865 | } |
Wimpie | 0:61dcd2c0299a | 866 | } |
Wimpie | 0:61dcd2c0299a | 867 | |
Wimpie | 0:61dcd2c0299a | 868 | for (int i=0; i<=w; i++) { |
Wimpie | 0:61dcd2c0299a | 869 | if (((i+(t % unitx)) % unitx) == 0) { |
Wimpie | 0:61dcd2c0299a | 870 | GLCD_drawpixel(x0+i,y0+2,PIXEL_ON,FALSE,screen); |
Wimpie | 0:61dcd2c0299a | 871 | |
Wimpie | 0:61dcd2c0299a | 872 | if (rMode==RASTER_ON) { |
Wimpie | 0:61dcd2c0299a | 873 | for (int r=0; r<=h; r++) { |
Wimpie | 0:61dcd2c0299a | 874 | if ((r % 2) ==0) |
Wimpie | 0:61dcd2c0299a | 875 | GLCD_drawpixel(x0+i,y0-r,PIXEL_ON,FALSE,screen); |
Wimpie | 0:61dcd2c0299a | 876 | } |
Wimpie | 0:61dcd2c0299a | 877 | } |
Wimpie | 0:61dcd2c0299a | 878 | if (((t-w+i)/unitx)>=0) |
Wimpie | 0:61dcd2c0299a | 879 | snprintf(buffer,3,"%i",((t-w+i)/unitx)); |
Wimpie | 0:61dcd2c0299a | 880 | else |
Wimpie | 0:61dcd2c0299a | 881 | snprintf(buffer,3,"%i",24+((t-w+i)/unitx)); |
Wimpie | 0:61dcd2c0299a | 882 | |
Wimpie | 0:61dcd2c0299a | 883 | // pc_PCD8544.traceOut(" %i %s ",(t-w+i)/unitx,buffer); |
Wimpie | 0:61dcd2c0299a | 884 | GLCD_writeString(x0+i-3,y0+4,buffer,VERYSMALLFONT,PIXEL_OFF,DISPLAY_NORMAL,SPACE_NORMAL,FALSE,screen); |
Wimpie | 0:61dcd2c0299a | 885 | } |
Wimpie | 0:61dcd2c0299a | 886 | if ((i % 2) == 0) { |
Wimpie | 0:61dcd2c0299a | 887 | GLCD_drawpixel(x0+i,y0+1,PIXEL_ON,FALSE,screen); |
Wimpie | 0:61dcd2c0299a | 888 | } |
Wimpie | 0:61dcd2c0299a | 889 | } |
Wimpie | 0:61dcd2c0299a | 890 | // update(); |
Wimpie | 0:61dcd2c0299a | 891 | } |
Wimpie | 0:61dcd2c0299a | 892 | |
Wimpie | 0:61dcd2c0299a | 893 | for (int i=0; i<size; i++) { |
Wimpie | 0:61dcd2c0299a | 894 | // pc_PCD8544.traceOut(" %i ",val[i]); |
Wimpie | 0:61dcd2c0299a | 895 | v1 = val[i] / Scale; |
Wimpie | 0:61dcd2c0299a | 896 | if (v1>h) |
Wimpie | 0:61dcd2c0299a | 897 | v1=h; |
Wimpie | 0:61dcd2c0299a | 898 | |
Wimpie | 0:61dcd2c0299a | 899 | if (i!=(size-1)) { |
Wimpie | 0:61dcd2c0299a | 900 | v2 = val[i+1] / Scale; |
Wimpie | 0:61dcd2c0299a | 901 | if (v2>h) |
Wimpie | 0:61dcd2c0299a | 902 | v2=h; |
Wimpie | 0:61dcd2c0299a | 903 | } else |
Wimpie | 0:61dcd2c0299a | 904 | v2=v1; |
Wimpie | 0:61dcd2c0299a | 905 | |
Wimpie | 0:61dcd2c0299a | 906 | |
Wimpie | 0:61dcd2c0299a | 907 | switch (cMode) { |
Wimpie | 0:61dcd2c0299a | 908 | case C_POINT: { |
Wimpie | 0:61dcd2c0299a | 909 | GLCD_drawpixel(x0+i,y0-v1,PIXEL_ON,FALSE,screen); |
Wimpie | 0:61dcd2c0299a | 910 | break; |
Wimpie | 0:61dcd2c0299a | 911 | } |
Wimpie | 0:61dcd2c0299a | 912 | case C_LINE: { |
Wimpie | 0:61dcd2c0299a | 913 | GLCD_drawline(x0+i,y0-v1,x0+i+1,y0-v2,PIXEL_ON,FALSE,screen); |
Wimpie | 0:61dcd2c0299a | 914 | break; |
Wimpie | 0:61dcd2c0299a | 915 | } |
Wimpie | 0:61dcd2c0299a | 916 | case C_VLINE: { |
Wimpie | 0:61dcd2c0299a | 917 | GLCD_drawline(x0+i,y0-v1,x0+i,y0,PIXEL_ON,FALSE,screen); |
Wimpie | 0:61dcd2c0299a | 918 | break; |
Wimpie | 0:61dcd2c0299a | 919 | } |
Wimpie | 0:61dcd2c0299a | 920 | } |
Wimpie | 0:61dcd2c0299a | 921 | } |
Wimpie | 0:61dcd2c0299a | 922 | |
Wimpie | 0:61dcd2c0299a | 923 | GLCD_update(screen); |
Wimpie | 0:61dcd2c0299a | 924 | } |
Wimpie | 0:61dcd2c0299a | 925 |