4DGL-uLCD-SE

Dependents:   ECE2035_SUM17_Project Air_Rendezvous_transmitter Transmitter app-board-RTOS-Threads ... more

Committer:
kennyainny
Date:
Fri Jul 14 21:42:47 2017 +0000
Revision:
0:19588ac80c02
no changes;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kennyainny 0:19588ac80c02 1 //
kennyainny 0:19588ac80c02 2 // uLCD_4DGL is a class to drive 4D Systems uLCD 144 G2
kennyainny 0:19588ac80c02 3 //
kennyainny 0:19588ac80c02 4 // Copyright (C) <2010> Stephane ROCHON <stephane.rochon at free.fr>
kennyainny 0:19588ac80c02 5 // Modifed for Goldelox processor <2013> Jim Hamblen
kennyainny 0:19588ac80c02 6 //
kennyainny 0:19588ac80c02 7 // uLCD_4DGL is free software: you can redistribute it and/or modify
kennyainny 0:19588ac80c02 8 // it under the terms of the GNU General Public License as published by
kennyainny 0:19588ac80c02 9 // the Free Software Foundation, either version 3 of the License, or
kennyainny 0:19588ac80c02 10 // (at your option) any later version.
kennyainny 0:19588ac80c02 11 //
kennyainny 0:19588ac80c02 12 // uLCD_4DGL is distributed in the hope that it will be useful,
kennyainny 0:19588ac80c02 13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
kennyainny 0:19588ac80c02 14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
kennyainny 0:19588ac80c02 15 // GNU General Public License for more details.
kennyainny 0:19588ac80c02 16 //
kennyainny 0:19588ac80c02 17 // You should have received a copy of the GNU General Public License
kennyainny 0:19588ac80c02 18 // along with uLCD_4DGL. If not, see <http://www.gnu.org/licenses/>.
kennyainny 0:19588ac80c02 19
kennyainny 0:19588ac80c02 20 #include "mbed.h"
kennyainny 0:19588ac80c02 21 #include "uLCD_4DGL.h"
kennyainny 0:19588ac80c02 22
kennyainny 0:19588ac80c02 23 #define ARRAY_SIZE(X) sizeof(X)/sizeof(X[0])
kennyainny 0:19588ac80c02 24
kennyainny 0:19588ac80c02 25 //Serial pc(USBTX,USBRX);
kennyainny 0:19588ac80c02 26
kennyainny 0:19588ac80c02 27
kennyainny 0:19588ac80c02 28 //******************************************************************************************************
kennyainny 0:19588ac80c02 29 uLCD_4DGL :: uLCD_4DGL(PinName tx, PinName rx, PinName rst) : _cmd(tx, rx),
kennyainny 0:19588ac80c02 30 _rst(rst)
kennyainny 0:19588ac80c02 31 #if DEBUGMODE
kennyainny 0:19588ac80c02 32 ,pc(USBTX, USBRX)
kennyainny 0:19588ac80c02 33 #endif // DEBUGMODE
kennyainny 0:19588ac80c02 34 {
kennyainny 0:19588ac80c02 35 // Constructor
kennyainny 0:19588ac80c02 36 _cmd.baud(9600);
kennyainny 0:19588ac80c02 37 #if DEBUGMODE
kennyainny 0:19588ac80c02 38 pc.baud(115200);
kennyainny 0:19588ac80c02 39
kennyainny 0:19588ac80c02 40 pc.printf("\n\n\n");
kennyainny 0:19588ac80c02 41 pc.printf("*********************\n");
kennyainny 0:19588ac80c02 42 pc.printf("uLCD_4DGL CONSTRUCTOR\n");
kennyainny 0:19588ac80c02 43 pc.printf("*********************\n");
kennyainny 0:19588ac80c02 44 #endif
kennyainny 0:19588ac80c02 45
kennyainny 0:19588ac80c02 46 _rst = 1; // put RESET pin to high to start TFT screen
kennyainny 0:19588ac80c02 47 reset();
kennyainny 0:19588ac80c02 48 cls(); // clear screen
kennyainny 0:19588ac80c02 49 current_col = 0; // initial cursor col
kennyainny 0:19588ac80c02 50 current_row = 0; // initial cursor row
kennyainny 0:19588ac80c02 51 current_color = WHITE; // initial text color
kennyainny 0:19588ac80c02 52 current_orientation = IS_PORTRAIT; // initial screen orientation
kennyainny 0:19588ac80c02 53 current_hf = 1;
kennyainny 0:19588ac80c02 54 current_wf = 1;
kennyainny 0:19588ac80c02 55 set_font(FONT_7X8); // initial font
kennyainny 0:19588ac80c02 56 // text_mode(OPAQUE); // initial texr mode
kennyainny 0:19588ac80c02 57 }
kennyainny 0:19588ac80c02 58
kennyainny 0:19588ac80c02 59 //******************************************************************************************************
kennyainny 0:19588ac80c02 60 void uLCD_4DGL :: writeBYTE(char c) // send a BYTE command to screen
kennyainny 0:19588ac80c02 61 {
kennyainny 0:19588ac80c02 62
kennyainny 0:19588ac80c02 63 _cmd.putc(c);
kennyainny 0:19588ac80c02 64 wait_us(500); //mbed is too fast for LCD at high baud rates in some long commands
kennyainny 0:19588ac80c02 65
kennyainny 0:19588ac80c02 66 #if DEBUGMODE
kennyainny 0:19588ac80c02 67 pc.printf(" Char sent : 0x%02X\n",c);
kennyainny 0:19588ac80c02 68 #endif
kennyainny 0:19588ac80c02 69
kennyainny 0:19588ac80c02 70 }
kennyainny 0:19588ac80c02 71
kennyainny 0:19588ac80c02 72 //******************************************************************************************************
kennyainny 0:19588ac80c02 73 void uLCD_4DGL :: writeBYTEfast(char c) // send a BYTE command to screen
kennyainny 0:19588ac80c02 74 {
kennyainny 0:19588ac80c02 75
kennyainny 0:19588ac80c02 76 _cmd.putc(c);
kennyainny 0:19588ac80c02 77 //wait_ms(0.0); //mbed is too fast for LCD at high baud rates - but not in short commands
kennyainny 0:19588ac80c02 78
kennyainny 0:19588ac80c02 79 #if DEBUGMODE
kennyainny 0:19588ac80c02 80 pc.printf(" Char sent : 0x%02X\n",c);
kennyainny 0:19588ac80c02 81 #endif
kennyainny 0:19588ac80c02 82
kennyainny 0:19588ac80c02 83 }
kennyainny 0:19588ac80c02 84 //******************************************************************************************************
kennyainny 0:19588ac80c02 85 void uLCD_4DGL :: freeBUFFER(void) // Clear serial buffer before writing command
kennyainny 0:19588ac80c02 86 {
kennyainny 0:19588ac80c02 87
kennyainny 0:19588ac80c02 88 while (_cmd.readable()) _cmd.getc(); // clear buffer garbage
kennyainny 0:19588ac80c02 89 }
kennyainny 0:19588ac80c02 90
kennyainny 0:19588ac80c02 91 //******************************************************************************************************
kennyainny 0:19588ac80c02 92 int uLCD_4DGL :: writeCOMMAND(char *command, int number) // send several BYTES making a command and return an answer
kennyainny 0:19588ac80c02 93 {
kennyainny 0:19588ac80c02 94
kennyainny 0:19588ac80c02 95 #if DEBUGMODE
kennyainny 0:19588ac80c02 96 pc.printf("\n");
kennyainny 0:19588ac80c02 97 pc.printf("New COMMAND : 0x%02X\n", command[0]);
kennyainny 0:19588ac80c02 98 #endif
kennyainny 0:19588ac80c02 99 int i, resp = 0;
kennyainny 0:19588ac80c02 100 freeBUFFER();
kennyainny 0:19588ac80c02 101 writeBYTE(0xFF);
kennyainny 0:19588ac80c02 102 for (i = 0; i < number; i++) {
kennyainny 0:19588ac80c02 103 if (i<16)
kennyainny 0:19588ac80c02 104 writeBYTEfast(command[i]); // send command to serial port
kennyainny 0:19588ac80c02 105 else
kennyainny 0:19588ac80c02 106 writeBYTE(command[i]); // send command to serial port but slower
kennyainny 0:19588ac80c02 107 }
kennyainny 0:19588ac80c02 108 while (!_cmd.readable()) wait_ms(TEMPO); // wait for screen answer
kennyainny 0:19588ac80c02 109 if (_cmd.readable()) resp = _cmd.getc(); // read response if any
kennyainny 0:19588ac80c02 110 switch (resp) {
kennyainny 0:19588ac80c02 111 case ACK : // if OK return 1
kennyainny 0:19588ac80c02 112 resp = 1;
kennyainny 0:19588ac80c02 113 break;
kennyainny 0:19588ac80c02 114 case NAK : // if NOK return -1
kennyainny 0:19588ac80c02 115 resp = -1;
kennyainny 0:19588ac80c02 116 break;
kennyainny 0:19588ac80c02 117 default :
kennyainny 0:19588ac80c02 118 resp = 0; // else return 0
kennyainny 0:19588ac80c02 119 break;
kennyainny 0:19588ac80c02 120 }
kennyainny 0:19588ac80c02 121 #if DEBUGMODE
kennyainny 0:19588ac80c02 122 pc.printf(" Answer received : %d\n",resp);
kennyainny 0:19588ac80c02 123 #endif
kennyainny 0:19588ac80c02 124
kennyainny 0:19588ac80c02 125 return resp;
kennyainny 0:19588ac80c02 126 }
kennyainny 0:19588ac80c02 127
kennyainny 0:19588ac80c02 128 //**************************************************************************
kennyainny 0:19588ac80c02 129 void uLCD_4DGL :: reset() // Reset Screen
kennyainny 0:19588ac80c02 130 {
kennyainny 0:19588ac80c02 131 wait_ms(5);
kennyainny 0:19588ac80c02 132 _rst = 0; // put RESET pin to low
kennyainny 0:19588ac80c02 133 wait_ms(5); // wait a few milliseconds for command reception
kennyainny 0:19588ac80c02 134 _rst = 1; // put RESET back to high
kennyainny 0:19588ac80c02 135 wait(3); // wait 3s for screen to restart
kennyainny 0:19588ac80c02 136
kennyainny 0:19588ac80c02 137 freeBUFFER(); // clean buffer from possible garbage
kennyainny 0:19588ac80c02 138 }
kennyainny 0:19588ac80c02 139 //******************************************************************************************************
kennyainny 0:19588ac80c02 140 int uLCD_4DGL :: writeCOMMANDnull(char *command, int number) // send several BYTES making a command and return an answer
kennyainny 0:19588ac80c02 141 {
kennyainny 0:19588ac80c02 142
kennyainny 0:19588ac80c02 143 #if DEBUGMODE
kennyainny 0:19588ac80c02 144 pc.printf("\n");
kennyainny 0:19588ac80c02 145 pc.printf("New COMMAND : 0x%02X\n", command[0]);
kennyainny 0:19588ac80c02 146 #endif
kennyainny 0:19588ac80c02 147 int i, resp = 0;
kennyainny 0:19588ac80c02 148 freeBUFFER();
kennyainny 0:19588ac80c02 149 writeBYTE(0x00); //command has a null prefix byte
kennyainny 0:19588ac80c02 150 for (i = 0; i < number; i++) {
kennyainny 0:19588ac80c02 151 if (i<16) //don't overflow LCD UART buffer
kennyainny 0:19588ac80c02 152 writeBYTEfast(command[i]); // send command to serial port
kennyainny 0:19588ac80c02 153 else
kennyainny 0:19588ac80c02 154 writeBYTE(command[i]); // send command to serial port with delay
kennyainny 0:19588ac80c02 155 }
kennyainny 0:19588ac80c02 156 while (!_cmd.readable()) wait_ms(TEMPO); // wait for screen answer
kennyainny 0:19588ac80c02 157 if (_cmd.readable()) resp = _cmd.getc(); // read response if any
kennyainny 0:19588ac80c02 158 switch (resp) {
kennyainny 0:19588ac80c02 159 case ACK : // if OK return 1
kennyainny 0:19588ac80c02 160 resp = 1;
kennyainny 0:19588ac80c02 161 break;
kennyainny 0:19588ac80c02 162 case NAK : // if NOK return -1
kennyainny 0:19588ac80c02 163 resp = -1;
kennyainny 0:19588ac80c02 164 break;
kennyainny 0:19588ac80c02 165 default :
kennyainny 0:19588ac80c02 166 resp = 0; // else return 0
kennyainny 0:19588ac80c02 167 break;
kennyainny 0:19588ac80c02 168 }
kennyainny 0:19588ac80c02 169 #if DEBUGMODE
kennyainny 0:19588ac80c02 170 pc.printf(" Answer received : %d\n",resp);
kennyainny 0:19588ac80c02 171 #endif
kennyainny 0:19588ac80c02 172
kennyainny 0:19588ac80c02 173 return resp;
kennyainny 0:19588ac80c02 174 }
kennyainny 0:19588ac80c02 175
kennyainny 0:19588ac80c02 176 //**************************************************************************
kennyainny 0:19588ac80c02 177 void uLCD_4DGL :: cls() // clear screen
kennyainny 0:19588ac80c02 178 {
kennyainny 0:19588ac80c02 179 char command[1] = "";
kennyainny 0:19588ac80c02 180
kennyainny 0:19588ac80c02 181 command[0] = CLS;
kennyainny 0:19588ac80c02 182 writeCOMMAND(command, 1);
kennyainny 0:19588ac80c02 183 current_row=0;
kennyainny 0:19588ac80c02 184 current_col=0;
kennyainny 0:19588ac80c02 185 current_hf = 1;
kennyainny 0:19588ac80c02 186 current_wf = 1;
kennyainny 0:19588ac80c02 187 set_font(FONT_7X8); // initial font
kennyainny 0:19588ac80c02 188 }
kennyainny 0:19588ac80c02 189
kennyainny 0:19588ac80c02 190 //**************************************************************************
kennyainny 0:19588ac80c02 191 int uLCD_4DGL :: version() // get API version
kennyainny 0:19588ac80c02 192 {
kennyainny 0:19588ac80c02 193
kennyainny 0:19588ac80c02 194 char command[2] = "";
kennyainny 0:19588ac80c02 195 command[0] = '\x00';
kennyainny 0:19588ac80c02 196 command[1] = VERSION;
kennyainny 0:19588ac80c02 197 return readVERSION(command, 2);
kennyainny 0:19588ac80c02 198 }
kennyainny 0:19588ac80c02 199
kennyainny 0:19588ac80c02 200 //**************************************************************************
kennyainny 0:19588ac80c02 201 void uLCD_4DGL :: baudrate(int speed) // set screen baud rate
kennyainny 0:19588ac80c02 202 {
kennyainny 0:19588ac80c02 203 char command[3]= "";
kennyainny 0:19588ac80c02 204 writeBYTE(0x00);
kennyainny 0:19588ac80c02 205 command[0] = BAUDRATE;
kennyainny 0:19588ac80c02 206 command[1] = 0;
kennyainny 0:19588ac80c02 207 int newbaud = BAUD_9600;
kennyainny 0:19588ac80c02 208 switch (speed) {
kennyainny 0:19588ac80c02 209 case 110 :
kennyainny 0:19588ac80c02 210 newbaud = BAUD_110;
kennyainny 0:19588ac80c02 211 break;
kennyainny 0:19588ac80c02 212 case 300 :
kennyainny 0:19588ac80c02 213 newbaud = BAUD_300;
kennyainny 0:19588ac80c02 214 break;
kennyainny 0:19588ac80c02 215 case 600 :
kennyainny 0:19588ac80c02 216 newbaud = BAUD_600;
kennyainny 0:19588ac80c02 217 break;
kennyainny 0:19588ac80c02 218 case 1200 :
kennyainny 0:19588ac80c02 219 newbaud = BAUD_1200;
kennyainny 0:19588ac80c02 220 break;
kennyainny 0:19588ac80c02 221 case 2400 :
kennyainny 0:19588ac80c02 222 newbaud = BAUD_2400;
kennyainny 0:19588ac80c02 223 break;
kennyainny 0:19588ac80c02 224 case 4800 :
kennyainny 0:19588ac80c02 225 newbaud = BAUD_4800;
kennyainny 0:19588ac80c02 226 break;
kennyainny 0:19588ac80c02 227 case 9600 :
kennyainny 0:19588ac80c02 228 newbaud = BAUD_9600;
kennyainny 0:19588ac80c02 229 break;
kennyainny 0:19588ac80c02 230 case 14400 :
kennyainny 0:19588ac80c02 231 newbaud = BAUD_14400;
kennyainny 0:19588ac80c02 232 break;
kennyainny 0:19588ac80c02 233 case 19200 :
kennyainny 0:19588ac80c02 234 newbaud = BAUD_19200;
kennyainny 0:19588ac80c02 235 break;
kennyainny 0:19588ac80c02 236 case 31250 :
kennyainny 0:19588ac80c02 237 newbaud = BAUD_31250;
kennyainny 0:19588ac80c02 238 break;
kennyainny 0:19588ac80c02 239 case 38400 :
kennyainny 0:19588ac80c02 240 newbaud = BAUD_38400;
kennyainny 0:19588ac80c02 241 break;
kennyainny 0:19588ac80c02 242 case 56000 :
kennyainny 0:19588ac80c02 243 newbaud = BAUD_56000;
kennyainny 0:19588ac80c02 244 break;
kennyainny 0:19588ac80c02 245 case 57600 :
kennyainny 0:19588ac80c02 246 newbaud = BAUD_57600;
kennyainny 0:19588ac80c02 247 break;
kennyainny 0:19588ac80c02 248 case 115200 :
kennyainny 0:19588ac80c02 249 newbaud = BAUD_115200;
kennyainny 0:19588ac80c02 250 break;
kennyainny 0:19588ac80c02 251 case 128000 :
kennyainny 0:19588ac80c02 252 newbaud = BAUD_128000;
kennyainny 0:19588ac80c02 253 break;
kennyainny 0:19588ac80c02 254 case 256000 :
kennyainny 0:19588ac80c02 255 newbaud = BAUD_256000;
kennyainny 0:19588ac80c02 256 break;
kennyainny 0:19588ac80c02 257 case 300000 :
kennyainny 0:19588ac80c02 258 newbaud = BAUD_300000;
kennyainny 0:19588ac80c02 259 speed = 272727;
kennyainny 0:19588ac80c02 260 break;
kennyainny 0:19588ac80c02 261 case 375000 :
kennyainny 0:19588ac80c02 262 newbaud = BAUD_375000;
kennyainny 0:19588ac80c02 263 speed = 333333;
kennyainny 0:19588ac80c02 264 break;
kennyainny 0:19588ac80c02 265 case 500000 :
kennyainny 0:19588ac80c02 266 newbaud = BAUD_500000;
kennyainny 0:19588ac80c02 267 speed = 428571;
kennyainny 0:19588ac80c02 268 break;
kennyainny 0:19588ac80c02 269 case 600000 :
kennyainny 0:19588ac80c02 270 newbaud = BAUD_600000;
kennyainny 0:19588ac80c02 271 break;
kennyainny 0:19588ac80c02 272 case 750000 : //rates over 600000 are not documented, but seem to work
kennyainny 0:19588ac80c02 273 newbaud = BAUD_750000;
kennyainny 0:19588ac80c02 274 break;
kennyainny 0:19588ac80c02 275 case 1000000 :
kennyainny 0:19588ac80c02 276 newbaud = BAUD_1000000;
kennyainny 0:19588ac80c02 277 break;
kennyainny 0:19588ac80c02 278 case 1500000 :
kennyainny 0:19588ac80c02 279 newbaud = BAUD_1500000;
kennyainny 0:19588ac80c02 280 break;
kennyainny 0:19588ac80c02 281 case 3000000 :
kennyainny 0:19588ac80c02 282 newbaud = BAUD_3000000;
kennyainny 0:19588ac80c02 283 break;
kennyainny 0:19588ac80c02 284 default :
kennyainny 0:19588ac80c02 285 newbaud = BAUD_9600;
kennyainny 0:19588ac80c02 286 speed = 9600;
kennyainny 0:19588ac80c02 287 break;
kennyainny 0:19588ac80c02 288 }
kennyainny 0:19588ac80c02 289
kennyainny 0:19588ac80c02 290 int i, resp = 0;
kennyainny 0:19588ac80c02 291
kennyainny 0:19588ac80c02 292 freeBUFFER();
kennyainny 0:19588ac80c02 293 command[1] = char(newbaud >>8);
kennyainny 0:19588ac80c02 294 command[2] = char(newbaud % 256);
kennyainny 0:19588ac80c02 295 wait_ms(1);
kennyainny 0:19588ac80c02 296 for (i = 0; i <3; i++) writeBYTEfast(command[i]); // send command to serial port
kennyainny 0:19588ac80c02 297 for (i = 0; i<10; i++) wait_ms(1);
kennyainny 0:19588ac80c02 298 //dont change baud until all characters get sent out
kennyainny 0:19588ac80c02 299 _cmd.baud(speed); // set mbed to same speed
kennyainny 0:19588ac80c02 300 i=0;
kennyainny 0:19588ac80c02 301 while ((!_cmd.readable()) && (i<25000)) {
kennyainny 0:19588ac80c02 302 wait_ms(TEMPO); // wait for screen answer - comes 100ms after change
kennyainny 0:19588ac80c02 303 i++; //timeout if ack character missed by baud change
kennyainny 0:19588ac80c02 304 }
kennyainny 0:19588ac80c02 305 if (_cmd.readable()) resp = _cmd.getc(); // read response if any
kennyainny 0:19588ac80c02 306 switch (resp) {
kennyainny 0:19588ac80c02 307 case ACK : // if OK return 1
kennyainny 0:19588ac80c02 308 resp = 1;
kennyainny 0:19588ac80c02 309 break;
kennyainny 0:19588ac80c02 310 case NAK : // if NOK return -1
kennyainny 0:19588ac80c02 311 resp = -1;
kennyainny 0:19588ac80c02 312 break;
kennyainny 0:19588ac80c02 313 default :
kennyainny 0:19588ac80c02 314 resp = 0; // else return 0
kennyainny 0:19588ac80c02 315 break;
kennyainny 0:19588ac80c02 316 }
kennyainny 0:19588ac80c02 317 }
kennyainny 0:19588ac80c02 318
kennyainny 0:19588ac80c02 319 //******************************************************************************************************
kennyainny 0:19588ac80c02 320 int uLCD_4DGL :: readVERSION(char *command, int number) // read screen info and populate data
kennyainny 0:19588ac80c02 321 {
kennyainny 0:19588ac80c02 322
kennyainny 0:19588ac80c02 323 int i, temp = 0, resp = 0;
kennyainny 0:19588ac80c02 324 char response[5] = "";
kennyainny 0:19588ac80c02 325
kennyainny 0:19588ac80c02 326 freeBUFFER();
kennyainny 0:19588ac80c02 327
kennyainny 0:19588ac80c02 328 for (i = 0; i < number; i++) writeBYTE(command[i]); // send all chars to serial port
kennyainny 0:19588ac80c02 329
kennyainny 0:19588ac80c02 330 while (!_cmd.readable()) wait_ms(TEMPO); // wait for screen answer
kennyainny 0:19588ac80c02 331
kennyainny 0:19588ac80c02 332 while (_cmd.readable() && resp < ARRAY_SIZE(response)) {
kennyainny 0:19588ac80c02 333 temp = _cmd.getc();
kennyainny 0:19588ac80c02 334 response[resp++] = (char)temp;
kennyainny 0:19588ac80c02 335 }
kennyainny 0:19588ac80c02 336 switch (resp) {
kennyainny 0:19588ac80c02 337 case 2 : // if OK populate data and return 1
kennyainny 0:19588ac80c02 338 revision = response[0]<<8 + response[1];
kennyainny 0:19588ac80c02 339 resp = 1;
kennyainny 0:19588ac80c02 340 break;
kennyainny 0:19588ac80c02 341 default :
kennyainny 0:19588ac80c02 342 resp = 0; // else return 0
kennyainny 0:19588ac80c02 343 break;
kennyainny 0:19588ac80c02 344 }
kennyainny 0:19588ac80c02 345 return resp;
kennyainny 0:19588ac80c02 346 }
kennyainny 0:19588ac80c02 347
kennyainny 0:19588ac80c02 348 //****************************************************************************************************
kennyainny 0:19588ac80c02 349 void uLCD_4DGL :: background_color(int color) // set screen background color
kennyainny 0:19588ac80c02 350 {
kennyainny 0:19588ac80c02 351 char command[3]= ""; // input color is in 24bits like 0xRRGGBB
kennyainny 0:19588ac80c02 352
kennyainny 0:19588ac80c02 353 command[0] = BCKGDCOLOR;
kennyainny 0:19588ac80c02 354
kennyainny 0:19588ac80c02 355 int red5 = (color >> (16 + 3)) & 0x1F; // get red on 5 bits
kennyainny 0:19588ac80c02 356 int green6 = (color >> (8 + 2)) & 0x3F; // get green on 6 bits
kennyainny 0:19588ac80c02 357 int blue5 = (color >> (0 + 3)) & 0x1F; // get blue on 5 bits
kennyainny 0:19588ac80c02 358
kennyainny 0:19588ac80c02 359 command[1] = ((red5 << 3) + (green6 >> 3)) & 0xFF; // first part of 16 bits color
kennyainny 0:19588ac80c02 360 command[2] = ((green6 << 5) + (blue5 >> 0)) & 0xFF; // second part of 16 bits color
kennyainny 0:19588ac80c02 361
kennyainny 0:19588ac80c02 362 writeCOMMAND(command, 3);
kennyainny 0:19588ac80c02 363 }
kennyainny 0:19588ac80c02 364
kennyainny 0:19588ac80c02 365 //****************************************************************************************************
kennyainny 0:19588ac80c02 366 void uLCD_4DGL :: textbackground_color(int color) // set screen background color
kennyainny 0:19588ac80c02 367 {
kennyainny 0:19588ac80c02 368 char command[3]= ""; // input color is in 24bits like 0xRRGGBB
kennyainny 0:19588ac80c02 369
kennyainny 0:19588ac80c02 370 command[0] = TXTBCKGDCOLOR;
kennyainny 0:19588ac80c02 371
kennyainny 0:19588ac80c02 372 int red5 = (color >> (16 + 3)) & 0x1F; // get red on 5 bits
kennyainny 0:19588ac80c02 373 int green6 = (color >> (8 + 2)) & 0x3F; // get green on 6 bits
kennyainny 0:19588ac80c02 374 int blue5 = (color >> (0 + 3)) & 0x1F; // get blue on 5 bits
kennyainny 0:19588ac80c02 375
kennyainny 0:19588ac80c02 376 command[1] = ((red5 << 3) + (green6 >> 3)) & 0xFF; // first part of 16 bits color
kennyainny 0:19588ac80c02 377 command[2] = ((green6 << 5) + (blue5 >> 0)) & 0xFF; // second part of 16 bits color
kennyainny 0:19588ac80c02 378
kennyainny 0:19588ac80c02 379 writeCOMMAND(command, 3);
kennyainny 0:19588ac80c02 380 }
kennyainny 0:19588ac80c02 381
kennyainny 0:19588ac80c02 382 //****************************************************************************************************
kennyainny 0:19588ac80c02 383 void uLCD_4DGL :: display_control(char mode) // set screen mode to value
kennyainny 0:19588ac80c02 384 {
kennyainny 0:19588ac80c02 385 char command[3]= "";
kennyainny 0:19588ac80c02 386
kennyainny 0:19588ac80c02 387 command[0] = DISPCONTROL;
kennyainny 0:19588ac80c02 388 command[1] = 0;
kennyainny 0:19588ac80c02 389 command[2] = mode;
kennyainny 0:19588ac80c02 390
kennyainny 0:19588ac80c02 391 if (mode == ORIENTATION) {
kennyainny 0:19588ac80c02 392 switch (mode) {
kennyainny 0:19588ac80c02 393 case LANDSCAPE :
kennyainny 0:19588ac80c02 394 current_orientation = IS_LANDSCAPE;
kennyainny 0:19588ac80c02 395 break;
kennyainny 0:19588ac80c02 396 case LANDSCAPE_R :
kennyainny 0:19588ac80c02 397 current_orientation = IS_LANDSCAPE;
kennyainny 0:19588ac80c02 398 break;
kennyainny 0:19588ac80c02 399 case PORTRAIT :
kennyainny 0:19588ac80c02 400 current_orientation = IS_PORTRAIT;
kennyainny 0:19588ac80c02 401 break;
kennyainny 0:19588ac80c02 402 case PORTRAIT_R :
kennyainny 0:19588ac80c02 403 current_orientation = IS_PORTRAIT;
kennyainny 0:19588ac80c02 404 break;
kennyainny 0:19588ac80c02 405 }
kennyainny 0:19588ac80c02 406 }
kennyainny 0:19588ac80c02 407 writeCOMMAND(command, 3);
kennyainny 0:19588ac80c02 408 set_font(current_font);
kennyainny 0:19588ac80c02 409 }
kennyainny 0:19588ac80c02 410 //****************************************************************************************************
kennyainny 0:19588ac80c02 411 void uLCD_4DGL :: display_power(char mode) // set screen mode to value
kennyainny 0:19588ac80c02 412 {
kennyainny 0:19588ac80c02 413 char command[3]= "";
kennyainny 0:19588ac80c02 414
kennyainny 0:19588ac80c02 415 command[0] = DISPPOWER;
kennyainny 0:19588ac80c02 416 command[1] = 0;
kennyainny 0:19588ac80c02 417 command[2] = mode;
kennyainny 0:19588ac80c02 418 writeCOMMAND(command, 3);
kennyainny 0:19588ac80c02 419 }
kennyainny 0:19588ac80c02 420 //****************************************************************************************************
kennyainny 0:19588ac80c02 421 void uLCD_4DGL :: set_volume(char value) // set sound volume to value
kennyainny 0:19588ac80c02 422 {
kennyainny 0:19588ac80c02 423 char command[2]= "";
kennyainny 0:19588ac80c02 424
kennyainny 0:19588ac80c02 425 command[0] = SETVOLUME;
kennyainny 0:19588ac80c02 426 command[1] = value;
kennyainny 0:19588ac80c02 427
kennyainny 0:19588ac80c02 428 writeCOMMAND(command, 2);
kennyainny 0:19588ac80c02 429 }
kennyainny 0:19588ac80c02 430
kennyainny 0:19588ac80c02 431
kennyainny 0:19588ac80c02 432 //******************************************************************************************************
kennyainny 0:19588ac80c02 433 int uLCD_4DGL :: getSTATUS(char *command, int number) // read screen info and populate data
kennyainny 0:19588ac80c02 434 {
kennyainny 0:19588ac80c02 435
kennyainny 0:19588ac80c02 436 #if DEBUGMODE
kennyainny 0:19588ac80c02 437 pc.printf("\n");
kennyainny 0:19588ac80c02 438 pc.printf("New COMMAND : 0x%02X\n", command[0]);
kennyainny 0:19588ac80c02 439 #endif
kennyainny 0:19588ac80c02 440
kennyainny 0:19588ac80c02 441 int i, temp = 0, resp = 0;
kennyainny 0:19588ac80c02 442 char response[5] = "";
kennyainny 0:19588ac80c02 443
kennyainny 0:19588ac80c02 444 freeBUFFER();
kennyainny 0:19588ac80c02 445
kennyainny 0:19588ac80c02 446 for (i = 0; i < number; i++) writeBYTE(command[i]); // send all chars to serial port
kennyainny 0:19588ac80c02 447
kennyainny 0:19588ac80c02 448 while (!_cmd.readable()) wait_ms(TEMPO); // wait for screen answer
kennyainny 0:19588ac80c02 449
kennyainny 0:19588ac80c02 450 while (_cmd.readable() && resp < ARRAY_SIZE(response)) {
kennyainny 0:19588ac80c02 451 temp = _cmd.getc();
kennyainny 0:19588ac80c02 452 response[resp++] = (char)temp;
kennyainny 0:19588ac80c02 453 }
kennyainny 0:19588ac80c02 454 switch (resp) {
kennyainny 0:19588ac80c02 455 case 4 :
kennyainny 0:19588ac80c02 456 resp = (int)response[1]; // if OK populate data
kennyainny 0:19588ac80c02 457 break;
kennyainny 0:19588ac80c02 458 default :
kennyainny 0:19588ac80c02 459 resp = -1; // else return 0
kennyainny 0:19588ac80c02 460 break;
kennyainny 0:19588ac80c02 461 }
kennyainny 0:19588ac80c02 462
kennyainny 0:19588ac80c02 463 #if DEBUGMODE
kennyainny 0:19588ac80c02 464 pc.printf(" Answer received : %d\n", resp);
kennyainny 0:19588ac80c02 465 #endif
kennyainny 0:19588ac80c02 466
kennyainny 0:19588ac80c02 467 return resp;
kennyainny 0:19588ac80c02 468 }
kennyainny 0:19588ac80c02 469