Manejar teclado matricial y mostrar en lcd

Gracias..!! Saint_ eres magnifico respondiste de inmediato te lo agradesco ya puedo continuar con el codigo, la verdad me estaba ahogando con ese vaso de agua
 
Saludos amigos.

Estoy haciendo un proyecto con el PIC18F2520, el cual tiene 3 puertos, (A,B y C) pero el problema con eso es que utilizo una pantalla LCD con un teclado 4x3 y ambos usan el puerto B.
Entonces me gustaría saber cómo modificar alguna de las dos librerías (lcd.c o kbd.c)
La que sea mas sencilla.

Necesito cualquiera de las dos en el puerto A o C.
La verdad no tengo inconvenientes con que sea otro puerto, sólo que uno se quede por defecto y otro sí cambiarlo.

Espero que me puedan ayudar.

Intenté usar la librería flex_lcd416a.c y solo modifiqué esto:
Código:
// Flex_LCD416.c

// These pins are for my Microchip PicDem2-Plus board,
// which I used to test this driver.
// An external 20x4 LCD is connected to these pins.
// Change these pins to match your own board's connections.

#define LCD_DB4 PIN_C4
#define LCD_DB5 PIN_C5
#define LCD_DB6 PIN_C6
#define LCD_DB7 PIN_C7

#define LCD_RS PIN_C0    //PIN_C4
#define LCD_RW PIN_C1
#define LCD_E PIN_C2    //PIN_C6
Pero una vez intentándolo en proteus, sólo prende la LCD pero no muestra nada.

Por cierto, mi programa es este: (igual y tengo algún fallo)
PHP:
#include <18F2520.h>
#fuses NOBROWNOUT, INTRC, NOMCLR
#use delay(internal=8M)
#include <flex_lcd416a.c>



