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 TFT touch screens
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 //****************************************************************************************************
kennyainny 0:19588ac80c02 24 void uLCD_4DGL :: set_font_size(char width, char height) // set font size
kennyainny 0:19588ac80c02 25 {
kennyainny 0:19588ac80c02 26 if (current_orientation == IS_PORTRAIT) {
kennyainny 0:19588ac80c02 27 current_fx = width;
kennyainny 0:19588ac80c02 28 current_fy = height;
kennyainny 0:19588ac80c02 29 } else {
kennyainny 0:19588ac80c02 30 current_fy = height;
kennyainny 0:19588ac80c02 31 current_fx = width;
kennyainny 0:19588ac80c02 32 }
kennyainny 0:19588ac80c02 33 max_col = current_w / (current_fx*current_wf);
kennyainny 0:19588ac80c02 34 max_row = current_h / (current_fy*current_hf);
kennyainny 0:19588ac80c02 35 }
kennyainny 0:19588ac80c02 36
kennyainny 0:19588ac80c02 37 //****************************************************************************************************
kennyainny 0:19588ac80c02 38 void uLCD_4DGL :: set_font(char mode) // set font - system or SD media
kennyainny 0:19588ac80c02 39 {
kennyainny 0:19588ac80c02 40 char command[3]= "";
kennyainny 0:19588ac80c02 41
kennyainny 0:19588ac80c02 42 command[0] = SETFONT;
kennyainny 0:19588ac80c02 43 command[1] = 0;
kennyainny 0:19588ac80c02 44 command[2] = mode;
kennyainny 0:19588ac80c02 45
kennyainny 0:19588ac80c02 46 current_font = mode;
kennyainny 0:19588ac80c02 47
kennyainny 0:19588ac80c02 48 if (current_orientation == IS_PORTRAIT) {
kennyainny 0:19588ac80c02 49 current_w = SIZE_X;
kennyainny 0:19588ac80c02 50 current_h = SIZE_Y;
kennyainny 0:19588ac80c02 51 } else {
kennyainny 0:19588ac80c02 52 current_w = SIZE_Y;
kennyainny 0:19588ac80c02 53 current_h = SIZE_X;
kennyainny 0:19588ac80c02 54 }
kennyainny 0:19588ac80c02 55
kennyainny 0:19588ac80c02 56 switch (mode) {
kennyainny 0:19588ac80c02 57 case FONT_5X7 :
kennyainny 0:19588ac80c02 58
kennyainny 0:19588ac80c02 59 current_fx = 6;
kennyainny 0:19588ac80c02 60 current_fy = 8;
kennyainny 0:19588ac80c02 61 break;
kennyainny 0:19588ac80c02 62 case FONT_7X8 :
kennyainny 0:19588ac80c02 63 current_fx = 7;
kennyainny 0:19588ac80c02 64 current_fy = 8;
kennyainny 0:19588ac80c02 65 break;
kennyainny 0:19588ac80c02 66 case FONT_8X8 :
kennyainny 0:19588ac80c02 67 current_fx = 8;
kennyainny 0:19588ac80c02 68 current_fy = 8;
kennyainny 0:19588ac80c02 69 break;
kennyainny 0:19588ac80c02 70 case FONT_8X12 :
kennyainny 0:19588ac80c02 71 current_fx = 8;
kennyainny 0:19588ac80c02 72 current_fy = 12;
kennyainny 0:19588ac80c02 73 break;
kennyainny 0:19588ac80c02 74 case FONT_12X16 :
kennyainny 0:19588ac80c02 75 current_fx = 12;
kennyainny 0:19588ac80c02 76 current_fy = 16;
kennyainny 0:19588ac80c02 77 break;
kennyainny 0:19588ac80c02 78 default:
kennyainny 0:19588ac80c02 79 current_fx = 8;
kennyainny 0:19588ac80c02 80 current_fy = 8;
kennyainny 0:19588ac80c02 81 }
kennyainny 0:19588ac80c02 82
kennyainny 0:19588ac80c02 83 max_col = current_w / (current_fx*current_wf);
kennyainny 0:19588ac80c02 84 max_row = current_h / (current_fy*current_hf);
kennyainny 0:19588ac80c02 85
kennyainny 0:19588ac80c02 86 writeCOMMAND(command, 3);
kennyainny 0:19588ac80c02 87 }
kennyainny 0:19588ac80c02 88
kennyainny 0:19588ac80c02 89
kennyainny 0:19588ac80c02 90
kennyainny 0:19588ac80c02 91 //****************************************************************************************************
kennyainny 0:19588ac80c02 92 void uLCD_4DGL :: text_mode(char mode) // set text mode
kennyainny 0:19588ac80c02 93 {
kennyainny 0:19588ac80c02 94 char command[3]= "";
kennyainny 0:19588ac80c02 95
kennyainny 0:19588ac80c02 96 command[0] = TEXTMODE;
kennyainny 0:19588ac80c02 97 command[1] = 0;
kennyainny 0:19588ac80c02 98 command[2] = mode;
kennyainny 0:19588ac80c02 99
kennyainny 0:19588ac80c02 100 writeCOMMAND(command, 3);
kennyainny 0:19588ac80c02 101 }
kennyainny 0:19588ac80c02 102
kennyainny 0:19588ac80c02 103 //****************************************************************************************************
kennyainny 0:19588ac80c02 104 void uLCD_4DGL :: text_bold(char mode) // set text mode
kennyainny 0:19588ac80c02 105 {
kennyainny 0:19588ac80c02 106 char command[3]= "";
kennyainny 0:19588ac80c02 107
kennyainny 0:19588ac80c02 108 command[0] = TEXTBOLD;
kennyainny 0:19588ac80c02 109 command[1] = 0;
kennyainny 0:19588ac80c02 110 command[2] = mode;
kennyainny 0:19588ac80c02 111
kennyainny 0:19588ac80c02 112 writeCOMMAND(command, 3);
kennyainny 0:19588ac80c02 113 }
kennyainny 0:19588ac80c02 114
kennyainny 0:19588ac80c02 115 //****************************************************************************************************
kennyainny 0:19588ac80c02 116 void uLCD_4DGL :: text_italic(char mode) // set text mode
kennyainny 0:19588ac80c02 117 {
kennyainny 0:19588ac80c02 118 char command[3]= "";
kennyainny 0:19588ac80c02 119
kennyainny 0:19588ac80c02 120 command[0] = TEXTITALIC;
kennyainny 0:19588ac80c02 121 command[1] = 0;
kennyainny 0:19588ac80c02 122 command[2] = mode;
kennyainny 0:19588ac80c02 123
kennyainny 0:19588ac80c02 124 writeCOMMAND(command, 3);
kennyainny 0:19588ac80c02 125 }
kennyainny 0:19588ac80c02 126
kennyainny 0:19588ac80c02 127 //****************************************************************************************************
kennyainny 0:19588ac80c02 128 void uLCD_4DGL :: text_inverse(char mode) // set text mode
kennyainny 0:19588ac80c02 129 {
kennyainny 0:19588ac80c02 130 char command[3]= "";
kennyainny 0:19588ac80c02 131
kennyainny 0:19588ac80c02 132 command[0] = TEXTINVERSE;
kennyainny 0:19588ac80c02 133 command[1] = 0;
kennyainny 0:19588ac80c02 134 command[2] = mode;
kennyainny 0:19588ac80c02 135
kennyainny 0:19588ac80c02 136 writeCOMMAND(command, 3);
kennyainny 0:19588ac80c02 137 }
kennyainny 0:19588ac80c02 138
kennyainny 0:19588ac80c02 139 //****************************************************************************************************
kennyainny 0:19588ac80c02 140 void uLCD_4DGL :: text_underline(char mode) // set text mode
kennyainny 0:19588ac80c02 141 {
kennyainny 0:19588ac80c02 142 char command[3]= "";
kennyainny 0:19588ac80c02 143
kennyainny 0:19588ac80c02 144 command[0] = TEXTUNDERLINE;
kennyainny 0:19588ac80c02 145 command[1] = 0;
kennyainny 0:19588ac80c02 146 command[2] = mode;
kennyainny 0:19588ac80c02 147
kennyainny 0:19588ac80c02 148 writeCOMMAND(command, 3);
kennyainny 0:19588ac80c02 149 }
kennyainny 0:19588ac80c02 150
kennyainny 0:19588ac80c02 151 //****************************************************************************************************
kennyainny 0:19588ac80c02 152 void uLCD_4DGL :: text_width(char width) // set text width
kennyainny 0:19588ac80c02 153 {
kennyainny 0:19588ac80c02 154 char command[3]= "";
kennyainny 0:19588ac80c02 155
kennyainny 0:19588ac80c02 156 command[0] = TEXTWIDTH;
kennyainny 0:19588ac80c02 157 command[1] = 0;
kennyainny 0:19588ac80c02 158 command[2] = width;
kennyainny 0:19588ac80c02 159 current_wf = width;
kennyainny 0:19588ac80c02 160 max_col = current_w / (current_fx*current_wf);
kennyainny 0:19588ac80c02 161 writeCOMMAND(command, 3);
kennyainny 0:19588ac80c02 162 }
kennyainny 0:19588ac80c02 163
kennyainny 0:19588ac80c02 164 //****************************************************************************************************
kennyainny 0:19588ac80c02 165 void uLCD_4DGL :: text_height(char height) // set text height
kennyainny 0:19588ac80c02 166 {
kennyainny 0:19588ac80c02 167 char command[3]= "";
kennyainny 0:19588ac80c02 168
kennyainny 0:19588ac80c02 169 command[0] = TEXTHEIGHT;
kennyainny 0:19588ac80c02 170 command[1] = 0;
kennyainny 0:19588ac80c02 171 command[2] = height;
kennyainny 0:19588ac80c02 172 current_hf = height;
kennyainny 0:19588ac80c02 173 max_row = current_h / (current_fy*current_hf);
kennyainny 0:19588ac80c02 174 writeCOMMAND(command, 3);
kennyainny 0:19588ac80c02 175 }
kennyainny 0:19588ac80c02 176
kennyainny 0:19588ac80c02 177
kennyainny 0:19588ac80c02 178 //****************************************************************************************************
kennyainny 0:19588ac80c02 179 void uLCD_4DGL :: text_char(char c, char col, char row, int color) // draw a text char
kennyainny 0:19588ac80c02 180 {
kennyainny 0:19588ac80c02 181 char command[6]= "";
kennyainny 0:19588ac80c02 182 command[0] = 0xE4; //move cursor
kennyainny 0:19588ac80c02 183 command[1] = 0;
kennyainny 0:19588ac80c02 184 command[2] = row;
kennyainny 0:19588ac80c02 185 command[3] = 0;
kennyainny 0:19588ac80c02 186 command[4] = col;
kennyainny 0:19588ac80c02 187 writeCOMMAND(command, 5);
kennyainny 0:19588ac80c02 188
kennyainny 0:19588ac80c02 189 command[0] = 0x7F; //set color
kennyainny 0:19588ac80c02 190
kennyainny 0:19588ac80c02 191 int red5 = (color >> (16 + 3)) & 0x1F; // get red on 5 bits
kennyainny 0:19588ac80c02 192 int green6 = (color >> (8 + 2)) & 0x3F; // get green on 6 bits
kennyainny 0:19588ac80c02 193 int blue5 = (color >> (0 + 3)) & 0x1F; // get blue on 5 bits
kennyainny 0:19588ac80c02 194
kennyainny 0:19588ac80c02 195 command[1] = ((red5 << 3) + (green6 >> 3)) & 0xFF; // first part of 16 bits color
kennyainny 0:19588ac80c02 196 command[2] = ((green6 << 5) + (blue5 >> 0)) & 0xFF; // second part of 16 bits color
kennyainny 0:19588ac80c02 197 writeCOMMAND(command, 3);
kennyainny 0:19588ac80c02 198
kennyainny 0:19588ac80c02 199 command[0] = TEXTCHAR; //print char
kennyainny 0:19588ac80c02 200 command[1] = 0;
kennyainny 0:19588ac80c02 201 command[2] = c;
kennyainny 0:19588ac80c02 202 writeCOMMAND(command, 3);
kennyainny 0:19588ac80c02 203
kennyainny 0:19588ac80c02 204 }
kennyainny 0:19588ac80c02 205
kennyainny 0:19588ac80c02 206
kennyainny 0:19588ac80c02 207 //****************************************************************************************************
kennyainny 0:19588ac80c02 208 void uLCD_4DGL :: text_string(char *s, char col, char row, char font, int color) // draw a text string
kennyainny 0:19588ac80c02 209 {
kennyainny 0:19588ac80c02 210
kennyainny 0:19588ac80c02 211 char command[1000]= "";
kennyainny 0:19588ac80c02 212 int size = strlen(s);
kennyainny 0:19588ac80c02 213 int i = 0;
kennyainny 0:19588ac80c02 214
kennyainny 0:19588ac80c02 215 set_font(font);
kennyainny 0:19588ac80c02 216
kennyainny 0:19588ac80c02 217 command[0] = 0xE4; //move cursor
kennyainny 0:19588ac80c02 218 command[1] = 0;
kennyainny 0:19588ac80c02 219 command[2] = row;
kennyainny 0:19588ac80c02 220 command[3] = 0;
kennyainny 0:19588ac80c02 221 command[4] = col;
kennyainny 0:19588ac80c02 222 writeCOMMAND(command, 5);
kennyainny 0:19588ac80c02 223
kennyainny 0:19588ac80c02 224 command[0] = 0x7F; //set color
kennyainny 0:19588ac80c02 225 int red5 = (color >> (16 + 3)) & 0x1F; // get red on 5 bits
kennyainny 0:19588ac80c02 226 int green6 = (color >> (8 + 2)) & 0x3F; // get green on 6 bits
kennyainny 0:19588ac80c02 227 int blue5 = (color >> (0 + 3)) & 0x1F; // get blue on 5 bits
kennyainny 0:19588ac80c02 228
kennyainny 0:19588ac80c02 229 command[1] = ((red5 << 3) + (green6 >> 3)) & 0xFF; // first part of 16 bits color
kennyainny 0:19588ac80c02 230 command[2] = ((green6 << 5) + (blue5 >> 0)) & 0xFF; // second part of 16 bits color
kennyainny 0:19588ac80c02 231 writeCOMMAND(command, 3);
kennyainny 0:19588ac80c02 232
kennyainny 0:19588ac80c02 233 command[0] = TEXTSTRING;
kennyainny 0:19588ac80c02 234 for (i=0; i<size; i++) command[1+i] = s[i];
kennyainny 0:19588ac80c02 235 command[1+size] = 0;
kennyainny 0:19588ac80c02 236 writeCOMMANDnull(command, 2 + size);
kennyainny 0:19588ac80c02 237 }
kennyainny 0:19588ac80c02 238
kennyainny 0:19588ac80c02 239
kennyainny 0:19588ac80c02 240
kennyainny 0:19588ac80c02 241 //****************************************************************************************************
kennyainny 0:19588ac80c02 242 void uLCD_4DGL :: locate(char col, char row) // place text curssor at col, row
kennyainny 0:19588ac80c02 243 {
kennyainny 0:19588ac80c02 244 char command[5] = "";
kennyainny 0:19588ac80c02 245 current_col = col;
kennyainny 0:19588ac80c02 246 current_row = row;
kennyainny 0:19588ac80c02 247 command[0] = MOVECURSOR; //move cursor
kennyainny 0:19588ac80c02 248 command[1] = 0;
kennyainny 0:19588ac80c02 249 command[2] = current_row;
kennyainny 0:19588ac80c02 250 command[3] = 0;
kennyainny 0:19588ac80c02 251 command[4] = current_col;
kennyainny 0:19588ac80c02 252 writeCOMMAND(command, 5);
kennyainny 0:19588ac80c02 253 }
kennyainny 0:19588ac80c02 254
kennyainny 0:19588ac80c02 255 //****************************************************************************************************
kennyainny 0:19588ac80c02 256 void uLCD_4DGL :: color(int color) // set text color
kennyainny 0:19588ac80c02 257 {
kennyainny 0:19588ac80c02 258 char command[5] = "";
kennyainny 0:19588ac80c02 259 current_color = color;
kennyainny 0:19588ac80c02 260 command[0] = 0x7F; //set color
kennyainny 0:19588ac80c02 261
kennyainny 0:19588ac80c02 262 int red5 = (color >> (16 + 3)) & 0x1F; // get red on 5 bits
kennyainny 0:19588ac80c02 263 int green6 = (color >> (8 + 2)) & 0x3F; // get green on 6 bits
kennyainny 0:19588ac80c02 264 int blue5 = (color >> (0 + 3)) & 0x1F; // get blue on 5 bits
kennyainny 0:19588ac80c02 265
kennyainny 0:19588ac80c02 266 command[1] = ((red5 << 3) + (green6 >> 3)) & 0xFF; // first part of 16 bits color
kennyainny 0:19588ac80c02 267 command[2] = ((green6 << 5) + (blue5 >> 0)) & 0xFF; // second part of 16 bits color
kennyainny 0:19588ac80c02 268 writeCOMMAND(command, 3);
kennyainny 0:19588ac80c02 269 }
kennyainny 0:19588ac80c02 270
kennyainny 0:19588ac80c02 271 //****************************************************************************************************
kennyainny 0:19588ac80c02 272 void uLCD_4DGL :: putc(char c) // place char at current cursor position
kennyainny 0:19588ac80c02 273 //used by virtual printf function _putc
kennyainny 0:19588ac80c02 274 {
kennyainny 0:19588ac80c02 275 char command[6] ="";
kennyainny 0:19588ac80c02 276 if(c<0x20) {
kennyainny 0:19588ac80c02 277 if(c=='\n') {
kennyainny 0:19588ac80c02 278 current_col = 0;
kennyainny 0:19588ac80c02 279 current_row++;
kennyainny 0:19588ac80c02 280 command[0] = MOVECURSOR; //move cursor to start of next line
kennyainny 0:19588ac80c02 281 command[1] = 0;
kennyainny 0:19588ac80c02 282 command[2] = current_row;
kennyainny 0:19588ac80c02 283 command[3] = 0;
kennyainny 0:19588ac80c02 284 command[4] = current_col;
kennyainny 0:19588ac80c02 285 writeCOMMAND(command, 5);
kennyainny 0:19588ac80c02 286 }
kennyainny 0:19588ac80c02 287 if(c=='\r') {
kennyainny 0:19588ac80c02 288 current_col = 0;
kennyainny 0:19588ac80c02 289 command[0] = MOVECURSOR; //move cursor to start of line
kennyainny 0:19588ac80c02 290 command[1] = 0;
kennyainny 0:19588ac80c02 291 command[2] = current_row;
kennyainny 0:19588ac80c02 292 command[3] = 0;
kennyainny 0:19588ac80c02 293 command[4] = current_col;
kennyainny 0:19588ac80c02 294 writeCOMMAND(command, 5);
kennyainny 0:19588ac80c02 295 }
kennyainny 0:19588ac80c02 296 if(c=='\f') {
kennyainny 0:19588ac80c02 297 uLCD_4DGL::cls(); //clear screen on form feed
kennyainny 0:19588ac80c02 298 }
kennyainny 0:19588ac80c02 299 } else {
kennyainny 0:19588ac80c02 300 command[0] = PUTCHAR;
kennyainny 0:19588ac80c02 301 command[1] = 0x00;
kennyainny 0:19588ac80c02 302 command[2] = c;
kennyainny 0:19588ac80c02 303 writeCOMMAND(command,3);
kennyainny 0:19588ac80c02 304 current_col++;
kennyainny 0:19588ac80c02 305 }
kennyainny 0:19588ac80c02 306 if (current_col == max_col) {
kennyainny 0:19588ac80c02 307 current_col = 0;
kennyainny 0:19588ac80c02 308 current_row++;
kennyainny 0:19588ac80c02 309 command[0] = MOVECURSOR; //move cursor to next line
kennyainny 0:19588ac80c02 310 command[1] = 0;
kennyainny 0:19588ac80c02 311 command[2] = current_row;
kennyainny 0:19588ac80c02 312 command[3] = 0;
kennyainny 0:19588ac80c02 313 command[4] = current_col;
kennyainny 0:19588ac80c02 314 writeCOMMAND(command, 5);
kennyainny 0:19588ac80c02 315 }
kennyainny 0:19588ac80c02 316 if (current_row == max_row) {
kennyainny 0:19588ac80c02 317 current_row = 0;
kennyainny 0:19588ac80c02 318 command[0] = MOVECURSOR; //move cursor back to start
kennyainny 0:19588ac80c02 319 command[1] = 0;
kennyainny 0:19588ac80c02 320 command[2] = current_row;
kennyainny 0:19588ac80c02 321 command[3] = 0;
kennyainny 0:19588ac80c02 322 command[4] = current_col;
kennyainny 0:19588ac80c02 323 writeCOMMAND(command, 5);
kennyainny 0:19588ac80c02 324 }
kennyainny 0:19588ac80c02 325 }
kennyainny 0:19588ac80c02 326
kennyainny 0:19588ac80c02 327
kennyainny 0:19588ac80c02 328 //****************************************************************************************************
kennyainny 0:19588ac80c02 329 void uLCD_4DGL :: puts(char *s) // place string at current cursor position
kennyainny 0:19588ac80c02 330 {
kennyainny 0:19588ac80c02 331
kennyainny 0:19588ac80c02 332 text_string(s, current_col, current_row, current_font, current_color);
kennyainny 0:19588ac80c02 333
kennyainny 0:19588ac80c02 334 current_col += strlen(s);
kennyainny 0:19588ac80c02 335
kennyainny 0:19588ac80c02 336 if (current_col >= max_col) {
kennyainny 0:19588ac80c02 337 current_row += current_col / max_col;
kennyainny 0:19588ac80c02 338 current_col %= max_col;
kennyainny 0:19588ac80c02 339 }
kennyainny 0:19588ac80c02 340 if (current_row >= max_row) {
kennyainny 0:19588ac80c02 341 current_row %= max_row;
kennyainny 0:19588ac80c02 342 }
kennyainny 0:19588ac80c02 343 }