Manejar teclado matricial y mostrar en lcd

Si pudieran darme una pista de como usar ambos por el portC se los agradecería muchisimo.
El teclado matricial utiliza resistencias pull-up, y cómo el puerto C no tiene, hay que ponerlas externas.
Por eso es mejor usar el teclado en el puerto B, que si tiene, y así se evita ponerlas externamente.

Adjunto un ejemplo utilizando la pantalla y el teclado por el puerto C.
Las librerías lcd.c y kbd.c ya están modificadas para trabajar por el puerto C,
y vienen dentro de la carpeta del proyecto, usa éstas, y nota que en el código se hace referencia a ellas de forma diferente.

Saludos.
 

Adjuntos

  • LCD con Teclado 3x4 (SCH).jpg
    LCD con Teclado 3x4 (SCH).jpg
    111.7 KB · Visitas: 215
  • 16F877A LCD y Teclado 3x4 en PORTC.rar
    135.6 KB · Visitas: 326
Buenas, tengo un problema con la simulacion de teclado en proteus, me funciona bien pero a veces deja de funcionar sin razon aparente, puse las resistencias externas y uso el teclado por el puerto D, tanto pantalla como teclado. Adjunto envio HEX y codigo en CCS, queria saber si a ustedes tambien les da ese error. OJO habilitada RB0INT asi que ponganlo a vcc.

Para la ID 3 la clave es 1234. Alguien que lo simule porfavor y me diga si el error es de la aplicacion o del proteus.
 

Adjuntos

  • CLAVES.txt
    8.6 KB · Visitas: 262
  • HEX.rar
    4.2 KB · Visitas: 243
Hola josexremix65

Pero. . . Qué dices de los que te menciona D@rkbytes en su menaje #370 ??

Creo que sería conveniente que adjuntaras el archivo que se genera con tu simulador para circuitos electrónicos.
Comprímelo con WinZip o WinRar y Adjúntalo aquí.

saludos
a sus ordenes
 
Estoy en el montaje de un proyecto de teclado matricial 4x4, que debe mostrar en un LCD las teclas pulsadas de manera secuencial; es decir, si marco 1,3 A, #, 2, se deben mostrar en el LCD esas teclas consecutivamente, no tengo activada una rutina que cuando llegue al final de la primera linea, pase a la segunda linea, eso lo realizare una vez solvente la situacion que planteo en el siguiente parrafo. El montaje en el Proteus funciona correctamente, cada número que marco se ve en el LCD.

El asunto que presenta problemas está cuando realizo el montaje en el Protoboard y ejecuto el programa. Aqui únicamente muestra el primer número que marco y luego se queda colgado; es decir, no muestra en el LCD ninguna de las sub-secuentes teclas que pulso. Adicionalmente, ninguna de las cuatro teclas de la última fila se muestran en el LCD.

EL PIC que utilizo es el PIC 16F870, el teclado es el matricial de 4x4 y el LCD es el 1602A, que es compatible con el LM016L, el XT es de 4Mhz.

He realizado las pruebas de los componentes de manera individual y funcionan bien, esto con la finalidad de comprobar que los componentes estan bien. Me he fijado al momento de compilar el programa y el FOSC es XT Oscilator, WDTE esta Disable.

Anexo el .HEX y el .DSN del proyecto. Agradezco cualquier ayuda al respecto.
P.D.: Anexe las otras librerias que estoy utilizando y una foto del proyecto
 

Adjuntos

  • Teclado 4x4.rar
    18.4 KB · Visitas: 317
  • MPASM Suite.rar
    8.9 KB · Visitas: 116
  • Teclado 4x4 -LCD.jpg
    Teclado 4x4 -LCD.jpg
    130.9 KB · Visitas: 145
Última edición:
El asunto que presenta problemas está cuando realizo el montaje en el Protoboard y ejecuto el programa. Aqui únicamente muestra el primer número que marco y luego se queda colgado; es decir, no muestra en el LCD ninguna de las sub-secuentes teclas que pulso. Adicionalmente, ninguna de las cuatro teclas de la última fila se muestran en el LCD.

