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

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

Desconectado yenz

  • PIC10
  • *
  • Mensajes: 22
Modificar librerías LCD 4x20
« en: 10 de Marzo de 2015, 21:50:49 »
Comunidad foros todopic me gustaría que me ayudaran con las librerías de la lcd 4x20 para que funcione
por 2 puertos diferentes estuve consultando sobre lcd_flex pero aun no e podido solucionar.
Me gustaría aprender a modificar las librería del lcd para poder cambiarle los pines de funcionamiento.
Conexión que necesito:

RA0 = E
RA1 = RS
RA2 = RW

RB4 = D4
RB5 = D5
RB6 = D6
RB7 = D7

Codigo en c
Código: C
  1. #include <16f628a.h>
  2. #use     delay(crystal = 4MHz)
  3.  
  4. //#define use_portb_kbd TRUE
  5. #include <kbd_lib.c>
  6. #include <LCD420.c>
  7.  
  8.  
  9. void main ()
  10. {
  11. CHAR k;
  12.  
  13.    lcd_init();
  14.    kbd_init();
  15.    port_b_pullups(TRUE);
  16.    lcd_gotoxy(1,1);
  17.    printf(lcd_putc,"Bienvenidos (^^,)");
  18.    
  19.    while (true)
  20.    {
  21.       k = kbd_getc();
  22.      
  23.       if (k!=0)
  24.       lcd_putc(k);
  25.      
  26.          }
  27.    }
Les adjunto la simulación en proteus.
« Última modificación: 10 de Marzo de 2015, 22:41:22 por yenz »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Modificar librerías LCD 4x20
« Respuesta #1 en: 10 de Marzo de 2015, 22:26:04 »
En tu .rar que agregaste hay un archivo llamado LCD.c mientras que en tu codigo es uno que dice LCD420.c

no se si sera el mismo pero en el comentario calramente dice:

Código: [Seleccionar]
////  Example of pin access:                                               ////
////     #define LCD_ENABLE_PIN  PIN_E0                                    ////
////     #define LCD_RS_PIN      PIN_E1                                    ////
////     #define LCD_RW_PIN      PIN_E2                                    ////
////     #define LCD_DATA4       PIN_D4                                    ////
////     #define LCD_DATA5       PIN_D5                                    ////
////     #define LCD_DATA6       PIN_D6                                    ////
////     #define LCD_DATA7       PIN_D7                                    ////

tenes que definirlos asi y listo

Desconectado yenz

  • PIC10
  • *
  • Mensajes: 22
Re: Modificar librerías LCD 4x20
« Respuesta #2 en: 10 de Marzo de 2015, 22:48:35 »
En tu .rar que agregaste hay un archivo llamado LCD.c mientras que en tu codigo es uno que dice LCD420.c

no se si sera el mismo pero en el comentario calramente dice:

Código: [Seleccionar]
////  Example of pin access:                                               ////
////     #define LCD_ENABLE_PIN  PIN_E0                                    ////
////     #define LCD_RS_PIN      PIN_E1                                    ////
////     #define LCD_RW_PIN      PIN_E2                                    ////
////     #define LCD_DATA4       PIN_D4                                    ////
////     #define LCD_DATA5       PIN_D5                                    ////
////     #define LCD_DATA6       PIN_D6                                    ////
////     #define LCD_DATA7       PIN_D7                                    ////

tenes que definirlos asi y listo

Citar
Que pena KILLERJC con ese error de librería es que he estado varios días revisando librerías seguro las confundí pero ya la remplace con la 4x20.
Me gustaría saber ese código que subió donde lo coloco.    
« Última modificación: 10 de Marzo de 2015, 22:51:50 por yenz »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Modificar librerías LCD 4x20
« Respuesta #3 en: 10 de Marzo de 2015, 23:18:06 »
Eso era para el lcd.c y lo pondrias en el main.

Para el lcd420.c deberias cambiar casi todas las funciones. Ya que este ultimo lo limita nomas al puertob por lo que vi rapidamente.

Las funciones que usan el puerto son algunas nomas:

 lcd_init()
 lcd_send_byte( BYTE address, BYTE n )
 lcd_send_nibble( BYTE n )
 lcd_read_byte()

Y podes usar la misma definicion del lcd.c y reemplazar todos los lcd.xxx ; y los set_tris_b() por su equivalente para cada uno de los pin, ademas si no te interesa leer el LCD se vuelve mas corto.
« Última modificación: 10 de Marzo de 2015, 23:24:26 por KILLERJC »

Desconectado yenz

  • PIC10
  • *
  • Mensajes: 22
Re: Modificar librerías LCD 4x20
« Respuesta #4 en: 11 de Marzo de 2015, 18:02:16 »
Eso era para el lcd.c y lo pondrias en el main.

Para el lcd420.c deberias cambiar casi todas las funciones. Ya que este ultimo lo limita nomas al puertob por lo que vi rapidamente.

Las funciones que usan el puerto son algunas nomas:

 lcd_init()
 lcd_send_byte( BYTE address, BYTE n )
 lcd_send_nibble( BYTE n )
 lcd_read_byte()

Y podes usar la misma definicion del lcd.c y reemplazar todos los lcd.xxx ; y los set_tris_b() por su equivalente para cada uno de los pin, ademas si no te interesa leer el LCD se vuelve mas corto.

Gracias KILLERJC  por tus orientaciones le cuento, encontré una librería lcd.c con la definición LCD_EXTENDED_NEWLINE para úsala con la lcd 4x20 es mas fácil de modificar por tiene mas funciones pero le hice los cambios por #define para los pines que necesito y no dio errores pero en la simulación en proteus no mostró nada y los pines definidos E,RS,RW no alumbraban ni la lcd mostró nada.

Después encontré una librería flex_lcd decía que se podía modificar E,RS,RW pero la incluí en mi programa y dio muchos errores al compilarla.

Le adjunto las dos nuevas librerías y la simulación para que me aconsejes y ayudes para avanzar en mi proyecto de grado.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Modificar librerías LCD 4x20
« Respuesta #5 en: 11 de Marzo de 2015, 18:50:26 »
Lo mejor es que estudies el codigo...

Si queres modificar una libreria vas a tener que saber como funciona. Es decir como mandan los datos al LCD, Como hace para enviar un byte usando una interfaz de 4 bits. Como inicia el LCD, leerlo ( si es necesario) muchas veces no lo es y podes omitirlo.

Creo que el que tenes el lcd420.c podrias modificarlo rapidamente para que funcione con los pines que deseas y solo tendrias que cambiar las funciones que te dije. Aunque sea por el momento hacerlo fijo para los pines que queres y luego si te armas la libreria para cualquier pin. Nada como una libreria hecha por uno mismo.

