-


-


-

Libreria para teclado matricial 4×4 a traves de Puerto B haciendo uso de interrupcion RB

Usando PORTB para teclado matricial con interrupciones, no hay mas que copiar este archivo en la carpeta PICC/drivers y
despues utilizarlo mediante include
Descarga aqui el archivo jkbd.c

///////////////////////////////////////////////////////////////////////////
//// jkbd.C ////
//// Driver for common 4×4 keypad modules ////
//// ////
//// kbd_init() Activa el rastreo EN PUERTO B RB0:RB3 ////
//// ////
//// getkey() Captura tecla pulsada a partir de la interrupcion por ////
//// cambio de estado en RB4:RB8 ////
//// ////
//// jkbd_getint(from,to,line) leer desde lcd numero decimal ////
//// de hasta 9 cifras y trasformar a int32 ////
//// para operar con el. ////
//// ////
//// ////
///////////////////////////////////////////////////////////////////////////////////////
//// El valor de trisB ha de ser 0xf0 ////
//// Un set_tris_b(0xf0); seria necesario en la funcion main ////
//// Libreria para uso de teclado matricial 4×4  2012 Made in Basque country
///////////////////////////////////////////////////////////////////////////////////////
#byte portb= 0×06
#byte porta= 0×05
#bit ra0=0×05.0
#bit ra1=0×05.1
#bit ra2=0×05.2
#bit ra3=0×05.3
#bit ra4=0×05.4
#bit ra5=0×05.5
#bit ra6=0×05.6
#bit ra7=0×05.7
#bit rb0=0×06.0
#bit rb1=0×06.1
#bit rb2=0×06.2
#bit rb3=0×06.3
#bit rb4=0×06.4
#bit rb5=0×06.5
#bit rb6=0×06.6
#bit rb7=0×06.7
int ink=0, inkc=0;
int s, n,num;
int ch=0;
int32 inkn=0;
void kbd_init(){// ciclo de rastreo de teclado a traves de nibble bajo de portb
while(1){
portb=0×01;
delay_ms(5);
portb=0×02;
delay_ms(5);
portb=0×04;
delay_ms(5);
portb=0×08;
delay_ms(5);
}
}
int getkey(){ // capturar caracter pulsado ¡formato char!
ink = (portb & 0xf0); // maskaratu
#asm
swapf ink,1; //nibbleak trukatu
#endasm
if (ink==0){
}else{
if (rb0==1){
if (ink==1){inkc=7;}
if (ink==2){inkc=8;}
if (ink==4){inkc=9;}
if (ink==8){inkc=15;}
}
if (rb1==1){
if (ink==1){inkc=4;}
if (ink==2){inkc=5;}
if (ink==4){inkc=6;}
if (ink==8){inkc=14;}
}
if (rb2==1){
if (ink==1){inkc=1;}
if (ink==2){inkc=2;}
if (ink==4){inkc=3;}
if (ink==8){inkc=13;}
}
if (rb3==1){
if (ink==1){inkc=10;}
if (ink==2){inkc=0;}
if (ink==4){inkc=11;}
if (ink==8){inkc=12;}
}
return inkc;
}
}
int32 jkbd_getint(from,to,line){// leer desde lcd numero decimal de hasta 9 cifras y trasformar a int32 para operar
int32 multx, mult=1;
inkn=0;
for (s=from-1;s>=to;s–){
ch= (lcd_getc(s,line)-48);
if (mult==1){multx=1;}
if (mult==2){multx=10;}
if (mult==3){multx=100;}
if (mult==4){multx=1000;}
if (mult==5){multx=10000;}
if (mult==6){multx=100000;}
if (mult==7){multx=1000000;}
if (mult==8){multx=10000000;}
if (mult==9){multx=100000000;}
inkn=inkn+(ch*multx);
mult++;
}
return inkn;
mult=1;

}