LCD TFT for ssd0139 driver 8 bit mode - using portout for max speed

Fork of LCDTFT_ssd0139 by chris stevens

Committer:
cstevens
Date:
Wed Jun 10 15:47:22 2015 +0000
Revision:
4:1c2f9e3b9b12
Parent:
3:f999653c1069
changed to make it use port instead of bus

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Suky 1:1085b6177f6e 1 /*
Suky 1:1085b6177f6e 2 @file LCDTFT.cpp
Suky 1:1085b6177f6e 3 @version: 1.0
Suky 1:1085b6177f6e 4
Suky 1:1085b6177f6e 5 @web www.micros-designs.com.ar
Suky 1:1085b6177f6e 6 @date 30/01/11
Suky 1:1085b6177f6e 7
Suky 1:1085b6177f6e 8 *- Version Log --------------------------------------------------------------*
Suky 1:1085b6177f6e 9 * Fecha Autor Comentarios *
Suky 1:1085b6177f6e 10 *----------------------------------------------------------------------------*
Suky 1:1085b6177f6e 11 * 30/01/11 Suky Original *
Suky 1:1085b6177f6e 12 *----------------------------------------------------------------------------*/
Suky 1:1085b6177f6e 13 ///////////////////////////////////////////////////////////////////////////
Suky 1:1085b6177f6e 14 //// ////
Suky 1:1085b6177f6e 15 //// ////
Suky 1:1085b6177f6e 16 //// (C) Copyright 2011 www.micros-designs.com.ar ////
cstevens 2:ebedda77b33b 17 //// Este c�digo puede ser usado, modificado y distribuido libremente ////
cstevens 2:ebedda77b33b 18 //// sin eliminar esta cabecera y sin garant�a de ning�n tipo. ////
Suky 1:1085b6177f6e 19 //// ////
Suky 1:1085b6177f6e 20 //// ////
Suky 1:1085b6177f6e 21 ///////////////////////////////////////////////////////////////////////////
Suky 1:1085b6177f6e 22 #include "LCDTFT.h"
Suky 1:1085b6177f6e 23
cstevens 4:1c2f9e3b9b12 24 LCDTFT::LCDTFT(PinName PIN_RD,PinName PIN_WR,PinName PIN_RS,PinName PIN_CS,PinName PIN_RESET, PortOut *PORTLCD)
Suky 1:1085b6177f6e 25 : LCD_PIN_RD(PIN_RD),LCD_PIN_WR(PIN_WR),LCD_PIN_RS(PIN_RS),LCD_PIN_CS(PIN_CS),LCD_PIN_RESET(PIN_RESET){
cstevens 4:1c2f9e3b9b12 26 LCD_PORT=PORTLCD;
Suky 1:1085b6177f6e 27 X=0;
Suky 1:1085b6177f6e 28 Y=0;
Suky 1:1085b6177f6e 29 X_min=0;
Suky 1:1085b6177f6e 30 X_max=LCD_X_MAX;
Suky 1:1085b6177f6e 31 _Alto=1;
Suky 1:1085b6177f6e 32 _Color=0x0000;
Suky 1:1085b6177f6e 33 }
cstevens 2:ebedda77b33b 34 // global variable for screen orientation set by init
cstevens 2:ebedda77b33b 35 bool orient=0;
Suky 1:1085b6177f6e 36
cstevens 2:ebedda77b33b 37 static const unsigned short regValues[] = {
cstevens 2:ebedda77b33b 38 0x0000, 0x0001, // start oscillation
cstevens 2:ebedda77b33b 39 0x00FF, 0x0010, // wait 16 ms
cstevens 2:ebedda77b33b 40 0x0007, 0x0000, //display control - zeros everything ???
cstevens 2:ebedda77b33b 41 0x0013, 0x0000, // power control 3 setting = all zero
cstevens 2:ebedda77b33b 42 0x0011, 0x2604, //power control 2 seting = gvd voltage 0x26 vci1 voltage 0x04
cstevens 2:ebedda77b33b 43 0x0014, 0x0015, // power contrlol 4 setting vcmr=0 vcomh=0 vml=13 = amplitude of vcom voltage
cstevens 2:ebedda77b33b 44 0x0010, 0x3C00, // power control 1 bt3=0 sap=7 (0b111) bt=4 (0b100)
cstevens 2:ebedda77b33b 45 0x0013, 0x0040, //power control 3 PON=1 PON1=0 AON=0
cstevens 2:ebedda77b33b 46 0x00FF,0x0010, // wait 16ms
cstevens 2:ebedda77b33b 47 0x0013, 0x0060, // power control 3 PON=1 PON1=1 AON=0
cstevens 2:ebedda77b33b 48 0x00FF, 0x0032, // wait 50ms
cstevens 2:ebedda77b33b 49 0x0013, 0x0070, //power control 3 PON=1 PON1=1 AON=1
cstevens 2:ebedda77b33b 50 0x00FF, 0x0028, // wait 40ms
cstevens 2:ebedda77b33b 51
cstevens 2:ebedda77b33b 52 0x0001, 0x0127, // driver ouptut control
cstevens 2:ebedda77b33b 53 0x0002, 0x0700, //LCD driving waveform settings
cstevens 2:ebedda77b33b 54 0x0003, 0x1030, // entry mode settingtri=0 dfm=0 bgr=1 id1:id0=11
cstevens 2:ebedda77b33b 55 0x0007, 0x0000, // display control 1 pt1-0=0 vle2-1=0 spt=0 gon=0 rev=0 d1-0=0
cstevens 2:ebedda77b33b 56 0x0008, 0x0404, //black period control fp3-0=4 bp3-0=4
cstevens 2:ebedda77b33b 57 0x000B, 0x0200, //frame cycle setting nd1-0=0 sdt1-0=2 ecs2-0=0 div1-0=0 dcr_ex=0 dcr2-0=0 rtn1-0=0
cstevens 2:ebedda77b33b 58 0x000C, 0x0000, //external interface controlrm=0 dm1-0=0 rim1-0=0
cstevens 2:ebedda77b33b 59 0x00015,0x0000, //sub panel control sub_im1-0=0 stn_en=0 mpu_mode=0 fcv_en=0
cstevens 2:ebedda77b33b 60
cstevens 2:ebedda77b33b 61 //gamma setting
cstevens 2:ebedda77b33b 62 0x0030, 0x0000,
cstevens 2:ebedda77b33b 63 0x0031, 0x0606,
cstevens 2:ebedda77b33b 64 0x0032, 0x0006,
cstevens 2:ebedda77b33b 65 0x0033, 0x0403,
cstevens 2:ebedda77b33b 66 0x0034, 0x0107,
cstevens 2:ebedda77b33b 67 0x0035, 0x0101,
cstevens 2:ebedda77b33b 68 0x0036, 0x0707,
cstevens 2:ebedda77b33b 69 0x0037, 0x0304,
cstevens 2:ebedda77b33b 70 0x0038, 0x0A00,
cstevens 2:ebedda77b33b 71 0x0039, 0x0706,
cstevens 2:ebedda77b33b 72 // end of gamma settings
cstevens 2:ebedda77b33b 73 0x0040, 0x0000, // gate scan position (start g1 scan) scn5-0=0
cstevens 2:ebedda77b33b 74 0x0041, 0x0000, // vertical scroll setting vl8-0=0
cstevens 2:ebedda77b33b 75 0x0042, 0x013F, // screen end position se18-10=0x13F
cstevens 2:ebedda77b33b 76 0x0043, 0x0000, // screen_start position ss28-20=0
cstevens 2:ebedda77b33b 77 0x0044, 0x0000, // 2nd screen driving position end 00
cstevens 2:ebedda77b33b 78 0x0045, 0x0000, //2nd screen driving position start =00
cstevens 2:ebedda77b33b 79 0x0046, 0xEF00, //window addre horizontal ram for x0,x1 HEA=0xEF HSA=00 ie x=0 and x=239
cstevens 2:ebedda77b33b 80 0x0047, 0x013F, //vertical ram address end vea=0x13F ie y=319
cstevens 2:ebedda77b33b 81 0x0048, 0x0000, //vertical ram address start=00 ie y=0
cstevens 2:ebedda77b33b 82 0x0007, 0x0011, //dispaly control 1
cstevens 2:ebedda77b33b 83 0x00FF, 0x0028, //wait 40ms
cstevens 2:ebedda77b33b 84 0x0007, 0x0017, //display control 1
cstevens 2:ebedda77b33b 85
cstevens 2:ebedda77b33b 86 };
cstevens 2:ebedda77b33b 87
cstevens 2:ebedda77b33b 88
cstevens 2:ebedda77b33b 89 void LCDTFT::vLCDTFTSetParametersPrintf(unsigned short Xo,unsigned short Yo,unsigned short Xmin,unsigned short Xmax,unsigned char Alto, unsigned short Color,unsigned short BackColor){
Suky 1:1085b6177f6e 90
Suky 1:1085b6177f6e 91 X=Xo;
Suky 1:1085b6177f6e 92 Y=Yo;
Suky 1:1085b6177f6e 93 X_min=Xmin;
Suky 1:1085b6177f6e 94 X_max=Xmax;
Suky 1:1085b6177f6e 95 _Alto=Alto;
Suky 1:1085b6177f6e 96 _Color=Color;
cstevens 2:ebedda77b33b 97 _Background=BackColor;
Suky 1:1085b6177f6e 98 }
Suky 1:1085b6177f6e 99
Suky 1:1085b6177f6e 100 int LCDTFT::_putc(int value){
Suky 1:1085b6177f6e 101 char Fmt[2]={value,0};
Suky 1:1085b6177f6e 102
Suky 1:1085b6177f6e 103 if(value=='\n'){
Suky 1:1085b6177f6e 104 X=X_min;
cstevens 2:ebedda77b33b 105 Y+=8*_Alto + 1;
Suky 1:1085b6177f6e 106 }else{
cstevens 2:ebedda77b33b 107 vLCDTFTText(X,Y,(const char *)&Fmt[0],&ARIAL[0],_Alto,_Color,_Background);
Suky 1:1085b6177f6e 108 X+=5*_Alto+1;
Suky 1:1085b6177f6e 109 if(X >= X_max){
Suky 1:1085b6177f6e 110 X = X_min;
cstevens 2:ebedda77b33b 111 Y += 8*_Alto + 1;
Suky 1:1085b6177f6e 112 }
Suky 1:1085b6177f6e 113 }
Suky 1:1085b6177f6e 114 return(value);
Suky 1:1085b6177f6e 115 }
Suky 1:1085b6177f6e 116
Suky 1:1085b6177f6e 117 int LCDTFT::_getc(){
Suky 1:1085b6177f6e 118 return(-1);
Suky 1:1085b6177f6e 119 }
Suky 1:1085b6177f6e 120
Suky 1:1085b6177f6e 121 void LCDTFT::vLCDTFTWriteCommand(unsigned short Data){
Suky 1:1085b6177f6e 122
Suky 1:1085b6177f6e 123 LCD_PIN_RS=0;
Suky 1:1085b6177f6e 124 LCD_PIN_CS=0;
cstevens 2:ebedda77b33b 125 LCD_PORT->write(Data>>8); // MSB so with an 8 bit port we need to write here the high and ,low bytes successively
Suky 1:1085b6177f6e 126 LCD_PIN_WR=0;
Suky 1:1085b6177f6e 127 LCD_PIN_WR=1;
cstevens 2:ebedda77b33b 128 LCD_PORT->write(Data & 0x00FF); // LSB
cstevens 2:ebedda77b33b 129 LCD_PIN_WR=0;
cstevens 2:ebedda77b33b 130 LCD_PIN_WR=1;
cstevens 2:ebedda77b33b 131
Suky 1:1085b6177f6e 132 LCD_PIN_CS=1;
Suky 1:1085b6177f6e 133 }
Suky 1:1085b6177f6e 134
Suky 1:1085b6177f6e 135 void LCDTFT::vLCDTFTWriteData(unsigned short Data){
Suky 1:1085b6177f6e 136 LCD_PIN_RS=1;
Suky 1:1085b6177f6e 137 LCD_PIN_CS=0;
cstevens 2:ebedda77b33b 138 LCD_PORT->write(Data>>8); // MSB so with an 8 bit port we need to write here the high and ,low bytes successively
cstevens 2:ebedda77b33b 139 LCD_PIN_WR=0;
cstevens 2:ebedda77b33b 140 LCD_PIN_WR=1;
cstevens 2:ebedda77b33b 141 LCD_PORT->write(Data & 0x00FF); // LSB
Suky 1:1085b6177f6e 142 LCD_PIN_WR=0;
Suky 1:1085b6177f6e 143 LCD_PIN_WR=1;
Suky 1:1085b6177f6e 144 LCD_PIN_CS =1;
Suky 1:1085b6177f6e 145 }
Suky 1:1085b6177f6e 146
Suky 1:1085b6177f6e 147
Suky 1:1085b6177f6e 148 void LCDTFT::vLCDTFTWriteCommandData(unsigned short CMD,unsigned short Data){
Suky 1:1085b6177f6e 149 vLCDTFTWriteCommand(CMD);
Suky 1:1085b6177f6e 150 vLCDTFTWriteData(Data);
Suky 1:1085b6177f6e 151 }
Suky 1:1085b6177f6e 152
Suky 1:1085b6177f6e 153 void LCDTFT::vLCDTFTAddressSet(unsigned short x1,unsigned short y1,unsigned short x2,unsigned short y2){
Suky 1:1085b6177f6e 154
Suky 1:1085b6177f6e 155 vLCDTFTWriteCommandData(0x0044,(x2<<8)+x1);
Suky 1:1085b6177f6e 156 vLCDTFTWriteCommandData(0x0045,y1);
Suky 1:1085b6177f6e 157 vLCDTFTWriteCommandData(0x0046,y2);
Suky 1:1085b6177f6e 158 vLCDTFTWriteCommandData(0x004e,x1);
Suky 1:1085b6177f6e 159 vLCDTFTWriteCommandData(0x004f,y1);
Suky 1:1085b6177f6e 160 vLCDTFTWriteCommand(0x0022);
Suky 1:1085b6177f6e 161 }
Suky 1:1085b6177f6e 162
Suky 1:1085b6177f6e 163 void LCDTFT::vLCDTFTAddressSetPoint(unsigned short x,unsigned short y){
Suky 1:1085b6177f6e 164
cstevens 2:ebedda77b33b 165 // CGRAM addresses are given by (x+y*256) - for some reason the y cordinate
cstevens 2:ebedda77b33b 166 // addresses require 17 bits
cstevens 2:ebedda77b33b 167 // equiv if y is given by 0xYYY and x by 0xXX
cstevens 2:ebedda77b33b 168 // then address of point x,y is 0xYYYXXX
cstevens 2:ebedda77b33b 169 int add;
cstevens 2:ebedda77b33b 170 int adl,adh;
cstevens 2:ebedda77b33b 171 if(orient==0){ // portrait
cstevens 2:ebedda77b33b 172 add=x+y*256; //240 x 320 y but 256 bytes for each x row
cstevens 2:ebedda77b33b 173
cstevens 2:ebedda77b33b 174 }
cstevens 2:ebedda77b33b 175 else{
cstevens 2:ebedda77b33b 176 add=(239-y)+x*256;
cstevens 2:ebedda77b33b 177 }
cstevens 2:ebedda77b33b 178 adl=add & 0x00FF; // selects the 8 low bits
cstevens 2:ebedda77b33b 179 adh=(add >>8); // the 9 high bits
cstevens 2:ebedda77b33b 180 vLCDTFTWriteCommandData(0x0020,adl); // 8 lsb of address
cstevens 2:ebedda77b33b 181 vLCDTFTWriteCommandData(0x0021,adh); //9 msb of address
cstevens 2:ebedda77b33b 182 vLCDTFTWriteCommand(0x0022); // prepare to send rgb data
Suky 1:1085b6177f6e 183 }
Suky 1:1085b6177f6e 184
cstevens 2:ebedda77b33b 185 void LCDTFT::vLCDTFTInit(bool format){
Suky 1:1085b6177f6e 186
cstevens 2:ebedda77b33b 187 int i;
cstevens 2:ebedda77b33b 188 unsigned short address,data;
cstevens 2:ebedda77b33b 189 orient=format;
Suky 1:1085b6177f6e 190 LCD_PIN_RESET=1;
cstevens 2:ebedda77b33b 191 wait_ms(5); // must hold for at least 1ms after reset
Suky 1:1085b6177f6e 192 LCD_PIN_RESET=0;
cstevens 2:ebedda77b33b 193 wait_ms(10); // wait for stable R-C oscillation
Suky 1:1085b6177f6e 194 LCD_PIN_RESET=1;
cstevens 2:ebedda77b33b 195 wait_ms(5); // final wait for rest to be acitvated
Suky 1:1085b6177f6e 196 LCD_PIN_CS=1;
Suky 1:1085b6177f6e 197 LCD_PIN_RD=1;
Suky 1:1085b6177f6e 198 LCD_PIN_WR=1;
Suky 1:1085b6177f6e 199 wait_ms(20);
cstevens 2:ebedda77b33b 200
cstevens 2:ebedda77b33b 201 for(i=0;i<sizeof(regValues)/4;i++)
cstevens 2:ebedda77b33b 202 {
cstevens 2:ebedda77b33b 203 address=regValues[i*2];
cstevens 2:ebedda77b33b 204 data=regValues[i*2+1];
cstevens 2:ebedda77b33b 205
cstevens 2:ebedda77b33b 206 if(address==0xFF)
cstevens 2:ebedda77b33b 207 {
cstevens 2:ebedda77b33b 208 wait_ms(data);
cstevens 2:ebedda77b33b 209 }
cstevens 2:ebedda77b33b 210 else {
cstevens 2:ebedda77b33b 211 vLCDTFTWriteCommandData(address,data);
cstevens 2:ebedda77b33b 212 }
cstevens 2:ebedda77b33b 213 }
cstevens 4:1c2f9e3b9b12 214 wait_ms(3); // changed from 1
cstevens 2:ebedda77b33b 215
Suky 1:1085b6177f6e 216
cstevens 2:ebedda77b33b 217 /*
Suky 1:1085b6177f6e 218 vLCDTFTWriteCommandData(0x0000,0x0001); wait_ms(1);
Suky 1:1085b6177f6e 219 vLCDTFTWriteCommandData(0x0003,0xA8A4); wait_ms(1);
Suky 1:1085b6177f6e 220 vLCDTFTWriteCommandData(0x000C,0x0000); wait_ms(1);
Suky 1:1085b6177f6e 221 vLCDTFTWriteCommandData(0x000D,0x080C); wait_ms(1);
Suky 1:1085b6177f6e 222 vLCDTFTWriteCommandData(0x000E,0x2B00); wait_ms(1);
Suky 1:1085b6177f6e 223 vLCDTFTWriteCommandData(0x001E,0x00B0); wait_ms(1);
Suky 1:1085b6177f6e 224 vLCDTFTWriteCommandData(0x0001,0x2B3F); wait_ms(1);
Suky 1:1085b6177f6e 225 vLCDTFTWriteCommandData(0x0002,0x0600); wait_ms(1);
Suky 1:1085b6177f6e 226 vLCDTFTWriteCommandData(0x0010,0x0000); wait_ms(1);
Suky 1:1085b6177f6e 227 vLCDTFTWriteCommandData(0x0011,0x6070); wait_ms(1);
Suky 1:1085b6177f6e 228 vLCDTFTWriteCommandData(0x0005,0x0000); wait_ms(1);
Suky 1:1085b6177f6e 229 vLCDTFTWriteCommandData(0x0006,0x0000); wait_ms(1);
Suky 1:1085b6177f6e 230 vLCDTFTWriteCommandData(0x0016,0xEF1C); wait_ms(1);
Suky 1:1085b6177f6e 231 vLCDTFTWriteCommandData(0x0017,0x0003); wait_ms(1);
Suky 1:1085b6177f6e 232 vLCDTFTWriteCommandData(0x0007,0x0233); wait_ms(1);
Suky 1:1085b6177f6e 233 vLCDTFTWriteCommandData(0x000B,0x0000); wait_ms(1);
Suky 1:1085b6177f6e 234 vLCDTFTWriteCommandData(0x000F,0x0000); wait_ms(1);
Suky 1:1085b6177f6e 235 vLCDTFTWriteCommandData(0x0041,0x0000); wait_ms(1);
Suky 1:1085b6177f6e 236 vLCDTFTWriteCommandData(0x0042,0x0000); wait_ms(1);
Suky 1:1085b6177f6e 237 vLCDTFTWriteCommandData(0x0048,0x0000); wait_ms(1);
Suky 1:1085b6177f6e 238 vLCDTFTWriteCommandData(0x0049,0x013F); wait_ms(1);
Suky 1:1085b6177f6e 239 vLCDTFTWriteCommandData(0x004A,0x0000); wait_ms(1);
Suky 1:1085b6177f6e 240 vLCDTFTWriteCommandData(0x004B,0x0000); wait_ms(1);
Suky 1:1085b6177f6e 241 vLCDTFTWriteCommandData(0x0044,0xEF00); wait_ms(1);
Suky 1:1085b6177f6e 242 vLCDTFTWriteCommandData(0x0045,0x0000); wait_ms(1);
Suky 1:1085b6177f6e 243 vLCDTFTWriteCommandData(0x0046,0x013F); wait_ms(1);
Suky 1:1085b6177f6e 244 vLCDTFTWriteCommandData(0x0030,0x0707); wait_ms(1);
Suky 1:1085b6177f6e 245 vLCDTFTWriteCommandData(0x0031,0x0204); wait_ms(1);
Suky 1:1085b6177f6e 246 vLCDTFTWriteCommandData(0x0032,0x0204); wait_ms(1);
Suky 1:1085b6177f6e 247 vLCDTFTWriteCommandData(0x0033,0x0502); wait_ms(1);
Suky 1:1085b6177f6e 248 vLCDTFTWriteCommandData(0x0034,0x0507); wait_ms(1);
Suky 1:1085b6177f6e 249 vLCDTFTWriteCommandData(0x0035,0x0204); wait_ms(1);
Suky 1:1085b6177f6e 250 vLCDTFTWriteCommandData(0x0036,0x0204); wait_ms(1);
Suky 1:1085b6177f6e 251 vLCDTFTWriteCommandData(0x0037,0x0502); wait_ms(1);
Suky 1:1085b6177f6e 252 vLCDTFTWriteCommandData(0x003A,0x0302); wait_ms(1);
Suky 1:1085b6177f6e 253 vLCDTFTWriteCommandData(0x003B,0x0302); wait_ms(1);
Suky 1:1085b6177f6e 254 vLCDTFTWriteCommandData(0x0023,0x0000); wait_ms(1);
Suky 1:1085b6177f6e 255 vLCDTFTWriteCommandData(0x0024,0x0000); wait_ms(1);
Suky 1:1085b6177f6e 256 vLCDTFTWriteCommandData(0x0025,0x8000); wait_ms(1);
Suky 1:1085b6177f6e 257 vLCDTFTWriteCommandData(0x004f,0);
Suky 1:1085b6177f6e 258 vLCDTFTWriteCommandData(0x004e,0);
Suky 1:1085b6177f6e 259 vLCDTFTWriteCommand(0x0022);
cstevens 2:ebedda77b33b 260 */
Suky 1:1085b6177f6e 261 }
Suky 1:1085b6177f6e 262
Suky 1:1085b6177f6e 263 void LCDTFT::vLCDTFTFillScreen(unsigned short Color){
Suky 1:1085b6177f6e 264 unsigned short i,j;
cstevens 2:ebedda77b33b 265
cstevens 2:ebedda77b33b 266 vLCDTFTWriteCommandData(0x0020,00); //set x=0
cstevens 2:ebedda77b33b 267 vLCDTFTWriteCommandData(0x0021,00); // set y=0
cstevens 2:ebedda77b33b 268 vLCDTFTWriteCommand(0x0022);
Suky 1:1085b6177f6e 269
Suky 1:1085b6177f6e 270 for(i=0;i<320;i++){
Suky 1:1085b6177f6e 271 for (j=0;j<240;j++){
Suky 1:1085b6177f6e 272 vLCDTFTWriteData(Color);
Suky 1:1085b6177f6e 273 }
Suky 1:1085b6177f6e 274 }
Suky 1:1085b6177f6e 275 }
Suky 1:1085b6177f6e 276
Suky 1:1085b6177f6e 277 void LCDTFT::vLCDTFTPoint(unsigned short x,unsigned short y,unsigned short Color){
Suky 1:1085b6177f6e 278
Suky 1:1085b6177f6e 279 vLCDTFTAddressSetPoint(x,y);
Suky 1:1085b6177f6e 280 vLCDTFTWriteData(Color);
Suky 1:1085b6177f6e 281 }
Suky 1:1085b6177f6e 282
cstevens 2:ebedda77b33b 283 void LCDTFT::vLCDTFTText(unsigned short x,unsigned short y,const char *PtrText,const char (*Fuente)[5],unsigned char Alto,unsigned short Color,unsigned short BackColor){
cstevens 3:f999653c1069 284 unsigned short i, j, k, l, m, temp,lmax;
Suky 1:1085b6177f6e 285 char DataPunto[5];
Suky 1:1085b6177f6e 286 const char *Ptr;
cstevens 3:f999653c1069 287 if(orient==0) lmax=LCD_X_MAX;
cstevens 3:f999653c1069 288 else lmax=LCD_Y_MAX;
Suky 1:1085b6177f6e 289
Suky 1:1085b6177f6e 290 while(*PtrText!='\0'){
Suky 1:1085b6177f6e 291 Ptr=(Fuente+*PtrText-' ')[0];
Suky 1:1085b6177f6e 292 for(i=0;i<5;i++){DataPunto[i]=*Ptr++;}
Suky 1:1085b6177f6e 293 switch(*PtrText){
Suky 1:1085b6177f6e 294 case '\n':
Suky 1:1085b6177f6e 295 y += 7*Alto + 1;
Suky 1:1085b6177f6e 296 break;
Suky 1:1085b6177f6e 297 case '\r':
Suky 1:1085b6177f6e 298 x = 0;
Suky 1:1085b6177f6e 299 break;
Suky 1:1085b6177f6e 300 default:
cstevens 3:f999653c1069 301 if(x+5*Alto >= lmax){
Suky 1:1085b6177f6e 302 x = 0;
Suky 1:1085b6177f6e 303 y += 7*Alto + 1;
Suky 1:1085b6177f6e 304 }
Suky 1:1085b6177f6e 305 for(j=0; j<5; ++j, x+=Alto){
Suky 1:1085b6177f6e 306 for(k=0; k < 7; k++){
Suky 1:1085b6177f6e 307 temp=(0x01<<k);
Suky 1:1085b6177f6e 308 if((DataPunto[j]&temp)==temp){
Suky 1:1085b6177f6e 309 for(l=0; l < Alto; ++l){
Suky 1:1085b6177f6e 310 for(m=0; m < Alto; ++m){
Suky 1:1085b6177f6e 311 vLCDTFTPoint(x+m,y+k*Alto+l,Color);
cstevens 2:ebedda77b33b 312 }//endform
cstevens 2:ebedda77b33b 313 }//endforl
cstevens 2:ebedda77b33b 314 }//endif
cstevens 2:ebedda77b33b 315 else{
cstevens 2:ebedda77b33b 316 for(l=0; l < Alto; ++l){
cstevens 2:ebedda77b33b 317 for(m=0; m < Alto; ++m){
cstevens 2:ebedda77b33b 318 vLCDTFTPoint(x+m,y+k*Alto+l,BackColor);
cstevens 2:ebedda77b33b 319 }//endform
cstevens 2:ebedda77b33b 320 }//endforl
cstevens 2:ebedda77b33b 321 }
Suky 1:1085b6177f6e 322 }
Suky 1:1085b6177f6e 323 }
Suky 1:1085b6177f6e 324 x++;
Suky 1:1085b6177f6e 325 break;
Suky 1:1085b6177f6e 326 }
Suky 1:1085b6177f6e 327 *PtrText++;
Suky 1:1085b6177f6e 328 }
Suky 1:1085b6177f6e 329 }
Suky 1:1085b6177f6e 330
Suky 1:1085b6177f6e 331 void LCDTFT::vLCDTFTLine(unsigned short x1,unsigned short y1,unsigned short x2,unsigned short y2,unsigned short Color){
Suky 1:1085b6177f6e 332
Suky 1:1085b6177f6e 333 unsigned short dy, dx;
Suky 1:1085b6177f6e 334 short addx=1, addy=1;
Suky 1:1085b6177f6e 335 short P, diff;
Suky 1:1085b6177f6e 336 unsigned short i=0;
Suky 1:1085b6177f6e 337
Suky 1:1085b6177f6e 338 diff=((short)x2-x1);
Suky 1:1085b6177f6e 339 if(diff<0) diff*=-1;
Suky 1:1085b6177f6e 340 dx=diff;
Suky 1:1085b6177f6e 341 diff=((short)y2-y1);
Suky 1:1085b6177f6e 342 if(diff<0) diff*=-1;
Suky 1:1085b6177f6e 343 dy=diff;
Suky 1:1085b6177f6e 344
Suky 1:1085b6177f6e 345
Suky 1:1085b6177f6e 346 if(x1 > x2)addx = -1;
Suky 1:1085b6177f6e 347 if(y1 > y2)addy = -1;
Suky 1:1085b6177f6e 348 if(dx >= dy){
Suky 1:1085b6177f6e 349 dy *= 2;
Suky 1:1085b6177f6e 350 P = dy - dx;
Suky 1:1085b6177f6e 351 diff = P - dx;
Suky 1:1085b6177f6e 352 for(;i<=dx;++i){
Suky 1:1085b6177f6e 353 vLCDTFTPoint(x1, y1, Color);
Suky 1:1085b6177f6e 354 if(P < 0){
Suky 1:1085b6177f6e 355 P += dy;
Suky 1:1085b6177f6e 356 x1 += addx;
Suky 1:1085b6177f6e 357 }else{
Suky 1:1085b6177f6e 358 P += diff;
Suky 1:1085b6177f6e 359 x1 += addx;
Suky 1:1085b6177f6e 360 y1 += addy;
Suky 1:1085b6177f6e 361 }
Suky 1:1085b6177f6e 362 }
Suky 1:1085b6177f6e 363 }else{
Suky 1:1085b6177f6e 364 dx *= 2;
Suky 1:1085b6177f6e 365 P = dx - dy;
Suky 1:1085b6177f6e 366 diff = P - dy;
Suky 1:1085b6177f6e 367 for(; i<=dy; ++i){
Suky 1:1085b6177f6e 368 vLCDTFTPoint(x1, y1, Color);
Suky 1:1085b6177f6e 369 if(P < 0){
Suky 1:1085b6177f6e 370 P += dx;
Suky 1:1085b6177f6e 371 y1 += addy;
Suky 1:1085b6177f6e 372 }else{
Suky 1:1085b6177f6e 373 P += diff;
Suky 1:1085b6177f6e 374 x1 += addx;
Suky 1:1085b6177f6e 375 y1 += addy;
Suky 1:1085b6177f6e 376 }
Suky 1:1085b6177f6e 377 }
Suky 1:1085b6177f6e 378 }
Suky 1:1085b6177f6e 379 }
Suky 1:1085b6177f6e 380
Suky 1:1085b6177f6e 381
Suky 1:1085b6177f6e 382 void LCDTFT::vLCDTFTRectangle(unsigned short x1,unsigned short y1,unsigned short x2,unsigned short y2,bool Filled,unsigned short Color){
Suky 1:1085b6177f6e 383
Suky 1:1085b6177f6e 384 if(Filled){
cstevens 2:ebedda77b33b 385 int Lenght=(int)(x2-x1);
Suky 1:1085b6177f6e 386
cstevens 2:ebedda77b33b 387
Suky 1:1085b6177f6e 388 for(int i=0;i<Lenght;i++){
cstevens 2:ebedda77b33b 389 vLCDTFTLine(x1,y1+i,x2,y1+i,Color);
Suky 1:1085b6177f6e 390 }
Suky 1:1085b6177f6e 391 }else{
Suky 1:1085b6177f6e 392 vLCDTFTLine(x1, y1, x2, y1, Color);
Suky 1:1085b6177f6e 393 vLCDTFTLine(x1, y2, x2, y2, Color);
Suky 1:1085b6177f6e 394 vLCDTFTLine(x1, y1, x1, y2, Color);
Suky 1:1085b6177f6e 395 vLCDTFTLine(x2, y1, x2, y2, Color);
Suky 1:1085b6177f6e 396 }
Suky 1:1085b6177f6e 397 }
Suky 1:1085b6177f6e 398
Suky 1:1085b6177f6e 399
Suky 1:1085b6177f6e 400 void LCDTFT::vLCDTFTCircle(unsigned short x,unsigned short y,unsigned short Radius,bool Filled,unsigned short Color){
Suky 1:1085b6177f6e 401 short a, b, P;
Suky 1:1085b6177f6e 402
Suky 1:1085b6177f6e 403 a = 0;
Suky 1:1085b6177f6e 404 b = Radius;
Suky 1:1085b6177f6e 405 P = 1 - Radius;
Suky 1:1085b6177f6e 406
Suky 1:1085b6177f6e 407 do{
Suky 1:1085b6177f6e 408 if(Filled){
Suky 1:1085b6177f6e 409 vLCDTFTLine(x-a, y+b, x+a, y+b, Color);
Suky 1:1085b6177f6e 410 vLCDTFTLine(x-a, y-b, x+a, y-b, Color);
Suky 1:1085b6177f6e 411 vLCDTFTLine(x-b, y+a, x+b, y+a, Color);
Suky 1:1085b6177f6e 412 vLCDTFTLine(x-b, y-a, x+b, y-a, Color);
Suky 1:1085b6177f6e 413 }else{
Suky 1:1085b6177f6e 414 vLCDTFTPoint(a+x, b+y, Color);
Suky 1:1085b6177f6e 415 vLCDTFTPoint(b+x, a+y, Color);
Suky 1:1085b6177f6e 416 vLCDTFTPoint(x-a, b+y, Color);
Suky 1:1085b6177f6e 417 vLCDTFTPoint(x-b, a+y, Color);
Suky 1:1085b6177f6e 418 vLCDTFTPoint(b+x, y-a, Color);
Suky 1:1085b6177f6e 419 vLCDTFTPoint(a+x, y-b, Color);
Suky 1:1085b6177f6e 420 vLCDTFTPoint(x-a, y-b, Color);
Suky 1:1085b6177f6e 421 vLCDTFTPoint(x-b, y-a, Color);
Suky 1:1085b6177f6e 422 }
Suky 1:1085b6177f6e 423 if(P < 0) P += 3 + 2 * a++;
Suky 1:1085b6177f6e 424 else P += 5 + 2 * (a++ - b--);
Suky 1:1085b6177f6e 425 }while(a <= b);
Suky 1:1085b6177f6e 426 }
cstevens 2:ebedda77b33b 427 /*
Suky 1:1085b6177f6e 428 void LCDTFT::vDrawImageBMP24Bits(const char *NameImagen){
Suky 1:1085b6177f6e 429
Suky 1:1085b6177f6e 430 #define OffsetWidthPixel 18
Suky 1:1085b6177f6e 431 #define OffsetHeighPixel 22
Suky 1:1085b6177f6e 432 #define OffsetSizeFile 34
Suky 1:1085b6177f6e 433 #define OffsetInitData 10
Suky 1:1085b6177f6e 434 #define OffserTipeFile 28
Suky 1:1085b6177f6e 435 char Nombre[80],k;
Suky 1:1085b6177f6e 436 unsigned short PosXImagen,PosYImagen;
Suky 1:1085b6177f6e 437 unsigned char Temp,BufferHeader[54],BufferTemp[3],Adicional;
Suky 1:1085b6177f6e 438 unsigned int WidthPixel,HeighPixel;
Suky 1:1085b6177f6e 439 unsigned short TipeFile,InitData,Temp16bits;
Suky 1:1085b6177f6e 440 union{
Suky 1:1085b6177f6e 441 unsigned short Val;
Suky 1:1085b6177f6e 442 struct{
Suky 1:1085b6177f6e 443 unsigned Blue:5;
Suky 1:1085b6177f6e 444 unsigned Green:6;
Suky 1:1085b6177f6e 445 unsigned Red:5;
Suky 1:1085b6177f6e 446 };
Suky 1:1085b6177f6e 447 }Color;
Suky 1:1085b6177f6e 448
Suky 1:1085b6177f6e 449 LocalFileSystem local("mbedMemory");
Suky 1:1085b6177f6e 450 sprintf(&Nombre[0],"/mbedMemory/");
Suky 1:1085b6177f6e 451 k=12;
Suky 1:1085b6177f6e 452 while(*NameImagen!='\0'){
Suky 1:1085b6177f6e 453 Nombre[k++]=*NameImagen++;
Suky 1:1085b6177f6e 454 }
Suky 1:1085b6177f6e 455
Suky 1:1085b6177f6e 456 FILE *Imagen = fopen((const char *)&Nombre[0], "r"); // Abrimos archivo para lectura.
Suky 1:1085b6177f6e 457 // Si no se pudo encontrar archivo:
Suky 1:1085b6177f6e 458 if(!Imagen) {
Suky 1:1085b6177f6e 459 vLCDTFTFillScreen(ColorBlack);
Suky 1:1085b6177f6e 460 return;
Suky 1:1085b6177f6e 461 }
Suky 1:1085b6177f6e 462 // Leemos cabecera de archivo
Suky 1:1085b6177f6e 463 fread(&BufferHeader[0],1,54,Imagen);
Suky 1:1085b6177f6e 464
Suky 1:1085b6177f6e 465 WidthPixel = ((unsigned int)BufferHeader[OffsetWidthPixel + 3]*16777216+BufferHeader[OffsetWidthPixel + 2]*65536+BufferHeader[OffsetWidthPixel + 1]*256+BufferHeader[OffsetWidthPixel]);
Suky 1:1085b6177f6e 466 HeighPixel = ((unsigned int)BufferHeader[OffsetHeighPixel + 3]*16777216+BufferHeader[OffsetHeighPixel + 2]*65536+BufferHeader[OffsetHeighPixel + 1]*256+BufferHeader[OffsetHeighPixel]);
Suky 1:1085b6177f6e 467 InitData = ((unsigned short)BufferHeader[OffsetInitData]);
Suky 1:1085b6177f6e 468 TipeFile = ((unsigned short)BufferHeader[OffserTipeFile + 1]*256 + BufferHeader[OffserTipeFile]);
Suky 1:1085b6177f6e 469
Suky 1:1085b6177f6e 470 if((WidthPixel>LCD_X_MAX) || (HeighPixel>LCD_Y_MAX) || (TipeFile!=24)){
Suky 1:1085b6177f6e 471 fclose(Imagen);
Suky 1:1085b6177f6e 472 return;
Suky 1:1085b6177f6e 473 }
Suky 1:1085b6177f6e 474
Suky 1:1085b6177f6e 475 if(InitData!=54){
Suky 1:1085b6177f6e 476 for(int k=54;k<InitData;k++){
Suky 1:1085b6177f6e 477 fread(&Temp,1,1,Imagen);
Suky 1:1085b6177f6e 478 }
Suky 1:1085b6177f6e 479 }
Suky 1:1085b6177f6e 480
Suky 1:1085b6177f6e 481 PosXImagen=(LCD_X_MAX/2)-(WidthPixel/2);
Suky 1:1085b6177f6e 482 PosYImagen=(LCD_Y_MAX/2)+(HeighPixel/2);
Suky 1:1085b6177f6e 483
Suky 1:1085b6177f6e 484 Temp16bits=WidthPixel*3;
Suky 1:1085b6177f6e 485 Adicional=0;
Suky 1:1085b6177f6e 486 while(((Temp16bits)%4)!=0){
Suky 1:1085b6177f6e 487 Adicional++;
Suky 1:1085b6177f6e 488 Temp16bits++;
Suky 1:1085b6177f6e 489 }
Suky 1:1085b6177f6e 490
Suky 1:1085b6177f6e 491 for(int k=0,y=PosYImagen;k<HeighPixel;k++,y--){
Suky 1:1085b6177f6e 492 vLCDTFTAddressSet(PosXImagen,y,PosXImagen+WidthPixel-1,y);
Suky 1:1085b6177f6e 493 for(int i=0;i<WidthPixel;i++){
Suky 1:1085b6177f6e 494 fread(&BufferTemp[0],1,3,Imagen); // Leemos 3 bytes (R,G,B)
Suky 1:1085b6177f6e 495 Color.Blue=BufferTemp[0]>>3;Color.Green=BufferTemp[1]>>2;Color.Red=BufferTemp[2]>>3; // Conversion de 24-bits a 16-bits.-
Suky 1:1085b6177f6e 496 vLCDTFTWriteData(Color.Val);
Suky 1:1085b6177f6e 497 }
Suky 1:1085b6177f6e 498 // Bytes adicionales para que linea sea multiplo de 4.-
Suky 1:1085b6177f6e 499 for(int p=0;p<Adicional;p++){
Suky 1:1085b6177f6e 500 fread(&Temp,1,1,Imagen);
Suky 1:1085b6177f6e 501 }
Suky 1:1085b6177f6e 502 }
Suky 1:1085b6177f6e 503 fclose(Imagen);
Suky 1:1085b6177f6e 504 }
cstevens 2:ebedda77b33b 505 */
Suky 1:1085b6177f6e 506 void LCDTFT::vLCDTFTDrawImage(unsigned short x,unsigned short y, unsigned short Width, unsigned short Heigh, unsigned int Lenght, const unsigned short *Imagen){
Suky 1:1085b6177f6e 507
Suky 1:1085b6177f6e 508 vLCDTFTAddressSet(x,y,x+Width-1,y+Heigh-1);
Suky 1:1085b6177f6e 509 for(int i=0;i<Lenght;i++){
Suky 1:1085b6177f6e 510 vLCDTFTWriteData(*Imagen++);
Suky 1:1085b6177f6e 511 }
Suky 0:359653f39307 512 }