void main(){
lcd_init();
for(;{
printf(lcd_putc,"Electronica");
delay_ms(2000);
lcd_putc("\f");
delay_ms(2000);
}
}
Lo hago sencillo, pues si no funciona así, para qué intento seguirle.
 
Última edición por un moderador:
Saludos amigos.

Estoy haciendo un proyecto con el PIC18F2520, el cual tiene 3 puertos, (A,B y C) pero el problema con eso es que utilizo una pantalla LCD con un teclado 4x3 y ambos usan el puerto B.
Entonces me gustaría saber cómo modificar alguna de las dos librerías (lcd.c o kbd.c)
La que sea mas sencilla.

Necesito cualquiera de las dos en el puerto A o C.
La verdad no tengo inconvenientes con que sea otro puerto, sólo que uno se quede por defecto y otro sí cambiarlo.

Espero que me puedan ayudar.

Lo hago sencillo, pues si no funciona así, para qué intento seguirle.
Buenas
Yo modificaría la librería lcd420 para el puerto C y poder conectar mi teclado matricial al puerto B y así ahorrar hardware puesto que el puerto B tienes las resistencias Pull-Up.
Si quieres ahorrar pines y hardware(resistencias) podrías conectar ambos periféricos por puerto B.
Adjunto Simulación :
 

Adjuntos

  • LCD420.rar
    42.6 KB · Visitas: 14
  • Ejemplo2.rar
    49.9 KB · Visitas: 14
Buenas a todos, me a servido de mucha ayuda los aportes e tomado uno como referencia ya que me solicitaron el uso de assembler para trabajar con el PIC16F887, pero presento un problema al querer adaptar lo que se muestra en un display a un LCD, ya que debo poder mostrar ese numero seleccionado en binario en un LCD. adjunto lo que tengo para ver quien pueda ayudarme con eso. Gracias de antemano.
 

Adjuntos

  • Teclado Matricial.rar
    52.9 KB · Visitas: 8
En vez de usar un oscilador RC, es mejor que uses el oscilador interno.
La pantalla la puedes direccionar por un puerto y el display de 7 segmentos por otro puerto.
El decodificador 7448 no debe ir conectado a la pantalla, sino al display de 7 segmentos.
Pero con el PIC no es necesario que lo uses, porque también se puede controlar directamente, aunque se usarán más pines.

Para controlar la pantalla necesitas rutinas especiales, así como lo estás haciendo no es correcto.

PD. Ese display de 7 segmentos a 4 bits, nunca lo he visto comercialmente.
 
Hola, gracias por responder, si bueno mi error fue dejarle los display a la simulación, los deje como guía para luego apartarlos al lcd, solo debe ir conectado el lcd, pero ese es mi error ya veo que no se trabajan igual según lo que me mencionas y es donde tengo mi falla ya que no se trabajar con el LCD, debo hacer algún tipo de configuración dentro del .ASM para activar el LCD, o debo modificar el código como tal? por que de ser así por eso ando perdido :cry:
 
Pues sí, por lo tanto primero debes estudiar cómo funciona cada dispositivo.

Adjunto un ejemplo de cómo implementar lo que deseas hacer.

Suerte.
 

Adjuntos

  • 16F887 Teclado Matricial 4x4, LCD 16x2 y Display 7 segmentos.rar
    59.2 KB · Visitas: 403
Muchas gracias de verdad si me es muy útil para realizar lo que debo hacer, ya solo me queda investigar como hacer para que en el LCD aparezca el numero en binario. :D
 
Pues sí, por lo tanto primero debes estudiar cómo funciona cada dispositivo.

Adjunto un ejemplo de cómo implementar lo que deseas hacer.

Suerte.

hola, luego de adaptarlo quiero realizar la acción de decirle al LCD que muestre el valor en binario no consigo como hacer que el muestre dicho valor, investigando usan agregar la palabra "Bin" para que el mande el valor en binario pero tanto con ese como en otros que e conseguido investigando un poco son usados en css o usan mucho lenguaje C, y no assembler para realizar la acción por eso estoy desorientado con esta opción del LCD.
 
Bin no es una opción que tenga la pantalla o el lenguaje ensamblador.
Seguramente es el nombre que una persona le puso a su rutina de conversión a Binario.

Para eso se necesita crear una subrutina que compare bit por bit un numero.

Me parece que se te va a complicar aunque es muy sencillo, así que adjunto el programa con la subrutina para convertir de BCD a Binario.

Nota: Requiere de la librería "LCD_4Bits.inc" del programa adjunto en el post #428
 

Adjuntos

  • Con Conversión de BCD a Binario.rar
    1.9 KB · Visitas: 9
Última edición:
buenas amigos queria saber si me pueden ayudar con mi programa, la situacion es la siguiente, necesito controlar el setpoint (temperatura) usando el teclado matricial 4x3 pero el programa funciona perfectamente leyendo la temperatura (colocando la temperatura deseada desde la programacion) pero cuanto intento colocar la temperatura desde el teclado marca la temperatura pero no acepta en enter (en este caso ''*'')', cabe destacar que soy nuevo progrmando y ya llevo rato lleyendo sobre el tema, no se en realidad que estoy haciendo mal, o si me estoy pasando algun detalle por alto, espero vuestra ayuda por favor.. como se daran cuenta en el programa la etapa que funciona bien esta habilitada y la del setpoint no, *//*
 

Adjuntos

  • Nuevo documento de texto.txt
    5.9 KB · Visitas: 11
  • Captura.PNG
    Captura.PNG
    43.4 KB · Visitas: 11
Buenas, amigos, un gusto saludarles.
Tengo un problema en implementar la librería KBD.C con un PIC24FJ32GA002
He estado tratando de utilizarla para este PIC y la verdad el código compila y no da errores pero no puedo obtener la variable leída del teclado.

Les dejo el código para su análisis. Gracias.
C:
#include <24FJ32GA002.h>
#Fuses NOWDT, NOPROTECT
#USE  delay(internal=4M)

#define LCD_E    PIN_B0
#define LCD_RS   PIN_B11
#define LCD_DB4  PIN_B12
#define LCD_DB5  PIN_B13
#define LCD_DB6  PIN_B14
#define LCD_DB7  PIN_B15

#include <lcd1.c>
#include <kbd.c>

int segundos;
int minutos;
int Horas;
int Cantidad_personas;
int i;
char K;
int cont1=0;


void configuracion(void)
{
setup_timer1(TMR_INTERNAL|TMR_DIV_BY_8);  
ENABLE_INTERRUPTS(INTR_GLOBAL);          
ENABLE_INTERRUPTS(INT_TIMER1);

set_timer1(3036);
}


void Mensaje_Reposo(){
lcd_init();

i=10;

for (i =10;i>=-32;i--){      
lcd_gotoxy(i,1);
printf(lcd_putc, "%02i:%02i - %c personas - Menu Principal", Horas, minutos, K);
delay_ms(500);
lcd_putc("\f");
}
}

void LeerTeclado(){
kbd_init();
K=kbd_getc();
}


#INT_TIMER1 //RUTUNA PARA CONTAR SEGUNDOS
void INTERRUPCIONTM1(){
set_timer1(3036);

CONT1++;

if(CONT1==4){
segundos++;
CONT1=0;
}

if(segundos==60){
minutos++;
segundos=0;
}

if(minutos==60){
Horas++;
minutos=0;
}
if(Horas==24){
Horas=0;
}
}


void Main(){
set_tris_b(0);
kbd_init();
configuracion();

while(true){
         LeerTeclado();

Mensaje_Reposo();
}
}
Adjunto también el circuito.
La verdad, pareciera que la librería no sirviera para este tipo de PIC.
 

Adjuntos

  • pic24 kbd.png
    pic24 kbd.png
    44.2 KB · Visitas: 6
PPrimero que nada ... aprende a programar usando las interrupciones del timer y del cambio de estados de los puertos, ya que pierdes un monton de tiempo esperando sin hacer nada (500 ms en la rutina del display. luego en donde le dices que debe retornar al programa principal y terminar la rutina de interrupción?

Ademas... yo siempre si puedo (cuestión de ecónomia), agrego un selector de puertos con latch (usando una PAL) son my baratas y faciles de programar y me evitan tener qe estar refrescando los perifericos por software.

Podrias tambien poner en este link el contenido de tus *.h files? para ver ts definiciones de variables alli incluidas
 
Última edición:
La verdad, pareciera que la librería no sirviera para este tipo de PIC.
Si hubieras leído esta parte en la librería kbd.c, comprenderías el por qué no funcionó tu programa:
C:
#if defined use_portb_kbd
   #byte kbd = getenv("SFR:PORTB")
#else
   #byte kbd = getenv("SFR:PORTD")
#endif
Nota que la sentencia espera que se defina el puerto B para su uso, si no se define usará el puerto D por defecto.
Pero como el PIC24FJ32GA002 no tiene puerto D se generaría un error.
En tu programa no agregaste #define use_portb_kbd TRUE y mencionas que no se generan errores, pero debe ser porque usas una versión antigua del compilador, o usas una librería diferente a la actual, o está modificada.

La librería kbd.c está diseñada para funcionar conjuntamente con los pines para la pantalla, así que te podrías ahorrar algunos pines.

Adjunto un ejemplo sencillo de uso con el PIC24FJ32GA002
 

Adjuntos

  • 24FJ32GA002 Teclado 3x4 y LCD.rar
    33.9 KB · Visitas: 3
Tu codigo esta bastante mal.

El "int i;" lo declaras asi y luego lo restas hasta dar negativo en el "for". En su lugar usa "signed int i;"

Luego, otra vez con "i", le colocas 10 antes y en el "for". No hace falta volver a ponerle, solo deja la declaracion en el "for".

Vuelves a iniciar el teclado. En el "main" ya lo iniciaste, no lo vuelvas a iniciar en la funcion "LeerTeclado"

El lcd debes iniciarlo una vez, en el "main" o en la funcion dedicada "configuracion" (y tambien pon ahi el del teclado).
....
Te recomiendo rehacer todo el programa con lo que te puse, y te dijo Dark, y organices mejor las cosas, como por ejemplo la funcion innecesaria de "LeerTeclado"
 
Atrás
Arriba