Итак, я пишу программу на C для интерфейса ЖК-дисплея в режиме 4-битных данных. Однако мне было интересно, могу ли я использовать остальные 4 бита для чего-то еще, например, для внешнего прерывания. Чтобы быть более конкретным, я использую PORTD для линий данных на Arduino, однако мне также нужен контакт PD2 для использования прерывания INT0 (кнопка). Я заметил, что в своей программе я продолжал устанавливать младшие 4 бита в 0 при отправке команд:
PORTD = cmd & 0xf0;
flashLCD();
PORTD = (cmd & 0x0f) << 4;
Это работает отлично, но устанавливает другие биты в 0. Это вызывается по таймеру, что означает, что я повторно отправляю команды. Поэтому я попытался сохранить предыдущее значение регистра и дополнить его некоторыми побитовыми операциями:
uint8_t initial_state = PORTD;
PORTD = (cmd & 0xf0) | (initial_state & 0x0f);
flashLCD();
PORTD = ((cmd & 0x0f) << 4) | (initial_state & 0x0f)
Он отправляет cmd на ЖК-дисплей, однако по-прежнему не отвечает на прерывание. Я хотел знать, есть ли что-то, что я не принимаю во внимание, или моя логика неверна. Спасибо.
Редактировать: Nvm Я понял это. Моя ЖК-библиотека всегда сбрасывала регистр порта на 0, даже в 4-битном режиме, поэтому другие неиспользуемые порты также сбрасывались. Я только что изменил библиотеку, чтобы использовать другие порты в 4-битном режиме.