Autor Tema: Ayuda con teclado matricial usando i2c con lcd 16x2  (Leído 587 veces)

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

Desconectado Just4Fun

  • PIC10
  • *
  • Mensajes: 2
Ayuda con teclado matricial usando i2c con lcd 16x2
« en: 14 de Julio de 2019, 11:02:03 »
Buenas tardes, no se si alguien me podria ayudar.
Estoy avanzando un proyecto de una cerradura electronica  usando el i2c, el tema es que cuando llego a la parte del teclado no logra guardar nada y comienza a reiniciarse.
espero puedan ayudarme, adjunto el codigo.
Soy nuevo en esto de microcontroladores disculpen mis errores.
Muchas gracias.

Código: [Seleccionar]
#include "LIB_I2C_LCD.h"
unsigned short kp;
char usuario[7];
int i=0;
char contador=0;

// Keypad module connections
char  keypadPort at PORTB;



void main() {
//Inicios
Keypad_Init();//Iniciar el Keypad
I2C1_Init(100000);//Iniciar Libreria I2C MicroC
I2C_LCD_Init();//Iniciar Libreria externa
PWM1_Init(5000); //iniciar PWM
TRISD.f0=0;
TRISD.f1=0;
TRISD.f2=0;
// Mensaje 1
I2C_LCD_Cmd(_LCD_CURSOR_OFF);
I2C_LCD_Cmd(_LCD_FIRST_ROW);
I2C_Lcd_Out(1,1,"PROYECTO CON ");
delay_ms(500);
I2C_LCD_Cmd(_LCD_SECOND_ROW);
I2C_Lcd_Out(2,1,"MICROCONTROLADOR");
delay_ms(1000);

//Mensaje 2
I2C_LCD_Cmd(_LCD_CLEAR);
I2C_LCD_Cmd(_LCD_FIRST_ROW);
I2C_Lcd_Out(1,1,"CERRADURA");
delay_ms(500);
I2C_LCD_Cmd(_LCD_SECOND_ROW);
I2C_Lcd_Out(2,1,"ELECTRONICA");
delay_ms(1000);

while(1){
I2C_LCD_Cmd(_LCD_CLEAR);
I2C_LCD_Cmd(_LCD_FIRST_ROW);
I2C_Lcd_Out(1,1,"INGRESE SU CLAVE");
kp=0;
 do                         //Espera por una tecla.
  kp=Keypad_Key_Click();  //Lee el número de la tecla y lo guarda en kp.
 while (!kp);
 switch (kp){
  case  1: kp = 49; break;  //49 es el código ASCII del número 1.
  case  2: kp = 50; break;  //50 es el código ASCII del número 2.
  case  3: kp = 51; break;  //51 es el código ASCII del número 3.
  case  4: kp = 65; break;  // A
  case  5: kp = 52; break;  // 4
  case  6: kp = 53; break;  // 5
  case  7: kp = 54; break;  // 6
  case  8: kp = 66; break;  // B
  case  9: kp = 55; break;  // 7
  case 10: kp = 56; break;  // 8
  case 11: kp = 57; break;  // 9
  case 12: kp = 67; break;  // C
  case 13: kp = 42; break;  // *
  case 14: kp = 48; break;  // 0
  case 15: kp = 35; break;  // #
  case 16: kp = 68; break;  // D
 }
    I2C_LCD_Cmd(_LCD_SECOND_ROW);
    I2C_Lcd_Out(2,i+1,"*");
    i++;
if(usuario[0]==49 && usuario[1]==49 && usuario[2]==49 && usuario[3]==49 && usuario[4]==49 && usuario[5]==49)//Contraseña 111111
{
I2C_LCD_Cmd(_LCD_CLEAR);
I2C_LCD_Cmd(_LCD_FIRST_ROW);
I2C_Lcd_Out(1,1,"BIENVENIDO");
I2C_LCD_Cmd(_LCD_SECOND_ROW);
I2C_Lcd_Out(2,1,"A CASA");

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7816
Re:Ayuda con teclado matricial usando i2c con lcd 16x2
« Respuesta #1 en: 14 de Julio de 2019, 15:15:12 »
Código: [Seleccionar]
while (!kp);
kp nunca va a cambiar de valor... por que se actualiza en la linea anterior y queda atrapado ahi para siempre, si se reinicia puede ser el WDT que lo tengas activo al quedarse ahi atrapado.

Otras cosas para que sepas:

Código: C
  1. case  1: kp = 49; break; //49 es el código ASCII del número 1.

Tranquilamente podrias haber realizado esto:

Código: C
  1. case  1: kp = '1'; break;

Y para no hacer tantos case.... podrias haber realizado un array con los datos y acceder con el indice que tuvieras... ejemplos:

Código: C
  1. char letras[] = {0,'1','2','3'};
  2. presionado = letras[kp];

Desconectado Just4Fun

  • PIC10
  • *
  • Mensajes: 2
Re:Ayuda con teclado matricial usando i2c con lcd 16x2
« Respuesta #2 en: 14 de Julio de 2019, 21:49:49 »
Código: [Seleccionar]
while (!kp);
kp nunca va a cambiar de valor... por que se actualiza en la linea anterior y queda atrapado ahi para siempre, si se reinicia puede ser el WDT que lo tengas activo al quedarse ahi atrapado.

Otras cosas para que sepas:

Código: C
  1. case  1: kp = 49; break; //49 es el código ASCII del número 1.

Tranquilamente podrias haber realizado esto:

Código: C
  1. case  1: kp = '1'; break;

Y para no hacer tantos case.... podrias haber realizado un array con los datos y acceder con el indice que tuvieras... ejemplos:

Código: C
  1. char letras[] = {0,'1','2','3'};
  2. presionado = letras[kp];

Muchas gracias, pude solucionar el problema.