Кириллица в HD44780
Одна из главных проблем, с который могут столкнуться русскоязычные пользователи - нестандартная кодировка кириллических символов. То есть если вы отправите в ЖКИ обычную строку с русскими символами, вместо них на экран будут выведены абраказябры. Связано это с тем, что для экономии места в памяти контроллера тупоголовые разработчики вместо увеличения объема (можно было просто занять свободные ячейки) решили оставить лишь по одной ячейке для символов со сходным начертанием. Так например, буква O или P выглядят одинаково как в кириллице, так и латинице. Неумные инженеры подумали, что так они неистово сократят объем используемой памяти, но сократили лишь функциональность дисплея. И теперь при необходимости вывести русские символы, каждый раз возникает неприятная неприятность в виде несовместимости таблиц HD44780 и ASCII. Выхода есть два, у обоих свои плюсы и минусы:
1. Написать подпрограмму для контроллера, которая на лету будет декодировать ASCII коды и выводить уже правильные символы на ЖКИ. Удобна тем, что позволяет передавать любые строки без опасения, что они будут выведены впоследствии неправильно. Но этот способ требует лишних ресурсов на перекодировку, а также нужно постоянно хранить в памяти таблицу символов.
2. Использовать утилиту для ПК, которая сама переконвертирует нужные строки в нужный формат, которые сразу подставляются в код для вывода. Удобно тем, что не занимает память контроллера, работает быстро и вообще не требует ресурсов для перекодировки. Но минус в том, что в коде программы нужные строки уже не разобрать. Вывод символов в этом фиксированный, то есть выводить можно только заранее выбранный набор строк. При использовании ввода, например, с RS-232, русские символы будут отображены некорректно.
О наличии подпрограмм для первого случая мне известно, но я не встречал ни одной библиотеки или функции на Basom, которая бы выполняла это. Если вы встречали что-то подобное, убедительная просьба прислать это мне.
Похоже, что я реализовал этот первый случай. Только у меня не подпрограмма, а просто небольшой цикл. Надо будет товарищу отписать, если ему это до сих пор интересно.
А конфигурацию я делал так же, только вот "Config lcdmode = PORT" не писал. Попробую ещё раз. Спасибо за наводку на такое полное руководство.
П.С. Пояснение к тому как это работает. Вот код перекодирования:
Код: Выделить всё
'/**
' * Вывод символа из ОЗУ
' */
Sub LCD_PutChar(ByVal Ch As Byte)
Dim CharFromTable As Byte
'// Заглушка, если драйвер не выбран
'if ( Driver == LCD_DRIVER_NONE ) return;
'// Если есть перевод каретки, то переходим на следующую строку
If Ch = Asc( "|" ) Then
LCD_Goto 1, 0
Else
' CharFromTable = CP1251_TO_CPHD44780(Ch)
CharFromTable = Lookup( Ch, CP1251_TO_CPHD44780 )
' Выводим символ, который соответствует таблице индикатора
LCD_WriteData TYPE_DATA, CharFromTable
End If
End Sub
Самая главная часть здесь вот эта:
Код: Выделить всё
' CharFromTable = CP1251_TO_CPHD44780(Ch)
CharFromTable = Lookup( Ch, CP1251_TO_CPHD44780 )
Смысл здесь в том, что CP1251_TO_CPHD44780(256) - массив во флеш-памяти. Используя индекс, численно равный коду символа в кодировке CP1251, мы перемещаемся по таблице символов индикатора и возвращаем код символа в кодировке индикатора.
Пример. Допустим, что мы хотим вывести буковку "ё". Прикинем, какой символ мы должы получить при перекодировании. См. в прикреплённую табличку. Буковка "ё" должна иметь код: HLHH LHLH, что в переводе на русский означает: 1011 0101 или &HB5
А теперь посмотрим, что выдаст мой код. Открываем charmap.exe в Windows. Выбираем любой шрифт с кириллицей. Там найдётся буковка "ё" с кодом: Alt+184. Т.е. это означает, что если вы сейчас где-нить в поле ввода удерживая Alt наберёте 0184, то там появится буковка "ё" (можете это проверить). В hex'е это будет 0184 = &HB8. Теперь смотрим в мою табличку в конце файла: по строкам ищем &HB0, а по столбцам &H08 - там будет число &HB5 (!), т.е. перекодирование произойдёт и мы получим нашу любимую букву "ё", которую вроде как Екатерина ввела в наш обиход и по поводу использования которой есть целое Письмо Минобрнауки РФ от 20.07.2009 N ИК-971/03.
П.С2. Поскольку я не нашёл способа добавить в строку управляющий символ перевода каретки, то использовал символ вертикальной черты для перевода строки. В таблице ЖКИ это второй символ после буквы "z" (12 в верхнем регистре). В коде произошли некоторые изменения.
Код: Выделить всё
' В качестве разделителя строк используется символ вертикальной черты "|".
' Он отсутствует в таблице ЖКИ, поэтому был выбран вместо управляющего
' символа перевода каретки с кодом &H0D, который не удаётся задать в
' строке Bascom.
Text00:
Data "Pinboard II Демо|Bascom AVR"
' |<- Строка1 ->||<Строка2>|
' Вывод на индикатор будет таким:
'
' +----------+
' |Pinboard II Демо|
' |Bascom AVR |
' +----------+
RusText:
Data "Россия навсегда!|Ура, друзья!"
Так гораздо удобнее хранить "интерфейс" окошка.
Исходник:
PBIIDemo.bas