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 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