//main menu en LCD 2x16
#define UPPER
#include <p18f4550.h>
#include <p18cxxx.h>
#include <stdio.h>
#include <xlcd.h>
#include <delays.h>
#include <stdlib.h>
#include "menu.h"
///////// configuracion fuses ///////////////////////////////////////////////////////////////////
#pragma config FOSC = HS
#pragma config CPUDIV = OSC1_PLL2
#pragma config VREGEN = OFF //Disabled USB power
#pragma config WDT = OFF// HW Disabled - SW Controlled
///////////////////////////////////////////////////////////////////////////////////////////////
/////////// PROTOTIPO FUNCIONES PARA DELAYS y XLCD /////////////
void DelayFor18TCY(void){ // TCY=4/Frec.Trabajo
Delay10TCYx(2); // Mi TCY para F_trabajo=4MHz es de 1mS. El retardo que piden será pues de 18*TCY=18mS
} // 10*x*(4/4MHz)=18uS; aislamos x, y x=1,8, por eso se pone 2. Seria algo mas de 18 TCY.
void DelayPORXLCD(void){
//Delay1KTCYx(15); // 1000*15*(4/4MHz)= 0,015 s
Delay1KTCYx(18);
}
void DelayXLCD(void){
Delay1KTCYx(2); // 1000*2*(4/4MHz)= 0,002 s
}
// Envia comando al LCD
void comandXLCD(unsigned char a){
BusyXLCD();
WriteCmdXLCD(a);
}
// Ubica cursor en (x = Posicion en linea, y = nº de linea)
void gotoxyXLCD(unsigned char x, unsigned char y){
unsigned char direccion;
if(y != 1)
direccion = 0x40;
else
direccion=0;
direccion += x-1;
comandXLCD(0x80 | direccion);
}
void clearDisplay(void){
/*
Instruction RS RW: DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 (Description fOSC is 270 kHz)
Clear display
0 0 0 0 0 0 0 0 0 1 Clears entire display and sets
DDRAM address 0 in addresscounter.*/
BusyXLCD();
WriteCmdXLCD(0b0000000001);
Delay10TCYx(10);
gotoxyXLCD(1,1);
}
char rom * Menu[]={ "Opcion 1 ",
"Opcion 2",
NULL
};
char rom * SubMenu1[]={ "SubMenu1-1","SubMenu1-2","SubMenu1-3","SubMenu1-4","SubMenu1-5","SubMenu1-6",
"SubMenu1-7","SubMenu1-8","SubMenu1-9","SubMenu1-10",
NULL
};
char rom *fraseComun={"OK?"};
void presentacion(void);
void test_pantalla(void);
void parpadeo(void);
int PosicionaMenu(int EscTecla,int posicion);
///////////////////////////////////
///////////////////////////////////////
///////////////////////////////////
void main(void){
int EscTecla=0,PosicionInicial=0,posicionActual=0;
ADCON1=0xFF;
TRISA = 0b10111110; //Define todos los puertos A como pines de entrada/salida.
OpenXLCD(FOUR_BIT & LINES_5X7); // Iniciamos LCD.-
//test_pantalla();
//presentacion();
LATAbits.LATA0=1;
//OpenXLCD(PARAM_SCLASS unsigned char);
while(1){
EscTecla=Teclado();
Delay10KTCYx(20);
posicionActual=PosicionaMenu(EscTecla,PosicionInicial);
Delay10KTCYx(20);
if (posicionActual>1){
LATAbits.LATA0=0;
}
/*
switch (EscTecla){ //MIRAR PQ ESCTECLA TOMA VALORES MAYORES DE 5. Con variable co0mo int si hace toma
case 0:parpadeo();
break;
case 1:
LATAbits.LATA0=0; // valores normales. Con enum no.
break;
case 2:
LATAbits.LATA0=0;
clearDisplay() ;
Delay10KTCYx(10);
break;
} */
}
}
void presentacion(){
comandXLCD(0x06); // Nos aseguramos incremento de direccion, display fijo
comandXLCD(0x0C); // Encendemos LCD.-
gotoxyXLCD(1,1);
putrsXLCD("Elije menu");
Delay10TCYx(10);
gotoxyXLCD(1,2); //Pasamos al oriden del Linea 2.-
putrsXLCD("y pulsa OK");
Delay10TCYx(20);
}
void test_pantalla(){
comandXLCD(0x06); // Nos aseguramos incremento de direccion, display fijo
comandXLCD(0x0C); // Encendemos LCD.-
gotoxyXLCD(1,1);
putrsXLCD("abcdefghijklmnño");
Delay10TCYx(10);
gotoxyXLCD(1,2); //Pasamos al oriden del Linea 2.-
putrsXLCD("Total:16 ");
Delay10TCYx(20);
}
void parpadeo(void){
LATAbits.LATA0=0;
Delay10KTCYx(20);
LATAbits.LATA0=1;
LATAbits.LATA0=0;
Delay10KTCYx(20);
LATAbits.LATA0=1;
}
int PosicionaMenu(int EscTecla,int PosicionInicial){
int pos;
pos=PosicionInicial;
if ( !pulsador_MenuMas) {
Delay10KTCYx(100);
pos++;
}
if (!pulsador_MenuMenos){
Delay10KTCYx(10);
pos--;
comandXLCD(0x06); // Nos aseguramos incremento de direccion, display fijo
comandXLCD(0x0C); // Encendemos LCD.-
gotoxyXLCD(1,1);
putrsXLCD("tecla -");
Delay10TCYx(10);
if (pos<=1){pos=0;}
return pos;
}
if (!TeclaOk){
Delay10KTCYx(10);
return pos;
}
}