hola a todos estoy haciendo el siguiente programa la idea es leer un teclado matricial 4X4 osea de
cuatro columnas y cuatro filas.ESTOY USANDO EL COMPILADOR CC5X.
para leer las teclas este programa usa el metodo de inversion de linea, osea que las entradas
se inviertes para pasar a ser salidas y viceversa. Por ahora soloquiero que cuando presione una tecla esta
sea leida y el pic active una salida osea un bit EN MI CASO diferente por cada numero del teclado esto segun se puede apreciar en el programa.
sucede que lal idea es leer las entradas y las salidas hacer un solo byte con ellas y guardarlas en la variable TECLA y luego preguntar
por los bits de la variable para ver cuales estan en cero y con eso detectar la tecla.
agradecere cualquier ayuda.
RB4-RB5-RB6-RB7=COLUMNAS
^ ^ ^ ^
| | | |
|---|---|---|---|---|---|
RB0 --> | 1 | 2 | 3 | F1|
|---|---|---|---|---|---|
RB1 --> | 4 | 5 | 6 | F2|
|---|---|---|---|---|---|
RB2 --> | 7 | 8 | 9 | F3|
|---|---|---|---|---|---|
RB3 --> | * | 0 | # | F4|
|---|---|---|---|---|---|
*/
RB0,BB1,RB2,RB3 ESTAN CONECTADOS A LAS FILAS.
void configura_puertos()
{
ADCON1=0b00000110;//configura todos los BIT del PUERTO A y el E como entradas y salidas digitales.
//TRISA=0x03;//0b00000011 RA0 yRA1 como entradas de 2 Monederos.
TRISB=0b11110000; //habilita las columnas como entradas en los bits B4-B7;
OPTION.7=0;//Habilita PULL-UP del puerto b
TRISC=0x00;//TRISC como salida.//0b10000000;Habilita comunicacion rs232.
TRISD=0x00;
TRISE=0x00;
}
void teclado_entrada_PORTB()
{
char TECLA,TECLA_C,TECLA_F;
while(1)
{
TECLA_C=PORTB;//11110000 las entradas estan en '1' mientras no se presione una tecla.
while (TECLA_C!=0xF0)
{
TRISB=0b00001111;//habilita las filas como entradas en los bits A0-A3.
OPTION.7=0;
TECLA_F=PORTB;
TECLA=TECLA_F|TECLA_C;//el bit que cambio en las filas queda guardado en TECLA_F.
TECLA_F=0x0F;
if ((TECLA.0==0)&&(TECLA.4==0))//Tecla "1 PRESSED".
{
//tecla "1" Presionada.
//Retardo.
PORTC.1=1;
TECLA=0xFF;
TECLA_C=0xF0;
}break;
if ((TECLA.0==0)&&(TECLA.5==0))//Tecla "2" PRESSED".
{
//tecla "2" Presionada.
PORTC.2=1;
TECLA=0xFF;
TECLA_C=0xF0;
}break;
if ((TECLA.0==0)&&(TECLA.6==0))//Tecla "3" PRESSED".
{
//tecla "3" Presionada.
PORTC.3=1;
TECLA=0xFF;
TECLA_C=0xF0;
}break;
if ((TECLA.1==0)&&(TECLA.4==0))//Tecla "4" PRESSED".
{
//tecla "4" Presionada.
PORTC.4=1;
TECLA=0xFF;
TECLA_C=0xF0;
}break;
if ((TECLA.1==0)&&(TECLA.5==0))//Tecla "5" PRESSED".
{
//tecla "5" Presionada.
PORTC.5=1;
TECLA=0xFF;
TECLA_C=0xF0;
}break;
if ((TECLA.1==0)&&(TECLA.6==0))//Tecla "6" PRESSED".
{
//tecla "6" Presionada.
PORTC.6=1;
TECLA=0xFF;
TECLA_C=0xF0;
}break;
if ((TECLA.2==0)&&(TECLA.4==0))//Tecla "7" PRESSED".
{
//tecla "7" Presionada.
PORTC.7=1;
TECLA=0xFF;
TECLA_C=0xF0;
}break;
if ((TECLA.2==0)&&(TECLA.5==0))//Tecla "8" PRESSED".
{
//tecla "8" Presionada.
PORTD.0=1;
TECLA=0xFF;
TECLA_C=0xF0;
}break;
if ((TECLA.2==0)&&(TECLA.6==0))//Tecla "9" PRESSED".
{
//tecla "9" Presionada.
PORTD.1=1;
TECLA=0xFF;
TECLA_C=0xF0;
}break;
if ((TECLA.3==0)&&(TECLA.4==0))//Tecla "*" PRESSED".
{
//tecla "*" Presionada.
PORTD.2=1;
TECLA=0xFF;
TECLA_C=0xF0;
}break;
if ((TECLA.3==0)&&(TECLA.5==0))//Tecla "0" PRESSED".
{
//tecla "0" Presionada.
PORTD.3=1;
TECLA=0xFF;
TECLA_C=0xF0;
}break;
if ((TECLA.3==0)&&(TECLA.6==0))//Tecla "#" PRESSED".
{
//tecla "#" Presionada.
PORTD.4=1;
TECLA=0xFF;
TECLA_C=0xF0;
}break;
if ((TECLA.0==0)&&(TECLA.7==0))//Tecla "F1" PRESSED".
{
//tecla "F1" Presionada.
PORTD.5=1;
TECLA=0xFF;
TECLA_C=0xF0;
}break;
if ((TECLA.1==0)&&(TECLA.7==0))//Tecla "F2" PRESSED".
{
//tecla "F2" Presionada.
PORTD.6=1;
TECLA=0xFF;
TECLA_C=0xF0;
}break;
if ((TECLA.2==0)&&(TECLA.7==0))//Tecla "F3" PRESSED".
{
//tecla "F3" Presionada.
PORTD.7=1;
TECLA=0xFF;
TECLA_C=0xF0;
}break;
if ((TECLA.3==0)&&(TECLA.7==0))//Tecla "F4" PRESSED".
{
//tecla "F4" Presionada.
PORTE.0=1;
TECLA=0xFF;
TECLA_C=0xF0;
}break;
}
}
}
void main()
{
configura_puertos();
teclado_entrada_PORTB();
}