EL PIC que utilizo es el PIC 16F870, el teclado es el matricial de 4x4 y el LCD es el 1602A, que es compatible con el LM016L, el XT es de 4Mhz.
Prueba ahora con los cambios realizados, pero monta todo tal cual y está en el esquema.
Verás que ya funciona físicamente.

Nota:
Algunas de esas librerías necesitan modificaciones para que funcionen.

Saludos.
 

Adjuntos

  • 16F870 Teclado 4x4 SCH.jpg
    16F870 Teclado 4x4 SCH.jpg
    112.6 KB · Visitas: 161
  • 16F870 Teclado 4x4.zip
    26 KB · Visitas: 226
Gracias...

Voy a montar el esquema enviado y te aviso.

Tú indicas que algunas de las librerías deben ser modificadas. El sistema completo que me envías yo lo probé en Proteus y funciona tal cual están las librerías que me anexaste, yo la revise y son las originales del libro.

Pregunto: Debo modificarlas según lo que indicas para que funcionen en el Protoboard?? por ejemplo colocar los Macros Bank0 y Bank1 para adecuar el Status Register y acondicionar las selecciones de los bancos dentro de cada una de las librerías??

Te pregunto porque yo ejecute la simulación en Proteus y tal cual esta; es decir, tal cual lo que me envías, funciono.
 
Gracias...

Voy a montar el esquema enviado y te aviso.

Tú indicas que algunas de las librerías deben ser modificadas. El sistema completo que me envías yo lo probé en Proteus y funciona tal cual están las librerías que me anexaste, yo la revise y son las originales del libro.

Pregunto: Debo modificarlas según lo que indicas para que funcionen en el Protoboard?? por ejemplo colocar los Macros Bank0 y Bank1 para adecuar el Status Register y acondicionar las selecciones de los bancos dentro de cada una de las librerías??

Te pregunto porque yo ejecute la simulación en Proteus y tal cual esta; es decir, tal cual lo que me envías, funciono.
El proyecto que subí ya tiene los cambios necesarios en las librerías para que funcione físicamente.
Si lo deseas puedes agregar los macros para el cambio de banco, eso se usa por comodidad.
Lo que debes tener en cuenta, es que cada vez que realices algún cambio, hagas pruebas.
Porque muchas veces por estar modificando un programa éste deja de funcionar si no se hace bien.

Saludos.
 
Revise con todo el detalle la información que me envía, y me di cuenta de algo muy importante que no estaba tomando en consideración al momento de realizar la compilación en el MPLAB, el asunto relacionado a cierto bit de configuración, el _LVP_OFF

Los bits de configuración pueden ser programados (puestos a 0) o dejados sin programar (quedan a 1), con objeto de seleccionar varias configuraciones del microcontrolador: tipo de oscilador, protección o no del programa, uso ó no del watchdog, etc.

Por lo que es especialmente importante cargar correctamente esos bits durante la programación para conseguir que el microcontrolador pueda funcionar de la manera correcta.

En el caso que comento:

LVP: Low Voltage In-Circuit Serial Programming Enable bit

1 = RB3/PGM pin has PGM function, low voltage programming enabled
0 = RB3 is digital I/O, HV on MCLR must be used for programming

Si, el LVP está configurado a “1”, entonces RB3 está configurado para low-voltage programming y se debe tener un pull-down en el PIN, mientras que el programa este funcionando en el circuito. En el caso en que LVP es “0” RB3 se libera para funciones de entrada y salida normales.

Adicionalmente, encontré en la web este artículo que me pareció interesante y toca este tema en la programación de 16F87x.

http://www.piclist.com/techref/microchip/16F877/hvprog.htm

Gracias por el apoyo recibido en este tema, incluí la línea de configuración dentro de mi código y funciona perfectamente.
 
Buenas, tengo problemas con utilizar el teclado en el puerto d, y el display si me funciona (estoy utilizando el pic18f4550), trate de modificar la librería del kbd.c y de ponerle resistencias al puerto d como han a aconsejado en temas anteriores, pero debo de estarme pasando algún paso o tengo algún error que no me he dado cuenta. El teclado en la simulación en el proteus solo se mantiene activas sus terminales pero no reacciona al presionar los botones.

Les agradeciera mucho su ayuda y me expliquen cual es el error y como hacerlo funcionar.

Les adjunto la simulación, librerías y el main (Compilador CCS)

Gracias
 

