Muy buenos días,
Me gustaría que me colaboraran con este tema que he venido trabajando ya hace varias semanas y no he logrado aun. En los proyectos que he utilizado siempre he conectado el teclado por el puerto B a un pic 18F4550 y ha funcionado correctamente. Pero ahora necesito conectarlo por el puerto D del mismo pic, he utilizado varias librerias y hecho lo que dicen muchos tutoriales pero nada ha funcionado aun, si alguien ha realizado ya este ejercicio le agradecería inmensamente de su colaboración.
esta es la libreria que estoy utilizando:
////////////////////////////////////////////////////////////////////////////////////
// KBD.C //
// FUNCIONES PARA ESCANEO DE UN TECLADO MATRICIAL //
// 4X4 HEXADECIMAL, EN EL PORTB //
// kbd_init() Debe ser invocada antes que las otras funciones. //
// c=lcd_getc(c) Si há sido presionada una tecla devuelve el caracter c //
// y lo salva en el char c, sino se presiona una tecla //
// retorna el valor /0, esta función puede invocarse //
// frecuentemente para no perder teclas pulsadas. //
// NOTA: REQUIERE COLOCAR RESISTENCIAS (2.2K) EN LOS PINES DE COLUMNAS //
// PINES DE COLUMNAS DE RB0(COL0) A RB3(COL3)) //
// PINES DE FILAS DE RB4(ROW0)) A RB7(ROW3)) //
// MODIF.: ING. FRANK GIRALDO - UD //
////////////////////////////////////////////////////////////////////////////////////
/*//////////////////////////////////////////////////////////////////////////////////
* RB0 RB1 RB2 RB3
* | | | |
* c0 c1 c2 c3
* | 1 | 2 | 3 | F | r0 - RB4
* | 4 | 5 | 6 | E | r1 - RB5
* | 7 | 8 | 9 | D | r2 - RB6
* | A | 0 | B | C | r3 - RB7
*
* COLUMNS=OUTs
* ROWS=INs
* SE HABILITAN PULL-UP INTERNAS
* SE REQUIERE COLOCAR RESISTENCIAS (2.2K) EN LOS PINES DE COLUMNAS
*
*///////////////////////////////////////////////////////////////////////////////////
//
#byte portkbd = 0XF83 //portkbd = portD
//Keypad connection: (Column 0 es B0)
// Bx:
#define COL0 (0 << 0)
#define COL1 (0 << 1)
#define COL2 (0 << 2)
#define COL3 (0 << 3)
#define ROW0 (1 << 4)
#define ROW1 (1 << 5)
#define ROW2 (1 << 6)
#define ROW3 (1 << 7)
#define ALL_ROWS (ROW3|ROW2|ROW1|ROW0)
#define ALL_PINS (ALL_ROWS|COL3|COL2|COL1|COL0)
char const KEYS[4][4] = {{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}};
#define KBD_DEBOUNCE_FACTOR 1.2
// Modifique el valor de temporización antirrebote con (KBD_DEBOUNCE_FACTOR = n/333),
// en donde n es el número de veces por segundo en los que ud. invoca
//la función kbd_getc().
//
void kbd_init(){
}
char kbd_getc( )
{
static BYTE kbd_call_count;
static short int kbd_down;
static char last_key;
static BYTE col;
BYTE kchar;
BYTE row;
//port_d_pullups(TRUE);
kchar='\0';
if(++kbd_call_count>KBD_DEBOUNCE_FACTOR)
{
switch (col)
{
case 0 : set_tris_d(ALL_PINS&~COL0);
portkbd=(0b1110);
break;
case 1 : set_tris_d(ALL_PINS&~COL1);
portkbd=(0b1101);
break;
case 2 : set_tris_d(ALL_PINS&~COL2);
portkbd=(0b1011);
break;
case 3 : set_tris_d(ALL_PINS&~COL3);
portkbd=(0b0111);
break;
}
if(kbd_down)
{
if((portkbd & (ALL_ROWS))==(ALL_ROWS))
{
kbd_down=FALSE;
kchar=last_key;
last_key='\0';
}
}
else
{
if((portkbd & (ALL_ROWS))!=(ALL_ROWS))
{
if((portkbd & ROW0) == 0)
row = 0;
else if((portkbd & ROW1) == 0)
row = 1;
else if((portkbd & ROW2) == 0)
row = 2;
else if((portkbd & ROW3) == 0)
row = 3;
last_key = KEYS[row][col];
kbd_down = TRUE;
}
else
{
++col;
if(col==4)
col=0;
}
}
kbd_call_count=0;
}
kchar = last_key;
set_tris_d(ALL_PINS);
return(kchar);
}
/*char dato;
char tecla()
{
dato='\0';
while(dato=='\0')
{
dato=kbd_getc();
delay_ms(100);
}
return dato;
} */
Y utilizando picc compiler este es el codigo que manejo en este momento:
#include <18F4550.h>
#include <KBD18FD.c>
#use delay(clock=20000000)
#fuses NOWDT,PUT,NOPROTECT,BROWNOUT,NOLVP,HS,CPD,NODEBUG
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8, parity=n)//n bit seg //debe hacerse en ambos micros 877A
#define prender output_high
#define apagar output_low
#define luz1 PIN_C1
#define luz2 PIN_C2
#define pulsador1 PIN_B0
#define LCD_DAT PIN_E0
#define LCD_E PIN_E2
#define LCD_CK PIN_E1
#include <LCD4x20_3PIN.c>
char daton;
long auxsegundos;
long segundos;
void un_digito()
{
lcd_putc("\f");
segundos=0;
auxsegundos=0;
do{
daton=kbd_getc();
lcd_putc(daton);
delay_ms(60);
if( daton !='\0')
{
lcd_gotoxy(8,1);
lcd_putc(daton);
delay_ms(1000);
// daton=daton-0X30;
auxsegundos=0;
segundos=12;
}
auxsegundos ++;
if(auxsegundos > 20)
{
auxsegundos = 0;
segundos ++;
}
}while(segundos<12);
}
void main()
{
#zero_ram
set_tris_A(0x00);
set_tris_B(0x00);
set_tris_C(0x80);
set_tris_D(0xff);
set_tris_E(0x00);
lcd_init();
kbd_init();
setup_comparator(No_analogs);
enable_interrupts(INT_RDA);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
EXT_INT_edge(H_to_L);
output_A(0x00);
output_B(0x00);
output_C(0x00);
output_D(0x00);
output_E(0x00);
lcd_gotoxy(1,1);
lcd_putc("\fBIENVENIDO");
delay_ms(500);
lcd_putc('\f');
lcd_gotoxy(1,1);
lcd_putc("\fPRUEBA1");
delay_ms(500);
lcd_putc('\f');
lcd_gotoxy(1,1);
lcd_putc("\fPROTEUS");
delay_ms(500);
un_digito();
}