Адресация HD44780 DDRAM по второй линии
Я записываю байты в HD44780 display DDRAM для отображения символов, и во второй строке это работает странно. Я использую модель 16x2 и пишу строку "0123456789" с адреса X.
Согласно таблице данных:
В 2-строчном дисплее курсор перемещается на вторую строку, когда он проходит 40-ю цифру первой строки.
Поэтому, когда я устанавливаю X равным 40, строка появляется с начала второй строки. Все идет нормально. Но когда я меняю X на другие значения, это появляется во второй строке:
X=39 ... 123456789
X=40 ... 0123456789
X=41 ... 0123456789
...
X=47 ... 0123456789
X=48 ... 89
X=49 ... 789
...
X=56 ... 0123456789
X=57 ... 0123456789
...
X=64 ... 0123456789
X=65 ... 0123456789
X=66 ... 0123456789
Поскольку адрес X=64, он работает как положено, поэтому увеличение X на единицу смещает строку вправо на 1 символ. В техническом описании также говорится
Однако, когда N равно 0 (однострочный дисплей), AAAAAAA может принимать значения от 00H до 4FH (79). Когда N равно 1 (двухстрочный дисплей), AAAAAAA может быть от 00H до 27H (39) для первой строки и от 40H (64) до 67H (103) для второй строки.
Поэтому вторая строка начинается с 40H (64), а не с 40, кажется. Это путаница? Что за идея между адресами 40-64? Было бы разумно, если бы вторая строка была адресом 28H-40H. Не вижу объяснения в даташите. Кроме того, как работает DDRAM при отображении 20 символов в строке и 4 строк?
@Jan Turoň, 👍0
1 ответ
Лучший ответ:
Ваша путаница в том, что вы смешиваете "цифру" и "байт". Это не одно и то же.
HD44780 никогда не может иметь более двух строк. Если вы посмотрите на блок-схему, вы увидите 16 соединений COM. Это ряды символов - по 8 в строке. Это дает максимум 2 строки текста.
Дисплеи 20 x 4 на самом деле представляют собой дисплеи 40 x 2, но разделенные пополам и сложенные друг в друга. 21-й символ первой строки на самом деле является первым символом 3-й строки.
Эти две строки разделены на два отдельных блока памяти. Один начинается с 0x00, а другой с 0x40. Два блока почти полностью разделены. Между 0x28 и 0x3F вас ничего не интересует. На самом деле эта память может даже не существовать, однако эти адреса могут сопоставляться с другими адресами в памяти. Это будет чисто артефакт внутренней адресации памяти.
Для простоты расшифровки адресов два блока памяти различаются только старшими битами адреса. Таким образом, младшие биты всегда будут одинаковыми для одного и того же места в обеих строках текста. То есть для того же горизонтального положения символов на дисплее первая строка (COL0-COL7) будет иметь тот же адрес в памяти, что и вторая строка (COL8-COL15), за исключением самых значащих битов.
Поскольку HD44780 работает блоками по 40 бит (8 символов, 5 бит на символ) для своих дисплеев и использует «модули расширения», чтобы дать каждому дополнительному блоку по 8 бит (вот почему вы получаете 8, 16, 20, и т. д.) наличие двух строк текста с действительно последовательными адресами памяти сделало бы декодирование адресов излишне трудным. Значит, нет.
Если вы возьмете в качестве примера 3-й символ по горизонтали на дисплее, адрес пикселя в памяти будет (примечание: это адрес пикселя, который в 5 раз превышает адрес символа после данные были сгенерированы из внутреннего набора символов):
Line 1: 0x02 = 0b00000010
Line 2: 0x42 = 0b01000010
Поскольку сама память имеет размер 80 байт и рассчитана на ширину не более 40 символов с 1 или 2 строками, между блоками адресов обязательно должна быть мертвая зона. Если бы адреса были полностью непрерывными, так что первый символ второй строки (символ 40) был бы 40-м адресом в памяти, адреса памяти выглядели бы так:
Line 1: 0x02 = 0b00000010
Line 2: 0x2a = 0b00101010
Сопоставление этих двух адресов с сигналами COM0-COM7 и COM8-COM15 было бы значительно сложнее и потребовало бы гораздо большего усложнения конструкции микросхемы, чего производитель явно не хочет.
Гораздо проще добавить немного логики в элемент управления курсором, который говорит: «Если курсор перемещается из позиции 39 в позицию 40, установите адрес памяти равным 0x40».
Поэтому при выводе последовательных символов на дисплей логика курсора скрывает от вас сегментированную память. Но если вы напрямую манипулируете этой сегментированной памятью, вы должны учитывать эту сегментацию.
- Как отобразить символ º на ЖК-дисплее?
- Потенциометр 10 кОм против резистора 10 кОм на ЖК-дисплее
- Как заставить ЖК-дисплей отображать китайские и японские иероглифы?
- Wemos: дисплей 16x2 ничего не показывает
- Запись значения на 7-сегментный дисплей max7219
- Чтение текста с SD-карты возвращает странные символы
- Как подключить этот последовательный дисплей SPI к Arduino?
- Serial.print печатает, а lcd.print - нет.
Понятно, я пропустил разговоры о выводах SEG и COM как о черном ящике и перешел к части инструкций. Теперь понятно., @Jan Turoň