Adjuntos

  • Teclado.rar
    41 KB · Visitas: 254
Buenas, tengo problemas con utilizar el teclado en el puerto d, y el display si me funciona (estoy utilizando el pic18f4550), trate de modificar la librería del kbd.c y de ponerle resistencias al puerto d como han a aconsejado en temas anteriores, pero debo de estarme pasando algún paso o tengo algún error que no me he dado cuenta. El teclado en la simulación en el proteus solo se mantiene activas sus terminales pero no reacciona al presionar los botones.

Les agradeciera mucho su ayuda y me expliquen cual es el error y como hacerlo funcionar.

Les adjunto la simulación, librerías y el main (Compilador CCS)

Gracias
Para trabajar el teclado y la pantalla por el puerto D no tienes que realizar modificaciones a las librerías.

Prueba usando esta parte del programa...
Código:
   while(TRUE){
      k=kbd_getc();
      if(k != 0){
      printf(lcd_putc,"\fTecla=%c",k);
      delay_ms(50);
      }
   }

Saludos.
 
Estimado D@rkbytes

Cual puede ser la razón por lo que ocurre lo siguiente:

Hay veces que al iniciar el sistema (PIC – LCD – Teclado 4x4); es decir, energizar el circuito, y enviar al LCD un mensaje de inicio, el cual consiste en:

Muestra_Mensaje_Tres
call LCD_Borra ; Borra la pantalla, memoria DDRAM, cursor a inicio linea 1
call LCD_Linea1 ; Cursor a principio de la linea 1
movlw MensajeTeclee4 ; Apuntador de mensaje "**** X.Y.Z **** "
call LCD_Mensaje ; Escribe en display el mensaje "**** X.Y.Z. ****"
call LCD_Linea2 ; Cursor al principio de la Línea 2.
movlw MensajeTeclee5 ; Apuntador de mensaje "LAB. DIGITALES"
call LCD_Mensaje ; Escribe en display el mensaje " LAB. DIGITALES"
call Retardo_2s ; durante XX seg. quedara el mensaje en el display
call LCD_Borra ; Borra la pantalla, memoria DDRAM, cursor a inicio linea 1
call LCD_Linea1 ; Cursor a principio de la linea 1
return

únicamente se muestra el mensaje de LCD_Linea1 y el LCD_Linea 2 no se muestra.

Que estoy haciendo para solventaar lo indicado anteriormente:

Pulso el botón de reset del PIC por un segundo aproximadamente y entonces se muestran los dos mensajes. Esto ocurre de manera no constante, hay veces que si ocurre como hay veces que no.

Que pienso que puede ocurrir:

Pudiese ser que la señal de habilitación y desabilitación del ENABLE en LCD dure muy corto tiempo.

Como tengo escrita esa rutina:
movwf LCD_BusDatos ; PORTB <= WREG Envía el dato al módulo LCD #ENVIA EL DATO#
bsf LCD_PinEnable ; PORTA RA2=1 (E) Activa el LCD mediante un pequeño pulso
bcf LCD_PinEnable ; PORTA RA2=0 (E) Desactiva el LCD.

Cual pienso podría ser la solución:

bsf LCD_PinEnable ; PORTA RA2=1 (E) Activa el LCD mediante un pequeño pulso
movwf LCD_BusDatos ; PORTB <= WREG Envía el dato al módulo LCD #ENVIA EL DATO#
bcf LCD_PinEnable ; PORTA RA2=0 (E) Desactiva el LCD.
call Retardo_5ms ; retardo de 5 ms.

Entendiendo que el ciclo de escritura de DATA al LCD incluye el flanco de bajada de la señal de ENABLE, que entiendo es cuando se pasa la información al bus de datos.

Piensas que esto pudiera apuntar a la solución?

Probé la rutina siguiente:

movf LCD_Dato,W ; WREG <=LCD_Dato(ALTO Y BAJO) Recupera el dato a enviar. #ENVIA EL DATO#
bsf LCD_PinEnable ; PORTA RA2=1 (E) Activa el LCD mediante un pequeño pulso
movwf LCD_BusDatos ; PORTB <= WREG Envía el dato al módulo LCD #ENVIA EL DATO#
bcf LCD_PinEnable ; PORTA RA2=0 (E) Desactiva el LCD.
call Retardo_50micros ; Retardo que asegure la escritura en el LCD de un comando o dato

