#include <16F877A.h>
#device adc = 10
#FUSES XT, NOWDT, NOPROTECT, NOPUT, NOBROWNOUT
#use delay(clock=4000000)
//#use fast_io(C)
//#use fast_io(D)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8, parity=N)
#include <LCD4x20.C>
#bit Fin_carrera = 7.4
void sube(void);
void baja(void);
void para(void);
void main()
{
short control, control1, controlh; // VARIABLES DE CONTROL
int16 hum1, hum2, hum3, temp1, temp2;
float tempt1, tempt2, humt1, humt2, humt3, humS, tempS, RH;
set_tris_c(0xB0);
set_tris_d(0xC0);
setup_adc_ports(AN0_AN1_AN2_AN3_AN4);
setup_adc(ADC_CLOCK_INTERNAL);
lcd_init();
control = 0;
control1 = 0;
controlh = 0;
while(true)
{
set_adc_channel(0); //CANAL 0
delay_us(20);
temp1 = (read_adc() * 100);
set_adc_channel(1); //CANAL 1
delay_us(20);
temp2 = (read_adc() *100);
tempt1 = temp1 * 0.0049;
tempt2 = temp2 * 0.0049;
tempS = (tempt1 + tempt2) / 2.0; //TEMPERATURA A MANEJAR
//*********** RUTINA DE CONTROL DE TEMPERATURA ****************
if (tempS >= 28.0)
{
if (control == 0) //AQUI TESTEAR EL RC3
{
output_high(PIN_C1);
// ir a sube y luego regresar
sube();
delay_ms(3000);
// ir a paraA y luego regresar
para();
output_low(PIN_C1);
control = 1; //aqui ver el RC3
}
}
if (tempS <= 20.0)
{
if (control == 1)
{
output_high(PIN_C3);
//ir a baja y regresar
baja();
delay_ms(3000);
//ir a paraB y regresar
para();
output_low(PIN_C3);
control = 0;
}
output_high(PIN_C2); //AIRE CALIENTE
control1 = 1;
}
if (control1 == 1)
{
if (tempS <= 25.0)
{
output_high(PIN_C2); //AIRE CALIENTE
} else
{
output_low(PIN_C2); //APAGA AIRE CALIENTE
control1 = 0;
}
}
//************ FIN RUTINA CONTROL TEMPERATURA *****************
set_adc_channel(2); //CANAL 2
delay_us(20);
hum1 = read_adc();
set_adc_channel(3); //CANAL 3
delay_us(20);
hum2 = read_adc();
set_adc_channel(4); //CANAL 4
delay_us(20);
hum3 = read_adc();
//hum1t = (5.0 * hum1) / 1024.0;
humt1 = hum1 * 0.0049;
humt2 = hum2 * 0.0049;
humt3 = hum3 * 0.0049;
humS = (humt1 + humt2 + humt3) / 3;
RH = (humS - 0.958) / 0.0307; // HUMEDAD HA MANEJAR
//******* RUTINA CONTROL DE HUMEDAD ****************
if (RH >= 80.0)
{
output_low(PIN_C0);
}
if (RH <= 75.0)
{
output_high(PIN_C0);
controlh = 1;
}
if (controlh == 1)
{
if (RH <= 77.0)
{
output_high(PIN_C0);
}else
{
output_low(PIN_C0);
controlh = 0;
}
}
//*********** FIN RUTINA CONTROL HUMEDAD **************
//printf(lcd_putc, "\fADC = %4ld", q);
//printf(lcd_putc, "\nVoltage = %01.2fV", p);
printf(lcd_putc, "\f TEMPERATURA ");
printf(lcd_putc, "\n %01.2f C", tempS);
printf(lcd_putc, "\n HUMEDAD ");
printf(lcd_putc, "\n%01.2f PHS", RH);
//TRANSMISION SERIAL
printf("ADC = %4ld", tempt1);
printf(" Temperatura = %01.2f C\r", tempS); // El \r permite cambiar de línea
printf("ADC = %4ld", hum3);
printf(" humedad = %01.2f RH\r", RH);
delay_ms(100);
}
}
void sube(void)
{
output_high(PIN_D4); // EN1
output_high(PIN_D5); // EN2
output_low(PIN_D0); // IN1
output_low(PIN_D2); // IN3
output_high(PIN_D1); // IN2
output_high(PIN_D3); // IN4
}
void baja(void)
{
output_high(PIN_D4); // EN1
output_high(PIN_D5); // EN2
output_high(PIN_D0); // IN1
output_high(PIN_D2); // IN3
output_low(PIN_D1); // IN2
output_low(PIN_D3); // IN4
}
void para(void)
{
output_high(PIN_D4); // EN1
output_high(PIN_D5); // EN2
output_low(PIN_D0); // IN1
output_low(PIN_D2); // IN3
output_low(PIN_D1); // IN2
output_low(PIN_D3); // IN4
}switch(menu){
case 1: ....
break;
case 2: ...
break;
} switch(menu){
case 1: ....
break;
case 2: ...
break;
case 3: ..
.
.
.
case 7:...
break;
}switch(menu){
case 0x01: ....
break;
case 0x02: ...
break;
case 0x03: ..
.
.
.
case 0x07:...
break;
}switch(menu){
case 1: tempA = 20.0;
tempB = 28.0;
hum1 = 75.0;
hum2 = 77.0;
funcion_control(float tempA, float tempB, float hum1, float hum2);
break;
case 2: tempA = 22.0;
tempB = 26.0;
hum1 = 73.0;
hum2 = 76.0;
funcion_control(float tempA, float tempB, float hum1, float hum2);
break;
break;
case 3:tempA = 19.0;
tempB = 25.0;
hum1 = 72.0;
hum2 = 78.0;
funcion_control(float tempA, float tempB, float hum1, float hum2);
break;
case 4:tempA = 18.0;
tempB = 24.0;
hum1 = 75.0;
hum2 = 78.0;
funcion_control(float tempA, float tempB, float hum1, float hum2);
break;
case 5:tempA = 26.0;
tempB = 30.0;
hum1 = 75.0;
hum2 = 78.0;
funcion_control(float tempA, float tempB, float hum1, float hum2);
break;
case 6:tempA = 19.0;
tempB = 25.0;
hum1 = 72.0;
hum2 = 78.0;
funcion_control(float tempA, float tempB, float hum1, float hum2);
break;
case 7:tempA = 22.0;
tempB = 27.0;
hum1 = 75.0;
hum2 = 78.0;
funcion_control(float tempA, float tempB, float hum1, float hum2);
break;
}int menu=1;
if(arriba==1)
{
}
if(abajo==1)
{
}
if(ok==1)
{
}
switch(menu)
{
case 1: printf(.....);
printf(......);
break;
case 2: printf(....);
printf(....);
break;
case 3: printf(....);
printf(....);
break;
}
y eso va a ser manejado por la variable "menu", esa variable va a tomar el valor que los botones "sube", "baja" y "ok" le van a dar??? y cómo va a tomar ese valor??Supongo que tendrás un teclado matricial, o al menos algunos pulsadores para poder desplazarse dentro de todas las opciones de tu menú e ingreso de datos. Esos pulsadores o teclado matricial, te va ayudar a subir y bajar los valores de tu variable menú, pongo el caso de pulsadores:
Cómo le hago para hacer rotar el menu, ya que primero se va a mostrar las primeras tres opciones, luego tendra que mostrarse las opciones 4 a la 6, luego la ultima.
Ahora, entendí que pretendes mostrar primero el case 1 y seguidamente (sin que se presione ninguna tecla) se muestre el case 2 y después el 3, o me equivoco?
Lo hice rápido, pero más o menos es la idea. Utiliza el buscador, seguro hay ejemplos en el foro.Pues bueno, busque en el foro, y no encontre mucho, solo este ejmplo que pone el maestro J1M, es exactamente lo que quiero lograr a principio, luego le voy dando estética.
Si el menu es muy largo, el 16F877 no va a ser suficiente, porque el printf utiliza bastante memoria
#byte pb =0xF81
#bit t_ok =pb.0 // RB0, pin21
#bit t_mas =pb.1 // RB1, pin22
#bit t_mns =pb.2 // RB2, pin23#byte intcon =0xFF2
#bit intf =intcon.1#include <16F877A.h>
#device adc = 10
#FUSES XT, NOWDT, NOPROTECT, NOPUT, NOBROWNOUT
#use delay(clock=4000000)
#use fast_io(C)
#use fast_io(D)
#bit enter = 6.0
//#byte PORTD = 0x06
#bit arriba = 8.6
#bit abajo = 8.7
#include <LCD4x20.C>
char cTestPulsadores();
void vDibujaMenu(char Menu);
#zero_ram
int8 NINGUNO = 1;
void main()
{
char Evento;
char VarMenu = 0;
set_tris_b(0x01);
set_tris_d(0xC0);
lcd_init();
vDibujaMenu(VarMenu);
while(1)
{
Evento = cTestPulsadores();
if (Evento != NINGUNO)
{
switch(VarMenu)
{
case 0:
VarMenu = 0x10;
break;
case 0x10:
case 0x11:
case 0x12:
if (Evento == ABAJO)
{
if (++VarMenu == 0x13) // PARA CONTROLAR EL DESBORDE
{
VarMenu = 0x10;
}
}
if (Evento == ARRIBA)
{
if (--VarMenu == 0x09) //PARA CONTROLAR EL DESBORDE
{
VarMenu = 0x12;
}
}
if (Evento == ENTER)
{
// ejecuto
VarMenu = 0x00;
}
break;
}
vDibujaMenu(VarMenu); //Dibujar el menu.
}
}
}
char cTestPulsadores()
{
if(arriba == 1)
{
delay_ms(20);
if (arriba == 1)
{
return(ARRIBA);
}
}
if (abajo == 1)
{
delay_ms(20);
if (abajo == 1)
{
return(ABAJO);
}
}
if (enter == 1)
{
delay_ms(20);
if (enter == 1)
{
return(ENTER);
}
}
return(NINGUNO);
}
void vDibujaMenu(char Menu)
{
switch(Menu)
{
case 0x00:
printf(lcd_putc, "\fPRINCIPAL");
break;
case 0x10:
printf(lcd_putc, "-> 1 opcion uno");
printf(lcd_putc, " 2 opcion dos");
break;
case 0x11:
printf(lcd_putc, "-> 2 opcion dos");
printf(lcd_putc, " 3 opcion tres");
break;
case 0x12:
printf(lcd_putc, "-> 3 opcion tres");
printf(lcd_putc, " 1 opcion uno");
break;
}
} case 0x10:
case 0x11:
case 0x12:No veos que definas NINGUNO, ABAJO, ENTER, ARRIBA, ect (Los 4 tienen que ser de valores distintos). Para ejecutar tienes la opción de cuando se prende enter, allí preguntar en que submenu se está posicionado y trabajar con eso.
switch(Menu)
{
case 0x00:
printf(lcd_putc, "\fPRINCIPAL");
break;
case 0x10:
printf(lcd_putc, "-> 1 opcion uno");
printf(lcd_putc, " 2 opcion dos");
break;
case 0x11:
printf(lcd_putc, "-> 2 opcion dos");
printf(lcd_putc, " 3 opcion tres");
break;
case 0x12:
printf(lcd_putc, "-> 3 opcion tres");
printf(lcd_putc, " 1 opcion uno");
break;
} switch(Menu)
{
case 0x00:
printf(lcd_putc, "\fPRINCIPAL");
break;
case 0x10:
printf(lcd_putc, "\n-> 1 opcion uno");
printf(lcd_putc, "\n 2 opcion dos");
break;
case 0x11:
printf(lcd_putc, "\n-> 2 opcion dos");
printf(lcd_putc, "\n 3 opcion tres");
break;
case 0x12:
printf(lcd_putc, "\n-> 3 opcion tres");
printf(lcd_putc, "\n 1 opcion uno");
break;
}#use fast_io(C)
#use fast_io(D)
#bit enter = 6.0
#bit arriba = 8.6
#bit abajo = 8.7
#include <LCD4x20.C>
char cTestPulsadores();
void vDibujaMenu(char Menu);No veos que definas NINGUNO, ABAJO, ENTER, ARRIBA, ect (Los 4 tienen que ser de valores distintos)
int NINGUNO = 0;
int ENTER = 1;
int ABAJO = 3;
int ARRIBA = 4;Espero sirva de algo y no te maree :D.
char NINGUNO = 'a';
//char ENTER = 'b';
//char ABAJO = 'c';
//char ARRIBA = 'd';#include <16F877A.h>
#device adc = 10
#FUSES XT, NOWDT, NOPROTECT, NOPUT, NOBROWNOUT
#use delay(clock=4000000)
#use fast_io(C)
#use fast_io(D)
#bit enter = 6.0
#bit arriba = 8.6
#bit abajo = 8.7
#include <LCD4x20.C>
char cTestPulsadores();
void vDibujaMenu(char Menu);
#define NINGUNO 0
#define ENTER 1
#define ABAJO 2
#define ARRIBA 3
#zero_ram
void main()
{
char Evento;
char VarMenu = 0;
set_tris_b(0x01);
set_tris_d(0xC0);
lcd_init();
vDibujaMenu(VarMenu);
while(true)
{
Evento = cTestPulsadores();
if (Evento != NINGUNO)
{
switch(VarMenu)
{
case 0:
VarMenu = 0x10;
break;
case 0x10:
case 0x11:
case 0x12:
if (Evento == ABAJO)
{
if (++VarMenu == 0x13) // PARA CONTROLAR EL DESBORDE
{
VarMenu = 0x10;
}
}
if (Evento == ARRIBA)
{
if (--VarMenu == 0x09) //PARA CONTROLAR EL DESBORDE
{
VarMenu = 0x12;
}
}
if (Evento == ENTER)
{
// ejecuto
//printf(lcd_putc, "\fOPCION ");
//printf(lcd_putc, "\nseleccionada ", VarMenu);
VarMenu = 0x00;
}
break;
}
vDibujaMenu(VarMenu); //Dibujar el menu.
}
}
}
char cTestPulsadores()
{
if(arriba == 1)
{
delay_ms(20);
//if (arriba == 1)
//{
return(ARRIBA);
//}
}
if (abajo == 1)
{
delay_ms(20);
//if (abajo == 1)
//{
return(ABAJO);
//}
}
if (enter == 1)
{
delay_ms(20);
//if (enter == 1)
//{
return(ENTER);
//}
}
return(NINGUNO);
}
void vDibujaMenu(char Menu)
{
switch(Menu)
{
case 0x00:
printf(lcd_putc, "\fPRINCIPAL");
break;
case 0x10:
printf(lcd_putc, "\n-> 1 opcion uno");
printf(lcd_putc, "\n 2 opcion dos");
break;
case 0x11:
printf(lcd_putc, "\n-> 2 opcion dos");
printf(lcd_putc, "\n 3 opcion tres");
break;
case 0x12:
printf(lcd_putc, "\n-> 3 opcion tres");
printf(lcd_putc, "\n 1 opcion uno");
break;
}
}NOTA: Esto ya es ........... vergonzoso :oops: :oops: :oops:............ :5] :5] :5] :5] :5]
NOTA: me gustaria subir la simulacion del proteus y el .hex, pero no se como subir archivos al foro.Cuando estas respondiendo al hilo con un mensaje, aparece debajo del cuadro de edición de texto la marca que dice "Opciones Adicionales...", haces click ahí y se abren las opciones siendo la última "Adjuntar" le das das click en examinar para buscar tu archivo a adjuntar. De preferencia un .rar donde se encuentre tu .c .hex .cof .dsn(proteus) y tus librerías .c de ser necesarias. Para poder ayudarte mejor.
#include <16F877A.h>
#device adc = 10
#FUSES XT, NOWDT, NOPROTECT, NOPUT, NOBROWNOUT
#use delay(clock=4000000)
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#bit enter = 6.0
#bit arriba = 8.6
#bit abajo = 8.7
#include <LCD4x20.C>
void vDibujaPuntero(int puntero);
#zero_ram
void main()
{
int puntero = 0;
lcd_init();
while (true)
{
delay_ms(300);
lcd_putc("\f");
lcd_putc("Prueva menu");
lcd_gotoxy(1,2);
lcd_putc("Inicialmente solo");
lcd_gotoxy(1,3);
lcd_putc("control movimiento");
lcd_gotoxy(1,4);
lcd_putc("del puntero");
if (abajo == 1)
{
delay_ms(300);
puntero++;
vDibujaPuntero(puntero);
}
if (arriba == 1)
{
delay_ms(300);
puntero--;
vDibujaPuntero(puntero);
}
}
}
void vDibujaPuntero (int puntero)
{
lcd_putc("\f");
lcd_gotoxy(3,1);
lcd_putc("1 opcion uno");
lcd_gotoxy(3,2);
lcd_putc("2 opcion dos");
lcd_gotoxy(3,3);
lcd_putc("3 opcion tres");
lcd_gotoxy(3,4);
lcd_putc("4 opcion cuatro");
lcd_gotoxy(1,puntero);
lcd_putc("->");
}#include <16F877A.h>
#device adc = 10
#FUSES XT, NOWDT, NOPROTECT, NOPUT, NOBROWNOUT
#use delay(clock=4000000)
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#bit enter = 6.0
#bit arriba = 8.6
#bit abajo = 8.7
#include <LCD4x20.C>
void vDibujaPuntero(int puntero);
#zero_ram
void main()
{
int puntero = 0;
lcd_init();
while (true)
{
if (abajo == 1)
{
delay_ms(300);
puntero++;
vDibujaPuntero(puntero);
}
if (arriba == 1)
{
delay_ms(300);
puntero--;
vDibujaPuntero(puntero);
}
}
}
void vDibujaPuntero (int puntero)
{
lcd_putc("\f");
lcd_gotoxy(3,1);
lcd_putc("1 opcion uno");
lcd_gotoxy(3,2);
lcd_putc("2 opcion dos");
lcd_gotoxy(3,3);
lcd_putc("3 opcion tres");
lcd_gotoxy(3,4);
lcd_putc("4 opcion cuatro");
lcd_gotoxy(1,puntero);
lcd_putc("->");
}#include <16F877A.h>
#device adc = 10
#FUSES XT, NOWDT, NOPROTECT, NOPUT, NOBROWNOUT
#use delay(clock=4000000)
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#bit enter = 6.0
#bit arriba = 8.6
#bit abajo = 8.7
#include <LCD4x20.C>
void vDibujaPuntero(int puntero);
void vDibujaPuntero2(int puntero);
#zero_ram
void main()
{
int puntero = 0;
lcd_init();
while (true)
{
if (abajo == 1)
{
delay_ms(300);
puntero++;
if (puntero == 5)
{
puntero = 1;
}
vDibujaPuntero(puntero);
}
if (arriba == 1)
{
delay_ms(300);
puntero--;
if (puntero == 0)
{
puntero = 4;
}
vDibujaPuntero(puntero);
}
}
}
void vDibujaPuntero (int puntero)
{
lcd_putc("\f");
lcd_gotoxy(3,1);
lcd_putc("1 opcion uno");
lcd_gotoxy(3,2);
lcd_putc("2 opcion dos");
lcd_gotoxy(3,3);
lcd_putc("3 opcion tres");
lcd_gotoxy(3,4);
lcd_putc("4 opcion cuatro");
lcd_gotoxy(1,puntero);
lcd_putc("->");
}#include <16F877A.h>
#device adc = 10
#FUSES XT, NOWDT, NOPROTECT, NOPUT, NOBROWNOUT
#use delay(clock=4000000)
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#bit enter = 6.1
#bit arriba = 8.6
#bit abajo = 8.7
#include <LCD4x20.C>
#use fast_io(B)
#use fast_io(D)
void vDibujaPuntero(int puntero);
void OpcionSelect(int puntero);
void testeo(void);
int puntero = 0;
#zero_ram
void main()
{
//int puntero = 0;
set_tris_b(0x03);
set_tris_d(0xC0);
lcd_init();
while(true)
{
lcd_putc("\f");
lcd_putc(" Este es una");
lcd_gotoxy(1,2);
lcd_putc("prueva del menu");
lcd_gotoxy(1,3);
lcd_putc("espero salga");
lcd_gotoxy(1,4);
lcd_putc("bien....!");
if (enter == 1)
{
lcd_putc("\f");
lcd_gotoxy(1,2);
lcd_putc("SELECCIONE");
lcd_gotoxy(1,3);
lcd_putc("PLANTACION");
delay_ms(2000);
//lcd_putc("\f");
testeo();
}
delay_ms(300);
}
//delay_ms(300);
}
void testeo()
{
puntero = 1;
vDibujaPuntero(puntero);
while (true)
{
if (abajo == 1)
{
delay_ms(300);
puntero++;
if (puntero == 5)
{
puntero = 1;
}
vDibujaPuntero(puntero);
}
if (arriba == 1)
{
delay_ms(300);
puntero--;
if (puntero == 0)
{
puntero = 4;
}
vDibujaPuntero(puntero);
}
if (enter == 1)
{
OpcionSelect(puntero);
}
}
}
void vDibujaPuntero (int puntero)
{
lcd_putc("\f");
lcd_gotoxy(3,1);
lcd_putc("1 opcion uno");
lcd_gotoxy(3,2);
lcd_putc("2 opcion dos");
lcd_gotoxy(3,3);
lcd_putc("3 opcion tres");
lcd_gotoxy(3,4);
lcd_putc("4 opcion cuatro");
lcd_gotoxy(1,puntero);
lcd_putc("->");
}
void OpcionSelect(int puntero)
{
switch(puntero)
{
case 1:lcd_putc("\f");
lcd_putc("opcion 1");
lcd_gotoxy(1,2);
lcd_putc("seleccionada");
delay_ms(300);
break;
case 2:lcd_putc("\f");
lcd_putc("opcion 2");
lcd_gotoxy(1,2);
lcd_putc("seleccionada");
delay_ms(300);
break;
case 3:lcd_putc("\f");
lcd_putc("opcion 3");
lcd_gotoxy(1,2);
lcd_putc("seleccionada");
delay_ms(300);
break;
case 4:lcd_putc("\f");
lcd_putc("opcion 4");
lcd_gotoxy(1,2);
lcd_putc("seleccionada");
delay_ms(300);
break;
}
}