Спойлер
Код: Выделить всё
...
#define CONCAT(x,y) x ## y
#define DDR(x) CONCAT(DDR,x)
#define PORT(x) CONCAT(PORT,x)
#define PIN(x) CONCAT(PIN,x)
/* KS0108 Data port*/
#define KS0108_D0 B
#define KS0108_D0_LINE (1<<0)
#define KS0108_D1 B
#define KS0108_D1_LINE (1<<1)
#define KS0108_D2 B
#define KS0108_D2_LINE (1<<2)
#define KS0108_D3 B
#define KS0108_D3_LINE (1<<3)
#define KS0108_D4 B
#define KS0108_D4_LINE (1<<4)
#define KS0108_D5 B
#define KS0108_D5_LINE (1<<5)
#define KS0108_D6 B
#define KS0108_D6_LINE (1<<6)
#define KS0108_D7 B
#define KS0108_D7_LINE (1<<7)
...
...
static void ks0108SetPort(uint8_t data)
{
if (data & (1<<0)) PORT(KS0108_D0) |= KS0108_D0_LINE; else PORT(KS0108_D0) &= ~KS0108_D0_LINE;
if (data & (1<<1)) PORT(KS0108_D1) |= KS0108_D1_LINE; else PORT(KS0108_D1) &= ~KS0108_D1_LINE;
if (data & (1<<2)) PORT(KS0108_D2) |= KS0108_D2_LINE; else PORT(KS0108_D2) &= ~KS0108_D2_LINE;
if (data & (1<<3)) PORT(KS0108_D3) |= KS0108_D3_LINE; else PORT(KS0108_D3) &= ~KS0108_D3_LINE;
if (data & (1<<4)) PORT(KS0108_D4) |= KS0108_D4_LINE; else PORT(KS0108_D4) &= ~KS0108_D4_LINE;
if (data & (1<<5)) PORT(KS0108_D5) |= KS0108_D5_LINE; else PORT(KS0108_D5) &= ~KS0108_D5_LINE;
if (data & (1<<6)) PORT(KS0108_D6) |= KS0108_D6_LINE; else PORT(KS0108_D6) &= ~KS0108_D6_LINE;
if (data & (1<<7)) PORT(KS0108_D7) |= KS0108_D7_LINE; else PORT(KS0108_D7) &= ~KS0108_D7_LINE;
return;
}
static void ks0108SetDdr(uint8_t data)
{
if (data & (1<<0)) DDR(KS0108_D0) |= KS0108_D0_LINE; else DDR(KS0108_D0) &= ~KS0108_D0_LINE;
if (data & (1<<1)) DDR(KS0108_D1) |= KS0108_D1_LINE; else DDR(KS0108_D1) &= ~KS0108_D1_LINE;
if (data & (1<<2)) DDR(KS0108_D2) |= KS0108_D2_LINE; else DDR(KS0108_D2) &= ~KS0108_D2_LINE;
if (data & (1<<3)) DDR(KS0108_D3) |= KS0108_D3_LINE; else DDR(KS0108_D3) &= ~KS0108_D3_LINE;
if (data & (1<<4)) DDR(KS0108_D4) |= KS0108_D4_LINE; else DDR(KS0108_D4) &= ~KS0108_D4_LINE;
if (data & (1<<5)) DDR(KS0108_D5) |= KS0108_D5_LINE; else DDR(KS0108_D5) &= ~KS0108_D5_LINE;
if (data & (1<<6)) DDR(KS0108_D6) |= KS0108_D6_LINE; else DDR(KS0108_D6) &= ~KS0108_D6_LINE;
if (data & (1<<7)) DDR(KS0108_D7) |= KS0108_D7_LINE; else DDR(KS0108_D7) &= ~KS0108_D7_LINE;
return;
}

