Buehehehehehe.
OK zum beispiel:
Pojedyńcze bity
#define PkT PORTD.7 //deklaracja wyjścia
#define D_L PINB.1 //deklaracja wejścia
PkT = 1;
Jakis_bit = D_L;
ofkorz możesz pisać od razu PORTD.7 = 1, ale to wyżej jest bardziej czytelne.
Co do całych portów to tak samo tyle, że nie nie dopisujesz pinu z portu i dana musi być 8 bitów (np. unsigned char)
To były AVR, w 51 jest jeszcze prościej bo wszystko jest w jednym porcie. Jeżeli masz includa z rejestrami to po prostu:
P0 = Jakas_dana;
Inna_dana = P1,
bity:
sbit B4 = P1^4;
no i B4 = 1
Kilka funkcji do IIC (powstały pod konkretne zastosowanie, więc nie jest to pełna implementacja IIC.
void delay (void)
{
int delay;
for (delay = 0; delay < 10; delay++);
}//end (delay)
//start
void start (void)
{
SCL = 1; delay ();
SDA = 0; delay ();
SCL = 0; delay ();
}//end(start)
//stop
void stop (void)
{
SDA = 0; delay ();
SCL = 1; delay ();
SDA = 1;
}//end(stop)
//potwierdzenie
void ack (void)
{
SDA = 0; delay ();
SCL = 1; delay ();
SCL = 0; delay ();
SDA = 1; delay ();
}//end(ack)
//wyslanie bajtu do IIC
void send_data (unsigned char Data)
{
int p;
SCL = 0; delay ();
for (p = 0;p < 8;p++)
{
if (Data & 0x80)
SDA = 1;
else SDA = 0;
Data <<= 1; delay ();
SCL = 1; delay ();
SCL = 0; delay ();
}
SDA = 1; delay ();
SCL = 1; delay ();
SCL = 0; delay (); delay ();
}//end(send_data)
//wczytanie bajtu
unsigned char get_data (void)
{
unsigned char Data;
int p;
SCL = 0; delay ();
Data = 0;
for (p = 0;p < 8; p++)
{
Data <<= 1;
SCL = 1; delay ();
if (SDA == 1)
Data++;
SCL = 0; delay ();
}
return(Data);
}//end(get_data)
Wyciągnięte z programu dla 51, ale odpowiednia deklaracja SDA i SCL i na AVR też powinno hulać (pod warunkiem, że arbitrażu nie trzeba i kilku innych ustrojstw.
Jak czegoś nie qmasz to pisz, postarmy się rozwiązać...