Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: gioalex07 en 04 de Diciembre de 2017, 00:33:19
Título: Teclado matricial-problema lectura
Publicado por: gioalex07 en 04 de Diciembre de 2017, 00:33:19
Hola comunidad, tengo este programa para realizar la lectura de un teclado matricial de 4x3 pero estoy simulando en proteus y no capta cuando yo oprimo una tecla. No se que podría estar mal o que se puede modificar para que funcione. O donde falla la interrupción ya que es la primera vez que realizo este metodo *Lo primordial es saber cual dato oprimió ya lo demás del programa es impresión en LCD
#include <xc.h> #define _XTAL_FREQ 4000000
void esc_lcd(char datos, char rs, char rw); void config_lcd_8bits(); void leer_teclado_matricial(int *resultado); int i,j,bandera,interrupcion = 0; int resultado[2] = {99,99}; char clave [4] = {'6','7','8','9'}; char teclado [12] = {'1','2','3','4','5','6','7','8','9','*','0','#'}; int vector [4] = {0b00000001,0b00000010,0b00000100,0b00001000}; int inicio [10] = {'P','r','e','s','i','o','n','e',' ','#'}; int ingreso [13] = {'I','n','g','r','e','s','e',' ','c','l','a','v','e'}; int final [14] = {'C','l','a','v','e',' ','c','o','r','r','e','c','t','a'};
Título: Re:Teclado matricial-problema lectura
Publicado por: gioalex07 en 04 de Diciembre de 2017, 16:34:38
Implemente la interfaz humana de un cajero bancario. Para ello visualice en un display alfanumérico LCD la frase “Presione #” y cuando alguien presione la tecla “#”, se debe visualizar el texto “Ingrese clave”. Si el usuario ingresa la clave de 4 dígitos numérica correcta, que estaba previamente almacenada en un microcontrolador y será “6789”, el display debe mostrar “Clave correcta” y activar un LED. La visualización del texto y el LED encendido debe durar 5 segundos.
En caso de que la clave sea incorrecta se debe volver al estado inicial y visualizar “Presione #”.
Esto es lo que tengo que realizar para contextualizar el problema..
Gracias a quien pueda ayudarme
Título: Re:Teclado matricial-problema lectura
Publicado por: KILLERJC en 05 de Diciembre de 2017, 15:09:14
Discculpa pero estoy viendo algunos errores en la logica de programacion:
Código: C
PORTA = vector;
Esto..... vector es un array. Por lo tanto, lo que estas haciendo alli es intentar poner "la direccion" de vector en el puerto A. Seguramente que esto no es lo que buscabas y tal ves era
Código: C
PORTA = vector[i];
- Delays dentro de la interrupcion.. Nunca. - Funciones que ocupen demasiado tiempo como escribir en el LCD ( ya que usan delays) en la interrupcion TAMPOCO. LLeva la muestra al loop principal. La interrupcion es atender y salir.
- Esto:
Código: C
int final [14]={'C','l','a','v','e',' ','c','o','r','r','e','c','t','a'};
Cambialo por:
Código: C
char final[]="Clave correcta";
Es mas simple de realizar, mas simple de saver cuando es que termino el string ya que al usar las comillas ocupa 1 espacio mas el cual usa un caracter nulo 0x00 o '\0' para identificar cuando es que termino. No te preocupas por que cantidad hay de caracteres.
- Aca en este punto
Código: C
num = PORTB;
switch(num){
Tenes que tener cuidado, ya que va a leer todo los demas pines tambien. El switch espera si o si el numero que vos le das, si hay orto bit en 1 no te sirve. Si tenes 3 bits que se pueden poner en 1, entonces mejor asegurarnos que pasen solo los 3 bits de mayor peso, asi:
Código: C
num = PORTB &0b11100000;
switch(num){
Título: Re:Teclado matricial-problema lectura
Publicado por: gioalex07 en 05 de Diciembre de 2017, 22:42:37
Pues te comento que por tiempo dijo que lo hicieramos por polling y ahora tengo problema al guardar en un arreglo las teclas que se pulsan para compararlas con un arreglo fijo. *lo enmarco con //aqui quiero guardar los pulsos pero siempre se almacena 1 ejm 9999 o 8888 y asi entonces nunca pasara a la siguiente condicion
gracias por tu ayuda
#include <xc.h> #define _XTAL_FREQ 4000000
void esc_lcd(char datos, char rs, char rw); void config_lcd_8bits(); void leer(); int inicio [10] = {'P','r','e','s','i','o','n','e',' ','#'}; int ingreso [13] = {'I','n','g','r','e','s','e',' ','c','l','a','v','e'}; int final [14] = {'C','l','a','v','e',' ','c','o','r','r','e','c','t','a'}; int final1 [16] = {'C','l','a','v','e',' ','i','n','c','o','r','r','e','c','t','a'}; int vector [4] = {0b000000001,0b000000010,0b000000100,0b000001000}; char clave [4] = {}; char clave1 [4] = {'6','7','8','9'}; int bandera,bandera1,bandera2,bandera3,clave_correcta, i, posicion,punto,variable = 0; int bandera4, bandera5 = 0; char tecla;