Возможно, такой код и будет чуть медленнее (а может, и нет, с учётом имеющихся ассемблерных инструкций установки/сброса бита, более быстрых, чем "длинные" сдвиги), но зато его легко модифицировать в случае изменения назначения пинов (скажем, плата оказывается проще при другой конфигурации).
Код: Выделить всё
#define CONCAT(x,y) x ## y
#define PORT(x) CONCAT(PORT,x)
#define SET(x) (PORT(x) |= x ## _LINE)
#define CLR(x) (PORT(x) &= ~x ## _LINE)
#define D0 C
#define D0_LINE (1<<1)
#define D1 C
#define D1_LINE (1<<2)
#define D2 C
#define D2_LINE (1<<3)
#define D3 C
#define D3_LINE (1<<4)
#define D4 C
#define D4_LINE (1<<5)
#define D5 C
#define D5_LINE (1<<7)
#define D6 B
#define D6_LINE (1<<6)
#define D7 B
#define D7_LINE (1<<7)
static void setPort(uint8_t data)
{
if (data & (1 << 0)) SET(D0); else CLR(D0);
if (data & (1 << 1)) SET(D1); else CLR(D1);
if (data & (1 << 2)) SET(D2); else CLR(D2);
if (data & (1 << 3)) SET(D3); else CLR(D3);
if (data & (1 << 4)) SET(D4); else CLR(D4);
if (data & (1 << 5)) SET(D5); else CLR(D5);
if (data & (1 << 6)) SET(D6); else CLR(D6);
if (data & (1 << 7)) SET(D7); else CLR(D7);
}
Спойлер
1) Исходная строка:Код: Выделить всё
if (data & (1 << 0)) SET(D0); else CLR(D0);Код: Выделить всё
if (data & (1 << 0)) (PORT(D0) |= D0 ## _LINE); else (PORT(D0) &= ~D0 ## _LINE);Код: Выделить всё
if (data & (1 << 0)) (PORT(D0) |= D0_LINE); else (PORT(D0) &= ~D0_LINE);Код: Выделить всё
if (data & (1 << 0)) CONCAT(PORT,D0) |= D0_LINE); else CONCAT(PORT,D0) &= ~D0_LINE);Код: Выделить всё
if (data & (1 << 0)) PORT ## D0 |= D0_LINE); else PORT ## D0 &= ~D0_LINE);Код: Выделить всё
if (data & (1 << 0)) PORT ## C |= (1<<1); else PORT ## C &= ~(1<<1);Код: Выделить всё
if (data & (1 << 0)) PORTC |= (1<<1); else PORTC &= ~(1<<1);