Итак, я пишу C-программу для интерфейса LCD на 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 на ЖК-дисплей, однако он по-прежнему не отвечает на прерывание.Я хотел знать, есть ли что-то, что я не принимаю во внимание, или моя логика неверна.Спасибо.
Edit: Nvm Я понял это.Моя библиотека LCD сбрасывала регистр портов на 0 всегда, даже когда в 4-битном режиме, поэтому другие неиспользуемые порты также сбрасывались.Я просто изменил библиотеку, чтобы я мог использовать другие порты в 4-битном режиме.