Как считывать данные непосредственно с ЖК-дисплея

lcd

Ссылка на сообщение: ЖК-данные считываются и отображаются на компьютере Было неясно, каков окончательный код. Не могли бы вы снова опубликовать код и схему и, если возможно, объяснение того, как это работает?

Моя проблема:

Мне нужно считывать информацию с ЖК-дисплея 20x4, который управляется ПЛК (который имеет защищенный шестнадцатеричный код), и отправлять данные через последовательный порт.

Для этого я использую arduino one для чтения. Я подключил arduino параллельно к шине передачи данных дисплея, чтобы попытаться прочитать биты и преобразовать позже.

Это схема, которую я использую:

Примечание: я разместил резисторы 1k для извлечения на каждом выводе, чтобы избежать ошибок считывания.

С помощью этого кода:

Проблема в том, что я получаю такие результаты при чтении:

Независимо от того, что появляется на экране, это всегда недопустимые символы. Если кто-нибудь укажет, в чем заключается моя проблема, я буду очень благодарен.

, 👍0

Обсуждение

Stack Exchange - это не форум, и ваш "вопрос" не подлежит ответу., @brhans

Дисплей, показанный на вашем изображении, представляет собой дисплей 16x2 LM016L. Почему вы думаете, что ваш "дисплей 20x4" имеет тот же метод управления, что и дисплей LM016L?, @Ale..chenski

Serial.print() будет слишком медленным для этого. Кроме того, ваши резисторы 1K потенциально слишком жесткие, если вам нужен хранитель для неиспользованных линий, попробуйте 10K или больше. В конечном счете, вам нужно либо написать код, основанный на фактическом понимании операций, описанных в спецификации ЖК-дисплея (включая детали синхронизации тактовых данных), либо, если вы просто хотите сделать общий захват для анализа, вам следует вместо этого использовать дешевый логический анализатор на базе USB ala sigrok / pulseview, который имеет шанс иметь достаточную частоту дискретизации для асинхронного захвата операций., @Chris Stratton


2 ответа


1

Я бы рекомендовал отказаться от 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

,

0

Вероятно, уже слишком поздно для OP, но есть анализатор протоколов для таких ЖК-экранов, которые используют ЖК-драйвер серии HD44780, как, например, обычный LCD1602. Код опубликован здесь:

https://forum.arduino.cc/t/lcd-1602-and-similar-databus-sniffer/675769/11

Скорость передачи данных была бы слишком высокой для Serial.print(), чтобы печатать каждый полученный символ в режиме реального времени, поэтому для консолидации данных используется очередь.

,