Pues asi es ... este es el codigo que usé es para presionar una tecla de un teclado 4x4 en el micro master y esta aparece en el esclavo en un lcd...
Para el master ...
Codigo:
#include "16f877.h"
#fuses noprotect,nobrownout,noput,nowdt,nolvp
#use delay(clock=4000000)
#use standard_io(A)
#use standard_io(b)
#use standard_io(d)
#use i2c(MASTER, SDA=PIN_C4, SCL=PIN_C3,FAST,FORCE_HW)
int tecla=0,conta=0,x,corrim=8;
int getkey (conta)
{
i2c_start ();
i2c_write (254);
i2c_write (conta);
i2c_stop ();
output_a (conta);
delay_ms (1000);
}
void main ()
{
conta=0;
while (1){
for (x=0;x<=3;x++)
{
output_b(corrim);
output_d (conta);
if (input(PIN_B4))
{
getkey(conta);
}
conta++;
output_d(conta);
if (input(PIN_B5))
{
getkey(conta);
}
conta++;
output_d(conta);
if (input(PIN_B6))
{
getkey(conta);
}
conta++;
output_d(conta);
if (input(PIN_B7))
{
getkey(conta);
}
conta++;
rotate_right(&corrim,1);
output_d(conta);
}
conta=0;
corrim=8;
}
}
y slave ...
Codigo:
#include "16f877.h"
#use i2c (slave, ADDRESS=254, scl=pin_c3, sda=pin_c4, fast, force_hw)
#use delay(clock=4000000)
#fuses noprotect,nobrownout,noput,nowdt,nolvp
#include "lcd.c"
#use fast_io (C)
#use standard_io (A)
int data;
void main ()
{
set_tris_c (0xff);
lcd_init ();
lcd_putc ("Esperando"
;
while (1)
{
if(~input(PIN_c4))
{
data=i2c_read ();
if (data==254)
{
data=i2c_read ();
lcd_putc ("f"
;
printf (lcd_putc, "El dato es el %i", data);
}
}
}
}
Y funciona, pero tengo unas dudas ...
Primero. No queria usar el i2c_poll y me pregunto si la manera de leer el dato en el esclavo es adecuada
Segundo. Al no usar el i2c_poll creo que no es necesario usar el force_hw
Tercero. Algunas sugerencias o comentarios sobre el programa para mejorar
Cuarto. Se podria hacer que al no presionar ninguna tecla (o al soltarla) de teclado en el micro master, aparezca "esperando" en la pantalla del micro slave?