Autor Tema: Ayuda para crear un menú en ccs  (Leído 5353 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado yenz

  • PIC10
  • *
  • Mensajes: 22
Ayuda para crear un menú en ccs
« en: 26 de Febrero de 2015, 17:08:48 »
Hola comunidad todopic me gustaría que me ayudaran a crea un menú para mi código.
Mi proyecto es realizar un sistema de control en el cual utilizare 8 salidas digitales, 8 entradas digitales, 8 entradas análogas y 1 salida análoga para eso estoy utilizando el pic16f877a la pantalla lcd 4x20 y el keypad 4x4.
Les adjunto mi código:
Código: C
  1. #include <16f877a.h>
  2. #use     delay(crystal = 4MHz)
  3.  
  4. #define use_portb_kbd TRUE
  5. #include <KBD96.c>
  6. #include <LCD420.c>
  7. #include <stdlib.h>
  8.  
  9. #define  LED_1  PIN_D0
  10. #define  LED_2  PIN_D1
  11. #define  LED_3  PIN_D2
  12. #define  LED_4  PIN_D3
  13. #define  LED_5  PIN_D4
  14. #define  LED_6  PIN_D5
  15. #define  LED_7  PIN_D6
  16. #define  LED_8  PIN_D7
  17.  
  18. #define ENTRADA1 PIN_C0
  19. #define ENTRADA2 PIN_C1
  20. #define ENTRADA3 PIN_C2
  21. #define ENTRADA4 PIN_C3
  22. #define ENTRADA5 PIN_C4
  23. #define ENTRADA6 PIN_C5
  24.  
  25. void mostrar_menu(){
  26. lcd_gotoxy(3,1);
  27. printf(lcd_putc,"\fMENU PRINCIPAL\r");
  28. lcd_gotoxy(1,2);
  29. printf(lcd_putc,"0 ESTADO PUERTO C ");
  30. lcd_gotoxy(1,3);
  31. printf(lcd_putc,"1,2,3,4,5,6,7,8");
  32. lcd_gotoxy(1,4);
  33. printf(lcd_putc,"CONTROL OFF/ON DE LED");
  34. }
  35.  
  36. void funcion_led_1(){
  37. output_toggle(LED_1);
  38.    if (input_state(LED_1))
  39.  printf(lcd_putc,"\fLed 1 encendido");
  40.    else
  41.  printf(lcd_putc,"\fLed 1 apagado");
  42. }
  43.  
  44. void funcion_led_2(){
  45. output_toggle(LED_2);
  46.    if (input_state(LED_2))
  47. printf(lcd_putc,"\fLed 2 encendido");
  48.    else
  49. printf(lcd_putc,"\fLed 2 apagado");
  50. }
  51. void funcion_led_3(){
  52. output_toggle(LED_3);
  53.    if (input_state(LED_3))
  54. printf(lcd_putc,"\fLed 3 encendido");
  55.    else
  56. printf(lcd_putc,"\fLed 3 apagado");
  57. }
  58.  
  59.  
  60. void funcion_led_4(){
  61. output_toggle(LED_4);
  62.    if (input_state(LED_1))
  63. printf(lcd_putc,"\fLed 4 encendido");
  64.    else
  65. printf(lcd_putc,"\fLed 4 apagado");
  66. }
  67.  
  68. void funcion_led_5(){
  69. output_toggle(LED_5);
  70.    if (input_state(LED_5))
  71. printf(lcd_putc,"\fLed 5 encendido");
  72.    else
  73. printf(lcd_putc,"\fLed 5 apagado");
  74. }
  75.  
  76. void funcion_led_6(){
  77. output_toggle(LED_6);
  78.    if (input_state(LED_6))
  79. printf(lcd_putc,"\fLed 6 encendido");
  80.    else
  81. printf(lcd_putc,"\fLed 6 apagado");
  82. }
  83.  
  84. void funcion_led_7(){
  85. output_toggle(LED_7);
  86.    if (input_state(LED_7))
  87. printf(lcd_putc,"\fLed 7 encendido");
  88.    else
  89. printf(lcd_putc,"\fLed 7 apagado");
  90. }
  91.  
  92. void funcion_led_8(){
  93. output_toggle(LED_8);
  94.    if (input_state(LED_8))
  95. printf(lcd_putc,"\fLed 8 encendido");
  96.    else
  97. printf(lcd_putc,"\fLed 8 apagado");
  98. }
  99.  
  100. void funcion_lectura_entradas(){
  101. lcd_gotoxy(1,1);
  102. printf(lcd_putc,"INPUT1=%u",input(ENTRADA1));
  103. lcd_gotoxy(1,2);
  104. printf(lcd_putc,"INPUT2=%u",input(ENTRADA2));
  105. lcd_gotoxy(1,3);
  106. printf(lcd_putc,"INPUT3=%u",input(ENTRADA3));
  107. lcd_gotoxy(11,1);
  108. printf(lcd_putc,"INPUT4=%u",input(ENTRADA4));
  109. lcd_gotoxy(11,2);
  110. printf(lcd_putc,"INPUT5=%u",input(ENTRADA5));
  111. lcd_gotoxy(11,3);
  112. printf(lcd_putc,"INPUT6=%u",input(ENTRADA6));
  113. lcd_gotoxy(1,4);
  114. printf(lcd_putc,"REGRESO MENU PULSE #");
  115. }
  116.  
  117. void main ()
  118. {
  119. CHAR k;
  120.  
  121.    lcd_init();
  122.    kbd_init();
  123.    port_b_pullups(TRUE);
  124.  
  125.    output_low(LED_1),(LED_2),(LED_3),(LED_4),(LED_5),(LED_6),(LED_7),(LED_8);
  126.    lcd_gotoxy(1,1);
  127.    printf(lcd_putc,"Bienvenidos (^^,)");
  128.    lcd_gotoxy(1,2);
  129.    printf(lcd_putc,"Pulsa # para ir menu");
  130.  
  131.    while (true)
  132.    {
  133.       k = kbd_getc();
  134.      
  135.       if (k!=0)
  136.          switch(k)
  137.          {
  138.          case '0':
  139.             funcion_lectura_entradas();
  140.             break;
  141.          case '1':
  142.             funcion_led_1();
  143.             break;    // Brake ya no se coloca al final de la selecci&#243;n.
  144.          case '2':
  145.             funcion_led_2();
  146.             break;
  147.             case '3':
  148.             funcion_led_3();
  149.             break;
  150.             case '4':
  151.             funcion_led_4();
  152.             break;
  153.             case '5':
  154.             funcion_led_5();
  155.             break;
  156.             case '6':
  157.             funcion_led_6();
  158.             break;
  159.             case '7':
  160.             funcion_led_7();
  161.             break;
  162.             case '8':
  163.             funcion_led_8();
  164.             break;
  165.             case '#':
  166.             mostrar_menu();
  167.             break;  
  168.          }
  169.    }
  170. }
también la simulación en proteus.
« Última modificación: 26 de Febrero de 2015, 17:14:17 por yenz »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ayuda para crear un menú en ccs
« Respuesta #1 en: 26 de Febrero de 2015, 17:22:02 »
nNo entiendo cual es el problema.

Desconectado yenz

  • PIC10
  • *
  • Mensajes: 22
Re: Ayuda para crear un menú en ccs
« Respuesta #2 en: 26 de Febrero de 2015, 18:43:30 »
Gracias KILLERJC por tu interés en mi proyecto.
El problema es que me gustaría que mi código sea mas eficiente con un menú en la lcd para el control de las salida representadas con 8 led, entradas con pulsadores.
intente hacer el menú pero no pude es un poco confuso para el usuario funciona así:
teclas del keypad 4x4:
- # abre el menú.
- 0 muestra el estado de las entradas representadas por pulsadores por el puerto C si están en 1 o 0 visualiza con errores.
1,2,3,4,5,6,7,8 son control de salidas digitales representadas por led por el puerto D cada led es un numero con el mismo se prende y se apaga visualización es independiente para cada uno.
Errores:
- Antes de entrar al menú podemos encender los led y revisar las entradas.
- No tengo la librerías keypad 4x4.
me gustaría que me ayudaran acomodar el código con un menú y sub menú para poder seguir trabajando con las entradas análogas que me faltan.
la simulación en proteus la adjunte al inicio.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ayuda para crear un menú en ccs
« Respuesta #3 en: 27 de Febrero de 2015, 04:18:23 »
Citar
- Antes de entrar al menú podemos encender los led y revisar las entradas.

Si veo que en tu codigo vos pedis que se presione # para ir al menu pero es posible presionar cualquier cosa. Pero es por como esta escrito

Ejemplo:
pediria por un #, al no darmelo seguiria preguntando por eso. Cuando lo recibo muestro el menu Y sigo adelante.
Loop: Ahora me quedo esperando por otra tecla, que es lo que tenes escrito y vuelvo nuevamente a mi loop

Es decir:
Código: C
  1. void main ()
  2. {
  3. CHAR k;
  4.  
  5.    lcd_init();
  6.    kbd_init();
  7.    port_b_pullups(TRUE);
  8.  
  9.    output_low(LED_1),(LED_2),(LED_3),(LED_4),(LED_5),(LED_6),(LED_7),(LED_8);
  10.    lcd_gotoxy(1,1);
  11.    printf(lcd_putc,"Bienvenidos (^^,)");
  12.    lcd_gotoxy(1,2);
  13.    printf(lcd_putc,"Pulsa # para ir menu");
  14.  
  15.    while (kbd_getc()!='#') {};
  16.    mostrar_menu();
  17.  
  18.    while (true)
  19.    {
  20.       k = kbd_getc();
  21.      
  22.       if (k!=0)
  23.          switch(k)
  24.       .........

Si quisieras un menu mas complejo ya deberias de usar estructuras o una maquina de estado.

Citar
- No tengo la librerías keypad 4x4.

busca por internet:
http://www.ccsinfo.com/forum/viewtopic.php?t=28022&start=14

con algo asi:
https://electrosome.com/wp-content/uploads/2012/06/Matrix-keyboard-pic-microcontroller.png

o imaginate y hace la tuya...
Siguiendo la imagen esa, las resistencias de pulldown estan para asegurar el 0 cuando no hay presionado ningun boton (puede ser pull-up tmb nomas que tendrias un 1 cuando no hay nada presionado). ya que tenes 4 entradas y 4 salidas, luego activas 1 por 1 las salidas, y cuando detectes un 1, segun la entrada que es y la salida activada vas a dar con la tecla.

ya con el principio de funcionamiento te daras cuenta como es.

Ahora yo pensaba:
8 pines para el teclado 4x4 ( portD )
8 pines para los leds ( a no ser que uses algo com un shift register ) (PortB)
8 pines entradas analogas ( y rogando que te quede un puerto completo con entrada analogicas ) (port A y E )
1 salida digital ( imagino que lo vas a hacer con el PWM sino va a ser muy pobre para un R-2R ) ( 1 pin PortC )
6 pines pines para el LCD ( si admite 4 bits o de ultima con un shif register reducirlo mas ) ( 6 pines PortC )

creo que te queda un pin libre nomas xD

Desconectado yenz

  • PIC10
  • *
  • Mensajes: 22
Re: Ayuda para crear un menú en ccs
« Respuesta #4 en: 27 de Febrero de 2015, 13:56:00 »
Gracias KILLERJC por tu ayuda estos días voy a trabajar bien duro en lo que me aconsejaste

« Última modificación: 27 de Febrero de 2015, 17:10:39 por yenz »

Desconectado yenz

  • PIC10
  • *
  • Mensajes: 22
Re: Ayuda para crear un menú en ccs
« Respuesta #5 en: 27 de Febrero de 2015, 14:02:37 »
Gracias Diego por tu ayuda, estos días voy a trabajar bien duro para realizar los cambios al código.
« Última modificación: 27 de Febrero de 2015, 17:10:19 por yenz »

Desconectado yenz

  • PIC10
  • *
  • Mensajes: 22
Re: Ayuda para crear un menú en ccs
« Respuesta #6 en: 01 de Marzo de 2015, 16:51:48 »
Hola muchachos
Tengo un problema que no me deja avanzar en mi código es implementar el teclado 4x4 y LCD por el mismo puerto (port B).
les adjunto mi código con las librerías y la simulación en proteus:
Código: C
  1. #include <16f877a.h>
  2. #use     delay(crystal = 4MHz)
  3.  
  4. #define use_portb_kbd TRUE
  5. #include <kbd_lib.c>
  6. #include <LCD420.c>
  7. #include <stdlib.h>
  8.  
  9. #define  LED_1  PIN_D0
  10. #define  LED_2  PIN_D1
  11. #define  LED_3  PIN_D2
  12. #define  LED_4  PIN_D3
  13. #define  LED_5  PIN_D4
  14. #define  LED_6  PIN_D5
  15. #define  LED_7  PIN_D6
  16. #define  LED_8  PIN_D7
  17.  
  18. #define ENTRADA1 PIN_C0
  19. #define ENTRADA2 PIN_C1
  20. #define ENTRADA3 PIN_C2
  21. #define ENTRADA4 PIN_C3
  22. #define ENTRADA5 PIN_C4
  23. #define ENTRADA6 PIN_C5
  24.  
  25. void mostrar_menu(){
  26. lcd_gotoxy(3,1);
  27. printf(lcd_putc,"\fMENU PRINCIPAL\r");
  28. lcd_gotoxy(1,2);
  29. printf(lcd_putc,"0 ESTADO PUERTO C ");
  30. lcd_gotoxy(1,3);
  31. printf(lcd_putc,"1,2,3,4,5,6,7,8");
  32. lcd_gotoxy(1,4);
  33. printf(lcd_putc,"CONTROL OFF/ON DE LED");
  34. }
  35.  
  36. void funcion_led_1(){
  37. output_toggle(LED_1);
  38.    if (input_state(LED_1))
  39.  printf(lcd_putc,"\fLed 1 encendido");
  40.    else
  41.  printf(lcd_putc,"\fLed 1 apagado");
  42. }
  43.  
  44. void funcion_led_2(){
  45. output_toggle(LED_2);
  46.    if (input_state(LED_2))
  47. printf(lcd_putc,"\fLed 2 encendido");
  48.    else
  49. printf(lcd_putc,"\fLed 2 apagado");
  50. }
  51. void funcion_led_3(){
  52. output_toggle(LED_3);
  53.    if (input_state(LED_3))
  54. printf(lcd_putc,"\fLed 3 encendido");
  55.    else
  56. printf(lcd_putc,"\fLed 3 apagado");
  57. }
  58.  
  59.  
  60. void funcion_led_4(){
  61. output_toggle(LED_4);
  62.    if (input_state(LED_1))
  63. printf(lcd_putc,"\fLed 4 encendido");
  64.    else
  65. printf(lcd_putc,"\fLed 4 apagado");
  66. }
  67.  
  68. void funcion_led_5(){
  69. output_toggle(LED_5);
  70.    if (input_state(LED_5))
  71. printf(lcd_putc,"\fLed 5 encendido");
  72.    else
  73. printf(lcd_putc,"\fLed 5 apagado");
  74. }
  75.  
  76. void funcion_led_6(){
  77. output_toggle(LED_6);
  78.    if (input_state(LED_6))
  79. printf(lcd_putc,"\fLed 6 encendido");
  80.    else
  81. printf(lcd_putc,"\fLed 6 apagado");
  82. }
  83.  
  84. void funcion_led_7(){
  85. output_toggle(LED_7);
  86.    if (input_state(LED_7))
  87. printf(lcd_putc,"\fLed 7 encendido");
  88.    else
  89. printf(lcd_putc,"\fLed 7 apagado");
  90. }
  91.  
  92. void funcion_led_8(){
  93. output_toggle(LED_8);
  94.    if (input_state(LED_8))
  95. printf(lcd_putc,"\fLed 8 encendido");
  96.    else
  97. printf(lcd_putc,"\fLed 8 apagado");
  98. }
  99.  
  100. void funcion_lectura_entradas(){
  101. lcd_gotoxy(1,1);
  102. printf(lcd_putc,"INPUT1=%u",input(ENTRADA1));
  103. lcd_gotoxy(1,2);
  104. printf(lcd_putc,"INPUT2=%u",input(ENTRADA2));
  105. lcd_gotoxy(1,3);
  106. printf(lcd_putc,"INPUT3=%u",input(ENTRADA3));
  107. lcd_gotoxy(11,1);
  108. printf(lcd_putc,"INPUT4=%u",input(ENTRADA4));
  109. lcd_gotoxy(11,2);
  110. printf(lcd_putc,"INPUT5=%u",input(ENTRADA5));
  111. lcd_gotoxy(11,3);
  112. printf(lcd_putc,"INPUT6=%u",input(ENTRADA6));
  113. lcd_gotoxy(1,4);
  114. printf(lcd_putc,"REGRESO MENU PULSE #");
  115. }
  116.  
  117. void main ()
  118. {
  119. CHAR k;
  120.  
  121.    lcd_init();
  122.    kbd_init();
  123.    port_b_pullups(TRUE);
  124.  
  125.    output_low(LED_1),(LED_2),(LED_3),(LED_4),(LED_5),(LED_6),(LED_7),(LED_8);
  126.    lcd_gotoxy(1,1);
  127.    printf(lcd_putc,"Bienvenidos (^^,)");
  128.    lcd_gotoxy(1,2);
  129.    printf(lcd_putc,"Pulsa # para ir menu");
  130.    
  131.    while (kbd_getc()!='#'){};
  132.    mostrar_menu();
  133.  
  134.    while (true)
  135.    {
  136.       k = kbd_getc();
  137.      
  138.       if (k!=0)
  139.          switch(k)
  140.          {
  141.          case '0':
  142.             funcion_lectura_entradas();
  143.             break;
  144.          case '1':
  145.             funcion_led_1();
  146.             break;    // Brake ya no se coloca al final de la selección.
  147.          case '2':
  148.             funcion_led_2();
  149.             break;
  150.             case '3':
  151.             funcion_led_3();
  152.             break;
  153.             case '4':
  154.             funcion_led_4();
  155.             break;
  156.             case '5':
  157.             funcion_led_5();
  158.             break;
  159.             case '6':
  160.             funcion_led_6();
  161.             break;
  162.             case '7':
  163.             funcion_led_7();
  164.             break;
  165.             case '8':
  166.             funcion_led_8();
  167.             break;
  168.             case '#':
  169.             mostrar_menu();
  170.             break;
  171.          }
  172.    }
  173. }

Desconectado yenz

  • PIC10
  • *
  • Mensajes: 22
Re: Ayuda para crear un menú en ccs
« Respuesta #7 en: 02 de Marzo de 2015, 12:35:29 »
Gracias diego como estaba trabajando con las librerías keypad 3x4 y lcd por el mismo puerto, pensé que no habría problema con el 4x4.

Desconectado yenz

  • PIC10
  • *
  • Mensajes: 22
Re: Ayuda para crear un menú en ccs
« Respuesta #8 en: 02 de Marzo de 2015, 17:27:09 »
Comencé de cero encendiendo un led con el keypad 3x4 y lcd conectado en el mismo puerto (port B) siguiendo el ejemplo del libro (Compilador C Ccs Y Simulador Proteus Para Microcontroladores Pic) conectando la LCD y Keypad 3x4 por el mismo puerto (port B). Me funciono bien.
Lo modifique paso a paso le cambie la lcd por una mas grande (20x4) en proteus y después en el compilador la librería y funciono, después cambie el teclado por el 4x4 lonecte lo mismo que el anterior y funcionaba con la librería del 4x3 y me dispuse a cambiar la librería del teclado para habilitar le las letras (A,B,C,D) y pailas eso si no pude lo intente con varias librerías que encontraba por Internet para teclado 4x4 abcd y todo fue inútil. El programa funciona sin conectarle el pin 4 del teclado que me imagino que habilita las letras ABCD.
Les adjunto el código la simulación y las librerías 4x4 abcd del keypad que he encontrado en Internet para que me ayuden a revisarlo si de pronto las conexiones o hay que cambiarle algo al código o librerías.
« Última modificación: 02 de Marzo de 2015, 19:00:27 por yenz »

Desconectado yenz

  • PIC10
  • *
  • Mensajes: 22
Re: Ayuda para crear un menú en ccs
« Respuesta #9 en: 03 de Marzo de 2015, 19:22:10 »
gracias Diego por su respuesta comenzare a trabajar.
Pero tengo una duda con las librerías del keypad 4x4 que descargue de Pagina
Tengo que cambiarle algo para que funcione en mi código por que yo las ingrese y no funciona.
Que pena con la molestia pero gracias a ustedes he aprendido mucho.

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Re: Ayuda para crear un menú en ccs
« Respuesta #10 en: 04 de Marzo de 2015, 06:54:04 »
 Hola, yo te recomendaría lo mismo que te dicen los compañeros, implementar el teclado en un puerto diferente al LCD, te ahorrarás muchos quebraderos de cabezas pero no te salvarás de todos los quebraderos que te van ha salir  :D
 Yo estoy haciendo un desarrollo parecido al tuyo, utilizo un PIC18F2455 con teclado 4x4, LCD 16x2 y demás periféricos conectados por protocolos de comunicación I2C y SPI y lo que hice con el teclado es poner un expansor de puertos por I2C y ahí meter el teclado y por medio de una interrupción en el pin B2 (INT2) atender al teclado y va perfecto.

Para los menús yo utilizo el bucle switch para mí es mucho más cómodo de ver porque me queda más ordenado pero eso ya es más cuestión de gustos
« Última modificación: 04 de Marzo de 2015, 06:56:06 por Thulsa Doom »
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado yenz

  • PIC10
  • *
  • Mensajes: 22
Re: Ayuda para crear un menú en ccs
« Respuesta #11 en: 04 de Marzo de 2015, 19:03:55 »
Gracias muchachos por sus recomendaciones y por su tiempo me dieron nuevas  :idea: que le voy a implementar a mi proyecto.


 

anything