Autor Tema: Modificar librerías LCD 4x20  (Leído 5413 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Modificar librerías LCD 4x20
« Respuesta #15 en: 29 de Marzo de 2015, 07:29:56 »
Mi idea es la siguiente:

Código: C
  1. while (true)
  2.    {
  3.       k = kbd_getc();
  4.      
  5.       if (k!=0)
  6.       {
  7.         switch(k)
  8.         {
  9.          case '#':
  10.             estado=0;
  11.             break;
  12.          case 'A':
  13.             estado=1;
  14.             break;
  15.          case 'B':
  16.             estado=2;
  17.             break;
  18.          case 'C':
  19.             estado=3;
  20.             break;
  21.          case 'D':
  22.             estado=4;
  23.             break;
  24.          default:
  25.            if(k >= '1' && k<= '8')
  26.            {
  27.                 PORTD ^= (1 << (k - 49))
  28.            }
  29.            break;
  30.         }
  31.        k=0;
  32.        }
  33.  
  34.        // ACA COMIENZO A MOSTRAR EN EL LCD
  35.  
  36.        switch(estado)
  37.        {
  38.         case 0:
  39.                 mostrar_menu();                          // se podria tener una varaible como "estado_anterior" si sigue en el mismo estado no actualize
  40.                 break;
  41.         case 1:
  42.                 funcion_pwm();                           // Mismo que el de lectura de las entradas digitales
  43.                 break;
  44.         case 2:
  45.                 funcion_lectura_entradas_digitales();     // A esta funcion agregarle una comparacion de un valor viejo del puerto con el nuevo de esa forma si es distinto actualiza todo el LCD
  46.                 break;
  47.         case 3:
  48.                 funcion_control_salidas_digitales();      // Mismo caso que el de lecturas de entradas digitales, hasta se puede usar la misma variable para estas 3 funciones
  49.                 break
  50.         case 4:
  51.                 mostrar_menu();
  52.                 break;
  53.         default:
  54.                 mostrar_menu();
  55.                 break;
  56.        }
  57. }

Para actualizar tenes 2 formas..
- Una es cada cierto tiempo, y eso requiere de un timer + interrupciones
- La otra es comparando los datos anteriores con los nuevos

El programa simplemente setea la variable estado ( si es que detecta algun boton ) o activa desactiva las salidas ( hay que definir el portd ),
Una ves que realiza eso, sin importar si se presiono o no una tecla, revisa en que estado esta y procede a mostrar ese menu.

Ahi entramos a un nuevo problema, yo no quiero escribirle al LCD 100 veces si no hubo ningun cambio.
Entonces tengo 2 cosas que me ayudarian con eso. Una es tener una variable que contenga el estado de la anterior pasada. Y la otra es una variable que contenga el valor del puerto de la anterior pasada.
Y las funciones te quedarian algo asi:

Código: C
  1. void funcion_lectura_entradas_digitales(){
  2. if(estado_viejo != estado || puerto_viejo != puerto)
  3.         {
  4.         lcd_gotoxy(1,1);
  5.         printf(lcd_putc,"\fINPUT1=%u",input(ENTRADA1));
  6.         lcd_gotoxy(1,2);
  7.         printf(lcd_putc,"INPUT2=%u",input(ENTRADA2));
  8.         lcd_gotoxy(1,3);
  9.         printf(lcd_putc,"INPUT3=%u",input(ENTRADA3));
  10.         lcd_gotoxy(11,1);
  11.         printf(lcd_putc,"INPUT4=%u",input(ENTRADA4));
  12.         lcd_gotoxy(11,2);
  13.         printf(lcd_putc,"INPUT5=%u",input(ENTRADA5));
  14.         lcd_gotoxy(11,3);
  15.         printf(lcd_putc,"INPUT6=%u",input(ENTRADA6));
  16.         lcd_gotoxy(1,4);
  17.         printf(lcd_putc,"REGRESO MENU PULSE #");
  18.         estado_viejo = estado;
  19.         puerto_viejo = puerto;
  20.         }
  21. }

Ante el cambio de una entrada, o una salida ( en resumen el puerto ) se actualizaria el LCD, y no volveria a actualizarse hasta que se produzca otro cambio.
Por supuesto lo del puerto no te interesa en la funcion "mostrar_menu()" asi que no iria y con solo lo del estado seria suficiente. Las demas funciones, como las salidas haces lo mismo podes utilizar la misma variable puerto_viejo y solo cambiar el valor del puerto. A puerto me refiero como PORTD, PORTA , PORTC, etc.

PD:

Citar
Lo que pasa es que es mi proyecto de grado y no lo he podido terminar.

Esto es para un titulo de grado ? es demasiado simple para serlo al menos para electronica y menos para 2 personas. Al menos para mi parecer.

EDIT: Lo hice con switch case al prinicipio pero lo podria haber resumido mucho mas con else if y un else (y juntaba todos los demas casos, de A a D en un if y el # por si se presioana algo fuera de lo comun). Y solo quedaba el switch case de los estados.
« Última modificación: 29 de Marzo de 2015, 07:42:06 por KILLERJC »

Desconectado yenz

  • PIC10
  • *
  • Mensajes: 22
Re: Modificar librerías LCD 4x20
« Respuesta #16 en: 30 de Marzo de 2015, 21:22:20 »
KILLERJC mi titulo seria tecnologo en"mantenimiento electrónico e instrumental industrial"
duración 18 meses fase lectiva y 6 meses de practica.
Es una entidad publica llamada Sena forma gratis y con un apoyo económico para jóvenes de bajos recursos que no
pudieron comenzar sus estudios en universidades privadas y publicas que exigen costos económicos y buenas notas en los
exámenes del estado.

La idea principal de la entidad es brindarnos un titulo para conseguir un buen empleo.
También con el titulo se habré la posibilidad de seguir estudiando en cualquier universidad y lograr el
titulo de ingeniero.
El titulo como lo dice nos prepararon para conocer la industria y de electrónica fueron pocos ejemplos del libro
"Compilador C Ccs Y Simulador Proteus Para Microcontroladores Pic" los ingenieros nos decían que nos estaban preparando
en instrumentación mas que todo por que la programación la realizaban los ingenieros en las empresas.

El ingeniero a cargo de certificarnos nos asigno los proyectos nos dividió de 4 personas cada grupo con una tarea de
automatización de aula de estudio como tablero, luces, persianas, absceso, préstamo de herramientas y otros que se fueron
desintegrando por deserción, mi proyecto interfaz USB consiste en conectar los proyectos de mis compañeros y poderlos
controlar desde una terminal.

Al comienzo de la formación se pensaba realizar la conexión por protocolo Zigbee para evitar el cableado y el arduino YUN
para aprovechar su compatibilidad con el Xbee y Internet, Compre todo y en esos días el ingeniero que propuso el proyecto
lo echaron y no nos volvieron a dar programación si unas materias de relleno, hable con el director de grado y me dijo que
desistiera y comenzara de nuevo que le entregara 5 Entradas análogas, 6 Entradas digitales, 8 Salidas digitales y Dotar a el
Pic con una salida analógica faltando un mes ahora faltan 8 días.
Yo comencé solo y busque ayuda con el foro, se me unieron dos compañeros de clase que no estaban haciendo nada
y todavía no están haciendo nada.
Gracias por su ayuda se ve super lo estoy intentando armar el código me gustaría otra ves su ayuda.
Que pena con la molestia

Código: C
  1. #include <16f877a.h>
  2. #use     delay(crystal = 4MHz)
  3.  
  4. #define  LCD_ENABLE_PIN PIN_A0
  5. #define  LCD_RS_PIN     PIN_A1
  6. #define  LCD_RW_PIN     PIN_A2
  7. #define  LCD_DATA4      PIN_B4
  8. #define  LCD_DATA5      PIN_B5
  9. #define  LCD_DATA6      PIN_B6
  10. #define  LCD_DATA7      PIN_B7
  11.  
  12. #include "lcd420ap.c"
  13. #include <kbd_lib.c>
  14.  
  15. #define  LED_1  PIN_D0
  16. #define  LED_2  PIN_D1
  17. #define  LED_3  PIN_D2
  18. #define  LED_4  PIN_D3
  19. #define  LED_5  PIN_D4
  20. #define  LED_6  PIN_D5
  21. #define  LED_7  PIN_D6
  22. #define  LED_8  PIN_D7
  23.  
  24. #define ENTRADA1 PIN_C0
  25. #define ENTRADA2 PIN_C1
  26. #define ENTRADA3 PIN_C2
  27. #define ENTRADA4 PIN_C3
  28. #define ENTRADA5 PIN_C4
  29. #define ENTRADA6 PIN_C5
  30. int8 estoy=0;
  31.  
  32. int8 estado;
  33. int8 puerto;
  34.  
  35. int8 led1=0;
  36. int8 led2=0;
  37. int8 led3=0;
  38. int8 led4=0;
  39. int8 led5=0;
  40. int8 led6=0;
  41. int8 led7=0;
  42. int8 led8=0;
  43.  
  44. void mostrar_menu(){
  45. lcd_gotoxy(1,1);
  46. printf(lcd_putc,"\f>A ENTRADA ANALOGICA\r");
  47. lcd_gotoxy(1,2);
  48. printf(lcd_putc,">B CONTROL PWM");
  49. lcd_gotoxy(1,3);
  50. printf(lcd_putc,">C ENTRADAS DIGITALES");
  51. lcd_gotoxy(1,4);
  52. printf(lcd_putc,">D SALIDAS DIGITALES");
  53. }
  54.  
  55. void funcion_lectura_entradas_analogas(){
  56. lcd_gotoxy(1,1);
  57. printf(lcd_putc,"\fpendiente entradas");
  58. lcd_gotoxy(1,2);
  59. printf(lcd_putc,"analoga y visualizar");
  60. }
  61.  
  62. void funcion_pwm(){
  63. printf(lcd_putc,"\fpendiente el PWM");
  64. }
  65.  
  66.  
  67. void funcion_lectura_entradas_digitales(){
  68. if(estado_viejo != estado || puerto_viejo != puerto)
  69.    {
  70.    lcd_gotoxy(1,1);
  71.    printf(lcd_putc,"\fINPUT1=%u",input(ENTRADA1));
  72.    lcd_gotoxy(1,2);
  73.    printf(lcd_putc,"INPUT2=%u",input(ENTRADA2));
  74.    lcd_gotoxy(1,3);
  75.    printf(lcd_putc,"INPUT3=%u",input(ENTRADA3));
  76.    lcd_gotoxy(11,1);
  77.    printf(lcd_putc,"INPUT4=%u",input(ENTRADA4));
  78.    lcd_gotoxy(11,2);
  79.    printf(lcd_putc,"INPUT5=%u",input(ENTRADA5));
  80.    lcd_gotoxy(11,3);
  81.    printf(lcd_putc,"INPUT6=%u",input(ENTRADA6));
  82.    lcd_gotoxy(1,4);
  83.    printf(lcd_putc,"REGRESO MENU PULSE #");
  84.    estado_viejo = estado;
  85.    puerto_viejo = puerto;
  86.  
  87.    }
  88. }
  89.  
  90. void funcion_control_salidas_digitales(){
  91.  
  92. lcd_gotoxy(1,1);
  93. printf(lcd_putc,"\fled1=%d",led1);
  94. lcd_gotoxy(1,2);
  95. printf(lcd_putc,"led2=%d",led2);
  96. lcd_gotoxy(1,3);
  97. printf(lcd_putc,"led3=%d",led3);
  98. lcd_gotoxy(1,4);
  99. printf(lcd_putc,"led4=%d",led4);
  100. lcd_gotoxy(10,1);
  101. printf(lcd_putc,"led5=%d",led5);
  102. lcd_gotoxy(10,2);
  103. printf(lcd_putc,"led6=%d",led6);
  104. lcd_gotoxy(10,3);
  105. printf(lcd_putc,"led7=%d",led7);
  106. lcd_gotoxy(10,4);
  107. printf(lcd_putc,"led8=%d",led8);
  108.  
  109. }
  110. void main ()
  111. {
  112. CHAR k;
  113.  
  114.    lcd_init();
  115.    kbd_init();
  116.    port_b_pullups(TRUE);
  117.    output_low(LED_1),(LED_2),(LED_3),(LED_4),(LED_5),(LED_6),(LED_7),(LED_8);
  118.    lcd_gotoxy(2,2);
  119.    printf(lcd_putc,"Bienvenidos  (^^,)");
  120.    lcd_gotoxy(1,3);
  121.    printf(lcd_putc,"Pulsa # para ir menu");
  122.    
  123.    while (kbd_getc()!='#'){};
  124.    mostrar_menu();
  125.  
  126. while (true)
  127.    {
  128.       k = kbd_getc();
  129.      
  130.       if (k!=0)
  131.       {
  132.    switch(k)
  133.    {
  134.          case '#':
  135.        estado=0;
  136.             break;
  137.          case 'A':
  138.        estado=1;
  139.             break;
  140.          case 'B':
  141.        estado=2;
  142.             break;
  143.          case 'C':
  144.        estado=3;
  145.             break;
  146.          case 'D':
  147.        estado=4;
  148.             break;
  149.     default:
  150.       if(k >= '1' && k<= '8')
  151.       {
  152.       PORTD = (1 << (k - 49))
  153.       }
  154.       break;
  155.    }
  156.        k=0;
  157.        }
  158.  
  159.        // ACA COMIENZO A MOSTRAR EN EL LCD
  160.  
  161.        switch(estado)
  162.        {
  163.    case 0:
  164.       mostrar_menu();             // se podria tener una varaible como "estado_anterior" si sigue en el mismo estado no actualize
  165.       break;
  166.    case 1:
  167.       funcion_pwm();             // Mismo que el de lectura de las entradas digitales
  168.       break;
  169.    case 2:
  170.       funcion_lectura_entradas_digitales();     // A esta funcion agregarle una comparacion de un valor viejo del puerto con el nuevo de esa forma si es distinto actualiza todo el LCD
  171.       break;
  172.    case 3:
  173.       funcion_control_salidas_digitales();     // Mismo caso que el de lecturas de entradas digitales, hasta se puede usar la misma variable para estas 3 funciones
  174.       break
  175.    case 4:
  176.       mostrar_menu();
  177.       break;
  178.    default:
  179.       mostrar_menu();
  180.       break;
  181.        }
  182. }
  183. }

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Modificar librerías LCD 4x20
« Respuesta #17 en: 30 de Marzo de 2015, 23:03:18 »
Perdon es que yo estoy acostumbrado aca. Realmente yo el unico gasto que tengo es el de transporte para ir a la universidad y mas que algunos libros fotocopiados obviamente. y normalmente gasto entre 2 a 3 U$S por mes como cuota. Por supuesto una universidad publica.

Sobre el programa:

if(estado_viejo != estado || puerto_viejo != puerto)

Deberia ir tambien en:

void funcion_control_salidas_digitales()
void funcion_pwm()

Y en:

mostrar_menu()

Solamente iria:

if(estado_viejo != estado)

Es decir no imporia el estado del puerto en la condicion, acordate que hay mas instrucciones que el if solo a agregar en todas.