TODOPIC
Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: Tempus en 19 de Febrero de 2009, 11:44:07
-
Hola tengo una duda no se como se crean submenus que se muestren en la lcd estoy trabajando con el 16f876 y lo que quier es que pulsando un pulsador que en mi caso es el ra3 entre en modo progrmacion y que en la pantalla de la lcd muestre lo siguiente:
introducir hora de funcionamiento motor 1 y le meteria la hora a la que va a funcionar el motor
y la segunda variable seria introducir hora de funcionamientode motor 2 y cuando le metos todoslos datos que directamente salga al menu principal donde
tengo puesto un reloj
As agradezco cualkier opinion gracias
adjunto mi c, mi proteus
-
hola,
es cuestion de crear pantallas o máscaras para tus submenus. puedes comenzar haciendo una pantalla con mensaje de presentacion, luego le das 2 segundos y cargas otra pantalla de la misma forma que hicistes la anterior.
se entendio o no era eso lo que necesitabas.
saludos :-/
-
Pero el problema que tengo es que necesito ver como se hace una y ver donde la tengo que poner dentro del programa en c una vez visto donde va una y su estructura lo demas ya sabria seguir yo
te agradeceria que metiers un en mi programa en c para verlo, gracias x contestar
-
Hola:
En efecto, es bastante simple, algo más que deberías tomar en cuanta es un antirebote de tecla por si alguien se quiere "prender" del pulsante, además de borrar la pantalla antes de un nuevo mensaje y al final para que no quede basura.
-
Entiendo todo el funcionamiento de los antirebotes , limpiar pantalla y todo pero lo que me falla es saber donde lo tengo que poner en mi programa,
gracias x vuestra colaboracion
-
Pero el problema que tengo es que necesito ver como se hace una y ver donde la tengo que poner dentro del programa en c una vez visto donde va una y su estructura lo demas ya sabria seguir yo
te agradeceria que metiers un en mi programa en c para verlo, gracias x contestar
Hola:
Vemos, al parecer esto es cuestión de sentido común solamente, si quieres mostrar algo cuando se presione el botón, pues será en esa parta, no lo tienes que mostrar cuando arranque, no te parece? Imagino que tienes un condicional para saber el estado del pulsante, por ejemplo:
Si el pulsante ha sido presionado then
antirebote
muestras el mensaje
fin del condicional.
Si no entiendes la estructura del C o como se usa una pantalla en este lenguaje, pásate por el subforo de lenguaje C y mira los ejemplos de J1M:
http://www.todopic.com.ar/foros/index.php?topic=4530.0
-
lo siento pero stoy mirando los ejemplos y no se hacerlo, gracias de todas formas x ayudarme ya intentare probar cosas para que funcione es que necesito verlo par saber el xk
-
Tienes algun trozo de código hecho ? Postealo en el mensaje.
Para guiarte un poco los submenus los puedes hacer con if - else, switch - case y whiles.
Antes de programar primero de todo: Diagrama de Flujo. Supongamos que solo tenemos un par de teclas. la tecla nº 1 y la tecla nº 2.
tecla nº1 pusaldo ? -- Sí (tecla nº1) --- Introducir hora --- Por cada pulsacion de tecla nº1 aumentamos en 1 la hora, Si pulsamos la nº2 cambiamos y pasamos a modificar
los minutos y luego los segundos. Si tecla nº2 esta pulsada permanentemente, salimos del modo "cambiar hora motor 1" y
modificamos la del motor2. Si mantenemos pulsado tecla nº2 salimos del "cambiar hora motor2".
-- No --- Comprovar otra vez.
Salu2.
-
He recibido tu mensaje privado , Tempus. Pero lo que pasa que no programo en C, sólo en assembler. Estoy recién empezando a aprender C y me pierdo en el #include :mrgreen: :D :D
-
tengo echo esto
es un mensaje de bienvenida
reloj mas termometro
y lo que estoy intentando ahora es que cuando pulso ra3 que me salga un menu mas menos asi
modo progrmacion
y cuando entre en el modo programacion haytendre dos opciones una para poner en hora el reloj y otra para programar la hora de funcionamient de dos motores
#include <16F876.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES BROWNOUT //Reset when brownout detected
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#use delay(clock=4000000)
#define use_portb_lcd TRUE
#include <lcd.c>
///DEFINICION DE FUNCIONES
void configurar(void);
void choras(void);
void cminutos(void);
int segundos,minutos,horas,temperatura;
int seg=0;
byte menu=0,flag=0,var=2; //variables para menu configurar
//INTERRUPCION//
#int_rtcc //Habilita interrupción timer0
void interrupt_timer(void){
seg++;
if(seg==125){ //Condición de cambio
segundos++; // cuenta 1 segundo
seg=0; //reiniciar cuenta
}
set_timer0(131); //Inicializa Timer0
}
void main(void){
setup_adc_ports(RA0_ANALOG); // configura RA0 como entrada analogica
set_tris_a(0xff);
setup_adc(ADC_CLOCK_INTERNAL);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64); //Configura timer0 y prescaler
set_timer0(131); //Inicializa timer0
enable_interrupts(INT_RTCC); //Habilita interrupción timer0
enable_interrupts(GLOBAL); //Habilita Interrupciones
lcd_init();// inicializa el LCD
set_adc_channel(0);
delay_us(20);
lcd_putc("Comedero Peces\nPino & Azparren" ); //presentacion...
delay_ms(4000);
while(true)
{
temperatura=read_adc();//lee valor analogico
if(segundos>59)
{
segundos=0;
minutos++;
if(minutos>59)
{
minutos=0;
horas++;
if(horas>24)
horas=0;
}
}
lcd_init(); //inicializa lcd
printf (lcd_putc,"\f%02u:%02u:%02u T:%d%cC\n H.COMIDA: 13:45" ,horas,minutos,segundos,temperatura*2,0xdf);
delay_ms(100);
}
}
-
A ver. COmo ya te dije no entiendo ni papa de C. Pero por lo que he visto el muy desgraciado te da facilmente la opción de fabricar menues como si estuvieses en un restaurant con solo unas pocas lineas.
Creo que primero tienes que declarar una variable que te sirva de bandera. AL inicio que sea = 0
Luego entras al menu principal
Miras la bandera (al inicio será 0) y te vas donde te diga la bandera. Si es uno te vas al menu 1, si es 2 al menu 2, etc
si es 0 me mantego haciendo nada y mirando las entradas
miras las entradas
si se activó la entrada 1 entonces pones bandera = 1
si se activó la entrada 2 entonces pones bandera = 2
etc
etc
vuelves al menu principal
Menu 1
activo el comedero de peces
bandera = 0
vuelvo a menu principal
Menu 2
activo el comedero de tiburones
bandera = 0
vuelvo a menu principal
etc
etc
Algo por el estilo. Es lo bueno de C , que puedes hacer menues como churros
Y AHORA ME VOY A JUGAR AL FALLEN EARTH, que tengo la closed beta y no la voy a desperdiciar. :mrgreen:
-
gracias x tu respuesta y muy bueno lo de los tiburones jejejejje voy a probar a hacerlo asi y ya te contare
saludos
-
hola buenas de nuevo estube haciendo esto:
#include <16F876.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES BROWNOUT //Reset when brownout detected
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#use delay(clock=4000000)
#define use_portb_lcd TRUE
#include <lcd.c>
///DEFINICION DE FUNCIONES
void configurar(void);
void choras(void);
void cminutos(void);
int segundos,minutos,horas,temperatura;
int seg=0;
byte menu=0,flag=0,var=2; //variables para menu configurar
//********************* //INTERRUPCION//************************************\\
#int_rtcc //Habilita interrupción timer0
void interrupt_timer(void){
seg++;
if(seg==125){ //Condición de cambio
segundos++; // cuenta 1 segundo
seg=0; //reiniciar cuenta
}
set_timer0(131); //Inicializa Timer0
}
void main(void){
setup_adc_ports(RA0_ANALOG); // configura RA0 como entrada analogica
set_tris_a(0xff);
setup_adc(ADC_CLOCK_INTERNAL);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64); //Configura timer0 y prescaler
set_timer0(131); //Inicializa timer0
enable_interrupts(INT_RTCC); //Habilita interrupción timer0
enable_interrupts(GLOBAL); //Habilita Interrupciones
lcd_init();// inicializa el LCD
set_adc_channel(0);
delay_us(20);
lcd_putc("Comedero Peces\nPino & Azparren" ); //presentacion...
delay_ms(4000);
while(true)
{
temperatura=read_adc();//lee valor analogico
if(segundos>59)
{
segundos=0;
minutos++;
if(minutos>59)
{
minutos=0;
horas++;
if(horas>24)
horas=0;
}
}
lcd_init(); //inicializa lcd
printf (lcd_putc,"\f%02u:%02u:%02u T:%d%cC\n H.COMIDA: 13:45" ,horas,minutos,segundos,temperatura*2,0xdf);
delay_ms(100);
}
}
///FUNCION CONFIGURAR
void configurar(void)
{
disable_interrupts(GLOBAL); //desactivadas interrupciones
do{
switch(menu){
case 0: lcd_putc("fConfigurar horas?" ); //horas
if(!input(PIN_A5))
{
while(!input(PIN_A5)){}
choras();
menu=1;
}
break;
case 1: lcd_putc("fConfigurar minutos?" ); //minutos
if(!input(PIN_A5))
{
while(!input(PIN_A5)){}
cminutos();
menu=2;
}
}
}
}
pero al final me da un error linea 103 expect while
OS ADJUNTO EL C PARAVER SI ME PODEIS DECIR CUAL ES EL FALLLO
GRACIAS NUEVAMENTE X TODO
-
permiso me meto un poquito...
[color=red]do{[/color]
switch(menu){
case 0: lcd_putc("fConfigurar horas?" ); //horas
if(!input(PIN_A5))
{
while(!input(PIN_A5)){}
choras();
menu=1;
}
break;
case 1: lcd_putc("fConfigurar minutos?" ); //minutos
[color=blue]if(!input(PIN_A5))[/color]
{
[color=red]while(!input(PIN_A5)){}[/color]
cminutos();
menu=2;
}
}
eso pasa porque el bucle do{} while() // no puede completarse
eso se soluciona asi
do{
switch(menu){
case 0: lcd_putc("fConfigurar horas?" ); //horas
if(!input(PIN_A5))
{
while(!input(PIN_A5)){}
choras();
menu=1;
}
break;
case 1: lcd_putc("fConfigurar minutos?" ); //minutos
if(!input(PIN_A5))
{
while(!input(PIN_A5))
cminutos();
menu=2;
}
}
[color=red]}while(1);[/color]
igualmente no entiendo para que esta ese bucle do-while yo lo sacaria...
saludos
-
gracias x tu respuesta entonces como harias tu el programa sin el do
SI puedes ponlo para k lo vea gracias
y ncantado de verte x aki
-
al final me queda asi
#include <16F876.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES BROWNOUT //Reset when brownout detected
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#use delay(clock=4000000)
#define use_portb_lcd TRUE
#include <lcd.c>
///DEFINICION DE FUNCIONES
void configurar(void);
void choras(void);
void cminutos(void);
int segundos,minutos,horas,temperatura;
int seg=0;
byte menu=0,flag=0,var=2; //variables para menu configurar
//********************* //INTERRUPCION//************************************\\
#int_rtcc //Habilita interrupción timer0
void interrupt_timer(void){
seg++;
if(seg==125){ //Condición de cambio
segundos++; // cuenta 1 segundo
seg=0; //reiniciar cuenta
}
set_timer0(131); //Inicializa Timer0
}
void main(void){
setup_adc_ports(RA0_ANALOG); // configura RA0 como entrada analogica
set_tris_a(0xff);
setup_adc(ADC_CLOCK_INTERNAL);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64); //Configura timer0 y prescaler
set_timer0(131); //Inicializa timer0
enable_interrupts(INT_RTCC); //Habilita interrupción timer0
enable_interrupts(GLOBAL); //Habilita Interrupciones
lcd_init();// inicializa el LCD
set_adc_channel(0);
delay_us(20);
lcd_putc("Comedero Peces\nPino & Azparren" ); //presentacion...
delay_ms(4000);
while(true)
{
temperatura=read_adc();//lee valor analogico
if(segundos>59)
{
segundos=0;
minutos++;
if(minutos>59)
{
minutos=0;
horas++;
if(horas>24)
horas=0;
}
}
lcd_init(); //inicializa lcd
printf (lcd_putc,"\f%02u:%02u:%02u T:%d%cC\n H.COMIDA: 13:45" ,horas,minutos,segundos,temperatura*2,0xdf);
delay_ms(100);
}
}
///FUNCION CONFIGURAR
void configurar(void){
disable_interrupts(GLOBAL); //desactivadas interrupciones
switch(menu){
case 0: lcd_putc("fConfigurar horas?" ); //horas
if(!input(PIN_A3))
{
while(!input(PIN_A3)){}
choras();
menu=1;
}
break;
case 1: lcd_putc("fConfigurar minutos?" ); //minutos
if(!input(PIN_A3))
{
while(!input(PIN_A3))
cminutos();
menu=2;
}
me compila bien pero a la hora de simular en proteus ummm no hace nada vosotros veis alg fallo d progrmacion
adjunto c y mi proteus
-
es muy logico lo que te sucede
///DEFINICION DE FUNCIONES
byte menu=0,flag=0,var=2; //variables para menu configurar
esa variable menu no la modificas nunca... lo que si entrara a configurar haria siempre lo mismo
segundo
while(true)
{
temperatura=read_adc();//lee valor analogico
if(segundos>59)
{
segundos=0;
minutos++;
if(minutos>59)
{
minutos=0;
horas++;
if(horas>24)
horas=0;
}
}
este bucle esta definido infinito la unica forma de salir del mismo es mediante una interrupcion, se entiende porque actualiza el reloj pero no el menu...
///FUNCION CONFIGURAR
void configurar(void){
disable_interrupts(GLOBAL); //desactivadas interrupciones
switch(menu){
case 0: lcd_putc("fConfigurar horas?" ); //horas
if(!input(PIN_A3))
{
while(!input(PIN_A3)){}
choras();
menu=1;
}
break;
case 1: lcd_putc("fConfigurar minutos?" ); //minutos
if(!input(PIN_A3))
{
while(!input(PIN_A3))
cminutos();
menu=2;
}
a esta funcion nunca estas entrando..... y las resistencias deberias colocarlas como el esquema adjunto...
saludos
Y AHORA ME VOY A JUGAR AL FALLEN EARTH, que tengo la closed beta y no la voy a desperdiciar. :mrgreen:
:D no conocia ese juego se ve que hace mucho tiempo que no juego a nada.... asi que andas matando bichitos :D
edit: este mensaje lo habia mandado mucho antes y no lo publico :shock: