Код: Выделить всё
static void st7920SetPort(uint8_t data)
{
if (data & (1<<0)) PORT(ST7920_D0) |= ST7920_D0_PIN; else PORT(ST7920_D0) &= ~ST7920_D0_PIN;
if (data & (1<<1)) PORT(ST7920_D1) |= ST7920_D1_PIN; else PORT(ST7920_D1) &= ~ST7920_D1_PIN;
if (data & (1<<2)) PORT(ST7920_D2) |= ST7920_D2_PIN; else PORT(ST7920_D2) &= ~ST7920_D2_PIN;
if (data & (1<<3)) PORT(ST7920_D3) |= ST7920_D3_PIN; else PORT(ST7920_D3) &= ~ST7920_D3_PIN;
if (data & (1<<4)) PORT(ST7920_D4) |= ST7920_D4_PIN; else PORT(ST7920_D4) &= ~ST7920_D4_PIN;
if (data & (1<<5)) PORT(ST7920_D5) |= ST7920_D5_PIN; else PORT(ST7920_D5) &= ~ST7920_D5_PIN;
if (data & (1<<6)) PORT(ST7920_D6) |= ST7920_D6_PIN; else PORT(ST7920_D6) &= ~ST7920_D6_PIN;
if (data & (1<<7)) PORT(ST7920_D7) |= ST7920_D7_PIN; else PORT(ST7920_D7) &= ~ST7920_D7_PIN;
return;
}
Я решение такое же применяю, единственное что я определения не в одном месте описываю (как у вас - дисплей, кнопки, энкодер и прочее...), а в хедерах библиотек, поэтому в каждой либе есть немного своих определений, и их небольшое количество - не напрягают в обычном виде... т.е. все таки по 2 - 3 определения на линию...
Только порт и линию называю по другому... вот так - ST7920_PORT0, ST7920_DDR0, ST7920_PIN0, ST7920_LINE0... вроде все однотипно, никаких лишних макросов (я их не долюбливаю), записи получаются - короче некуда, и сразу понятно что за операция... в общем - я балдю со своего стиля

...
Код: Выделить всё
static void st7920SetPort(uint8_t data)
{
if (data & (1<<0)) ST7920_PORT0 |= ST7920_LINE0; else ST7920_PORT0 &= ~ST7920_LINE0;
if (data & (1<<1)) ST7920_PORT1 |= ST7920_LINE1; else ST7920_PORT1 &= ~ST7920_LINE1;
if (data & (1<<2)) ST7920_PORT2 |= ST7920_LINE2; else ST7920_PORT2 &= ~ST7920_LINE2;
if (data & (1<<3)) ST7920_PORT3 |= ST7920_LINE3; else ST7920_PORT3 &= ~ST7920_LINE3;
if (data & (1<<4)) ST7920_PORT4 |= ST7920_LINE4; else ST7920_PORT4 &= ~ST7920_LINE4;
if (data & (1<<5)) ST7920_PORT5 |= ST7920_LINE5; else ST7920_PORT5 &= ~ST7920_LINE5;
if (data & (1<<6)) ST7920_PORT6 |= ST7920_LINE6; else ST7920_PORT6 &= ~ST7920_LINE6;
if (data & (1<<7)) ST7920_PORT7 |= ST7920_LINE7; else ST7920_PORT7 &= ~ST7920_LINE7;
return;
}
Для управления лнией не удобно использовать название ST7920_D0_PIN, т.к. фрагмент PIN удобнее использовать по прямому назнечению, например так:
Код: Выделить всё
data = 0;
if (ST7920_PIN0 & ST7920_LINE0) data | (1<<0);
if (ST7920_PIN1 & ST7920_LINE1) data | (1<<1);
if (ST7920_PIN2 & ST7920_LINE2) data | (1<<2);
if (ST7920_PIN3 & ST7920_LINE3) data | (1<<3);
if (ST7920_PIN4 & ST7920_LINE4) data | (1<<4);
if (ST7920_PIN5 & ST7920_LINE5) data | (1<<5);
if (ST7920_PIN6 & ST7920_LINE6) data | (1<<6);
if (ST7920_PIN7 & ST7920_LINE7) data | (1<<7);
Вот например управление сдвиговым регистром:
Спойлер
Код: Выделить всё
//настройки портов
#define OUTD_CLK_PORT PORTC
#define OUTD_CLK_DDR DDRC
#define OUTD_CLK_LINE (1<<1)//линия тактирования
#define OUTD_DATA_PORT PORTB
#define OUTD_DATA_DDR DDRB
#define OUTD_DATA_LINE (1<<5)//линия данных
#define OUTD_STROBE_PORT PORTB
#define OUTD_STROBE_DDR DDRB
#define OUTD_STROBE_LINE (1<<4)//линия стробирования
#define OUTD_ACTIVE_PORT PORTC
#define OUTD_ACTIVE_DDR DDRC
#define OUTD_ACTIVE_LINE (1<<0)//перевод выходов сдвиговых регистров из 3-го состоян в активное
А вот параллельное чтение с 16-ти линий:
Спойлер
Код: Выделить всё
//----------
//Определения портов
#define IND_PORT0 PORTB
#define IND_PIN0 PINB
#define IND_LINE0 (1<<2)
#define IND_PORT1 PORTB
#define IND_PIN1 PINB
#define IND_LINE1 (1<<1)
#define IND_PORT2 PORTB
#define IND_PIN2 PINB
#define IND_LINE2 (1<<0)
#define IND_PORT3 PORTD
#define IND_PIN3 PIND
#define IND_LINE3 (1<<7)
#define IND_PORT4 PORTD
#define IND_PIN4 PIND
#define IND_LINE4 (1<<6)
#define IND_PORT5 PORTD
#define IND_PIN5 PIND
#define IND_LINE5 (1<<5)
#define IND_PORT6 PORTB
#define IND_PIN6 PINB
#define IND_LINE6 (1<<7)
#define IND_PORT7 PORTB
#define IND_PIN7 PINB
#define IND_LINE7 (1<<6)
#define IND_PORT8 PORTD
#define IND_PIN8 PIND
#define IND_LINE8 (1<<4)
#define IND_PORT9 PORTD
#define IND_PIN9 PIND
#define IND_LINE9 (1<<3)
#define IND_PORT10 PORTD
#define IND_PIN10 PIND
#define IND_LINE10 (1<<1)
#define IND_PORT11 PORTD
#define IND_PIN11 PIND
#define IND_LINE11 (1<<0)
#define IND_PORT12 PORTC
#define IND_PIN12 PINC
#define IND_LINE12 (1<<5)
#define IND_PORT13 PORTC
#define IND_PIN13 PINC
#define IND_LINE13 (1<<4)
#define IND_PORT14 PORTC
#define IND_PIN14 PINC
#define IND_LINE14 (1<<3)
#define IND_PORT15 PORTC
#define IND_PIN15 PINC
#define IND_LINE15 (1<<2)
//----------
//инициализация библиотеки
void InDataInit (void)
{
/* //включить подтяжку
IN_DATA_PORT0 |= IN_DATA_LINE0; IN_DATA_PORT1 |= IN_DATA_LINE1;
IN_DATA_PORT2 |= IN_DATA_LINE2; IN_DATA_PORT3 |= IN_DATA_LINE3;
IN_DATA_PORT4 |= IN_DATA_LINE4; IN_DATA_PORT5 |= IN_DATA_LINE5;
IN_DATA_PORT6 |= IN_DATA_LINE6; IN_DATA_PORT7 |= IN_DATA_LINE7;
IN_DATA_PORT8 |= IN_DATA_LINE8; IN_DATA_PORT9 |= IN_DATA_LINE9;
IN_DATA_PORT10 |= IN_DATA_LINE10; IN_DATA_PORT11 |= IN_DATA_LINE11;
IN_DATA_PORT12 |= IN_DATA_LINE12; IN_DATA_PORT13 |= IN_DATA_LINE13;
IN_DATA_PORT14 |= IN_DATA_LINE14; IN_DATA_PORT15 |= IN_DATA_LINE15;
*/}
//----------
//функция чтения данных из параллельного порта
uint16_t InDataGet (char negative)
{
uint16_t temp = 0;
//чтение данных сенсоров
if (IND_PIN0 & IND_LINE0) temp |= 0x0001;
if (IND_PIN1 & IND_LINE1) temp |= 0x0002;
if (IND_PIN2 & IND_LINE2) temp |= 0x0004;
if (IND_PIN3 & IND_LINE3) temp |= 0x0008;
if (IND_PIN4 & IND_LINE4) temp |= 0x0010;
if (IND_PIN5 & IND_LINE5) temp |= 0x0020;
if (IND_PIN6 & IND_LINE6) temp |= 0x0040;
if (IND_PIN7 & IND_LINE7) temp |= 0x0080;
if (IND_PIN8 & IND_LINE8) temp |= 0x0100;
if (IND_PIN9 & IND_LINE9) temp |= 0x0200;
if (IND_PIN10 & IND_LINE10) temp |= 0x0400;
if (IND_PIN11 & IND_LINE11) temp |= 0x0800;
if (IND_PIN12 & IND_LINE12) temp |= 0x1000;
if (IND_PIN13 & IND_LINE13) temp |= 0x2000;
if (IND_PIN14 & IND_LINE14) temp |= 0x4000;
if (IND_PIN15 & IND_LINE15) temp |= 0x8000;
if (negative)
return temp;
return ~temp;
}
//----------