Hola a tod@s
Perdon por la tardanza pero es que he estado algo liado...
El funcionamiento es muy similar a si lo conectaras directamente el teclado al PIC
//////////////////////////////////////////////////////////////
// Libreria Teclado I2C Libreria_tecladoI2C.C //
// //
// Adaptacion: D. Sanchez 03/06 //
/////////////////////////////////////////////////////////////
/*
PCF8574 Resistencias TECLADO PIC
---------- ------------ ---------- -----
P0 ---------- R 330 -------- Fila 1
P1 ---------- R 330 -------- Fila 2
P2 ---------- R 330 -------- Fila 3
P3 ---------- R 330 -------- Fila 4
P4 -------------------------- Col 1
P5 -------------------------- Col 2
P6 -------------------------- Col 3
P7 -------------------------- Col 4
INT------------------------------------ RB0/INT
A0,A1,A2 conectar a masa.
*/
void PCF8574_Escribe(int8 dato);
int8 PCF8574_Lee(void);
void Teclado_ini(void)
{
port_b_pullups (0b00000001); // Activa la resitencia pull-up interna del pin RB0/INT
ext_int_edge( H_TO_L ); // La int. se activara por flanco de bajada
PCF8574_Escribe(0b11110000); // Pone como salida (0) las Lineas y como entrada (1) las Columnas
delay_ms(50);
}
void PCF8574_Escribe(int8 dato)
{
i2c_start(); // Start condition
i2c_write(PCF8574_Escritura);// Device address
i2c_write(dato);// dato
i2c_stop(); // Stop condition
}
int8 escanea_tecla(void)
{
int8 l,c;
signed int8 dato=-1;
int8 fila=0b11111110; // primera fila
for (l=0; l<=3; l++) // Recorre las 4 filas
{
PCF8574_Escribe(fila);
rotate_left(&fila, 1); // siguientes filas, va desplazando el 0 hacia la izquierda
delay_ms(20); // necesario antes de leer 20
dato=PCF8574_Lee();
c=0;
if (!bit_test(dato,4)) c=1; //Col 1
else if (!bit_test(dato,5)) c=2; //Col 2
else if (!bit_test(dato,6)) c=3; //Col 3
else if (!bit_test(dato,7)) c=4; //Col 4
if(c) break; // Si c es distinto de 0 sale del for
}
if(c)
dato=(l*4)+c;
else
dato=-1; //Ninguna tecla pulsada
PCF8574_Escribe(0b11110000); // Vuelve a poner como salida (0) las Lineas y como entrada (1) las Columnas
return dato;
}
char tecla_c(int8 codigo)
{
char tabla_tecla[17]={'1','2','3','F','4','5','6','E','7','8','9','D','A','0','B','C','Z'};
return tabla_tecla[codigo-1];
}
int8 lee_teclado(void)
{
int8 tecla_hex;
tecla_hex=escanea_tecla();
}
int8 PCF8574_Lee(void)
{
int8 dato;
i2c_start(); // Start condition
i2c_write(PCF8574_Lectura);// Device address
dato = i2c_read();
i2c_stop(); // Stop condition
return dato;
}
//////////////////////////////////////////////////////////////////////////////
Y aqui tienes un pequeño ejemplo
////////////////////////////////////////////////////////////////////////
//// Prueba Teclado I2C Pru_teclado_I2C.C ////
//// ////
////////////////////////////////////////////////////////////////////////
#INCLUDE <16F876.H>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#ORG 0x1F00,0x1FFF {} //Para 8k Pic 16F876/7 (necesario para bootloader)
#use delay(clock=20000000)
#include <LCD_CCS_4B16x2.c> // Libreria LCD.C modificada
#use I2C(master,sda=PIN_C4,scl=PIN_C3,FORCE_HW)
#define PCF8574_Lectura 0b01000001 // Fija=0100 A0-A1=000 Modo lectura=1
#define PCF8574_Escritura 0b01000000 // Fija=0100 A0-A1=000 Modo escritura=0
int8 conta=0;
signed int8 cod_tecla;
#include <Libreria_tecladoI2c.c>
#INT_EXT
void int_rb0()
{
cod_tecla=escanea_tecla();
}
void main()
{
lcd_init();
lcd_putc("\fTeclado I2C\n"); delay_ms(500);
Teclado_Ini();
enable_interrupts(int_ext);
enable_interrupts(global);
while(TRUE)
{
if(cod_tecla>=0)
{
output_high(PIN_A1);
printf(lcd_putc,"%d %c",cod_tecla,tecla_c(cod_tecla));
delay_ms(100);
output_low(PIN_A1);
cod_tecla=-1; // Necesario para evitar repetirse
}
delay_ms(25);
}
}
En proteus no tengo nada, sorry
Saludos