funciona perfectamente... Se elimino lo que te comentaba anteriormente.

Saludos y gracias nuevamente.
 
Última edición por un moderador:
Buenos días
Quería realizar una consulta en relación a cierto carácter que se presenta en el LCD 16x2 cuando recibe del Hiperterminal un <CR><LF>

Para mayor detalle anexo el link del video en donde se puede observar detalladamente cual es el carácter al que hago referencia:

También pueden ubicar el video escribiendo:
Proyecto RFID Control de Acceso, Video Comunicacion Serial PIC-PC, PIC 16F870 ASM

El carácter también se puede observar en el archivo adjunto CARACTER LCD 16x2

En el video se ve que el carácter se presenta en el LCD cuando presiono la tecla enter en el teclado a través del Hiperterminal, entiendo que esta acción envía dos comandos consecutivos el <CR><LF>, que son colocar el curso al principio de la segunda línea, con el salto de línea.

Como logre solventar que este carácter no se presentara ?

En la ventana de Propiedades del Hiperterminal, en la configuración de las propiedades de esa conexión, en la parte correspondiente a ASCII SENDING, desmarque la opción: SEND LINE ENDS WITH LINE FEEDS y ahora se ve en el Hiperteminal que hace el <CR> pero no el <LF> ya que el curso se posiciona nuevamente al inicio de la misma línea; es decir, no hace el salto de línea. Con esto ya no se presenta ese carácter.

Ver Hyperterminal en el archivo adjunto.

Hasta aquí todo va funcionando bien....

El tema se presenta ahora cuando no utilizo el Hiperterminal y estoy realizando el código del sistema en Visual Basic 10, en donde envió el comando vbCrLf y aqui se presenta nuevamente el carácter en el LCD, he probado con vbCr únicamente y también se presenta el carácter.

Como hago en VB10 para que eso no ocurra, es decir; como simular en VB10 lo que hice en el Hiperterminal con tan solo desmarcar la opción SEND LINE ENDS WITH LINE FEEDS y el carácter no se presente en el LCD

Pueden observar el resultado de la comunicacion trabajando perfectamente con el Hiperterminal, en el siguiente enlace:

http://www.youtube.com/watch?feature=player_detailpage&v=LpoEMuU_Tnw
 

Adjuntos

  • Caracter LCD 16x2.JPG
    Caracter LCD 16x2.JPG
    4.3 KB · Visitas: 21
  • Hyperterminal.JPG
    Hyperterminal.JPG
    23.3 KB · Visitas: 10
Última edición:
Buenas tardes, bueno pues otro problema, esta vez con imprimir algo en la LCD conectada al puerto B junto con un teclado matricial, lo que tengo es lo siguiente:
Código:
   #include <16f887.h>
   #device adc=10
   #use delay(clock=20M)
   #fuses HS, NOWDT
   
   #include <lcd.c>        // Se incluye el driver de la pantalla LCD
   #include <kbd.c>        // Se incluye el driver del teclado matricial
   #include <stdlib.h>     // Se incluye para generar número aleatorio
   
   #define LCD_ENABLE_PIN  PIN_B0                                    
   #define LCD_RS_PIN      PIN_B1                                   
   #define LCD_RW_PIN      PIN_B2                                    
   #define LCD_DATA4       PIN_B4                                   
   #define LCD_DATA5       PIN_B5                                 
   #define LCD_DATA6       PIN_B6                             
   #define LCD_DATA7       PIN_B7 
   
   #use fast_io(a)         // Modo de gestión del puerto A
   #use fast_io(b)         // Modo de gestión del puerto B
   #use fast_io(c)         // Modo de gestión del puerto C
   
   #bit adif=0x0C.6        // Bandera de fin de conversión A/D
   #bit tmr1if=0x0C.0      // Bandera de desbordamiento del TMR1
