Cuelgo solo el menu de una variable, el resto serian igual pero cambiando los datos a obtener.
void MENU_NCOMB(){
char k;
kbd_init();
lcd_putc('\f');
lcd_gotoxy(1,1);
printf(lcd_putc, "1.OBTENER DATOS");
lcd_gotoxy(1,2);
printf(lcd_putc, "#.VOLVER AL MENU");
while (TRUE){
k=kbd_getc();
if (k!=0)
switch(k){
case '1':
lcd_putc('\f');
lcd_gotoxy(1,1);
printf(lcd_putc,"OBTENIENDO");
lcd_gotoxy(1,2);
printf(lcd_putc,"DATOS...");
delay_ms(100);
NIVEL_COMBUSTIBLE();
//! delay_ms(10000);
//! lcd_putc('\f');
//! GUARDAR_DATO();
break;
case '#':
MENU();
break;
}
}
}
void SELECCIONAR(){
char z;
kbd_init();
WHILE(true){
z=kbd_getc();
if (z!=0)
switch(z){
case '1':
MENU_TEMP();
break;
case '2':
MENU_NCOMB();
break;
case '3':
MENU_VEL();
break;
case '4':
MENU_RPM();
break;
}
}
}
void main(){
char k;
lcd_init();
kbd_init();
//RTC();
//! delay_ms(1000);
INICIO();
while(TRUE){ //Bucle infinito siempre consulta el teclado
k=kbd_getc();
if (k!=0){
switch(k){
case '1':
MENU();
SELECCIONAR();
break;
case '2':
TRANSMITIR_DATOS ();
break;
}
}
}
}
void Mostrar_menu_inicial(){
lcd_putc('\f');
lcd_gotoxy(1,1);
printf(lcd_putc,"1. MENU");
lcd_gotoxy(1,2);
printf(lcd_putc,"2. ENVIAR DATOS");
}
void Obtener_datos(variable){
switch(variable){
case 1:
NTC();
break;
case 2:
NIVEL_COMBUSTIBLE();
break;
case 3:
VELOCIDAD();
break;
case 4:
REVOLUCIONES();
break;
}
Queda realizar las funciones que escriben en el LCD como
Mostrar_menu_inicial(); ( enviar datos y menu)
Mostrar_menu_de_variables(); ( var1 var2 var3 y var4)
Mostrar_Menu_Var(); ( obtener datos y menu )
Y la que obtiene los datos:
Obtener_datos(variable);
while(TRUE){
k=kbd_getc();
if (k!=0 & j!=k){
switch(Nivelmenu){
case 0:
switch (k){
case '1':
Mostrar_menu_de_variables();
Nivelmenu=1;
break;
case '2':
EnviarDatos();
break;
default:
break;
}
break;
case 1:
switch (k){
case '1':
Mostrar_menu_var();
variable=1;
Nivelmenu=2;
break;
case '2':
Mostrar_menu_var();
variable=2;
Nivelmenu=2;
break;
case '3':
Mostrar_menu_var();
variable=3;
Nivelmenu=2;
break;
case '4':
Mostrar_menu_var();
variable=4;
Nivelmenu=2;
break;
default:
break;
}
break;
case 2:
switch (k){
case '1':
Obtenerdatos (variable);
Nivelmenu=1;
Mostrar_menu_de_variables();
break;
case '#':
Mostrar_menu_de_variables();
Nivelmenu=1;
break;
default:
break;
}
break;
//! case 3: //Menu de salir o guardar
//! switch(k){
//! case 'A':
//! Mostrar_salir_o_guardar();
//! Nivelmenu=1;
//! Mostrar_menu_de_variables();
//! break;
//! case 'B':
//! Mostrar_salir_o_guardar();
//! break;
//! default:
//! break;
//! }
default:
Mostrar_menu_inicial();
Nivelmenu=0;
break;
}
}
j=k;
}
}
void TEMPERATURA_MOTOR(){
set_adc_channel(0); //Habilita canal 0
delay_us(10);
do {
q= Read_ADC(); //Valor que lee el ADC
VT=5.0*q/1024.0;//Realiza conversion
R1=10000;
V=5.0;
RT=VT*R1/(V-VT);
B=4300;
TO=25;
TOK=TO+273.15;
RO=10000; //Resistencia 10 K a 25ºC
TK=1/((1/B)*log(RT/RO)+(1/TOK));
TC=TK-273.15;
}
while(k=='\0');
}
void mostrar_variable_1(){
printf(lcd_putc, "TEMP = %04.1f ºC",TC);
}
while(TRUE){
Obtenerdatos(variable);
k=kbd_getc();
if (k!=0 & j!=k)
{
j=k;
}
else
{
j=0;
}
switch(Nivelmenu){
case 0:
switch (j){
case '1':
Mostrar_menu_de_variables();
Nivelmenu=1;
break;
case '2':
EnviarDatos();
break;
default:
break;
}
break;
case 1:
switch (j){
case '1':
Mostrar_menu_var();
variable=1;
Nivelmenu=2;
break;
case '2':
Mostrar_menu_var();
variable=2;
Nivelmenu=2;
break;
case '3':
Mostrar_menu_var();
variable=3;
Nivelmenu=2;
break;
case '4':
Mostrar_menu_var();
variable=4;
Nivelmenu=2;
break;
default:
break;
}
break;
case 2:
switch (variable){
case '1':
mostrar_variable_1();
break;
case '2':
mostrar_variable_2();
break;
case '3':
mostrar_variable_3();
break;
//! case '4':
//! mostrar_variable_1();
//! break;
default:
break;
}
if (j=='#')
{
Mostrar_menu_de_variables();
Nivelmenu=1;
break;
}
break;
default:
Mostrar_menu_inicial();
Nivelmenu=0;
break;
}
}
//j=k;
}
void Obtenerdatos(){
switch(variable){
case 1:
TEMPERATURA_MOTOR();
break;
case 2:
NIVEL_COMBUSTIBLE();
break;
case 3:
TACOMETRO();
break;
case 4:
TEMPERATURA_AMBIENTE();
break;
}
}
Obviamente ninguna de esas funciones de adentro puede tener un while(1)
void TEMPERATURA_MOTOR(){
set_adc_channel(0); //Habilita canal 0
delay_us(10);
do{
q= Read_ADC(); //Valor que lee el ADC
VT=5.0*q/1024.0;//Realiza conversion
R1=10000;
V=5.0;
RT=VT*R1/(V-VT);
B=4300;
TO=25;
TOK=TO+273.15;
RO=10000; //Resistencia 10 K a 25ºC
TK=1/((1/B)*log(RT/RO)+(1/TOK));
TC=TK-273.15;
}
while(1);
}