Desconectado yenz

  • PIC10
  • *
  • Mensajes: 22
Re: Modificar librerías LCD 4x20
« Respuesta #6 en: 12 de Marzo de 2015, 19:23:25 »
Lo mejor es que estudies el codigo...

Si queres modificar una libreria vas a tener que saber como funciona. Es decir como mandan los datos al LCD, Como hace para enviar un byte usando una interfaz de 4 bits. Como inicia el LCD, leerlo ( si es necesario) muchas veces no lo es y podes omitirlo.

Creo que el que tenes el lcd420.c podrias modificarlo rapidamente para que funcione con los pines que deseas y solo tendrias que cambiar las funciones que te dije. Aunque sea por el momento hacerlo fijo para los pines que queres y luego si te armas la libreria para cualquier pin. Nada como una libreria hecha por uno mismo.

Hola  gracias por su ayuda e avanzado enormemente pero algo no me funciona bien que no pude solucionar.

Resulta que en mi código cuando oprimo 'C' reviso las entradas con visualización su estado si están en 0 y 1 normalmente funciona pero me di cuenta que no se actualizaba el estado de la entrada hasta que se volviera a oprimir 'C'. Comencé a
buscar la solución pero se me complico generando errores.

Con un while (TRUE) que le adicione en el case 'C' para que se estuviera preguntando por el estado de la entrada y cuando se oprimiera el pulsador mostrara el cambio al instante en la lcd, pero eso creo un bucle infinito en el cual no pude salir para poder regresar a menú o encender los led que tengo en el (port D).

