Как считывать данные непосредственно с ЖК-дисплея
Ссылка на сообщение: ЖК-данные считываются и отображаются на компьютере Было неясно, каков окончательный код. Не могли бы вы снова опубликовать код и схему и, если возможно, объяснение того, как это работает?
Моя проблема:
Мне нужно считывать информацию с ЖК-дисплея 20x4, который управляется ПЛК (который имеет защищенный шестнадцатеричный код), и отправлять данные через последовательный порт.
Для этого я использую arduino one для чтения. Я подключил arduino параллельно к шине передачи данных дисплея, чтобы попытаться прочитать биты и преобразовать позже.
Это схема, которую я использую:
Примечание: я разместил резисторы 1k для извлечения на каждом выводе, чтобы избежать ошибок считывания.
С помощью этого кода:
Проблема в том, что я получаю такие результаты при чтении:
Независимо от того, что появляется на экране, это всегда недопустимые символы. Если кто-нибудь укажет, в чем заключается моя проблема, я буду очень благодарен.
@, 👍0
Обсуждение2 ответа
Я бы рекомендовал отказаться от digitalRead в этом случае - он выполняется последовательно и довольно медленно. Поскольку вам нужно прочитать только 8 строк ввода, рассмотрите возможность использования регистра портов: Arduino Uno поставляется в общей сложности с тремя портами, которые "удерживают" все контакты ввода-вывода. Это такие
- PORTB = Цифровые контакты с 8 по 13 плюс кристаллические контакты.
- PORTC = Аналоговый вход от 0 до 5, вывод сброса
- PORTD = Цифровой вывод от 0 до 7
Поскольку для последовательной связи вам нужны линии RX и TX (цифровой вывод 0 и 1), вам придется разделить сигнал на два регистра.
Я бы рекомендовал подключить D0 через D3 к цифровым выводам с 8 по 11 для первых четырех битов (это означает, что они перейдут к битам с 3 по 0 порта B), а D4 через D7 - к аналоговым выводам с 0 по 3 (это означает, что они перейдут к битам с 3 по 0 порта C). RW поступает на вывод 7, RS - на вывод 6, E - на вывод 5.
Код, который вы затем использовали бы для чтения данных, был бы следующим: uint8_t byte_displaydata = 0x00; uint8_t RW = 7; uint8_t RS = 6; uint8_t E = 5;
void setup() {
Serial.begin(1200); //возможно, немного увеличьте это
pinMode(RW, INPUT); // некоторая скорость теряется по сравнению с манипуляцией регистром, но это, вероятно, незначительный
pinMode(RS, INPUT);
pinMode(E,INPUT);
DDRB &= ~((1 << DDRB0) | (1 << DDRB1) | (1 << DDRB2) | (1 << DDRB3)); // технические данные не требуются, поскольку они инициализируются с 0
DDRC &= ~((1 << DDRC0) | (1 << DDRC1) | (1 << DDRC2) | (1 << DDRC3));
PORTB &= ~((1 << PORTB0) | (1 << PORTB1) | (1 << PORTB2) | (1 << PORTB3)); //отключить внутренние подтягивания
PORTC &= ~((1 << PORTC0) | (1 << PORTC1) | (1 << PORTC2) | (1 << PORTC3));
}
void loop() {
if(digitalRead(RS) == HIGH && digitalRead(E) == HIGH){
byte_displaydata = 0x00; //сбросить byte_displaydata
byte_displaydata = PINB << 4; //вставьте биты PINB от 3 до 0 в биты от 7 до 4
byte_displaydata |= (PINC & 0x0F); //фильтровать биты PINC от 3 до 0 и ИЛИ их в биты результата от 3 до 0
Serial.println(byte_displaydata,BIN);
}
}
Пожалуйста, обратите внимание, что я не тестировал это и только недавно начал работать в AVR / Arduino. Если кто-нибудь сможет это просмотреть, я был бы вам очень признателен.
Источник: Спецификация микросхемы ATmega328P, отображение контактов Arduino
Вероятно, уже слишком поздно для OP, но есть анализатор протоколов для таких ЖК-экранов, которые используют ЖК-драйвер серии HD44780, как, например, обычный LCD1602. Код опубликован здесь:
https://forum.arduino.cc/t/lcd-1602-and-similar-databus-sniffer/675769/11
Скорость передачи данных была бы слишком высокой для Serial.print(), чтобы печатать каждый полученный символ в режиме реального времени, поэтому для консолидации данных используется очередь.
- Печать string and integer LCD
- Как отобразить символ º на ЖК-дисплее?
- Отправка значения с одного Arduino на другой
- Черные квадраты дисплея Arduino 16x2
- NodeMCU с RFID RC522 и LCD-модулем интерфейса I2C вместе
- ЖК-дисплей I2C отображает странные символы
- Экран LCD 16*02 I2C показывает только первый напечатанный символ
- Потенциометр 10 кОм против резистора 10 кОм на ЖК-дисплее
Stack Exchange - это не форум, и ваш "вопрос" не подлежит ответу., @brhans
Дисплей, показанный на вашем изображении, представляет собой дисплей 16x2 LM016L. Почему вы думаете, что ваш "дисплей 20x4" имеет тот же метод управления, что и дисплей LM016L?, @Ale..chenski
Serial.print() будет слишком медленным для этого. Кроме того, ваши резисторы 1K потенциально слишком жесткие, если вам нужен хранитель для неиспользованных линий, попробуйте 10K или больше. В конечном счете, вам нужно либо написать код, основанный на фактическом понимании операций, описанных в спецификации ЖК-дисплея (включая детали синхронизации тактовых данных), либо, если вы просто хотите сделать общий захват для анализа, вам следует вместо этого использовать дешевый логический анализатор на базе USB ala sigrok / pulseview, который имеет шанс иметь достаточную частоту дискретизации для асинхронного захвата операций., @Chris Stratton