////////////////////////////////////////////////////////////////////////////////
   main(){
 
   int16 random;            // Número aleatorio, asegura el encendido aleatorio 
                           // de los LEDs en el dummy shot 
   char tecla;              // Valor de la tecla oprimida
   int16 numero[3];         // Arreglo de 4 variables para alojar los diferentes 
                           // datos numéricos
   int8 k;                 // Contador de teclas oprimidas
   
   delay_ms(300);          // Retardo de 300 ms para permitir que se establezca
                           // bien el voltaje de alimentación de la pantalla LCD
   lcd_init();             // Se inicializa la pantalla
   
   lcd_putc("   DUMMY SHOT   ");    // Se imprime el mensaje en la línea 1
   lcd_gotoxy(1,2);     // Se ubica el cursor al principio de la linea 2
   delay_ms(1000);       // Retardo para visualizar "   DUMMY SHOT   "
   lcd_putc("Random=");       // Se imprime el mensaje para la inserción de
                              // un número aleatorio
   port_b_pullups(true);   // Se hab. las res. elev. del puerto B

Como ven ya intenté declarar los pines por los cuales controlar la LCD (puerto B), pero no entiendo por que no imprime por ahí, sigue imprimiendo por el puerto D, espero me puedan aclarar esta duda por favor :confused: , desde ya gracias :)
 
Buenas tardes, bueno pues otro problema, esta vez con imprimir algo en la LCD conectada al puerto B junto con un teclado matricial.
No entiendo por que no imprime por ahí, sigue imprimiendo por el puerto D, espero me puedan aclarar esta duda por favor :confused: , desde ya gracias :)
En realidad es muy fácil cambiar de puerto.
Antes también estaba confundido sobre como hacerlo, pero pronto descubrí la forma. :)

Mira este pequeño ejemplo adjunto para que entiendas como se hace sin modificar la librería LCD.C.

Saludos.
 

Adjuntos

  • 16F887 LCD 16x2 Puerto B.rar
    39.3 KB · Visitas: 153
Pues sigo sin poder lograrlo D@rkbytes, y de ante mano gracias por la ayuda que siempre me brindas :D, ya hice algo como en el código, pero nada, adjunto mi circuito haber si tú pudieras encontrar la falla, estuvimos con mi profesor y aunque el también es de los buenos, no pudimos :unsure:
 

Adjuntos

  • Dummy Shot.rar
    339.7 KB · Visitas: 38
Pues sigo sin poder lograrlo D@rkbytes, y de ante mano gracias por la ayuda que siempre me brindas :D, ya hice algo como en el código, pero nada, adjunto mi circuito haber si tú pudieras encontrar la falla, estuvimos con mi profesor y aunque el también es de los buenos, no pudimos :unsure:
Si hay alguna fallas en tu programa, y me supuse que tendrías problemas cuando quisieras usar el teclado por el puerto B.
Mira el motivo y la solución en el post #360
Y para que no se te haga complicado ver las funciones de ese programa, adjunto un ejemplo básico de uso, controlando la pantalla y el teclado matricial 3x4 por el puerto B.

Suerte.
 

Adjuntos

  • 16F887 LCD 16x2 con Teclado 3x4 por el puerto B.rar
    46.7 KB · Visitas: 156
Hola,
Mi problema es que no logro activar las resistencias pull-up de las entradas del puerto B para el manejo de un teclado matricial con un pic16f883. Lo que trate fue adaptar el proyecto de un post muy anterior de D@rkbytes que esta en assembler y que funcionaba perfecto con un pic16f887.
Gracias por la ayuda que me pueda dar.
 
Hola,
Mi problema es que no logro activar las resistencias pull-up de las entradas del puerto B para el manejo de un teclado matricial con un pic16f883. Lo que trate fue adaptar el proyecto de un post muy anterior de D@rkbytes que esta en assembler y que funcionaba perfecto con un pic16f887.
Gracias por la ayuda que me pueda dar.
¿Podrías mencionar el número del post para saber de que programa se trata?
Si el programa lo estás escribiendo en ensamblador tienes que configurar el bit 7 del registro OPTION_REG en 0
Ese bit es el que activa las resistencias Pull-Up del puerto B.
bcf OPTION_REG,7
El registro OPTION_REG se encuentra en el banco 1

Si lo estás escribiendo en C, en el post #360 está la solución.

Si tienes otro problema o usas otro lenguaje de programación, es necesario que adjuntes código y esquema en un archivo comprimido para poder ayudarte.

Saludos.
 
Atrás
Arriba