Esto le adicione pero lo elimine.
Código: [Seleccionar]
 
  switch(k)
         {
         case 'C':
   while (TRUE){
            delay_ms(500);
            funcion_lectura_entradas();
            k = kbd_getc();
            if (k!=0)
            break;
   }

Después me recomendaron poner un REPEAT mas arriba del void pero la verdad no encontré ningún ejemplo para esa función.
Estoy realizando un menú y sub menú e llegado a este punto gracias a todos ustedes gracias por su ayuda. :apreton:

Código: [Seleccionar]
#include <16f877a.h>
#use     delay(crystal = 4MHz)

#define  LCD_ENABLE_PIN PIN_A0
#define  LCD_RS_PIN     PIN_A1
#define  LCD_RW_PIN     PIN_A2
#define  LCD_DATA4      PIN_B4
#define  LCD_DATA5      PIN_B5
#define  LCD_DATA6      PIN_B6
#define  LCD_DATA7      PIN_B7

#include "lcd420ap.c"
#include <kbd_lib.c>

#define  LED_1  PIN_D0
#define  LED_2  PIN_D1
#define  LED_3  PIN_D2
#define  LED_4  PIN_D3
#define  LED_5  PIN_D4
#define  LED_6  PIN_D5
#define  LED_7  PIN_D6
#define  LED_8  PIN_D7

#define ENTRADA1 PIN_C0
#define ENTRADA2 PIN_C1
#define ENTRADA3 PIN_C2
#define ENTRADA4 PIN_C3
#define ENTRADA5 PIN_C4
#define ENTRADA6 PIN_C5

void mostrar_menu(){
lcd_gotoxy(1,1);
printf(lcd_putc,"\f>A ENTRADA ANALOGICA\r");
lcd_gotoxy(1,2);
printf(lcd_putc,">B CONTROL PWM");
lcd_gotoxy(1,3);
printf(lcd_putc,">C ENTRADAS DIGITALES");
lcd_gotoxy(1,4);
printf(lcd_putc,">D SALIDAS DIGITALES");
}

void funcion_lectura_entradas_analogas(){
lcd_gotoxy(1,1);
printf(lcd_putc,"\fpendiente entradas");
lcd_gotoxy(1,2);
printf(lcd_putc,"analoga y visualizar");
}

void funcion_pwm(){
printf(lcd_putc,"\fpendiente el PWM");
}

void funcion_control_salidas_digitales(){
lcd_gotoxy(1,1);
printf(lcd_putc,"\fFalta panel de");
lcd_gotoxy(1,2);
printf(lcd_putc,"Control para los led");
}

void funcion_led_1(){
output_toggle(LED_1);
   if (input_state(LED_1))
 printf(lcd_putc,"\fLed 1 encendido");
   else
 printf(lcd_putc,"\fLed 1 apagado");
}

void funcion_led_2(){
output_toggle(LED_2);
   if (input_state(LED_2))
printf(lcd_putc,"\fLed 2 encendido");
   else
printf(lcd_putc,"\fLed 2 apagado");
}

void funcion_led_3(){
output_toggle(LED_3);
   if (input_state(LED_3))
printf(lcd_putc,"\fLed 3 encendido");
   else
printf(lcd_putc,"\fLed 3 apagado");
}

void funcion_led_4(){
output_toggle(LED_4);
   if (input_state(LED_1))
printf(lcd_putc,"\fLed 4 encendido");
   else
printf(lcd_putc,"\fLed 4 apagado");
}

void funcion_led_5(){
output_toggle(LED_5);
   if (input_state(LED_5))
printf(lcd_putc,"\fLed 5 encendido");
   else
printf(lcd_putc,"\fLed 5 apagado");
}

void funcion_led_6(){
output_toggle(LED_6);
   if (input_state(LED_6))
printf(lcd_putc,"\fLed 6 encendido");
   else
printf(lcd_putc,"\fLed 6 apagado");
}

void funcion_led_7(){
output_toggle(LED_7);
   if (input_state(LED_7))
printf(lcd_putc,"\fLed 7 encendido");
   else
printf(lcd_putc,"\fLed 7 apagado");
}

void funcion_led_8(){
output_toggle(LED_8);
   if (input_state(LED_8))
printf(lcd_putc,"\fLed 8 encendido");
   else
printf(lcd_putc,"\fLed 8 apagado");
}

void funcion_lectura_entradas_digitales(){
lcd_gotoxy(1,1);
printf(lcd_putc,"\fINPUT1=%u",input(ENTRADA1));
lcd_gotoxy(1,2);
printf(lcd_putc,"INPUT2=%u",input(ENTRADA2));
lcd_gotoxy(1,3);
printf(lcd_putc,"INPUT3=%u",input(ENTRADA3));
lcd_gotoxy(11,1);
printf(lcd_putc,"INPUT4=%u",input(ENTRADA4));
lcd_gotoxy(11,2);
printf(lcd_putc,"INPUT5=%u",input(ENTRADA5));
lcd_gotoxy(11,3);
printf(lcd_putc,"INPUT6=%u",input(ENTRADA6));
lcd_gotoxy(1,4);
printf(lcd_putc,"REGRESO MENU PULSE #");
}

void main ()
{
CHAR k;

   lcd_init();
   kbd_init();
   port_b_pullups(TRUE);
   output_low(LED_1),(LED_2),(LED_3),(LED_4),(LED_5),(LED_6),(LED_7),(LED_8);
   lcd_gotoxy(2,2);
   printf(lcd_putc,"Bienvenidos  (^^,)");
   lcd_gotoxy(1,3);
   printf(lcd_putc,"Pulsa # para ir menu");
   
   while (kbd_getc()!='#'){};
   mostrar_menu();

   while (true)
   {
      k = kbd_getc();
     
      if (k!=0)
         switch(k)
         {
         case 'A':
            funcion_lectura_entradas_analogas();
           break;
         case 'B':
            funcion_pwm();
            break;
         case 'C':
            funcion_lectura_entradas_digitales();
           break;
         case 'D':
            funcion_control_salidas_digitales();
           break;
         case '1':
            funcion_led_1();
            break;
         case '2':
            funcion_led_2();
           break;
         case '3':
            funcion_led_3();
           break;
         case '4':
            funcion_led_4();
            break;
         case '5':
            funcion_led_5();
           break;
         case '6':
            funcion_led_6();
           break;
         case '7':
            funcion_led_7();
           break;
         case '8':
            funcion_led_8();
           break;
         case '#':
            mostrar_menu();
           break;
         }
   }
}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Modificar librerías LCD 4x20
« Respuesta #7 en: 12 de Marzo de 2015, 21:12:58 »
Vos queres que se actualize las entradas continuamente sin tener presionado nada ?, Poner un loop como lo hiciste seria lo mas simple de hacer. Pero eso exige tener una condicion para salir. Que en tu caso es el '#' y deberia mostrar el menu.

Se podria hacer de 2 formas creo... una es mantener una copia del valor ingresado corriendo sobre el switch principal (esto exigue cambiar otras cosas como lo de los leds ( sino prenderia y apagaria continuamente)
Y la otra es preguntar y mostrar el menu dentro del case (caso mas simple):

Código: [Seleccionar]
 switch(k)
         {
         case 'C':
         do {
             delay_ms(500);
             funcion_lectura_entradas();
         } while (kbd_getc() != '#');
         mostrar_menu();
         break;

De esa forma se ejecuta aunque sea una ves el codigo.
Luego que se ejecuta pregunta si se presiono el '#', de presionarse este se sale del modo de leer las entradas y muestra el menu.
Ahora si volves a tu while principal.

Lo que si no se si queres hacer uso de prender leds mientras estas "leyendo" las entradas si es asi deberiamos hacer otra cosa. Yo entendi que querias que se actualizara constantemente lo que muestra el LCD.
Como no soy fan de CCS no se si kbd_getc() es bloqueante, es decir si no recibe nada se quede ahi para siempre y no devuelva ningun valor. Si fuera asi entonces deberiamos buscar otra condicion o agregar una sola. Pero voy a suponer que devuelve 0 o un caracter '\0' cuando no se presiona nada.
« Última modificación: 12 de Marzo de 2015, 21:22:52 por KILLERJC »

Desconectado yenz

  • PIC10
  • *
  • Mensajes: 22
Re: Modificar librerías LCD 4x20
« Respuesta #8 en: 14 de Marzo de 2015, 23:12:53 »
Gracias KILLERJC por su ayuda y tiempo.
paso lo que se temía no se puede salir al while principal, me demore un poco en contestar por que intente solucionar con unos compañeros de clase e ingeniero y no pudimos, cada cambio al código generaba mas errores fue chistoso en un punto el teclado funcionaba con 2 pulsos nada nos sirvió hasta que un amigo me aconsejo utilizar interrupciones eso implico comenzar de cero.
se utilizo #INT_RB  RB7_RB4 para revisar port c también me ayudo con la conversión AD para revisar entradas analógicas también esta en mi proyecto que consta de:
- 8 entradas digitales representadas con pulsadores cual tenga un sub menú  y su visualización de estado.
- 8 salidas digitales representadas con LED el cual tenga un sub menú para el control encendido y apagado y su visualización.
- 8 entradas análogas cual tenga un sub menú  y su visualización de estado.
- 1 salida análoga creo que es con PWM con un sub menú para su control y visualización.
Las entradas digitales ya, entradas analógicas ya cada vez estoy mas cerca de cumplir el objetivo gracias a ustedes ahora sigo con lo demás claro con pocas ideas y con ganas de aprender mas.
Le adjunto mi nuevo programa y el que estoy remplazando, para que me ayude con algunos consejos para seguir adelante mil gracias.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Modificar librerías LCD 4x20
« Respuesta #9 en: 15 de Marzo de 2015, 00:13:40 »
Yo pienso que cualquiera de las 2 formas hubiera funcionado, sin interrupciones o con las mismas. Con respecto a lo que veniamos hablando, que es del menu, vos enviabas las cosas por UART, asi que la interrupcion que valdria la pena es la del UART,

Por lo cual no le veo ningun sentido usar las interrupciones de nivel del puerto B. Ahora si vos lo decis por que ahora estas usando un keypad y no la UART como venias haciendo, creo que entrar a la interrupcion requiere mas tiempo que hacerlo sin interrupcion. Y agregaria mas complejidad. En un keypad generalmente para "ahorrar" lineas y para un teclado 4x4 , 4 son salidas y 4 entradas. las salidas tenes que rotarlas y fijarte cual es la entrada puesta en 1, y listo salis. Fin de la "lectura" del teclado. Y todo tu otro codigo serviria como lo tenias solamente reemplazando el kbd_getc() por otra funcion teclado_leer() por ejemplo.

Pero mucho no te podes inclinar por mis opiniones por que no se que requiere tu codigo hacer.

Desconectado yenz

  • PIC10
  • *
  • Mensajes: 22
Re: Modificar librerías LCD 4x20
« Respuesta #10 en: 15 de Marzo de 2015, 18:48:01 »
Yo pienso que cualquiera de las 2 formas hubiera funcionado, sin interrupciones o con las mismas. Con respecto a lo que veniamos hablando, que es del menu, vos enviabas las cosas por UART, asi que la interrupcion que valdria la pena es la del UART,

Por lo cual no le veo ningun sentido usar las interrupciones de nivel del puerto B. Ahora si vos lo decis por que ahora estas usando un keypad y no la UART como venias haciendo, creo que entrar a la interrupcion requiere mas tiempo que hacerlo sin interrupcion. Y agregaria mas complejidad. En un keypad generalmente para "ahorrar" lineas y para un teclado 4x4 , 4 son salidas y 4 entradas. las salidas tenes que rotarlas y fijarte cual es la entrada puesta en 1, y listo salis. Fin de la "lectura" del teclado. Y todo tu otro codigo serviria como lo tenias solamente reemplazando el kbd_getc() por otra funcion teclado_leer() por ejemplo.

Pero mucho no te podes inclinar por mis opiniones por que no se que requiere tu código hacer.

hola de nuevo KILLERJC lo que quiero hacer en mi código es un menú y sub menú que se pueda entrar y salir de una opción a otra las cuales son:
- 8 entradas digitales representadas con pulsadores cual tenga un sub menú  y su visualización de estado.
- 8 salidas digitales representadas con LED el cual tenga un sub menú para el control encendido y apagado y su visualización.
- 8 entradas análogas cual tenga un sub menú  y su visualización de estado.
- 1 salida análoga creo que es con PWM con un sub menú para su control y visualización.
Aun no e podido hacer todas porque lo que llevo lo estoy mejorando con ayuda de ustedes.

Las salidas digitales me gustaría mejorale un poco su funcionamiento pienso hacer un sub menú que muestre los ocho led en la lcd y actualice cuando se prenda o apague al instante, fuera de eso el ingeniero a cargo de revisar mi proyecto de grado me dijo que antes de realizar ese cambio multiplexara los led para el ahorro de pines eso me puso mas pensativo. 

ya realice la modificación que me recomendaste en la respuesta Respuesta #7 y cambie kbd_getc() por otra función kbd_read() en el código y en las librerías del teclado pero no funciono sigue con el problema del bucle infinito.
adjunto el código para que lo cheques un poco:
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.  
  31. void mostrar_menu(){
  32. lcd_gotoxy(1,1);
  33. printf(lcd_putc,"\f>A ENTRADA ANALOGICA\r");
  34. lcd_gotoxy(1,2);
  35. printf(lcd_putc,">B CONTROL PWM");
  36. lcd_gotoxy(1,3);
  37. printf(lcd_putc,">C ENTRADAS DIGITALES");
  38. lcd_gotoxy(1,4);
  39. printf(lcd_putc,">D SALIDAS DIGITALES");
  40. }
  41.  
  42. void funcion_lectura_entradas_analogas(){
  43. lcd_gotoxy(1,1);
  44. printf(lcd_putc,"\fpendiente entradas");
  45. lcd_gotoxy(1,2);
  46. printf(lcd_putc,"analoga y visualizar");
  47. }
  48.  
  49. void funcion_pwm(){
  50. printf(lcd_putc,"\fpendiente el PWM");
  51. }
  52.  
  53. void funcion_control_salidas_digitales(){
  54. lcd_gotoxy(1,1);
  55. printf(lcd_putc,"\fFalta panel de");
  56. lcd_gotoxy(1,2);
  57. printf(lcd_putc,"Control para los led");
  58. }
  59.  
  60. void funcion_led_1(){
  61. output_toggle(LED_1);
  62.    if (input_state(LED_1))
  63.  printf(lcd_putc,"\fLed 1 encendido");
  64.    else
  65.  printf(lcd_putc,"\fLed 1 apagado");
  66. }
  67.  
  68. void funcion_led_2(){
  69. output_toggle(LED_2);
  70.    if (input_state(LED_2))
  71. printf(lcd_putc,"\fLed 2 encendido");
  72.    else
  73. printf(lcd_putc,"\fLed 2 apagado");
  74. }
  75.  
  76. void funcion_led_3(){
  77. output_toggle(LED_3);
  78.    if (input_state(LED_3))
  79. printf(lcd_putc,"\fLed 3 encendido");
  80.    else
  81. printf(lcd_putc,"\fLed 3 apagado");
  82. }
  83.  
  84. void funcion_led_4(){
  85. output_toggle(LED_4);
  86.    if (input_state(LED_1))
  87. printf(lcd_putc,"\fLed 4 encendido");
  88.    else
  89. printf(lcd_putc,"\fLed 4 apagado");
  90. }
  91.  
  92. void funcion_led_5(){
  93. output_toggle(LED_5);
  94.    if (input_state(LED_5))
  95. printf(lcd_putc,"\fLed 5 encendido");
  96.    else
  97. printf(lcd_putc,"\fLed 5 apagado");
  98. }
  99.  
  100. void funcion_led_6(){
  101. output_toggle(LED_6);
  102.    if (input_state(LED_6))
  103. printf(lcd_putc,"\fLed 6 encendido");
  104.    else
  105. printf(lcd_putc,"\fLed 6 apagado");
  106. }
  107.  
  108. void funcion_led_7(){
  109. output_toggle(LED_7);
  110.    if (input_state(LED_7))
  111. printf(lcd_putc,"\fLed 7 encendido");
  112.    else
  113. printf(lcd_putc,"\fLed 7 apagado");
  114. }
  115.  
  116. void funcion_led_8(){
  117. output_toggle(LED_8);
  118.    if (input_state(LED_8))
  119. printf(lcd_putc,"\fLed 8 encendido");
  120.    else
  121. printf(lcd_putc,"\fLed 8 apagado");
  122. }
  123.  
  124. void funcion_lectura_entradas_digitales(){
  125. lcd_gotoxy(1,1);
  126. printf(lcd_putc,"\fINPUT1=%u",input(ENTRADA1));
  127. lcd_gotoxy(1,2);
  128. printf(lcd_putc,"INPUT2=%u",input(ENTRADA2));
  129. lcd_gotoxy(1,3);
  130. printf(lcd_putc,"INPUT3=%u",input(ENTRADA3));
  131. lcd_gotoxy(11,1);
  132. printf(lcd_putc,"INPUT4=%u",input(ENTRADA4));
  133. lcd_gotoxy(11,2);
  134. printf(lcd_putc,"INPUT5=%u",input(ENTRADA5));
  135. lcd_gotoxy(11,3);
  136. printf(lcd_putc,"INPUT6=%u",input(ENTRADA6));
  137. lcd_gotoxy(1,4);
  138. printf(lcd_putc,"REGRESO MENU PULSE #");
  139. }
  140.  
  141. void main ()
  142. {
  143. CHAR k;
  144.  
  145.    lcd_init();
  146.    kbd_init();
  147.    port_b_pullups(TRUE);
  148.    output_low(LED_1),(LED_2),(LED_3),(LED_4),(LED_5),(LED_6),(LED_7),(LED_8);
  149.    lcd_gotoxy(2,2);
  150.    printf(lcd_putc,"Bienvenidos  (^^,)");
  151.    lcd_gotoxy(1,3);
  152.    printf(lcd_putc,"Pulsa # para ir menu");
  153.    
  154.    while (kbd_getc()!='#'){};
  155.    mostrar_menu();
  156.  
  157.    while (true)
  158.    {
  159.       k = kbd_getc();
  160.      
  161.       if (k!=0)
  162.          switch(k)
  163.          {
  164.          case 'A':
  165.             funcion_lectura_entradas_analogas();
  166.            break;
  167.          case 'B':
  168.             funcion_pwm();
  169.             break;
  170.          case 'C':
  171.          do {
  172.             delay_ms(500);
  173.             funcion_lectura_entradas_digitales();
  174.          } while (kbd_getc() != '#');
  175.             mostrar_menu();
  176.            break;
  177.          case 'D':
  178.             funcion_control_salidas_digitales();
  179.            break;
  180.          case '1':
  181.             funcion_led_1();
  182.             break;
  183.          case '2':
  184.             funcion_led_2();
  185.            break;
  186.          case '3':
  187.             funcion_led_3();
  188.            break;
  189.          case '4':
  190.             funcion_led_4();
  191.             break;
  192.          case '5':
  193.             funcion_led_5();
  194.            break;
  195.          case '6':
  196.             funcion_led_6();
  197.            break;
  198.          case '7':
  199.             funcion_led_7();
  200.            break;
  201.          case '8':
  202.             funcion_led_8();
  203.            break;
  204.          case '#':
  205.             mostrar_menu();
  206.            break;
  207.          }
  208.    }
  209. }

mis librerias teclado 4x4ABCD
Código: C
  1. ///////////////////////////////////////////////////////////////////////////
  2. ////                     KBD_LIB.C by Redraven                         ////
  3. ////                                                                   ////
  4. ////                     Derived from KBDD.C                           ////
  5. ////                  Generic keypad scan driver                       ////
  6. ////                                                                   ////
  7. ////  kbd_init()   Must be called before any other function.           ////
  8. ////                                                                   ////
  9. ////  c = kbd_getc(c)  Will return a key value if pressed or /0 if not ////
  10. ////                   This function should be called frequently so as ////
  11. ////                   not to miss a key press.                        ////
  12. ////                                                                   ////
  13. ///////////////////////////////////////////////////////////////////////////
  14. ////        (C) Copyright 1996,1997 Custom Computer Services            ////
  15. //// This source code may only be used by licensed users of the CCS C   ////
  16. //// compiler.  This source code may only be distributed to other       ////
  17. //// licensed users of the CCS C compiler.  No other use, reproduction  ////
  18. //// or distribution is permitted without written permission.           ////
  19. //// Derivative programs created using this software in object code     ////
  20. //// form are not restricted in any way.                                ////
  21. ////////////////////////////////////////////////////////////////////////////
  22.  
  23. ////////////////// The following defines the keypad layout on port D
  24.  
  25. // Un-comment the following define to use port B
  26. #define use_portb_kbd TRUE
  27.  
  28. // Make sure the port used has pull-up resistors (or the LCD) on
  29. // the column pins
  30.  
  31.  
  32. #if defined(__PCH__)
  33. #if defined use_portb_kbd
  34.    #byte kbd = 0xF81              // This puts the entire structure
  35. #else
  36.    #byte kbd = 0xF83              // This puts the entire structure
  37. #endif
  38. #else
  39. #if defined use_portb_kbd
  40.    #byte kbd = 6                  // on to port B (at address 6)
  41. #else
  42.    #byte kbd = 8                  // on to port D (at address 8)
  43. #endif
  44. #endif
  45.  
  46. #if defined use_portb_kbd
  47.    #define set_tris_kbd(x) set_tris_b(x)
  48. #else
  49.    #define set_tris_kbd(x) set_tris_d(x)
  50. #endif
  51.  
  52. //Keypad connection:   (for example column 0 is B0)
  53.  
  54. #define COL0 (1 << 0) // PIN_B0
  55. #define COL1 (1 << 1) // PIN_B1
  56. #define COL2 (1 << 2) // PIN_B2
  57. #define COL3 (1 << 3) // PIN_B3
  58.  
  59. #define ROW0 (1 << 4) // PIN_B4
  60. #define ROW1 (1 << 5) // PIN_B5
  61. #define ROW2 (1 << 6) // PIN_B6
  62. #define ROW3 (1 << 7) // PIN_B7
  63.  
  64. #define ALL_ROWS (ROW0|ROW1|ROW2|ROW3)
  65. #define ALL_PINS (ALL_ROWS|COL0|COL1|COL2|COL3)
  66.  
  67. // Keypad layout:
  68. char const KEYS[4][4] = {{'1','2','3','A'},
  69.                          {'6','5','4','B'},
  70.                          {'7','8','9','C'},
  71.                          {'*','0','#','D'}};
  72.  
  73. #define KBD_DEBOUNCE_FACTOR 33    // Set this number to apx n/333 where
  74.                                   // n is the number of times you expect
  75.                                   // to call kbd_getc each second
  76.  
  77. void kbd_init() {
  78. }
  79.  
  80. char kbd_getc( ) {
  81.    static byte kbd_call_count;
  82.    static short int kbd_down;
  83.    static char last_key;
  84.    static byte col;
  85.  
  86.    byte kchar;
  87.    byte row;
  88.  
  89.    kchar='\0';
  90.    if(++kbd_call_count>KBD_DEBOUNCE_FACTOR) {
  91.        switch (col) {
  92.          case 0   : set_tris_kbd(ALL_PINS&~COL0);
  93.                     kbd=~COL0&ALL_PINS;
  94.                     break;
  95.          case 1   : set_tris_kbd(ALL_PINS&~COL1);
  96.                     kbd=~COL1&ALL_PINS;
  97.                     break;
  98.          case 2   : set_tris_kbd(ALL_PINS&~COL2);
  99.                     kbd=~COL2&ALL_PINS;
  100.                     break;
  101.          case 3   : set_tris_kbd(ALL_PINS&~COL3);
  102.                     kbd=~COL3&ALL_PINS;
  103.                     break;
  104.        }
  105.  
  106.        if(kbd_down) {
  107.          if((kbd & (ALL_ROWS))==(ALL_ROWS)) {
  108.            kbd_down=false;
  109.            kchar=last_key;
  110.            last_key='\0';
  111.          }
  112.        } else {
  113.           if((kbd & (ALL_ROWS))!=(ALL_ROWS)) {
  114.              if((kbd & ROW0)==0)
  115.                row=0;
  116.              else if((kbd & ROW1)==0)
  117.                row=1;
  118.              else if((kbd & ROW2)==0)
  119.                row=2;
  120.              else if((kbd & ROW3)==0)
  121.                row=3;
  122.              last_key =KEYS[row][col];
  123.              kbd_down = true;
  124.           } else {
  125.              ++col;
  126.              if(col==4)
  127.                col=0;
  128.           }
  129.        }
  130.       kbd_call_count=0;
  131.    }
  132.   set_tris_kbd(ALL_PINS);
  133.   return(kchar);
  134. }

Y me recomendaron usar interrupciones y me dieron un ejemplo para que me ayudara a generar ideas pero eso implica un poco mas de trabajo ya que toca incluirle teclado y las salidas digitales etc.
Código: C
  1. #include <16f877a.h>
  2. #device  adc = 10
  3. #use     delay(crystal = 4MHz)
  4. #include "lcd420ap.c"
  5.  
  6. // Declaración de rutinas y/o funciones.
  7. void mostrar_menu (void);
  8. void leer_puerto (void);
  9. void leer_adc (void);
  10.  
  11. // Servicio de interrupción por cambio de estado (RB7:RB4)
  12. #INT_RB
  13. void sdi_RB7_RB4 (void)
  14. {
  15.    if(!input(pin_b4))            // Si es por RB4
  16.    {
  17.       leer_puerto();
  18.    }
  19.    
  20.    if(!input(pin_b5))            // Si es por RB5
  21.    {
  22.       leer_adc();
  23.    }
  24. }
  25.            
  26.      
  27. void main (void)
  28. {
  29.    setup_adc_ports(ALL_ANALOG);
  30.    setup_adc(ADC_CLOCK_INTERNAL);
  31.    
  32.    enable_interrupts(INT_RB);
  33.    enable_interrupts(GLOBAL);
  34.    
  35.    lcd_init();
  36.    port_b_pullups(1);
  37.    mostrar_menu();
  38.    
  39.    while (true);
  40. }
  41.  
  42. void mostrar_menu (void)
  43. {
  44.    lcd_putc("\fSeleccione opcion");
  45.    lcd_gotoxy(1,2);
  46.    lcd_putc("A = Leer puerto C");
  47.    lcd_gotoxy(1,3);
  48.    lcd_putc("B = Leer canales AD");
  49. }
  50.  
  51. void leer_puerto (void)
  52. {
  53.    lcd_putc("\f");
  54.    
  55.    while (input(pin_b6))
  56.    {
  57.       lcd_gotoxy(1,1);
  58.       printf(lcd_putc,"RC0:%u RC1:%u RC2:%u",
  59.       input_state(pin_c0),input_state(pin_c1)
  60.       input_state(pin_c2));
  61.       lcd_gotoxy(1,2);
  62.       printf(lcd_putc,"RC3:%u RC4:%u RC5:%u",
  63.       input_state(pin_c3),input_state(pin_c4)
  64.       input_state(pin_c5));
  65.       lcd_gotoxy(1,3);
  66.       printf(lcd_putc,"RC6:%u RC7:%u",
  67.       input_state(pin_c6),input_state(pin_c7));
  68.       lcd_gotoxy(12,4);
  69.       lcd_putc("C = salir");
  70.      
  71.       if(!input(pin_b6))
  72.       {
  73.          lcd_putc("\f");
  74.          mostrar_menu();
  75.       }
  76.    }
  77. }
  78.  
  79. void leer_adc (void)
  80. {
  81. int16 adc[3];
  82.    
  83.    lcd_putc("\fLectura de CAD's");
  84.    lcd_gotoxy(12,4);
  85.    lcd_putc("C = Salir");
  86.  
  87.    while(input(pin_b6))
  88.    {
  89.       set_adc_channel(0);
  90.       delay_us(50);
  91.       adc[0] = read_adc();
  92.       lcd_gotoxy(1,2);
  93.       printf(lcd_putc,"CH0: %04lu",adc[0]);
  94.       set_adc_channel(1);
  95.       delay_us(50);
  96.       adc[1] = read_adc();
  97.       lcd_gotoxy(1,3);
  98.       printf(lcd_putc,"CH1: %04lu",adc[1]);
  99.       set_adc_channel(2);
  100.       delay_us(50);
  101.       adc[2] = read_adc();
  102.       lcd_gotoxy(1,4);
  103.       printf(lcd_putc,"CH1: %04lu",adc[2]);
  104.       delay_ms(100);
  105.    
  106.       if(!input(pin_b6))
  107.       {
  108.          mostrar_menu();
  109.       }
  110.    }
  111. }
« Última modificación: 15 de Marzo de 2015, 19:14:44 por yenz »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Modificar librerías LCD 4x20
« Respuesta #11 en: 15 de Marzo de 2015, 20:29:06 »
Luego reviso el codigo y edito este mensaje....

Por otra parte si queres manejar los 8 leds con menos pines podrias usar:
http://www.nxp.com/documents/data_sheet/74HC_HCT595.pdf

De esa forma necesitarias 3 pines, 1 para los datos, 1 para el clock y otro para el latch. Y hacer la logica de enviar los datos, sino creo que se podria usar el SPI para eso. pero tal ves complicaria un poco mas las cosas o tal ves lo haria mas simple.

Desconectado yenz

  • PIC10
  • *
  • Mensajes: 22
Re: Modificar librerías LCD 4x20
« Respuesta #12 en: 26 de Marzo de 2015, 16:47:45 »
Luego reviso el codigo y edito este mensaje....

Por otra parte si queres manejar los 8 leds con menos pines podrias usar:
http://www.nxp.com/documents/data_sheet/74HC_HCT595.pdf

De esa forma necesitarias 3 pines, 1 para los datos, 1 para el clock y otro para el latch. Y hacer la logica de enviar los datos, sino creo que se podria usar el SPI para eso. pero tal ves complicaria un poco mas las cosas o tal ves lo haria mas simple.

Hola KILLERJC estoy trabajando con 74HCT595 me pareció una solución muy practica gracias.
Por otra parte me gustaría pregúntale sobre unas modificaciones realizadas a mi código:
Un amigo me ayudo a cambiar un poco mi código para la función de encender, apagar y visualizar 8 led.
Mi preguntas son:
- Porque para encender o apagar los led hay que oprimir 2 veces para que realice la acción.
- Para realizar la función de lectura de las 6 entradas digitales representadas con pulsadores que tengo me dijo que hiciera algo similar para que funcione como los led y se actualicen en tiempo real como necesito, pero no pude me genera errores al compilar.
le adjunto el código para que me ayudes un poco a añadir las funciones que me faltan.
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. int8 led1=0;
  32. int8 led2=0;
  33. int8 led3=0;
  34. int8 led4=0;
  35. int8 led5=0;
  36. int8 led6=0;
  37. int8 led7=0;
  38. int8 led8=0;
  39. int8 cont1=0;
  40. int8 cont2=0;
  41. int8 cont3=0;
  42. int8 cont4=0;
  43. int8 cont5=0;
  44. int8 cont6=0;
  45. int8 cont7=0;
  46. int8 cont8=0;
  47.  
  48. void mostrar_menu(){
  49. lcd_gotoxy(1,1);
  50. printf(lcd_putc,"\f>A ENTRADA ANALOGICA\r");
  51. lcd_gotoxy(1,2);
  52. printf(lcd_putc,">B CONTROL PWM");
  53. lcd_gotoxy(1,3);
  54. printf(lcd_putc,">C ENTRADAS DIGITALES");
  55. lcd_gotoxy(1,4);
  56. printf(lcd_putc,">D SALIDAS DIGITALES");
  57. }
  58.  
  59. void funcion_lectura_entradas_analogas(){
  60. lcd_gotoxy(1,1);
  61. printf(lcd_putc,"\fpendiente entradas");
  62. lcd_gotoxy(1,2);
  63. printf(lcd_putc,"analoga y visualizar");
  64. }
  65.  
  66. void funcion_pwm(){
  67. printf(lcd_putc,"\fpendiente el PWM");
  68. }
  69.  
  70. void funcion_lectura_entradas_digitales(){
  71. lcd_gotoxy(1,1);
  72. printf(lcd_putc,"\fINPUT1=%u",input(ENTRADA1));
  73. lcd_gotoxy(1,2);
  74. printf(lcd_putc,"INPUT2=%u",input(ENTRADA2));
  75. lcd_gotoxy(1,3);
  76. printf(lcd_putc,"INPUT3=%u",input(ENTRADA3));
  77. lcd_gotoxy(11,1);
  78. printf(lcd_putc,"INPUT4=%u",input(ENTRADA4));
  79. lcd_gotoxy(11,2);
  80. printf(lcd_putc,"INPUT5=%u",input(ENTRADA5));
  81. lcd_gotoxy(11,3);
  82. printf(lcd_putc,"INPUT6=%u",input(ENTRADA6));
  83. lcd_gotoxy(1,4);
  84. printf(lcd_putc,"REGRESO MENU PULSE #");
  85. }
  86.  
  87. void funcion_control_salidas_digitales(){
  88.  
  89. lcd_gotoxy(1,1);
  90. printf(lcd_putc,"\fled1=%d",led1);
  91. lcd_gotoxy(1,2);
  92. printf(lcd_putc,"led2=%d",led2);
  93. lcd_gotoxy(1,3);
  94. printf(lcd_putc,"led3=%d",led3);
  95. lcd_gotoxy(1,4);
  96. printf(lcd_putc,"led4=%d",led4);
  97. lcd_gotoxy(10,1);
  98. printf(lcd_putc,"led5=%d",led5);
  99. lcd_gotoxy(10,2);
  100. printf(lcd_putc,"led6=%d",led6);
  101. lcd_gotoxy(10,3);
  102. printf(lcd_putc,"led7=%d",led7);
  103. lcd_gotoxy(10,4);
  104. printf(lcd_putc,"led8=%d",led8);
  105.  
  106. }
  107.  
  108. void main ()
  109. {
  110. CHAR k;
  111.  
  112.    lcd_init();
  113.    kbd_init();
  114.    port_b_pullups(TRUE);
  115.    output_low(LED_1),(LED_2),(LED_3),(LED_4),(LED_5),(LED_6),(LED_7),(LED_8);
  116.    lcd_gotoxy(2,2);
  117.    printf(lcd_putc,"Bienvenidos  (^^,)");
  118.    lcd_gotoxy(1,3);
  119.    printf(lcd_putc,"Pulsa # para ir menu");
  120.    
  121.    while (kbd_getc()!='#'){};
  122.    mostrar_menu();
  123.  
  124.    while (true)
  125.    {
  126.       k = kbd_getc();
  127.      
  128.       if (k!=0)
  129.       {
  130.             //--------menu-------
  131.             if (k =='#')
  132.                {
  133.                  estoy =0;
  134.                  mostrar_menu();
  135.                }
  136.            //-------ANALOGOS"A"-------    
  137.             if (k=='A')
  138.             {
  139.             estoy=1;
  140.             }
  141.             //-------PWM"B"-------
  142.             else if (k=='B')
  143.             {
  144.             estoy=2;
  145.             }
  146.             //-------ENTRADAS DIGITALES"C"-------
  147.             else if (k=='C')
  148.             {
  149.             estoy=3;
  150.             }
  151.              //-------SALIDAS DIGITALES"D"-------
  152.             else if (k=='D')
  153.             {
  154.             estoy=4;
  155.             }
  156.            //-----SE OPRIMIO A
  157.             if (estoy==1)
  158.             {
  159.              funcion_lectura_entradas_analogas();
  160.             }
  161.             //-----SE OPRIMIO B
  162.             else if (estoy==2)
  163.             {
  164.              funcion_pwm();
  165.             }
  166.             //-----SE OPRIMIO C
  167.               else if (estoy==3)
  168.             {
  169.             funcion_lectura_entradas_digitales();
  170.             }
  171.             //-----SE OPRIMIO D
  172.               else if (estoy==4)
  173.             {          
  174.  //---------led1---------------------          
  175.             if(k=='1')
  176.            {
  177.              if (cont1==0)
  178.              {
  179.               led1 =0;
  180.               cont1 =1;
  181.               output_low(LED_1);
  182.              }
  183.             else if (cont1==1)
  184.            {
  185.               led1 =1;
  186.               cont1 =0;
  187.                output_high(LED_1);
  188.            }
  189.            };
  190.   //------------led2--------
  191.   if(k=='2')
  192.            {
  193.              if (cont2==0)
  194.              {
  195.               led2 =0;
  196.               cont2 =1;
  197.               output_low(LED_2);
  198.              }
  199.             else if (cont2==1)
  200.            {
  201.               led2 =1;
  202.               cont2 =0;
  203.                output_high(LED_2);
  204.            }
  205.            };
  206.  //---------led3---------------------          
  207.             if(k=='3')
  208.            {
  209.              if (cont3==0)
  210.              {
  211.               led3 =0;
  212.               cont3 =1;
  213.               output_low(LED_3);
  214.              }
  215.             else if (cont3==1)
  216.            {
  217.               led3 =1;
  218.               cont3 =0;
  219.                output_high(LED_3);
  220.            }
  221.            };
  222.  //---------led4---------------------          
  223.             if(k=='4')
  224.            {
  225.              if (cont4==0)
  226.              {
  227.               led4 =0;
  228.               cont4 =1;
  229.               output_low(LED_4);
  230.              }
  231.             else if (cont4==1)
  232.            {
  233.               led4 =1;
  234.               cont4 =0;
  235.                output_high(LED_4);
  236.            }
  237.            };
  238. //---------led5---------------------          
  239.             if(k=='5')
  240.            {
  241.              if (cont5==0)
  242.              {
  243.               led5 =0;
  244.               cont5 =1;
  245.               output_low(LED_5);
  246.              }
  247.             else if (cont5==1)
  248.            {
  249.               led5 =1;
  250.               cont5 =0;
  251.                output_high(LED_5);
  252.            }
  253.            };
  254. //---------led6---------------------          
  255.             if(k=='6')
  256.            {
  257.              if (cont6==0)
  258.              {
  259.               led6 =0;
  260.               cont6 =1;
  261.               output_low(LED_6);
  262.              }
  263.             else if (cont6==1)
  264.            {
  265.               led6 =1;
  266.               cont6 =0;
  267.                output_high(LED_6);
  268.            }
  269.            };
  270. //---------led7---------------------          
  271.             if(k=='7')
  272.            {
  273.              if (cont7==0)
  274.              {
  275.               led7 =0;
  276.               cont7 =1;
  277.               output_low(LED_7);
  278.              }
  279.             else if (cont7==1)
  280.            {
  281.               led7 =1;
  282.               cont7 =0;
  283.                output_high(LED_7);
  284.            }
  285.            };
  286. //---------led8---------------------          
  287.             if(k=='8')
  288.            {
  289.              if (cont8==0)
  290.              {
  291.               led8 =0;
  292.               cont8 =1;
  293.               output_low(LED_8);
  294.              }
  295.             else if (cont8==1)
  296.            {
  297.               led8 =1;
  298.               cont8 =0;
  299.                output_high(LED_8);
  300.            }
  301.            };
  302.             funcion_control_salidas_digitales();
  303.             }
  304.                
  305.       }
  306.       k=0;
  307.    }
  308. }
« Última modificación: 31 de Marzo de 2015, 19:33:29 por yenz »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Modificar librerías LCD 4x20
« Respuesta #13 en: 26 de Marzo de 2015, 19:17:50 »
Hay cosas que realmente no entiendo, Todo esto:

Código: C
  1. if(k=='1')
  2.            {
  3.              if (cont1==0)
  4.              {
  5.               led1 =0;
  6.               cont1 =1;
  7.               output_low(LED_1);
  8.              }
  9.             else if (cont1==1)
  10.            {
  11.               led1 =1;
  12.               cont1 =0;
  13.                output_high(LED_1);
  14.            }
  15.            };

Se puede resumir a

Código: C
  1. if(k=='1')
  2. {
  3.   output_toggle(LED_1)
  4.   led1 = input_state(pin);
  5. }

Tambien hay un ; al final de tus if en los leds, que no deberian estar


Hay otras cosas como estas :

Código: C
  1. //-------ANALOGOS"A"-------    
  2.             if (k=='A')
  3.             {
  4.             estoy=1;
  5.             }
  6.             //-------PWM"B"-------
  7.             else if (k=='B')
  8.             {
  9.             estoy=2;
  10.             }
  11.             //-------SALIDAS  DIGITALES"C"-------
  12.             else if (k=='C')
  13.             {
  14.             estoy=3;
  15.             }
  16.            //-----SE OPRIMIO A
  17.             if (estoy==1)
  18.             {
  19.              funcion_lectura_entradas_analogas();
  20.             }
  21.             //-----SE OPRIMIO B
  22.             else if (estoy==2)
  23.             {
  24.              funcion_pwm();
  25.             }
  26.             //-----SE OPRIMIO C
  27.               else if (estoy==3)
  28.             {

No se cual es el objetivo de eso... Si es que intentas que presioanr una ves y se mantenga actualizado, pero eso no lo va a lograr, por que esta dentro del loop cuando se presiona una tecla..

Citar
- Porque para encender o apagar los led hay que oprimir 2 veces para que realice la acción.
No veo nada en que pueda hacer eso, excepto:
- los ; agregados que ya comente
- Que el programa sea rapido y con un solo tocar cuente como que entro varias veces, y segun la suerte puede que entre 1 o 2 veces) aunque si lo manejas por UART no deberia haber problema

Desconectado yenz

  • PIC10
  • *
  • Mensajes: 22
Re: Modificar librerías LCD 4x20
« Respuesta #14 en: 28 de Marzo de 2015, 18:25:13 »
Gracias KILLERJC y mil disculpas por lo repetitivo y enredado que me volví con el foro.
Lo que pasa es que es mi proyecto de grado y no lo he podido terminar.
Es un sistema de control para que revisar y controlar:
- 5 Entradas análogas representada con potenciometros y visualizar su estado en LCD.
- 6 Entradas digitales representada con pulsadores y visualizar su estado en LCD.
- 8 Salidas digitales controlar su encendido, apagado y visualizar su estado en LCD.
- Dotar a el pic con una salida analógica.
para eso estoy usando:
- pic 16f877a
- LCD 4x20
- keypad 4x4 ABCD

En lo que llevaba un menú de 4 funciones A,B,C,D y los botones del 1 al 8 del keypad para control de los led, funcionaba con
una limitante cada que entraba a una función se quedaba estática y no se actualizaba solo hasta que volvía a entrar a la
función, eso lo realice con un switch case, intententamos realizar un loop para que cuando entrara a la función siguiera
preguntando pero se volvió un bucle infinito y no se podía salir de la función hacia el menú principal.

Un amigo me recomendó y me ayudo con interrupciones de RB7_RB4 se limitaba a 2 botones y  no pude ingresarle mas funciones
lastima por que funciona perfectamente actualizando en tiempo real y se podía salir de una función a otra.

Lo ultimo que he hecho con ayuda es cambiando el switch case por else if para poder salir del los bucles infinitos y
se actualizara siempre en tiempo real y se pudiera salir al menú principal, por el momento marcha bien con algunos detallitos
pero bien, me ayudo con una función la del control de los led pero no e podido meterle las otras funciones.
Por eso acudí a ustedes cualquier ayuda es un avance para mi graduación.




 

anything