Menus LCD TFT
Dependents: Example_Menu_LCD_TFT
Menus.h
00001 /* 00002 \file Menus.h 00003 \version: 1.0 00004 00005 \brief Este fichero contiene funciones para creación de Menus es LCD TFT.- 00006 00007 \web www.micros-designs.com.ar 00008 \date 15/03/11 00009 00010 *- Version Log --------------------------------------------------------------* 00011 * Fecha Autor Comentarios * 00012 *----------------------------------------------------------------------------* 00013 * 15/03/11 Suky Original * 00014 *----------------------------------------------------------------------------*/ 00015 /////////////////////////////////////////////////////////////////////////// 00016 //// //// 00017 //// //// 00018 //// (C) Copyright 2011 www.micros-designs.com.ar //// 00019 //// Este código puede ser usado, modificado y distribuido libremente //// 00020 //// sin eliminar esta cabecera y sin garantía de ningún tipo. //// 00021 //// //// 00022 //// //// 00023 /////////////////////////////////////////////////////////////////////////// 00024 #ifndef __MENUS_H__ 00025 #define __MENUS_H__ 00026 00027 #include "mbed.h" 00028 #include "LCDTFT.h" 00029 #include "Touch.h" 00030 #include "GenericTypeDefs.h" 00031 #include "Images.h" 00032 00033 // **************************************************************************************** 00034 #define TOUCH_X_MIN 20 00035 #define TOUCH_X_MAX 230 00036 #define TOUCH_Y_MIN 15 00037 #define TOUCH_Y_MAX 240 00038 // **************************************************************************************** 00039 #define MENU_FIN 0 00040 #define MENU_COMANDO 1 00041 #define MENU_SUBMENU 2 00042 #define SUBMENU_ANTERIOR 3 00043 #define MENU_MAIN 4 00044 // **************************************************************************************** 00045 #define MENSAJE_ATRAS_OK 1 00046 #define MENSAJE_NO_SI 2 00047 #define MENSAJE_ATRAS 3 00048 00049 #define MENSAJE_ACCION_ATRAS 1 00050 #define MENSAJE_ACCION_OK 2 00051 #define MENSAJE_ACCION_NO 3 00052 #define MENSAJE_ACCION_SI 4 00053 00054 #define MODIFICADOR_ACEPTAR 1 00055 #define MODIFICADOR_CANCELAR 2 00056 // **************************************************************************************** 00057 #define IMAGEN_FONDO_MENU 10 00058 // **************************************************************************************** 00059 #define BOTON_NORMAL 1 00060 #define BOTON_PRES_IZQ 2 00061 #define BOTON_PRES_DER 3 00062 #define ITEM_NORMAL 4 00063 #define ITEM_PRES 5 00064 // **************************************************************************************** 00065 #define COLOR_LETRA_BOTON ColorAqua 00066 #define COLOR_LETRA_BOTON_PRES ColorWhite 00067 #define COLOR_FONDO_LETRA ColorGray 00068 #define COLOR_MSJ ColorWhite 00069 // **************************************************************************************** 00070 #define JUST_IZQ 1 00071 #define JUST_DER 2 00072 #define JUST_CENTRADO 3 00073 // **************************************************************************************** 00074 #define AREA_BTN_INF_DER() (Coordenadas.x<235 && Coordenadas.x>135) && (Coordenadas.y<320 && Coordenadas.y>290) 00075 #define AREA_BTN_INF_IZQ() (Coordenadas.x<105 && Coordenadas.x>5) && (Coordenadas.y<320 && Coordenadas.y>290) 00076 // **************************************************************************************** 00077 TouchScreenADS7843 MyTouch(p9,p10,p12,p11,p8); // ADS7843-> SDO,SDI,SCK,CS,IRQ 00078 BusOut MyBus(p13,p14,p15,p16,p17,p18,p19,p20,p30,p29,p28,p27,p26,p25,p24,p23); 00079 LCDTFT MyLCD(p5,p6,p7,p22,p21,&MyBus); 00080 // **************************************************************************************** 00081 typedef struct{ 00082 UINT8 TipoMenu; 00083 const UINT8 *TextoMenu; 00084 UINT8 *Menu; 00085 void (*PtrFuncionSeleccion)(void); 00086 const UINT16 *PtrIcono; 00087 }MENU; 00088 // **************************************************************************************** 00089 struct{ 00090 const MENU *PtrMenu; 00091 UINT8 ElementoSeleccionActual; 00092 void (*FuncionActualEjecucion)(void); 00093 UINT8 CantElementosMenu; 00094 }MenuActual; 00095 // **************************************************************************************** 00096 struct{ 00097 float ValorInicial; 00098 float ValorActual; 00099 UINT8 String[15]; 00100 UINT8 Ptr; 00101 void (*FuncionActualEjecucion)(UINT8,float); 00102 }ModificadorVariable; 00103 // **************************************************************************************** 00104 struct{ 00105 UINT8 TipoMensajePantalla; 00106 void (*MensajeFuncionEjecutar)(UINT8); 00107 }MensajePantalla; 00108 // **************************************************************************************** 00109 TOUCH_DATA Coordenadas; 00110 volatile bool kbhit_irq=0; 00111 volatile bool kbhit_tratament=0; 00112 // **************************************************************************************** 00113 void vSeteoFuncionEjecutar(void (*PtrNuevaFuncion)(void)); 00114 void vEjecutaEventosMenu(void); 00115 void vSeleccionarMenuAnterior(void); 00116 void vSeleccionMenu(const MENU *Menu,UINT8 ElementoMenuSeleccion); 00117 void vEventosSubMenu(void); 00118 void vDibujarImagenFondo(UINT8 Seleccion); 00119 void vDibujarMenuInferior(const UINT8 *TextoIzq,const UINT8 *TextoDer, UINT8 Status); 00120 void vDibujarElementoMenu(UINT8 NElemento,UINT8 Status); 00121 void vMensajePantalla(const UINT8 *Mensaje,UINT16 YInicial,UINT8 TipoMensaje,void (*FuncionEjecutar)(UINT8)); 00122 void vEventosPantallaMensaje(void); 00123 void vModificadorVariables(const UINT8 *NombreVariable,float ValorInicial,void (*PtrFuncion)(UINT8,float)); 00124 void vEventosModificadorVariables(void); 00125 void vTextoJustificado(const unsigned char *PtrTexto,unsigned short ExtremoIzq, unsigned short ExtremoDer, unsigned short y, unsigned char Just,const char (*Fuente)[5],unsigned char Alto, unsigned short Color); 00126 void vEscribirMensaje(unsigned short YInicial,const unsigned char *Mensaje,const char (*Fuente)[5],unsigned char Just, unsigned short Color); 00127 // **************************************************************************************** 00128 // Rutina de atencion de interrupcion.- 00129 void vISRTouchIRQ(){ 00130 UINT_COORDxy Temp; 00131 00132 00133 MyTouch.vTestTouchPanel(&Coordenadas); 00134 // Coordenadas dentro del rango de pantalla LCD: 00135 if((Coordenadas.x>TOUCH_X_MIN && Coordenadas.x<TOUCH_X_MAX) && (Coordenadas.y>TOUCH_Y_MIN && Coordenadas.y<TOUCH_Y_MAX)){ 00136 if(kbhit_tratament==0){ 00137 // Cambio de coordenda y escala: 00138 Temp=Coordenadas.y; 00139 Coordenadas.y=((float)((255.0-TOUCH_X_MIN)-Coordenadas.x)*(320.0/(TOUCH_X_MAX-TOUCH_X_MIN))); 00140 Coordenadas.x=((float)(Temp-TOUCH_Y_MIN)*(240.0/(TOUCH_Y_MAX-TOUCH_Y_MIN))); 00141 kbhit_irq=1; 00142 } 00143 } 00144 } 00145 // **************************************************************************************** 00146 void vInitLCDTFTAndTouch(void){ 00147 MyTouch.vInitADS7843(USE_8BITS,&vISRTouchIRQ); 00148 MyLCD.vLCDTFTInit(); 00149 Led1=0; 00150 Led2=0; 00151 } 00152 // **************************************************************************************** 00153 // **************************************************************************************** 00154 /* ** Se carga en puntero la funcion que se ejecutara dentro del while ** */ 00155 void vSeteamosFuncionEjecutar(void (*PtrNuevaFuncion)(void)){ 00156 MenuActual.FuncionActualEjecucion = PtrNuevaFuncion; 00157 } 00158 /* ** Ejecuta funcion que se encuentra apuntada ** */ 00159 void vEjecutaEventosMenu(void){ 00160 (*MenuActual.FuncionActualEjecucion)(); 00161 } 00162 /* ** Selecciona Menu anterior a mostrar despues de un comando ** */ 00163 void vSeleccionarMenuAnterior(void){ 00164 vSeleccionMenu(MenuActual.PtrMenu,MenuActual.ElementoSeleccionActual); 00165 } 00166 00167 /* ** Selecciona y dibuja un submenu, luego carga en puntero funcion que atiende sus eventos ** */ 00168 void vSeleccionMenu(const MENU *Menu,UINT8 ElementoMenuSeleccion){ 00169 UINT8 NElemento; 00170 00171 /* ** Guardamos el Menu actual que se visualiza y trabaja ** */ 00172 MenuActual.PtrMenu=Menu; 00173 MenuActual.ElementoSeleccionActual=ElementoMenuSeleccion; 00174 00175 /* ** Borramos pantalla y dibujamos elementos del menu** */ 00176 vDibujarImagenFondo(IMAGEN_FONDO_MENU); 00177 00178 /* ** Dibujamos barra con titulo ** */ 00179 MyLCD.vLCDTFTDrawImage(0,0,WIDTH_TITULO,HEIGH_TITULO,LENGTH_TITULO,&Titulo[0]); 00180 vTextoJustificado(MenuActual.PtrMenu[0].TextoMenu,5,234,4,JUST_CENTRADO,&ARIAL[0],2,ColorAzulMarino); 00181 /* ** Dibujamos Items ** */ 00182 NElemento=1; 00183 while(MenuActual.PtrMenu[NElemento].TipoMenu!=MENU_FIN){ 00184 vDibujarElementoMenu(NElemento-1,ITEM_NORMAL); 00185 NElemento++; 00186 } 00187 MenuActual.CantElementosMenu=NElemento-1; 00188 00189 if(MenuActual.PtrMenu[0].TipoMenu==MENU_MAIN){ 00190 vDibujarMenuInferior(" ","Menu",BOTON_NORMAL); 00191 }else{ 00192 vDibujarMenuInferior("Atras"," ",BOTON_NORMAL); 00193 } 00194 /* ** Cargamos en puntero funci�n que atiende eventos del Submenu (Funci�n en while del main)** */ 00195 vSeteamosFuncionEjecutar(vEventosSubMenu); 00196 } 00197 00198 void vDibujarImagenFondo(UINT8 Seleccion){ 00199 00200 switch(Seleccion){ 00201 case IMAGEN_FONDO_MENU: 00202 for(short k=0;k<320;k+=10){ 00203 MyLCD.vLCDTFTDrawImage(0,k,WIDTH_FONDO,HEIGH_FONDO,LENGTH_FONDO,&Fondo[0]); 00204 } 00205 break; 00206 } 00207 } 00208 /* ** Dibuja barra inferior de botones ** */ 00209 void vDibujarMenuInferior(const UINT8 *TextoIzq,const UINT8 *TextoDer, UINT8 Status){ 00210 00211 00212 switch(Status){ 00213 case BOTON_PRES_IZQ: 00214 vTextoJustificado(TextoIzq,5,105,296,JUST_CENTRADO,&ARIAL[0],2,COLOR_LETRA_BOTON_PRES); 00215 break; 00216 case BOTON_PRES_DER: 00217 vTextoJustificado(TextoDer,135,234,296,JUST_CENTRADO,&ARIAL[0],2,COLOR_LETRA_BOTON_PRES); 00218 break; 00219 case BOTON_NORMAL: 00220 MyLCD.vLCDTFTDrawImage(0,289,WIDTH_BOTONES,HEIGH_BOTONES,LENGTH_BOTONES,&Botones[0]); 00221 vTextoJustificado(TextoIzq,5,105,296,JUST_CENTRADO,&ARIAL[0],2,COLOR_LETRA_BOTON); 00222 vTextoJustificado(TextoDer,135,234,296,JUST_CENTRADO,&ARIAL[0],2,COLOR_LETRA_BOTON); 00223 break; 00224 } 00225 } 00226 /* ** Dibuja elementos del submenu ** */ 00227 void vDibujarElementoMenu(UINT8 NElemento,UINT8 Status){ 00228 00229 if(Status==ITEM_NORMAL){ 00230 if((NElemento%2)==0){ 00231 MyLCD.vLCDTFTDrawImage(35,28+((((NElemento+2)/2)-1)*65),WIDTH_ICONO,HEIGH_ICONO,LENGTH_ICONO,MenuActual.PtrMenu[NElemento+1].PtrIcono); 00232 MyLCD.vLCDTFTRectangle(5,81+((((NElemento+2)/2)-1)*65),114,90+((((NElemento+2)/2)-1)*65),1,COLOR_FONDO_LETRA); 00233 vTextoJustificado(MenuActual.PtrMenu[NElemento+1].TextoMenu,5,114,82+((((NElemento+2)/2)-1)*65),JUST_CENTRADO,&ARIAL[0],1,COLOR_LETRA_BOTON); 00234 }else{ 00235 MyLCD.vLCDTFTDrawImage(155,28+((((NElemento+2)/2)-1)*65),WIDTH_ICONO,HEIGH_ICONO,LENGTH_ICONO,MenuActual.PtrMenu[NElemento+1].PtrIcono); 00236 MyLCD.vLCDTFTRectangle(125,81+((((NElemento+2)/2)-1)*65),234,90+((((NElemento+2)/2)-1)*65),1,COLOR_FONDO_LETRA); 00237 vTextoJustificado(MenuActual.PtrMenu[NElemento+1].TextoMenu,125,234,82+((((NElemento+2)/2)-1)*65),JUST_CENTRADO,&ARIAL[0],1,COLOR_LETRA_BOTON); 00238 } 00239 }else{ 00240 if((NElemento%2)==0){ 00241 vTextoJustificado(MenuActual.PtrMenu[NElemento+1].TextoMenu,5,114,82+((((NElemento+2)/2)-1)*65),JUST_CENTRADO,&ARIAL[0],1,COLOR_LETRA_BOTON_PRES); 00242 }else{ 00243 vTextoJustificado(MenuActual.PtrMenu[NElemento+1].TextoMenu,125,234,82+((((NElemento+2)/2)-1)*65),JUST_CENTRADO,&ARIAL[0],1,COLOR_LETRA_BOTON_PRES); 00244 } 00245 } 00246 } 00247 // **************************************************************************************** 00248 // **************************************************************************************** 00249 void vEventosSubMenu(void){ 00250 const MENU *SubMenu; 00251 void (*PtrComando)(void); 00252 00253 if(kbhit_irq==1){ 00254 kbhit_irq=0; 00255 kbhit_tratament=1; 00256 00257 if(MenuActual.PtrMenu[0].TipoMenu==MENU_MAIN){ 00258 if(AREA_BTN_INF_DER()){ 00259 vDibujarMenuInferior(" ","Menu",BOTON_PRES_DER); 00260 wait_ms(300); 00261 SubMenu=(MENU *)MenuActual.PtrMenu[0].Menu; 00262 vSeleccionMenu(SubMenu,1); 00263 } 00264 kbhit_tratament=0; 00265 }else{ 00266 for(char k=0;k<MenuActual.CantElementosMenu;k++){ 00267 if((k%2)==0){ 00268 if((Coordenadas.x<85 && Coordenadas.x>35) && (Coordenadas.y<(78+((((k+2)/2)-1)*65)) && Coordenadas.y>(28+((((k+2)/2)-1)*65)))){ 00269 vDibujarElementoMenu(k,ITEM_PRES); 00270 wait_ms(300); 00271 MenuActual.ElementoSeleccionActual=k+1; 00272 /* ** Abrimos otro submenu o ejecutamos comando ** */ 00273 switch(MenuActual.PtrMenu[k+1].TipoMenu){ 00274 case MENU_COMANDO: 00275 PtrComando=(void(*)(void))MenuActual.PtrMenu[k+1].PtrFuncionSeleccion; 00276 kbhit_tratament=0; 00277 if(PtrComando!=NULL) (*PtrComando)(); 00278 break; 00279 case MENU_SUBMENU: 00280 SubMenu=(MENU *)MenuActual.PtrMenu[k+1].Menu; 00281 vSeleccionMenu(SubMenu,1); 00282 break; 00283 } 00284 } 00285 }else{ 00286 if((Coordenadas.x<205 && Coordenadas.x>155) && (Coordenadas.y<(78+((((k+2)/2)-1)*65)) && Coordenadas.y>(28+((((k+2)/2)-1)*65)))){ 00287 vDibujarElementoMenu(k,ITEM_PRES); 00288 wait_ms(300); 00289 MenuActual.ElementoSeleccionActual=k+1; 00290 /* ** Abrimos otro submenu o ejecutamos comando ** */ 00291 switch(MenuActual.PtrMenu[k+1].TipoMenu){ 00292 case MENU_COMANDO: 00293 PtrComando=(void(*)(void))MenuActual.PtrMenu[k+1].PtrFuncionSeleccion; 00294 kbhit_tratament=0; 00295 if(PtrComando!=NULL) (*PtrComando)(); 00296 break; 00297 case MENU_SUBMENU: 00298 SubMenu=(MENU *)MenuActual.PtrMenu[k+1].Menu; 00299 vSeleccionMenu(SubMenu,1); 00300 break; 00301 } 00302 } 00303 } 00304 } 00305 00306 if(AREA_BTN_INF_IZQ()){ 00307 vDibujarMenuInferior("Atras"," ",BOTON_PRES_IZQ); 00308 wait_ms(300); 00309 SubMenu=(MENU *)MenuActual.PtrMenu[0].Menu; 00310 vSeleccionMenu(SubMenu,1); 00311 } 00312 kbhit_tratament=0; 00313 } 00314 } 00315 } 00316 // ******************************************************************************************************************************** 00317 // ****************************************** MENSAJES EN PANTALLA **************************************************************** 00318 // ******************************************************************************************************************************** 00319 /* ** Se escribe un mensaje en pantalla para elemento del tipo comando, presentando en barra inferior opcion a elegir ** */ 00320 void vMensajePantalla(const UINT8 *Mensaje,UINT16 YInicial,UINT8 TipoMensaje,void (*FuncionEjecutar)(UINT8)){ 00321 00322 MensajePantalla.MensajeFuncionEjecutar=FuncionEjecutar; 00323 MensajePantalla.TipoMensajePantalla=TipoMensaje; 00324 00325 vDibujarImagenFondo(IMAGEN_FONDO_MENU); 00326 MyLCD.vLCDTFTDrawImage(0,0,WIDTH_TITULO,HEIGH_TITULO,LENGTH_TITULO,&Titulo[0]); 00327 vTextoJustificado(MenuActual.PtrMenu[MenuActual.ElementoSeleccionActual].TextoMenu,5,234,4,JUST_CENTRADO,&ARIAL[0],2,ColorAzulMarino); 00328 00329 MyLCD.vLCDTFTRectangle(5,30,234,284,1,ColorGray); 00330 MyLCD.vLCDTFTRectangle(5,30,234,31,1,ColorWhite); 00331 MyLCD.vLCDTFTRectangle(5,283,234,284,1,ColorBlack); 00332 MyLCD.vLCDTFTRectangle(5,30,6,284,1,ColorWhite); 00333 MyLCD.vLCDTFTRectangle(233,30,234,284,1,ColorWhite); 00334 00335 vEscribirMensaje(YInicial,Mensaje,&ARIAL[0],JUST_CENTRADO,COLOR_MSJ); 00336 00337 switch(TipoMensaje){ 00338 case MENSAJE_ATRAS_OK: 00339 vDibujarMenuInferior("Atras", "Ok",BOTON_NORMAL); 00340 break; 00341 case MENSAJE_NO_SI: 00342 vDibujarMenuInferior("No", "Si",BOTON_NORMAL); 00343 break; 00344 case MENSAJE_ATRAS: 00345 vDibujarMenuInferior("Atras", " ",BOTON_NORMAL); 00346 break; 00347 } 00348 vSeteamosFuncionEjecutar(vEventosPantallaMensaje); 00349 } 00350 00351 /* ** Se atiende eventos de pantalla con mensaje ** */ 00352 void vEventosPantallaMensaje(void){ 00353 UINT8 AccionPulsIzq,AccionPulsDer; 00354 const UINT8 *TextDer,*TextIzq; 00355 00356 switch(MensajePantalla.TipoMensajePantalla){ 00357 case MENSAJE_ATRAS_OK: 00358 AccionPulsIzq = MENSAJE_ACCION_ATRAS; 00359 AccionPulsDer = MENSAJE_ACCION_OK; 00360 TextDer="Atras"; 00361 TextIzq="Ok"; 00362 break; 00363 00364 case MENSAJE_NO_SI: 00365 AccionPulsIzq = MENSAJE_ACCION_NO; 00366 AccionPulsDer = MENSAJE_ACCION_SI; 00367 TextDer="No"; 00368 TextIzq="Si"; 00369 break; 00370 00371 default: 00372 AccionPulsIzq = MENSAJE_ACCION_ATRAS; 00373 AccionPulsDer = MENSAJE_ACCION_ATRAS; 00374 TextDer="Atras"; 00375 TextIzq=" "; 00376 } 00377 if(kbhit_irq==1){ 00378 kbhit_irq=0; 00379 kbhit_tratament=1; 00380 00381 if(AREA_BTN_INF_DER()){ 00382 vDibujarMenuInferior(TextIzq,TextDer,BOTON_PRES_DER); 00383 wait_ms(300); 00384 (*MensajePantalla.MensajeFuncionEjecutar)(AccionPulsIzq); 00385 } 00386 if(AREA_BTN_INF_IZQ()){ 00387 vDibujarMenuInferior(TextIzq,TextDer,BOTON_PRES_IZQ); 00388 wait_ms(300); 00389 (*MensajePantalla.MensajeFuncionEjecutar)(AccionPulsDer); 00390 } 00391 kbhit_tratament=0; 00392 } 00393 } 00394 00395 void vModificadorVariables(const UINT8 *NombreVariable,float ValorInicial,void (*PtrFuncion)(UINT8,float)){ 00396 const UINT8 PtrLetras[13][2]={"7","8","9","4","5","6","1","2","3",".","0","c"}; 00397 UINT8 Ptr=0,Fmt[30]; 00398 00399 ModificadorVariable.ValorInicial=ValorInicial; 00400 ModificadorVariable.ValorActual=0.0; 00401 memset(&ModificadorVariable.String[0],0,15); 00402 ModificadorVariable.Ptr=0; 00403 ModificadorVariable.FuncionActualEjecucion=PtrFuncion; 00404 00405 vDibujarImagenFondo(IMAGEN_FONDO_MENU); 00406 MyLCD.vLCDTFTDrawImage(0,0,WIDTH_TITULO,HEIGH_TITULO,LENGTH_TITULO,&Titulo[0]); 00407 vTextoJustificado(NombreVariable,5,234,4,JUST_CENTRADO,&ARIAL[0],2,ColorAzulMarino); 00408 00409 MyLCD.vLCDTFTRectangle(22,122,217,148,1,ColorWhite); 00410 MyLCD.vLCDTFTRectangle(20,120,219,121,1,ColorGray); 00411 MyLCD.vLCDTFTRectangle(20,120,21,150,1,ColorGray); 00412 MyLCD.vLCDTFTRectangle(218,120,219,150,1,ColorGray); 00413 MyLCD.vLCDTFTRectangle(20,149,219,150,1,ColorBlack); 00414 sprintf((char *)&Fmt[0],"%f",ValorInicial); 00415 vTextoJustificado((const UINT8 *)&Fmt[0],20,219,128,JUST_CENTRADO,&ARIAL[0],2,ColorAzulMarino); 00416 00417 // Dibuja pad Numerico: 00418 for(int k=209;k<289;k+=20){ 00419 for(int j=0;j<240;j+=80){ 00420 MyLCD.vLCDTFTDrawImage(j,k,WIDTH_TECLAS,HEIGH_TECLAS,LENGTH_TECLAS,&Teclas[0]); 00421 vTextoJustificado(&PtrLetras[Ptr++][0],j,j+79,k+3,JUST_CENTRADO,&ARIAL[0],2,ColorCian); 00422 } 00423 } 00424 vDibujarMenuInferior("Cancelar","Aceptar",BOTON_NORMAL); 00425 00426 vSeteamosFuncionEjecutar(vEventosModificadorVariables); 00427 } 00428 00429 void vEventosModificadorVariables(void){ 00430 const UINT8 PtrLetras[12][2]={"7","8","9","4","5","6","1","2","3",".","0","c"}; 00431 UINT8 PtrTecla; 00432 float Temp; 00433 00434 if(kbhit_irq==1){ 00435 kbhit_irq=0; 00436 kbhit_tratament=1; 00437 00438 // Testea Pad Numerico.- 00439 PtrTecla=0; 00440 for(int k=209;k<289;k+=20){ 00441 for(int j=0;j<240;j+=80){ 00442 if((Coordenadas.x<(j+74)) && (Coordenadas.x>(j+5)) && (Coordenadas.y<(k+15)) && (Coordenadas.y>(k+5))){ 00443 vTextoJustificado(&PtrLetras[PtrTecla][0],j,j+79,k+3,JUST_CENTRADO,&ARIAL[0],2,ColorWhite); 00444 wait_ms(300); 00445 vTextoJustificado(&PtrLetras[PtrTecla][0],j,j+79,k+3,JUST_CENTRADO,&ARIAL[0],2,ColorCian); 00446 // Borrar? 00447 if(PtrTecla==11){ 00448 if(ModificadorVariable.Ptr!=0){ 00449 ModificadorVariable.Ptr--; 00450 ModificadorVariable.String[ModificadorVariable.Ptr]='\0'; 00451 } 00452 }else{ 00453 ModificadorVariable.String[ModificadorVariable.Ptr++]=((UINT8)PtrLetras[PtrTecla][0]); 00454 } 00455 MyLCD.vLCDTFTRectangle(22,122,217,148,1,ColorWhite); 00456 vTextoJustificado((const UINT8 *)&ModificadorVariable.String[0],20,219,128,JUST_CENTRADO,&ARIAL[0],2,ColorAzulMarino); 00457 kbhit_tratament=0; 00458 return; 00459 } 00460 PtrTecla++; 00461 } 00462 } 00463 00464 if(AREA_BTN_INF_DER()){ 00465 vDibujarMenuInferior("Cancelar","Aceptar",BOTON_PRES_DER); 00466 wait_ms(300); 00467 Temp=atof((const char *)&ModificadorVariable.String[0]); 00468 (*ModificadorVariable.FuncionActualEjecucion)(MODIFICADOR_ACEPTAR,Temp); 00469 00470 } 00471 if(AREA_BTN_INF_IZQ()){ 00472 vDibujarMenuInferior("Cancelar","Aceptar",BOTON_PRES_IZQ); 00473 wait_ms(300); 00474 (*ModificadorVariable.FuncionActualEjecucion)(MODIFICADOR_CANCELAR,0.0); 00475 } 00476 kbhit_tratament=0; 00477 } 00478 } 00479 // ************************************************************************************************ 00480 void vTextoJustificado(const unsigned char *PtrTexto,unsigned short ExtremoIzq, unsigned short ExtremoDer, unsigned short y, unsigned char Just,const char (*Fuente)[5],unsigned char Alto, unsigned short Color){ 00481 unsigned char x,NCaracteres; 00482 const unsigned char *Ptr; 00483 00484 if(Just!=JUST_IZQ){ 00485 for(Ptr=PtrTexto;*Ptr!='\0';Ptr++); 00486 NCaracteres=Ptr - PtrTexto; 00487 } 00488 switch(Just){ 00489 case JUST_IZQ: 00490 x=ExtremoIzq+5; 00491 break; 00492 case JUST_DER: 00493 x=ExtremoDer-NCaracteres*(5*Alto+1)-4; 00494 break; 00495 case JUST_CENTRADO: 00496 x=((ExtremoIzq+ExtremoDer-NCaracteres*(5*Alto+1))/2); 00497 break; 00498 } 00499 MyLCD.vLCDTFTText(x,y,(const char *)PtrTexto,Fuente,Alto,Color); 00500 } 00501 /* ** Escribe mensaje en pantalla multilinea justificado ** */ 00502 void vEscribirMensaje(unsigned short YInicial,const unsigned char *Mensaje,const char (*Fuente)[5],unsigned char Just, unsigned short Color){ 00503 char Texto[50],k,dy=0; 00504 00505 while(*Mensaje!='\0'){ 00506 k=0; 00507 do{ 00508 Texto[k++]=*Mensaje++; 00509 }while(*Mensaje!='\0' && *Mensaje!='\n'); 00510 if(*Mensaje=='\n') *Mensaje++; 00511 if(k<50){while(k<50){Texto[k++]='\0';}} 00512 vTextoJustificado((const unsigned char *)&Texto[0],0,239,YInicial+dy,Just,Fuente,1,Color); 00513 dy+=11; 00514 } 00515 } 00516 #endif
Generated on Tue Jul 19 2022 22:21:18 by
1.7.2
Ale C.-