Hola a todos, pues tengo un problema al utilizar un teclado en un proyecto que estoy realizando,
antes de nada he de decir que soy novato en la programación de microcontroladores en lenguaje C
la practica consta de un teclado + un LCD y los dos conectados al puerto B de un microcontrolador PIC16F876.
La programación la realizo con el compilador CCS C.
Lo que pretendo hacer, es que mientras no pulse ninguna tecla del teclado, un led que está en el puerto C en el pin 0 esté parpadeando, y en el display se despliegue un mensaje de por ejemplo, "LCD Activado".
Cuándo pulse el teclado, aparezca en el display, "Pulsar tecla 1", "Pulse tecla 2" y así sucesivamente hasta terminar de introducir el código que tengo guardado en la memoria eeprom.
Si el código es correcto, me va a una subrutina si no, me despliega un mensaje de error.
el programa que he hecho es este:
#include <16F876.h>
#fuses XT,NOWDT,NOPROTECT
#use delay(clock = 4000000)
#use standard_io (A)
#use standard_io (B)
#define use_portb_lcd TRUE
#include <lcd.c>
#define use_portb_kbd TRUE
#include <kbd.c>
#include <stdlib.h>
#rom 0x2100={'1','2','3'}
void keyboard();
void main(){
char k;
int i;
char data[3], clave[3];
lcd_init();
kbd_init();
port_b_pullups(TRUE);
while(TRUE){
i=0;
printf(lcd_putc,"\fLCD activado\n");
while(i<=2){
k=kbd_getc();
if (k!= 0)
{data[i]=k;
i++;
printf(lcd_putc,"\fPulsar tecla%u\n"i+1);
}
}
for (i=0;i<=2;i++){
clave[i]=read_eeprom(i);}
if ((data[0]==clave[0])&&(data[1]==clave[1])&&(data[2]==clave[2]))
keyboard();
else printf(lcd_putc,"\fClave erronea");
delay_ms(1500);
}
}
void keyboard(){
lcd_gotoxy(1,1);
printf(lcd_putc,"\fTeclado activado");
while(TRUE){
output_low(PIN_C0);
output_low(PIN_C1);
output_high(PIN_C2);
delay_ms(700);
output_low(PIN_C2);
delay_ms(700);
}
}
Hasta ahí todo bien, pero como intente introducir un led que parpadee o algo más, el programa parece que nada más iniciarse se queda esperando en el bucle while (1<=2) y no sale de ahí.
si pongo un led que parpadee dentro de ese bucle por ejemplo así:
#include <16F876.h>
#fuses XT,NOWDT,NOPROTECT
#use delay(clock = 4000000)
#use standard_io (A)
#use standard_io (B)
#define use_portb_lcd TRUE
#include <lcd.c>
#define use_portb_kbd TRUE
#include <kbd.c>
#include <stdlib.h>
#rom 0x2100={'1','2','3'}
void keyboard();
void main(){
char k;
int i;
char data[3], clave[3];
lcd_init();
kbd_init();
port_b_pullups(TRUE);
while(TRUE){
i=0;
printf(lcd_putc,"\fLCD activado\n");
while(i<=2){
k=kbd_getc();
if (k!= 0)
{data[i]=k;
i++;
printf(lcd_putc,"\fPulsar tecla%u\n"i+1);
}
output_high(PIN_C0);
delay_ms(300);
output_low(PIN_C0);
delay_ms(300);
}
for (i=0;i<=2;i++){
clave[i]=read_eeprom(i);}
if ((data[0]==clave[0])&&(data[1]==clave[1])&&(data[2]==clave[2]))
keyboard();
else printf(lcd_putc,"\fClave erronea");
delay_ms(1500);
}
}
void keyboard(){
lcd_gotoxy(1,1);
printf(lcd_putc,"\fTeclado activado");
while(TRUE){
output_low(PIN_C0);
output_low(PIN_C1);
output_high(PIN_C2);
delay_ms(700);
output_low(PIN_C2);
delay_ms(700);
}
}
el código de parpadeo de led no se ejecuta, ponga donde ponga ese código o solo se ejecuta una vez y luego se queda esperando a que introduzca números en el teclado.
si hago otro tipo de bucle para que este corriendo todo el rato, si me funciona el led pero no funciona el teclado.
Me gustaría a ver si alguien me puede explicar el funcionamiento de la librería kbd.c o si hay otra manera de hacer ésto que quiero
la verdad es que me está costando mucho entender el teclado, con el lcd no tengo problemas pero el teclado se me resiste.
Pido disculpas si no me he explicado con claridad, si eso me preguntan lo que no entiendan de esto que quiero hacer y yo intentaré ser más claro.