Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Примеры применения в среде Баском » ! Исследование LCD на базе HD44780 ( только вывод информации!). !


! Исследование LCD на базе HD44780 ( только вывод информации!). !

Сообщений 1 страница 13 из 13

1

Различные варианты вывода информации на LCD, а именно большие цифры, большие цифры + маленькие цифры + буквы русского алфавита, бегущая строка.

Исходник LCD16x4 большие цифры

'*******************************************************************************
'*****************                                   ***************************
'*****************       Конфигурация программы      ***************************
'*****************           и контроллера           ***************************
'*****************                                   ***************************
'*******************************************************************************
  $regfile = "m8def.dat" : $crystal = 1000000 : $framesize = 0 : $hwstack = 0 : $swstack = 0 : $baud = 4800       '1200     '2400     '4800     '9600     '19200     '38400     '57600     '115000
'*******************************************************************************
'-------------------------------------------------------------------------------
'*******************************************************************************
'**************************     Конфигурация LCD     ***************************
'*******************************************************************************
'-------------------------------------------------------------------------------
' Выводы МК к которым подключен LCD, !!! Обратите внимание, библиотеки не используются, выводы могут быть любые
'-------------------------------------------------------------------------------
  Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.1 , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5
  Config Lcd = 16 * 4       ' Используемый LCD
  Initlcd       ' Инициализируем LCD
  Waitms 50       ' Ждем пока все запустится
  Cursor Off Noblink       ' Выключаем неморгающий курсор
'  Cursor On Noblink         ' Включаем неморгающий курсор
'  Cursor On Blink           ' Включаем моргающий курсор
  Cls       ' Чистим экран, на всякий случай
'-------------------------------------------------------------------------------
'Upperline  1 строка, Lowerline  2 строка, Thirdline  3 строка, Fourthline 4 строка  - один из вариантов перехода на строку
'-------------------------------------------------------------------------------
'--------------------- Графика для формирования цифр ---------------------------
'-------------------------------------------------------------------------------
  Deflcdchar 1 , 31 , 31 , 32 , 32 , 32 , 32 , 32 , 32       ' replace [x] with number (0-7)
  Deflcdchar 2 , 32 , 32 , 32 , 32 , 32 , 32 , 31 , 31       ' replace [x] with number (0-7)
  Deflcdchar 3 , 31 , 31 , 32 , 32 , 32 , 32 , 31 , 31       ' replace [x] with number (0-7)
  Deflcdchar 4 , 31 , 31 , 31 , 31 , 31 , 31 , 31 , 31       ' replace [x] with number (0-7)
  Deflcdchar 5 , 32 , 32 , 32 , 32 , 32 , 14 , 14 , 14       ' точка
  Deflcdchar 6 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32       ' пробел
  Deflcdchar 7 , 32 , 32 , 31 , 31 , 31 , 31 , 32 , 32       ' replace [x] with number (0-7)
'-------------------------------------------------------------------------------
'-------------   Переменные для подпрограммы вывода больших цифр   -------------
'-------------------------------------------------------------------------------
  Dim Цикл_1 As Byte , Цикл_2 As Byte , X1 As Byte , X2 As Byte , Y As Byte
  Dim Выводимая_строка_big As String * 6 , Большие_цифры_lcd As String * 6
  Dim Большие_символы_верх As String * 6 , Большие_символы_низ As String * 6
'-------------------------------------------------------------------------------
'--------------------   Подпрограммы вывода больших цифр   ---------------------
'-------------------------------------------------------------------------------
  Declare Sub Формирование_больших_цифр()       ' Подпрограмма вывода больших цифр
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
'------------------   Конфигурация выхода для светодиодика   -------------------
'-------------------------------------------------------------------------------
  Config Portd.7 = Output       ' Натраиваем порт на выход
  Светодиод Alias Portd.7       ' Присваиваем собственное имя ножке порта контроллера
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
'-----------------------------   Переменные   ----------------------------------
'-------------------------------------------------------------------------------
  Dim A_byte As Byte , B_byte As Byte
  Dim A_word As Word , B_word As Word
  Dim A_single As Single , B_single As Single
  Dim A_integer As Integer , B_integer As Integer
  Dim A_string As String * 5 , B_string As String * 5

'-------------------------------------------------------------------------------
'----------------------------   Подпрограммы   ---------------------------------
'-------------------------------------------------------------------------------

'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
   A_word = 0       ' Начальные значения переменных
   B_word = 9999       ' Начальные значения переменных
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
'-----------------------   Оcновной_цикл_программы   ---------------------------
'-------------------------------------------------------------------------------
  Do
  Главный_цикл:
'-------------------------------------

     Incr A_word       ' Увеличиваем переменную
     If A_word = 9999 Then A_word = 0       ' Если больше 9999, сбрасываем в 0

     Decr B_word       ' Уменьшаем переменную
     If B_word = 0 Then B_word = 9999       ' Если достигло 0, пишем в переменную 9999

     Большие_символы_верх = Str(a_word)       ' Делаем строковой, выводимую переменную

     Большие_символы_низ = Str(b_word)       ' Делаем строковой, выводимую переменную

     Call Формирование_больших_цифр       ' Переходим к подпрограмме вывода больших символов

     Waitms 200

     Toggle Светодиод       ' Моргаем светодоидиком ( типа, все нормально, ещё не зависли)
'------------------------------------
  Goto Главный_цикл
  Loop
End
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
  Sub Формирование_больших_цифр:
'-------------------------------------------------------------------------------

'-------------------------------------------------------------------------------

    Большие_символы_верх = Format(большие_символы_верх , "   0")       'форматируем выводимую переменную
    Большие_символы_низ = Format(большие_символы_низ , "   0")       'форматируем выводимую переменную

    X1 = 1       ' Координаты места вывода
    X2 = 2       ' Координаты места вывода
    Y = 1       ' Координаты места вывода

    For Цикл_1 = 1 To 2
      If Цикл_1 = 1 Then
        Выводимая_строка_big = Большие_символы_верх
          Else
            Выводимая_строка_big = Большие_символы_низ
              End If
        For Цикл_2 = 1 To 5
          Большие_цифры_lcd = Mid(выводимая_строка_big , Цикл_2 , 1)       'разбиваем на цифры
'-------------------------------------------------------------------------------
'------------------------- Большие цифры ---------------------------------------
'-------------------------------------------------------------------------------
        Select Case Большие_цифры_lcd       'выбираем выводимый символ
'-------------------------------------------------------------------
          Case "0" :
                     Locate X1 , Y : Lcd Chr(4) ; Chr(1) ; Chr(4)
                     Locate X2 , Y : Lcd Chr(4) ; Chr(2) ; Chr(4)
'-------------------------------------------------------------------
          Case "1":
                    Locate X1 , Y : Lcd Chr(1) ; Chr(4) ; Chr(6)
                    Locate X2 , Y : Lcd Chr(2) ; Chr(4) ; Chr(2)
'-------------------------------------------------------------------
          Case "2":
                    Locate X1 , Y : Lcd Chr(3) ; Chr(3) ; Chr(4)
                    Locate X2 , Y : Lcd Chr(4) ; Chr(2) ; Chr(2)
'-------------------------------------------------------------------
          Case "3":
                    Locate X1 , Y : Lcd Chr(1) ; Chr(3) ; Chr(4)
                    Locate X2 , Y : Lcd Chr(2) ; Chr(2) ; Chr(4)
'-------------------------------------------------------------------
          Case "4":
                    Locate X1 , Y : Lcd Chr(4) ; Chr(2) ; Chr(4)
                    Locate X2 , Y : Lcd Chr(6) ; Chr(6) ; Chr(4)
'-------------------------------------------------------------------
          Case "5":
                    Locate X1 , Y : Lcd Chr(4) ; Chr(3) ; Chr(3)
                    Locate X2 , Y : Lcd Chr(2) ; Chr(2) ; Chr(4)
'-------------------------------------------------------------------
          Case "6":
                    Locate X1 , Y : Lcd Chr(4) ; Chr(3) ; Chr(3)
                    Locate X2 , Y : Lcd Chr(4) ; Chr(2) ; Chr(4)
'-------------------------------------------------------------------
          Case "7":
                    Locate X1 , Y : Lcd Chr(1) ; Chr(1) ; Chr(4)
                    Locate X2 , Y : Lcd Chr(6) ; Chr(6) ; Chr(4)
'-------------------------------------------------------------------
          Case "8":
                    Locate X1 , Y : Lcd Chr(4) ; Chr(3) ; Chr(4)
                    Locate X2 , Y : Lcd Chr(4) ; Chr(2) ; Chr(4)
'-------------------------------------------------------------------
          Case "9":
                    Locate X1 , Y : Lcd Chr(4) ; Chr(3) ; Chr(4)
                    Locate X2 , Y : Lcd Chr(2) ; Chr(2) ; Chr(4)
'-------------------------------------------------------------------
          Case ":":
                    Locate X1 , Y : Lcd Chr(7)
                    Locate X2 , Y : Lcd Chr(7)
                    Y = Y - 2
'-------------------------------------------------------------------
          Case ".":
                    Y = Y - 1
                    Locate X1 , Y : Lcd Chr(6)
                    Locate X2 , Y : Lcd Chr(5)
                    Y = Y - 2
'-------------------------------------------------------------------
          Case " ":
                    Locate X1 , Y : Lcd Chr(6)
                    Locate X2 , Y : Lcd Chr(6)
'-------------------------------------------------------------------
            End Select
          Y = Y + 4
        Next Цикл_2
       X1 = 3 : X2 = 4 : Y = 1
    Next Цикл_1
  End Sub
'-------------------------------------------------------------------------------
'*******************************************************************************
End

Исходник  LCD20x2 бегущая строка на двух языках

'*******************************************************************************
'*****************                                   ***************************
'*****************       Конфигурация программы      ***************************
'*****************           и контроллера           ***************************
'*****************                                   ***************************
'*******************************************************************************
  $regfile = "m8def.dat" : $crystal = 8000000 : $framesize = 0 : $hwstack = 0 : $swstack = 0 : $baud = 4800       '1200     '2400     '4800     '9600     '19200     '38400     '57600     '115000
'*******************************************************************************
'-------------------------------------------------------------------------------
'*******************************************************************************
'**************************     Конфигурация LCD     ***************************
'*******************************************************************************
'-------------------------------------------------------------------------------
' Выводы МК к которым подключен LCD, !!! Обратите внимание, библиотеки не используются, выводы могут быть любые
'-------------------------------------------------------------------------------
  Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.1 , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5
'-------------------------------------------------------------------------------
  Config Lcd = 20 * 2       ' Используемый LCD
  Initlcd       ' Инициализируем LCD
  Waitms 50       ' Ждем пока все запустится
  Cursor Off Noblink       ' Выключаем неморгающий курсор
'  Cursor On Noblink         ' Включаем неморгающий курсор
'  Cursor On Blink           ' Включаем моргающий курсор
  Cls       ' Чистим экран, на всякий случай
'-------------------------------------------------------------------------------
'Upperline  1 строка, Lowerline  2 строка, Thirdline  3 строка, Fourthline 4 строка  - один из вариантов перехода на строку
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
'-----------------------------   Переменные   ----------------------------------
'-------------------------------------------------------------------------------
Dim A As Byte
Dim X As Byte
Dim Y As Byte
Dim Позиция As Byte
Dim Пробелы As String * 22
Dim Вывод_на_lcd As String * 21
Dim Количество_пробелов As Byte
Dim Текст_сообщения As String * 214
Dim Выводимое_сообщение As String * 254
Dim Количество_знаков_в_сообщении As Byte
'-------------------------------------------------------------------------------
'----------------------------   Подпрограммы   ---------------------------------
'-------------------------------------------------------------------------------
Declare Sub Бегущая_строка()
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
'  Текст_сообщения = "01.07.2013 Пример вывода информации в режиме бегущей строки. Максимальное количество символов 254. Пользуйтесь на здоровье. Удачи!"
'  Текст_сообщения = "01.07.2013 Ёpёјep іГіoгa ёЅдopјaеёё і pe¶ёјe Іeґyжe№ cїpoєё. Maєcёјa»ДЅoe єo»ёАecїіo cёјіo»oі 254. Ёo»Д·y№їecД Ѕa ·гopoіДe. ©гaАё!"

'  Текст_сообщения = "01.07.2013 Sample output information in a marquee. Maximum number of characters 254. Use of health. Good luck!"
'------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
'-----------------------   Оcновной_цикл_программы   ---------------------------
'-------------------------------------------------------------------------------
  Do
  Главный_цикл:
'-------------------------------------

    Текст_сообщения = Lookupstr(a , Выводимые_сообщения)

    Call Бегущая_строка

    Incr A
    If A > 1 Then A = 0

'------------------------------------
  Goto Главный_цикл
  Loop
End
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
Бегущая_строка:
'-------------------------------------------------------------------------------
X = 1 : Y = 1

Пробелы = String(20 , 30)

Количество_знаков_в_сообщении = Len(текст_сообщения)

Количество_знаков_в_сообщении = Количество_знаков_в_сообщении + 40

If Количество_знаков_в_сообщении > 40 Then
Количество_знаков_в_сообщении = Количество_знаков_в_сообщении - 20
End If

Выводимое_сообщение = Пробелы + Текст_сообщения + Пробелы

Do

Позиция = 0

While Позиция < Количество_знаков_в_сообщении
Incr Позиция

Вывод_на_lcd = Mid(выводимое_сообщение , Позиция , 20)

Locate X , Y
Lcd Вывод_на_lcd
Waitms 200
Wend
Cls
  X = X + 1
Loop Until X = 3
'---------
Return
'-------------------------------------------------------------------------------
'*******************************************************************************

'*******************************************************************************
'-------------------------------------------------------------------------------
  Выводимые_сообщения:
'-------------------------------------------------------------------------------
'  Data "01.07.2013 Пример вывода информации в режиме бегущей строки. Максимальное количество символов 254. Пользуйтесь на здоровье. Удачи!"
  Data "01.07.2013 Ёpёјep іГіoгa ёЅдopјaеёё і pe¶ёјe Іeґyжe№ cїpoєё. Maєcёјa»ДЅoe єo»ёАecїіo cёјіo»oі 254. Ёo»Д·y№їecД Ѕa ·гopoіДe. ©гaАё!"
  Data "01.07.2013 Sample output information in a marquee. Maximum number of characters 254. Use of health. Good luck!"
'-------------------------------------------------------------------------------
'*******************************************************************************

Исходник  LCD40x2 бегущая строка на двух языках

'*******************************************************************************
'*****************                                   ***************************
'*****************       Конфигурация программы      ***************************
'*****************           и контроллера           ***************************
'*****************                                   ***************************
'*******************************************************************************
  $regfile = "m8def.dat" : $crystal = 1000000 : $framesize = 0 : $hwstack = 0 : $swstack = 0 : $baud = 4800       '1200     '2400     '4800     '9600     '19200     '38400     '57600     '115000
'*******************************************************************************
'-------------------------------------------------------------------------------
'*******************************************************************************
'**************************     Конфигурация LCD     ***************************
'*******************************************************************************
'-------------------------------------------------------------------------------
' Выводы МК к которым подключен LCD, !!! Обратите внимание, библиотеки не используются, выводы могут быть любые
'-------------------------------------------------------------------------------
  Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.1 , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5
'-------------------------------------------------------------------------------
  Config Lcd = 40 * 2       ' Используемый LCD
  Initlcd       ' Инициализируем LCD
  Waitms 50       ' Ждем пока все запустится
  Cursor Off Noblink       ' Выключаем неморгающий курсор
'  Cursor On Noblink         ' Включаем неморгающий курсор
'  Cursor On Blink           ' Включаем моргающий курсор
  Cls       ' Чистим экран, на всякий случай
'-------------------------------------------------------------------------------
'Upperline  1 строка, Lowerline  2 строка, Thirdline  3 строка, Fourthline 4 строка  - один из вариантов перехода на строку
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
'-----------------------------   Переменные   ----------------------------------
'-------------------------------------------------------------------------------
Dim A As Byte
Dim X As Byte
Dim Y As Byte
Dim Позиция As Byte
Dim Пробелы As String * 22
Dim Вывод_на_lcd As String * 21
Dim Количество_пробелов As Byte
Dim Текст_сообщения As String * 214
Dim Выводимое_сообщение As String * 254
Dim Количество_знаков_в_сообщении As Byte
'-------------------------------------------------------------------------------
'----------------------------   Подпрограммы   ---------------------------------
'-------------------------------------------------------------------------------
Declare Sub Бегущая_строка()
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
'  Текст_сообщения = "01.07.2013 Пример вывода информации в режиме бегущей строки. Максимальное количество символов 254. Пользуйтесь на здоровье. Удачи!"
'  Текст_сообщения = "01.07.2013 Ёpёјep іГіoгa ёЅдopјaеёё і pe¶ёјe Іeґyжe№ cїpoєё. Maєcёјa»ДЅoe єo»ёАecїіo cёјіo»oі 254. Ёo»Д·y№їecД Ѕa ·гopoіДe. ©гaАё!"

'  Текст_сообщения = "01.07.2013 Sample output information in a marquee. Maximum number of characters 254. Use of health. Good luck!"
'------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
'-----------------------   Оcновной_цикл_программы   ---------------------------
'-------------------------------------------------------------------------------
  Do
  Главный_цикл:
'-------------------------------------

    Текст_сообщения = Lookupstr(a , Выводимые_сообщения)

    Call Бегущая_строка

    Incr A
    If A > 1 Then A = 0

'------------------------------------
  Goto Главный_цикл
  Loop
End
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
Бегущая_строка:
'-------------------------------------------------------------------------------
X = 1 : Y = 1

Пробелы = String(40 , 30)

Количество_знаков_в_сообщении = Len(текст_сообщения)

Количество_знаков_в_сообщении = Количество_знаков_в_сообщении + 80

If Количество_знаков_в_сообщении > 40 Then
Количество_знаков_в_сообщении = Количество_знаков_в_сообщении - 40
End If

Выводимое_сообщение = Пробелы + Текст_сообщения + Пробелы

Do

Позиция = 0

While Позиция < Количество_знаков_в_сообщении
Incr Позиция

Вывод_на_lcd = Mid(выводимое_сообщение , Позиция , 40)

Locate X , Y
Lcd Вывод_на_lcd
Waitms 75
Wend
Cls
  X = X + 1
Loop Until X = 3
'---------
Return
'-------------------------------------------------------------------------------
'*******************************************************************************

'*******************************************************************************
'-------------------------------------------------------------------------------
  Выводимые_сообщения:
'-------------------------------------------------------------------------------
'  Data "01.07.2013 Пример вывода информации в режиме бегущей строки. Максимальное количество символов 254. Пользуйтесь на здоровье. Удачи!"
  Data "01.07.2013 Ёpёјep іГіoгa ёЅдopјaеёё і pe¶ёјe Іeґyжe№ cїpoєё. Maєcёјa»ДЅoe єo»ёАecїіo cёјіo»oі 254. Ёo»Д·y№їecД Ѕa ·гopoіДe. ©гaАё!"
  Data "01.07.2013 Sample output information in a marquee. Maximum number of characters 254. Use of health. Good luck!"
'-------------------------------------------------------------------------------
'*******************************************************************************

Исходник LCD20x4 большие цифры + маленькие цифры + буквы русского алфавита

'*******************************************************************************
'*****************                                   ***************************
'*****************       Конфигурация программы      ***************************
'*****************           и контроллера           ***************************
'*****************                                   ***************************
'*******************************************************************************
  $regfile = "m8def.dat" : $crystal = 1000000 : $framesize = 0 : $hwstack = 0 : $swstack = 0 : $baud = 4800       '1200     '2400     '4800     '9600     '19200     '38400     '57600     '115000
'*******************************************************************************
'-------------------------------------------------------------------------------
'*******************************************************************************
'**************************     Конфигурация LCD     ***************************
'*******************************************************************************
'-------------------------------------------------------------------------------
' Выводы МК к которым подключен LCD, !!! Обратите внимание, библиотеки не используются, выводы могут быть любые
'-------------------------------------------------------------------------------
  Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.1 , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5
'-------------------------------------------------------------------------------
  Config Lcd = 20 * 4       ' Используемый LCD
  Initlcd       ' Инициализируем LCD
  Waitms 50       ' Ждем пока все запустится
  Cursor Off Noblink       ' Выключаем неморгающий курсор
'  Cursor On Noblink         ' Включаем неморгающий курсор
'  Cursor On Blink           ' Включаем моргающий курсор
  Cls       ' Чистим экран, на всякий случай
'-------------------------------------------------------------------------------
'Upperline  1 строка, Lowerline  2 строка, Thirdline  3 строка, Fourthline 4 строка  - один из вариантов перехода на строку
'-------------------------------------------------------------------------------
'--------------------- Графика для формирования цифр ---------------------------
'-------------------------------------------------------------------------------
  Deflcdchar 1 , 31 , 31 , 32 , 32 , 32 , 32 , 32 , 32       ' replace [x] with number (0-7)
  Deflcdchar 2 , 32 , 32 , 32 , 32 , 32 , 32 , 31 , 31       ' replace [x] with number (0-7)
  Deflcdchar 3 , 31 , 31 , 32 , 32 , 32 , 32 , 31 , 31       ' replace [x] with number (0-7)
  Deflcdchar 4 , 31 , 31 , 31 , 31 , 31 , 31 , 31 , 31       ' replace [x] with number (0-7)
  Deflcdchar 5 , 32 , 32 , 32 , 32 , 32 , 14 , 14 , 14       ' точка
  Deflcdchar 6 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32       ' пробел
  Deflcdchar 7 , 32 , 32 , 31 , 31 , 31 , 31 , 32 , 32       ' replace [x] with number (0-7)
'-------------------------------------------------------------------------------
'-------------   Переменные для подпрограммы вывода больших цифр   -------------
'-------------------------------------------------------------------------------
  Dim Цикл_1 As Byte , Цикл_2 As Byte , X1 As Byte , X2 As Byte , Y As Byte
  Dim Выводимая_строка_big As String * 6 , Большие_цифры_lcd As String * 6
  Dim Большие_символы_верх As String * 6 , Большие_символы_низ As String * 6
'-------------------------------------------------------------------------------
'--------------------   Подпрограммы вывода больших цифр   ---------------------
'-------------------------------------------------------------------------------
  Declare Sub Формирование_больших_цифр()       ' Подпрограмма вывода больших цифр
'-------------------------------------------------------------------------------
'-----------    Подпрограмма вывода русского текста на LCD HD44780   -----------
'-------------------------------------------------------------------------------
  Declare Sub Lcd_print(byval Копия_lcd_print As String)       ' Подпрограмма вывода русского текста на LCD HD44780
'-------------------------------------------------------------------------------
  Dim Длина As Integer , Цикл_lcd_print As Integer
  Dim Код_символа As Byte , Код_символа_lcd As Byte
  Dim Символ_lcd As String * 1 , Символ As String * 1 , Вывод_на_lcd As String * 20
'-------------------------------------------------------------------------------
  Dim Строка_lcd As Byte , Курсор_lcd As Byte , Цикл_lcd As Byte
  Dim Буфер_lcd As String * 20
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
'------------------   Конфигурация выхода для светодиодика   -------------------
'-------------------------------------------------------------------------------
  Config Portd.7 = Output       ' Натраиваем порт на выход
  Светодиод Alias Portd.7       ' Присваиваем собственное имя ножке порта контроллера
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
'-----------------------------   Переменные   ----------------------------------
'-------------------------------------------------------------------------------
  Dim A_byte As Byte , B_byte As Byte , C_byte As Byte , D_byte As Byte
  Dim A_word As Word , B_word As Word , C_word As Word , D_word As Word
  Dim A_single As Single , B_single As Single , C_single As Single , D_single As Single
  Dim A_integer As Integer , B_integer As Integer , C_integer As Integer , D_integer As Integer
  Dim A_string As String * 5 , B_string As String * 5 , C_string As String * 5 , D_string As String * 5
'-------------------------------------------------------------------------------
'----------------------------   Подпрограммы   ---------------------------------
'-------------------------------------------------------------------------------

'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
   A_byte = 0       ' Начальные значения переменных
   B_byte = 0       ' Начальные значения переменных
   A_word = 0       ' Начальные значения переменных
   B_word = 9999       ' Начальные значения переменных
   C_word = 1111       ' Начальные значения переменных
   D_word = 8888       ' Начальные значения переменных
   C_string = ""       ' Начальные значения переменных
   D_string = ""       ' Начальные значения переменных
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
'-----------------------   Оcновной_цикл_программы   ---------------------------
'-------------------------------------------------------------------------------
  Do
  Главный_цикл:
'-------------------------------------

     Incr A_word       ' Увеличиваем переменную
     If A_word = 9999 Then A_word = 0       ' Если больше 9999, сбрасываем в 0

     Decr B_word       ' Уменьшаем переменную
     If B_word = 0 Then B_word = 9999       ' Если достигло 0, пишем в переменную 9999

     Incr C_word       ' Увеличиваем переменную
     If C_word = 8888 Then C_word = 1111       ' Если больше 9999, сбрасываем в 0

     C_string = Str(c_word)       ' Преобразуем переменную "Word"( числовая ), в переменную "String" ( строковая )
     C_string = Format(c_string , "   0")       ' Форматируем, как нам надо ( в данном случае, убираем незначащие "0", ровняем по правому краю )

     Decr D_word       ' Уменьшаем переменную
     If D_word = 1111 Then D_word = 8888       ' Если достигло 0, пишем в переменную 9999

     D_string = Str(d_word)       ' Преобразуем переменную "Word"( числовая ), в переменную "String" ( строковая )
     D_string = Format(d_string , "   0")       ' Форматируем, как нам надо ( в данном случае, убираем незначащие "0", ровняем по правому краю )

     Большие_символы_верх = Str(a_word)       ' Делаем строковой, выводимую переменную

     Большие_символы_низ = Str(b_word)       ' Делаем строковой, выводимую переменную

     Call Формирование_больших_цифр       ' Переходим к подпрограмме вывода больших символов

     Locate 3 , 17       ' Указываем начальное положение знакоместа
     Lcd C_string       ' Выводим переменную на LCD

     Locate 4 , 17       ' Указываем начальное положение знакоместа
     Lcd D_string       ' Выводим переменную на LCD

     Incr A_byte       ' Увеличиваем переменную на 1
     If A_byte > 7 Then A_byte = 0       ' Если достигли, обнуляем

     Буфер_lcd = Lookupstr(a_byte , Выводимый_русский_текст )       ' Берем выводимый текст из таблицы "Выводимый_русский_текст", ( искать внизу исходника )

     Строка_lcd = 1       ' Указываем номер строки
     Курсор_lcd = 17       ' Указываем начальное положение знакоместа

     Lcd_print Буфер_lcd       ' Выводим переменную на LCD с пощью подпрограммы "Lcd_print"

     Incr B_byte       ' Увеличиваем переменную на 1
     If B_byte > 17 Then B_byte = 0       ' Если достигли, обнуляем

     Буфер_lcd = Lookupstr(b_byte , Выводимый_русский_алфавит )       ' Берем выводимый текст из таблицы "Выводимый_русский_алфавит", ( искать внизу исходника )

     Строка_lcd = 2       ' Указываем номер строки
     Курсор_lcd = 17       ' Указываем начальное положение знакоместа

     Lcd_print Буфер_lcd       ' Выводим переменную на LCD с пощью подпрограммы "Lcd_print"


     Waitms 200

     Toggle Светодиод       ' Моргаем светодоидиком ( типа, все нормально, ещё не зависли)
'------------------------------------
  Goto Главный_цикл
  Loop
End
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
  Sub Формирование_больших_цифр:
'-------------------------------------------------------------------------------

'-------------------------------------------------------------------------------

    Большие_символы_верх = Format(большие_символы_верх , "   0")       'форматируем выводимую переменную
    Большие_символы_низ = Format(большие_символы_низ , "   0")       'форматируем выводимую переменную

    X1 = 1       ' Координаты места вывода
    X2 = 2       ' Координаты места вывода
    Y = 1       ' Координаты места вывода

    For Цикл_1 = 1 To 2
      If Цикл_1 = 1 Then
        Выводимая_строка_big = Большие_символы_верх
          Else
            Выводимая_строка_big = Большие_символы_низ
              End If
        For Цикл_2 = 1 To 5
          Большие_цифры_lcd = Mid(выводимая_строка_big , Цикл_2 , 1)       'разбиваем на цифры
'-------------------------------------------------------------------------------
'------------------------- Большие цифры ---------------------------------------
'-------------------------------------------------------------------------------
        Select Case Большие_цифры_lcd       'выбираем выводимый символ
'-------------------------------------------------------------------
          Case "0" :
                     Locate X1 , Y : Lcd Chr(4) ; Chr(1) ; Chr(4)
                     Locate X2 , Y : Lcd Chr(4) ; Chr(2) ; Chr(4)
'-------------------------------------------------------------------
          Case "1":
                    Locate X1 , Y : Lcd Chr(1) ; Chr(4) ; Chr(6)
                    Locate X2 , Y : Lcd Chr(2) ; Chr(4) ; Chr(2)
'-------------------------------------------------------------------
          Case "2":
                    Locate X1 , Y : Lcd Chr(3) ; Chr(3) ; Chr(4)
                    Locate X2 , Y : Lcd Chr(4) ; Chr(2) ; Chr(2)
'-------------------------------------------------------------------
          Case "3":
                    Locate X1 , Y : Lcd Chr(1) ; Chr(3) ; Chr(4)
                    Locate X2 , Y : Lcd Chr(2) ; Chr(2) ; Chr(4)
'-------------------------------------------------------------------
          Case "4":
                    Locate X1 , Y : Lcd Chr(4) ; Chr(2) ; Chr(4)
                    Locate X2 , Y : Lcd Chr(6) ; Chr(6) ; Chr(4)
'-------------------------------------------------------------------
          Case "5":
                    Locate X1 , Y : Lcd Chr(4) ; Chr(3) ; Chr(3)
                    Locate X2 , Y : Lcd Chr(2) ; Chr(2) ; Chr(4)
'-------------------------------------------------------------------
          Case "6":
                    Locate X1 , Y : Lcd Chr(4) ; Chr(3) ; Chr(3)
                    Locate X2 , Y : Lcd Chr(4) ; Chr(2) ; Chr(4)
'-------------------------------------------------------------------
          Case "7":
                    Locate X1 , Y : Lcd Chr(1) ; Chr(1) ; Chr(4)
                    Locate X2 , Y : Lcd Chr(6) ; Chr(6) ; Chr(4)
'-------------------------------------------------------------------
          Case "8":
                    Locate X1 , Y : Lcd Chr(4) ; Chr(3) ; Chr(4)
                    Locate X2 , Y : Lcd Chr(4) ; Chr(2) ; Chr(4)
'-------------------------------------------------------------------
          Case "9":
                    Locate X1 , Y : Lcd Chr(4) ; Chr(3) ; Chr(4)
                    Locate X2 , Y : Lcd Chr(2) ; Chr(2) ; Chr(4)
'-------------------------------------------------------------------
          Case ":":
                    Locate X1 , Y : Lcd Chr(7)
                    Locate X2 , Y : Lcd Chr(7)
                    Y = Y - 2
'-------------------------------------------------------------------
          Case ".":
                    Y = Y - 1
                    Locate X1 , Y : Lcd Chr(6)
                    Locate X2 , Y : Lcd Chr(5)
                    Y = Y - 2
'-------------------------------------------------------------------
          Case " ":
                    Locate X1 , Y : Lcd Chr(6)
                    Locate X2 , Y : Lcd Chr(6)
'-------------------------------------------------------------------
            End Select
          Y = Y + 4
        Next Цикл_2
       X1 = 3 : X2 = 4 : Y = 1
    Next Цикл_1
  End Sub
'-------------------------------------------------------------------------------
'*******************************************************************************

'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
  Sub Lcd_print(byval Копия_lcd_print As String * 20)
'-------------------------------------------------------------------------------
'   Local Длина As Integer , Цикл_lcd_print As Integer
'   Local Код_символа As Byte , Код_символа_lcd As Byte
'   Local Символ_lcd As String * 1 , Символ As String * 1 ', Вывод_на_lcd As String * 20
'-------------------------------------------------------------------------------
    Длина = Len(копия_lcd_print) : If Длина = 0 Then Exit Sub

    Вывод_на_lcd = ""

    For Цикл_lcd_print = 1 To Длина
      Символ = Mid(копия_lcd_print , Цикл_lcd_print , 1)
      Код_символа = Asc(символ)
      Код_символа_lcd = Lookup(код_символа , Cp1251_to_lcd_hd44780)
      Символ_lcd = Chr(код_символа_lcd)
      Вывод_на_lcd = Вывод_на_lcd + Символ_lcd
    Next Цикл_lcd_print

    Locate Строка_lcd , Курсор_lcd
    Lcd Вывод_на_lcd
'-------------------------------------------------------------------------------
  End Sub
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
'**********************************************************************************************************************
'************       Таблица для перекодировки из символов Cp1251 в символы знакосинтезирующего LCD        *************
'**********************************************************************************************************************
'----------------------------------------------------------------------------------------------------------------------
  Cp1251_to_lcd_hd44780:
'----------------------------------------------------------------------------------------------------------------------
'**********************************************************************************************************************
'----------------------------------------------------------------------------------------------------------------------
'-----------------------------------------    первые 128 знаков    ----------------------------------------------------
'----------------------------------------------------------------------------------------------------------------------
    Data &H00 , &H01 , &H02 , &H03 , &H04 , &H05 , &H06 , &H07 , &H08 , &H09 , &H0A , &H0B , &H0C , &H0D , &H0E , &H0F
    Data &H10 , &H11 , &H12 , &H13 , &H14 , &H15 , &H16 , &H17 , &H18 , &H19 , &H1A , &H1B , &H1C , &H1D , &H1E , &H1F
    Data &H20 , &H21 , &H22 , &H23 , &H24 , &H25 , &H26 , &H27 , &H28 , &H29 , &H2A , &H2B , &H2C , &H2D , &H2E , &H2F
    Data &H30 , &H31 , &H32 , &H33 , &H34 , &H35 , &H36 , &H37 , &H38 , &H39 , &H3A , &H3B , &H3C , &H3D , &H3E , &H3F
    Data &H40 , &H41 , &H42 , &H43 , &H44 , &H45 , &H46 , &H47 , &H48 , &H49 , &H4A , &H4B , &H4C , &H4D , &H4E , &H4F
    Data &H50 , &H51 , &H52 , &H53 , &H54 , &H55 , &H56 , &H57 , &H58 , &H59 , &H5A , &H5B , &H20 , &H5D , &H5E , &H5F
    Data &H60 , &H61 , &H62 , &H63 , &H64 , &H65 , &H66 , &H67 , &H68 , &H69 , &H6A , &H6B , &H6C , &H6D , &H6E , &H6F
    Data &H70 , &H71 , &H72 , &H73 , &H74 , &H75 , &H76 , &H77 , &H78 , &H79 , &H7A , &H5B , &H20 , &H5D , &HE9 , &H7F
'----------------------------------------------------------------------------------------------------------------------
'-----------------------------------------    вторые 128 знаков    ----------------------------------------------------
'----------------------------------------------------------------------------------------------------------------------
    Data &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20
    Data &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20
    Data &HCB , &H20 , &H49 , &H69 , &H04 , &H20 , &HFE , &HEF , &HA2 , &HCC , &H00 , &HC9 , &H20 , &H20 , &H20 , &H02
    Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &HB5 , &H4E , &H00 , &H00 , &H00 , &H00 , &H00 , &H00
    Data &H41 , &HA0 , &H42 , &HA1 , &HE0 , &H45 , &HA3 , &HA4 , &HA5 , &HA6 , &H4B , &HA7 , &H4D , &H48 , &H4F , &HA8
    Data &H50 , &H43 , &H54 , &HA9 , &HAA , &H58 , &HE1 , &HAB , &HAC , &HE2 , &HAD , &HAE , &H62 , &HAF , &HB0 , &HB1
    Data &H61 , &HB2 , &HB3 , &HB4 , &HE3 , &H65 , &HB6 , &HB7 , &HB8 , &HB9 , &HBA , &HBB , &HBC , &HBD , &H6F , &HBE
    Data &H70 , &H63 , &HBF , &H79 , &HE4 , &H78 , &HE5 , &HC0 , &HC1 , &HE6 , &HC2 , &HC3 , &HC4 , &HC5 , &HC6 , &HC7
'----------------------------------------------------------------------------------------------------------------------
'**********************************************************************************************************************
'----------------------------------------------------------------------------------------------------------------------
'-----------------------------------------    первые 128 знаков    ----------------------------------------------------
'----------------------------------------------------------------------------------------------------------------------
'    Data " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " "
'    Data " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " "
'    Data " " , "!" , " " , "#" , "$" , "%" , "&" , "'" , "(" , ")" , "*" , "+" , "," , "-" , "." , "/"
'    Data "0" , "1" , "2" , "3" , "4" , "5" , "6" , "7" , "8" , "9" , ":" , ";" , "<" , "=" , ">" , "?"
'    Data "@" , "A" , "B" , "C" , "D" , "E" , "F" , "G" , "H" , "I" , "J" , "K" , "L" , "M" , "N" , "O"
'    Data "P" , "Q" , "R" , "S" , "T" , "U" , "V" , "W" , "X" , "Y" , "Z" , "[" , "\" , "]" , "^" , "_"
'    Data "`" , "a" , "b" , "c" , "d" , "e" , "f" , "g" , "h" , "i" , "j" , "k" , "l" , "m" , "n" , "o"
'    Data "p" , "q" , "r" , "s" , "t" , "u" , "v" , "w" , "x" , "y" , "z" , "{" , "|" , "}" , "~" , "¦"
'----------------------------------------------------------------------------------------------------------------------
'-----------------------------------------    вторые 128 знаков    ----------------------------------------------------
'----------------------------------------------------------------------------------------------------------------------
'    Data " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " "
'    Data " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " "
'    Data " " , " " , " " , " " , " " , " " , " " , " " , "ў" , " " , " " , " " , " " , " " , " " , " "
'    Data " " , " " , " " , " " , " " , " " , " " , " " , "µ" , " " , " " , " " , " " , " " , " " , " "
'    Data "A" , " " , "B" , "Ў" , "а" , "E" , "Ј" , "¤" , "Ґ" , "¦" , "K" , "§" , "M" , "H" , "O" , "Ё"
'    Data "P" , "C" , "T" , "©" , "Є" , "X" , "б" , "«" , "¬" , "в" , "­" , "®" , "b" , "Ї" , "°" , "±"
'    Data "a" , "І" , "і" , "ґ" , "г" , "e" , "¶" , "·" , "ё" , "№" , "є" , "»" , "ј" , "Ѕ" , "o" , "ѕ"
'    Data "p" , "c" , "ї" , "y" , "д" , "x" , "е" , "А" , "Б" , "ж" , "В" , "Г" , "Д" , "Е" , "Ж" , "З"
'----------------------------------------------------------------------------------------------------------------------
'**********************************************************************************************************************

'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
  Выводимый_русский_текст:
'-------------------------------------------------------------------------------
    Data "    "
    Data "Тест"
    Data "LCD "
    Data "Вот "
    Data "Так "
    Data "Оно "
    Data "Рабо"
    Data "тает"
'-------------------------------------------------------------------------------
'*******************************************************************************

'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
  Выводимый_русский_алфавит:
'-------------------------------------------------------------------------------
    Data "    "
    Data "АаБб"
    Data "ВвГг"
    Data "ДдЕе"
    Data "ЁёЖж"
    Data "ЗзИи"
    Data "ЙйКк"
    Data "ЛлМм"
    Data "НнОо"
    Data "ПпРр"
    Data "СсТт"
    Data "УуФф"
    Data "ХхЦц"
    Data "ЧчШш"
    Data "ЩщЪъ"
    Data "ЫыЬь"
    Data "ЭэЮю"
    Data "Яя"
'-------------------------------------------------------------------------------
'*******************************************************************************

Фото работы Протеуса
http://s5.uploads.ru/t/H9EmS.jpg  http://s4.uploads.ru/t/zOsZM.jpg

Фото, как выглядит в железе
http://s4.uploads.ru/t/XVLAm.jpg  http://s4.uploads.ru/t/CtE3i.jpg
                               WH1604B-YGH-CT#                                                                 WH1602B-TMI-CT#
                                                                                         
http://s4.uploads.ru/t/X3kny.jpg  http://s4.uploads.ru/t/npyGc.jpg
                               WH2002A-YGH-CP#                                                                WH2004D-YGH-CP#

http://s4.uploads.ru/t/BoMmT.jpg
   Вверху слева: WH2004D-YGH-CP#    справа: WH1602B-TMI-CP#
   нижний WH2004L-TMI-CP#

Фото и видео для наглядности, протеус не показывает 8 ряд пикселей в знакоместе ( выглядит не совсем так, как в железе ).                                                                                                                     
                                                                                                                           

Документация на LCD "Winstar"
Подробное описание pdf ( англ. ) - http://www.promelec.ru/pdf/TECH.pdf
Как выглядят и datasheet ( сайт производителя ) - http://www.winstar.com.tw/products_detail.php?CID=17
Расшифровка маркировки на русском языке - http://www.promelec.ru/catalog_info/57/150/626/675/

Всё, что необходимо: -  исходники, эмуляция протеуса, прошивки, программы для кодирования LED и LCD под Windows ( все проверены в Windows_7x64 ), находится в архиве.

Видео СКАЧАТЬ:   http://www.fayloobmennik.net/2981791   ( Залиты все варианты, правда качество не очень, но думаю разобрать можно ). 

Архив СКАЧАТЬ:   http://www.fayloobmennik.net/2980689    ! Если ссылки не будут работать, напишите.

Кому не жалко, делитесь информацией. Учиться никогда не поздно!

Отредактировано sasha_1973 (2013-07-19 12:35:29)

+1

2

Исходник:  ещё вариант бегущей строки на русском языке, итог оптимизации предыдущих вариантов. Каждая строчка прокомментирована. Программная кодировка текста, "на лету", т.е., кракозяблики или иероглифы не используются.

'*******************************************************************************
'*****************                                   ***************************
'*****************       Конфигурация программы      ***************************
'*****************           и контроллера           ***************************
'*****************                                   ***************************
'*******************************************************************************
  $regfile = "m8def.dat" : $crystal = 8000000 : $framesize = 0 : $hwstack = 0 : $swstack = 0 : $baud = 4800       '1200     '2400     '4800     '9600     '19200     '38400     '57600     '115000
'*******************************************************************************
'-------------------------------------------------------------------------------
'*******************************************************************************
'**************************     Конфигурация LCD     ***************************
'*******************************************************************************
'-------------------------------------------------------------------------------
'  Выводы МК к которым подключен LCD, !!! Обратите внимание, библиотеки не используются, выводы могут быть любые
'-------------------------------------------------------------------------------
  Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.1 , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5
'-------------------------------------------------------------------------------
  Config Lcd = 20 * 4       ' Используемый LCD
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'  ! ВНИМАНИЕ !
'  Не забудьте подставить значения своего LCD
  Const Количество_строк_в_lcd = 4       ' Константа для количества строк  в LCD
  Const Количество_знакомест_в_lcd = 20       ' Константа для количества знаков в LCD

'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
  Initlcd       ' Инициализируем LCD
  Waitms 50       ' Ждем пока все запустится
  Cursor Off Noblink       ' Выключаем неморгающий курсор
'  Cursor On Noblink         ' Включаем неморгающий курсор
'  Cursor On Blink           ' Включаем моргающий курсор
  Cls       ' Чистим экран, на всякий случай
'-------------------------------------------------------------------------------
'  Upperline  1 строка, Lowerline  2 строка, Thirdline  3 строка, Fourthline 4 строка  - один из вариантов перехода на строку
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
'-----------    Подпрограмма вывода русского текста на LCD HD44780   -----------
'-------------------------------------------------------------------------------
  Declare Sub Lcd_print(byval Копия_lcd_print As String)       ' Подпрограмма вывода русского текста на LCD HD44780
'-------------------------------------------------------------------------------
  Dim Длина As Integer , Цикл_lcd_print As Integer
  Dim Код_символа As Byte , Код_символа_lcd As Byte
  Dim Символ_lcd As String * 1 , Символ As String * 1 , Вывод_на_lcd As String * 21
'-------------------------------------------------------------------------------
  Dim Строка_lcd As Byte , Курсор_lcd As Byte , Цикл_lcd As Byte
  Dim Буфер_lcd As String * 21
'-------------------------------------------------------------------------------
'-----------------------------   Переменные   ----------------------------------
'-------------------------------------------------------------------------------
  Dim Позиция As Byte
  Dim Пробелы As String * 22
  Dim Номер_сообщения As Byte
  Dim Количество_пробелов As Byte
  Dim Бегущая_строка As String * 21
  Dim Текст_сообщения As String * 214
  Dim Выводимое_сообщение As String * 254

  Dim Количество_знаков_в_сообщении As Byte
'-------------------------------------------------------------------------------
'----------------------------   Подпрограммы   ---------------------------------
'-------------------------------------------------------------------------------
  Declare Sub Выбор_сообщения()
  Declare Sub Подпрограмма_бегущая_строка()
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
'---------------------   Начальные данные переменных   -------------------------
'-------------------------------------------------------------------------------
  Строка_lcd = 1 : Курсор_lcd = 1
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
'-----------------------   Оcновной_цикл_программы   ---------------------------
'-------------------------------------------------------------------------------
  Do
  Главный_цикл:
'-------------------------------------

    rcall Выбор_сообщения

    rCall Подпрограмма_бегущая_строка

    Incr Номер_сообщения
    If Номер_сообщения > 5 Then Номер_сообщения = 0

'------------------------------------
  Goto Главный_цикл
  Loop
End
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
Подпрограмма_бегущая_строка:
'-------------------------------------------------------------------------------
   Пробелы = String(количество_знакомест_в_lcd , 30)       ' Количество пробелов до и после сообщения, выбирается исходя из количества знакомест исполбзуемого LCD  ( "30" - это не просто с потолка, это символ пробела)

   Количество_знаков_в_сообщении = Len(текст_сообщения)       ' Определяем количество символов в сообщении

   Количество_знаков_в_сообщении = Количество_знаков_в_сообщении + 40       ' Количество символов в сообщении + количество пробелов, до и после текста

   If Количество_знаков_в_сообщении > 40 Then       ' Ограничение знакомест, для разных индикаторов разное пример (LCD20x2 или LCD20x4? число 40, LCD16x2 число 32)
       Количество_знаков_в_сообщении = Количество_знаков_в_сообщении - Количество_знакомест_в_lcd
   End If

   Выводимое_сообщение = Пробелы + Текст_сообщения + Пробелы       ' Собираем выводимую информацию в кучу

     Позиция = 0

     While Позиция < Количество_знаков_в_сообщении       ' Выводим по одному символу всё, что собрали в кучу

       Incr Позиция

       Бегущая_строка = Mid(выводимое_сообщение , Позиция , Количество_знакомест_в_lcd)

       Lcd_print Бегущая_строка       ' Выводим сообщение с помощью подпрограммы "Lcdprint"

       Waitms 100       ' скорость вывода бегущей строки, если надо можно привязать к таймеру

     Wend       ' Если всё напечатали, идем дальше

     Cls       ' Чистим экран LCD

     Incr Строка_lcd       ' Переходим на следующую строку

     If Строка_lcd > Количество_строк_в_lcd Then Строка_lcd = 1       ' Если строки у индикатора закончились, переходим на 1 строку
'-------------------------------------------------------------------------------
Return
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
  Выбор_сообщения:       ' Подпрограмма для выбора того, что будем печатать на LCD
'-------------------------------------------------------------------------------
    Текст_сообщения = Lookupstr(номер_сообщения , Выводимые_сообщения)       ' Берем нужное сообщение из таблицы ( находится внизу исходника )
'-------------------------------------------------------------------------------
  Return
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
  Выводимые_сообщения:
'-------------------------------------------------------------------------------
  Data "Тестирование LCD на базе контроллера HD44780. Вот так оно работает"
  Data "Пример вывода информации в режиме бегущей строки. Максимальное количество символов 254."
  Data "Дальше пойдёт русский алфавит"
  Data "Аа, Бб, Вв, Гг, Дд, Ее, Ёё, Жж, Зз, Ии, Йй, Кк, Лл, Мм, Нн, Оо, Пп, Рр, Сс, Тт, Уу, Фф, Хх, Цц, Чч, Шш, Щщ, Ъъ, Ыы, Ьь, Ээ, Юю, Яя."
  Data "Удачи в освоении контроллеров семейства Atmega и ATxmega."
  Data "Sample output information in a marquee. Maximum number of characters 254.Good luck!"
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
  Sub Lcd_print(byval Копия_lcd_print As String * 21)
'-------------------------------------------------------------------------------
    Длина = Len(копия_lcd_print) : If Длина = 0 Then Exit Sub       ' Определяем длину, если ничего нет выходим из подпрограммы

    Вывод_на_lcd = ""

    For Цикл_lcd_print = 1 To Длина       ' Занимаемся переливанием из пустого в порожнее, вместо производителей LCD
      Символ = Mid(копия_lcd_print , Цикл_lcd_print , 1)       ' Берем по одному символу
      Код_символа = Asc(символ)       ' Определяем код символа согласно таблицы Cp1251
      Код_символа_lcd = Lookup(код_символа , Cp1251_to_lcd_hd44780)       ' определяем код символа согласно таблицы зашитой в знакогенератор LCD
      Символ_lcd = Chr(код_символа_lcd)       ' Делаем из кода символа, собственно сам символ, который будем с упоением наблюдать на ЭКРАНЕ LCD
      Вывод_на_lcd = Вывод_на_lcd + Символ_lcd       ' Собираем в кучу, все то, что накодировали
    Next Цикл_lcd_print       ' Если все закончилось, бежим в магазин, но так, как мы за трезвость, то идем дальше

    Locate Строка_lcd , Курсор_lcd       ' Определяемся куда выводить
    Lcd Вывод_на_lcd       ' И наконец АППОГЕЙ всего этого геморроя, ПЕЧАТЬ НА LCD
'-------------------------------------------------------------------------------
  End Sub
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
'**********************************************************************************************************************
'************       Таблица для перекодировки из символов Cp1251 в символы знакосинтезирующего LCD        *************
'**********************************************************************************************************************
'----------------------------------------------------------------------------------------------------------------------
  Cp1251_to_lcd_hd44780:
'----------------------------------------------------------------------------------------------------------------------
'**********************************************************************************************************************
'----------------------------------------------------------------------------------------------------------------------
'-----------------------------------------    первые 128 знаков    ----------------------------------------------------
'----------------------------------------------------------------------------------------------------------------------
    Data &H00 , &H01 , &H02 , &H03 , &H04 , &H05 , &H06 , &H07 , &H08 , &H09 , &H0A , &H0B , &H0C , &H0D , &H0E , &H0F
    Data &H10 , &H11 , &H12 , &H13 , &H14 , &H15 , &H16 , &H17 , &H18 , &H19 , &H1A , &H1B , &H1C , &H1D , &H1E , &H1F
    Data &H20 , &H21 , &H22 , &H23 , &H24 , &H25 , &H26 , &H27 , &H28 , &H29 , &H2A , &H2B , &H2C , &H2D , &H2E , &H2F
    Data &H30 , &H31 , &H32 , &H33 , &H34 , &H35 , &H36 , &H37 , &H38 , &H39 , &H3A , &H3B , &H3C , &H3D , &H3E , &H3F
    Data &H40 , &H41 , &H42 , &H43 , &H44 , &H45 , &H46 , &H47 , &H48 , &H49 , &H4A , &H4B , &H4C , &H4D , &H4E , &H4F
    Data &H50 , &H51 , &H52 , &H53 , &H54 , &H55 , &H56 , &H57 , &H58 , &H59 , &H5A , &H5B , &H20 , &H5D , &H5E , &H5F
    Data &H60 , &H61 , &H62 , &H63 , &H64 , &H65 , &H66 , &H67 , &H68 , &H69 , &H6A , &H6B , &H6C , &H6D , &H6E , &H6F
    Data &H70 , &H71 , &H72 , &H73 , &H74 , &H75 , &H76 , &H77 , &H78 , &H79 , &H7A , &H5B , &H20 , &H5D , &HE9 , &H7F
'----------------------------------------------------------------------------------------------------------------------
'-----------------------------------------    вторые 128 знаков    ----------------------------------------------------
'----------------------------------------------------------------------------------------------------------------------
    Data &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20
    Data &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20
    Data &HCB , &H20 , &H49 , &H69 , &H04 , &H20 , &HFE , &HEF , &HA2 , &HCC , &H00 , &HC9 , &H20 , &H20 , &H20 , &H02
    Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &HB5 , &H4E , &H00 , &H00 , &H00 , &H00 , &H00 , &H00
    Data &H41 , &HA0 , &H42 , &HA1 , &HE0 , &H45 , &HA3 , &HA4 , &HA5 , &HA6 , &H4B , &HA7 , &H4D , &H48 , &H4F , &HA8
    Data &H50 , &H43 , &H54 , &HA9 , &HAA , &H58 , &HE1 , &HAB , &HAC , &HE2 , &HAD , &HAE , &H62 , &HAF , &HB0 , &HB1
    Data &H61 , &HB2 , &HB3 , &HB4 , &HE3 , &H65 , &HB6 , &HB7 , &HB8 , &HB9 , &HBA , &HBB , &HBC , &HBD , &H6F , &HBE
    Data &H70 , &H63 , &HBF , &H79 , &HE4 , &H78 , &HE5 , &HC0 , &HC1 , &HE6 , &HC2 , &HC3 , &HC4 , &HC5 , &HC6 , &HC7
'----------------------------------------------------------------------------------------------------------------------
'**********************************************************************************************************************
'----------------------------------------------------------------------------------------------------------------------
'-----------------------------------------    первые 128 знаков    ----------------------------------------------------
'----------------------------------------------------------------------------------------------------------------------
'    Data " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " "
'    Data " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " "
'    Data " " , "!" , " " , "#" , "$" , "%" , "&" , "'" , "(" , ")" , "*" , "+" , "," , "-" , "." , "/"
'    Data "0" , "1" , "2" , "3" , "4" , "5" , "6" , "7" , "8" , "9" , ":" , ";" , "<" , "=" , ">" , "?"
'    Data "@" , "A" , "B" , "C" , "D" , "E" , "F" , "G" , "H" , "I" , "J" , "K" , "L" , "M" , "N" , "O"
'    Data "P" , "Q" , "R" , "S" , "T" , "U" , "V" , "W" , "X" , "Y" , "Z" , "[" , "\" , "]" , "^" , "_"
'    Data "`" , "a" , "b" , "c" , "d" , "e" , "f" , "g" , "h" , "i" , "j" , "k" , "l" , "m" , "n" , "o"
'    Data "p" , "q" , "r" , "s" , "t" , "u" , "v" , "w" , "x" , "y" , "z" , "{" , "|" , "}" , "~" , "¦"
'----------------------------------------------------------------------------------------------------------------------
'-----------------------------------------    вторые 128 знаков    ----------------------------------------------------
'----------------------------------------------------------------------------------------------------------------------
'    Data " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " "
'    Data " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " "
'    Data " " , " " , " " , " " , " " , " " , " " , " " , "ў" , " " , " " , " " , " " , " " , " " , " "
'    Data " " , " " , " " , " " , " " , " " , " " , " " , "µ" , " " , " " , " " , " " , " " , " " , " "
'    Data "A" , " " , "B" , "Ў" , "а" , "E" , "Ј" , "¤" , "Ґ" , "¦" , "K" , "§" , "M" , "H" , "O" , "Ё"
'    Data "P" , "C" , "T" , "©" , "Є" , "X" , "б" , "«" , "¬" , "в" , "­" , "®" , "b" , "Ї" , "°" , "±"
'    Data "a" , "І" , "і" , "ґ" , "г" , "e" , "¶" , "·" , "ё" , "№" , "є" , "»" , "ј" , "Ѕ" , "o" , "ѕ"
'    Data "p" , "c" , "ї" , "y" , "д" , "x" , "е" , "А" , "Б" , "ж" , "В" , "Г" , "Д" , "Е" , "Ж" , "З"
'----------------------------------------------------------------------------------------------------------------------
'**********************************************************************************************************************
'-------------------------------------------------------------------------------

Посмотреть, как работает, скачать:  http://www.fayloobmennik.net/2984421

Отредактировано sasha_1973 (2013-07-02 17:35:04)

0

3

Ещё один вариант больших цифр на LCD.
Отличия от предыдущих, только в дополнительной графике, закругленные цифры, для улучшения восприятия (см. начало исходника "Графика для формирования цифр").

Исходник

'*******************************************************************************
'*****************                                   ***************************
'*****************       Конфигурация программы      ***************************
'*****************           и контроллера           ***************************
'*****************                                   ***************************
'*******************************************************************************
  $regfile = "m16def.dat" : $crystal = 8000000 : $framesize = 0 : $hwstack = 0 : $swstack = 0 : $baud = 4800       '1200     '2400     '4800     '9600     '19200     '38400     '57600     '115000
'*******************************************************************************
'-------------------------------------------------------------------------------
'*******************************************************************************
'**************************     Конфигурация LCD     ***************************
'*******************************************************************************
'-------------------------------------------------------------------------------
' Выводы МК к которым подключен LCD, !!! Обратите внимание, библиотеки не используются, выводы могут быть любые
'-------------------------------------------------------------------------------
  Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.1 , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5
'-------------------------------------------------------------------------------
  Config Lcd = 20 * 4       ' Используемый LCD
  Initlcd           ' Инициализируем LCD
  Waitms 50         ' Ждем пока все запустится
  Cursor Off Noblink       ' Выключаем неморгающий курсор
'  Cursor On Noblink         ' Включаем неморгающий курсор
'  Cursor On Blink           ' Включаем моргающий курсор
  Cls               ' Чистим экран, на всякий случай
'-------------------------------------------------------------------------------
'Upperline  1 строка, Lowerline  2 строка, Thirdline  3 строка, Fourthline 4 строка  - один из вариантов перехода на строку
'-------------------------------------------------------------------------------
'--------------------- Графика для формирования цифр ---------------------------
'-------------------------------------------------------------------------------
  Deflcdchar 0 , 31 , 31 , 32 , 32 , 32 , 32 , 32 , 32       ' верхняя черточка
  Deflcdchar 1 , 32 , 32 , 32 , 32 , 32 , 32 , 31 , 31       ' нижняя черточка
  Deflcdchar 2 , 31 , 31 , 32 , 32 , 32 , 32 , 31 , 31       ' 2 черточки
  Deflcdchar 3 , 7 , 15 , 31 , 31 , 31 , 31 , 31 , 31       ' левый верхний угол
  Deflcdchar 4 , 31 , 31 , 31 , 31 , 31 , 31 , 15 , 7       ' левый нижний угол
  Deflcdchar 5 , 28 , 30 , 31 , 31 , 31 , 31 , 31 , 31       ' правый верхний угол
  Deflcdchar 6 , 31 , 31 , 31 , 31 , 31 , 31 , 30 , 28       ' правый нижний угол
  Deflcdchar 7 , 32 , 1 , 3 , 7 , 14 , 12 , 32 , 32       ' Кусочек для единицы
'-------------------------------------------------------------------------------
'-------------   Переменные для подпрограммы вывода больших цифр   -------------
'-------------------------------------------------------------------------------
  Dim Цикл_1 As Byte , Цикл_2 As Byte , X1 As Byte , X2 As Byte , Y As Byte
  Dim Количество_больших_символов As Byte
  Dim Выводимая_строка_big As String * 6 , Большие_цифры_lcd As String * 6
  Dim Большие_символы_верх As String * 6 , Большие_символы_низ As String * 6
'-------------------------------------------------------------------------------
'--------------------   Подпрограммы вывода больших цифр   ---------------------
'-------------------------------------------------------------------------------
  Declare Sub Формирование_больших_цифр()       ' Подпрограмма вывода больших цифр
'-------------------------------------------------------------------------------
'-----------    Подпрограмма вывода русского текста на LCD HD44780   -----------
'-------------------------------------------------------------------------------
  Declare Sub Lcd_print(byval Копия_lcd_print As String)       ' Подпрограмма вывода русского текста на LCD HD44780
'-------------------------------------------------------------------------------
  Dim Длина As Integer , Цикл_lcd_print As Integer
  Dim Код_символа As Byte , Код_символа_lcd As Byte
  Dim Символ_lcd As String * 1 , Символ As String * 1 , Вывод_на_lcd As String * 20
'-------------------------------------------------------------------------------
  Dim Строка_lcd As Byte , Курсор_lcd As Byte , Цикл_lcd As Byte
  Dim Буфер_lcd As String * 20
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
'------------------   Конфигурация выхода для светодиодика   -------------------
'-------------------------------------------------------------------------------
  Config Portd.7 = Output       ' Натраиваем порт на выход
  Светодиод Alias Portd.7       ' Присваиваем собственное имя ножке порта контроллера
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
'-----------------------------   Переменные   ----------------------------------
'-------------------------------------------------------------------------------
  Dim A_byte As Byte , B_byte As Byte , C_byte As Byte , D_byte As Byte
  Dim A_word As Word , B_word As Word , C_word As Word , D_word As Word
  Dim A_single As Single , B_single As Single , C_single As Single , D_single As Single
  Dim A_integer As Integer , B_integer As Integer , C_integer As Integer , D_integer As Integer
  Dim A_string As String * 5 , B_string As String * 5 , C_string As String * 5 , D_string As String * 5
  Dim Счетчик_byte As Byte , Счетчик_integer As Integer , Счетчик_word As Word , Счетчик_single As Single
'-------------------------------------------------------------------------------
'----------------------------   Подпрограммы   ---------------------------------
'-------------------------------------------------------------------------------

'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
   A_byte = 0       ' Начальные значения переменных
   B_byte = 0       ' Начальные значения переменных
   A_word = 0       ' Начальные значения переменных
   B_word = 9999    ' Начальные значения переменных
   C_word = 111     ' Начальные значения переменных
   D_word = 888     ' Начальные значения переменных
   C_string = ""    ' Начальные значения переменных
   D_string = ""    ' Начальные значения переменных
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
'-----------------------   Оcновной_цикл_программы   ---------------------------
'-------------------------------------------------------------------------------
  Do
  Главный_цикл:
'-------------------------------------

     Incr A_word    ' Увеличиваем переменную
     If A_word = 999 Then A_word = 0       ' Если больше 9999, сбрасываем в 0

     Decr B_word    ' Уменьшаем переменную
     If B_word = 0 Then B_word = 1111       ' Если достигло 0, пишем в переменную 9999

     Incr C_word    ' Увеличиваем переменную
     If C_word = 888 Then C_word = 111       ' Если больше 9999, сбрасываем в 0

     C_string = Str(c_word)       ' Преобразуем переменную "Word"( числовая ), в переменную "String" ( строковая )
     C_string = Format(c_string , " 0.0")       ' Форматируем, как нам надо ( в данном случае, убираем незначащие "0", ровняем по правому краю )

     Decr D_word    ' Уменьшаем переменную
     If D_word = 111 Then D_word = 888       ' Если достигло 0, пишем в переменную 9999

     D_string = Str(d_word)       ' Преобразуем переменную "Word"( числовая ), в переменную "String" ( строковая )
     D_string = Format(d_string , " 0.0")       ' Форматируем, как нам надо ( в данном случае, убираем незначащие "0", ровняем по правому краю )

     Большие_символы_верх = Str(a_word)       ' Делаем строковой, выводимую переменную
'     If A_word < 1000 Then Большие_символы_верх = "   " + Большие_символы_верх

     Большие_символы_низ = Str(b_word)       ' Делаем строковой, выводимую переменную
'     If B_word < 1000 Then Большие_символы_низ = "   " + Большие_символы_низ

     rCall Формирование_больших_цифр       ' Переходим к подпрограмме вывода больших символов

     Locate 3 , 17  ' Указываем начальное положение знакоместа
     Lcd C_string   ' Выводим переменную на LCD

     Locate 4 , 17  ' Указываем начальное положение знакоместа
     Lcd D_string   ' Выводим переменную на LCD

     Incr Счетчик_byte

     If Счетчик_byte > 9 Then
         Счетчик_byte = 0

         Incr A_byte       ' Увеличиваем переменную на 1
         If A_byte > 7 Then A_byte = 0       ' Если достигли, обнуляем

         Буфер_lcd = Lookupstr(a_byte , Выводимый_русский_текст )       ' Берем выводимый текст из таблицы "Выводимый_русский_текст", ( искать внизу исходника )

         Строка_lcd = 1       ' Указываем номер строки
         Курсор_lcd = 17       ' Указываем начальное положение знакоместа

         Lcd_print Буфер_lcd       ' Выводим переменную на LCD с пощью подпрограммы "Lcd_print"

     End If

     Incr Счетчик_word

     If Счетчик_word > 5 Then
         Счетчик_word = 0

         Incr B_byte       ' Увеличиваем переменную на 1
         If B_byte > 17 Then B_byte = 0       ' Если достигли, обнуляем

         Буфер_lcd = Lookupstr(b_byte , Выводимый_русский_алфавит )       ' Берем выводимый текст из таблицы "Выводимый_русский_алфавит", ( искать внизу исходника )

         Строка_lcd = 2       ' Указываем номер строки
         Курсор_lcd = 17       ' Указываем начальное положение знакоместа

         Lcd_print Буфер_lcd       ' Выводим переменную на LCD с пощью подпрограммы "Lcd_print"

     End If

     Waitms 150

     Toggle Светодиод       ' Моргаем светодоидиком ( типа, все нормально, ещё не зависли)
'------------------------------------
  Goto Главный_цикл
  Loop
End
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
  Sub Формирование_больших_цифр:
'-------------------------------------------------------------------------------

'-------------------------------------------------------------------------------
    Количество_больших_символов = 5
    Большие_символы_верх = Format(большие_символы_верх , " 0.00")       'форматируем выводимую переменную

'    If B_word < 1000 Then
        Количество_больших_символов = 5
        Большие_символы_низ = Format(большие_символы_низ , " 0.00")       'форматируем выводимую переменную
'      Else
'        Количество_больших_символов = 4
'        Большие_символы_низ = Format(большие_символы_низ , " 0.00")       'форматируем выводимую переменную
'    End If

    X1 = 1          ' Координаты места вывода
    X2 = 2          ' Координаты места вывода
    Y = 1           ' Координаты места вывода

    For Цикл_1 = 1 To 2
      If Цикл_1 = 1 Then
        Выводимая_строка_big = Большие_символы_верх
          Else
            Выводимая_строка_big = Большие_символы_низ
              End If
        For Цикл_2 = 1 To Количество_больших_символов
          Большие_цифры_lcd = Mid(выводимая_строка_big , Цикл_2 , 1)       'разбиваем на цифры
'-------------------------------------------------------------------------------
'------------------------- Большие цифры ---------------------------------------
'-------------------------------------------------------------------------------
        Select Case Большие_цифры_lcd       'выбираем выводимый символ
'-------------------------------------------------------------------
          Case "0" :
                     Locate X1 , Y : Lcd Chr(3) ; Chr(0) ; Chr(5)
                     Locate X2 , Y : Lcd Chr(4) ; Chr(1) ; Chr(6)
'-------------------------------------------------------------------
          Case "1":
                    Locate X1 , Y : Lcd Chr(7) ; Chr(255) ; Chr(20)
                    Locate X2 , Y : Lcd Chr(20) ; Chr(255) ; Chr(20)
'-------------------------------------------------------------------
          Case "2":
                    Locate X1 , Y : Lcd Chr(2) ; Chr(2) ; Chr(5)
                    Locate X2 , Y : Lcd Chr(4) ; Chr(1) ; Chr(1)
'-------------------------------------------------------------------
          Case "3":
                    Locate X1 , Y : Lcd Chr(0) ; Chr(2) ; Chr(5)
                    Locate X2 , Y : Lcd Chr(1) ; Chr(1) ; Chr(6)
'-------------------------------------------------------------------
          Case "4":
                    Locate X1 , Y : Lcd Chr(255) ; Chr(1) ; Chr(5)
                    Locate X2 , Y : Lcd Chr(20) ; Chr(20) ; Chr(255)
'-------------------------------------------------------------------
          Case "5":
                    Locate X1 , Y : Lcd Chr(255) ; Chr(2) ; Chr(2)
                    Locate X2 , Y : Lcd Chr(1) ; Chr(1) ; Chr(6)
'-------------------------------------------------------------------
          Case "6":
                    Locate X1 , Y : Lcd Chr(3) ; Chr(2) ; Chr(2)
                    Locate X2 , Y : Lcd Chr(4) ; Chr(1) ; Chr(6)
'-------------------------------------------------------------------
          Case "7":
                    Locate X1 , Y : Lcd Chr(0) ; Chr(0) ; Chr(5)
                    Locate X2 , Y : Lcd Chr(20) ; Chr(3) ; Chr(20)
'-------------------------------------------------------------------
          Case "8":
                    Locate X1 , Y : Lcd Chr(3) ; Chr(2) ; Chr(5)
                    Locate X2 , Y : Lcd Chr(4) ; Chr(1) ; Chr(6)
'-------------------------------------------------------------------
          Case "9":
                    Locate X1 , Y : Lcd Chr(3) ; Chr(2) ; Chr(5)
                    Locate X2 , Y : Lcd Chr(1) ; Chr(1) ; Chr(6)
'-------------------------------------------------------------------
          Case ":":
                    Y = Y - 1
                    Locate X1 , Y : Lcd Chr(7)
                    Locate X2 , Y : Lcd Chr(7)
                    Y = Y - 3
'-------------------------------------------------------------------
          Case ".":
                    Y = Y - 1
                    Locate X1 , Y : Lcd Chr(20)
                    Locate X2 , Y : Lcd Chr(46)
                    Y = Y - 3
'-------------------------------------------------------------------
          Case " ":
                    Locate X1 , Y : Lcd Chr(20)
                    Locate X2 , Y : Lcd Chr(20)
'-------------------------------------------------------------------
          Case "#":
                    Locate X1 , Y : Lcd Chr(20) : Lcd Chr(20) : Lcd Chr(20)
                    Locate X2 , Y : Lcd Chr(20) : Lcd Chr(20) : Lcd Chr(20)
'-------------------------------------------------------------------
            End Select
          Y = Y + 4
        Next Цикл_2
       X1 = 3 : X2 = 4 : Y = 1
    Next Цикл_1
  End Sub
'-------------------------------------------------------------------------------
'*******************************************************************************

'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
  Sub Lcd_print(byval Копия_lcd_print As String * 20)
'-------------------------------------------------------------------------------
'   Local Длина As Integer , Цикл_lcd_print As Integer
'   Local Код_символа As Byte , Код_символа_lcd As Byte
'   Local Символ_lcd As String * 1 , Символ As String * 1 ', Вывод_на_lcd As String * 20
'-------------------------------------------------------------------------------
    Длина = Len(копия_lcd_print) : If Длина = 0 Then Exit Sub

    Вывод_на_lcd = ""

    For Цикл_lcd_print = 1 To Длина
      Символ = Mid(копия_lcd_print , Цикл_lcd_print , 1)
      Код_символа = Asc(символ)
      Код_символа_lcd = Lookup(код_символа , Cp1251_to_lcd_hd44780)
      Символ_lcd = Chr(код_символа_lcd)
      Вывод_на_lcd = Вывод_на_lcd + Символ_lcd
    Next Цикл_lcd_print

    Locate Строка_lcd , Курсор_lcd
    Lcd Вывод_на_lcd
'-------------------------------------------------------------------------------
  End Sub
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
'**********************************************************************************************************************
'************       Таблица для перекодировки из символов Cp1251 в символы знакосинтезирующего LCD        *************
'**********************************************************************************************************************
'----------------------------------------------------------------------------------------------------------------------
  Cp1251_to_lcd_hd44780:
'----------------------------------------------------------------------------------------------------------------------
'**********************************************************************************************************************
'----------------------------------------------------------------------------------------------------------------------
'-----------------------------------------    первые 128 знаков    ----------------------------------------------------
'----------------------------------------------------------------------------------------------------------------------
    Data &H00 , &H01 , &H02 , &H03 , &H04 , &H05 , &H06 , &H07 , &H08 , &H09 , &H0A , &H0B , &H0C , &H0D , &H0E , &H0F
    Data &H10 , &H11 , &H12 , &H13 , &H14 , &H15 , &H16 , &H17 , &H18 , &H19 , &H1A , &H1B , &H1C , &H1D , &H1E , &H1F
    Data &H20 , &H21 , &H22 , &H23 , &H24 , &H25 , &H26 , &H27 , &H28 , &H29 , &H2A , &H2B , &H2C , &H2D , &H2E , &H2F
    Data &H30 , &H31 , &H32 , &H33 , &H34 , &H35 , &H36 , &H37 , &H38 , &H39 , &H3A , &H3B , &H3C , &H3D , &H3E , &H3F
    Data &H40 , &H41 , &H42 , &H43 , &H44 , &H45 , &H46 , &H47 , &H48 , &H49 , &H4A , &H4B , &H4C , &H4D , &H4E , &H4F
    Data &H50 , &H51 , &H52 , &H53 , &H54 , &H55 , &H56 , &H57 , &H58 , &H59 , &H5A , &H5B , &H20 , &H5D , &H5E , &H5F
    Data &H60 , &H61 , &H62 , &H63 , &H64 , &H65 , &H66 , &H67 , &H68 , &H69 , &H6A , &H6B , &H6C , &H6D , &H6E , &H6F
    Data &H70 , &H71 , &H72 , &H73 , &H74 , &H75 , &H76 , &H77 , &H78 , &H79 , &H7A , &H5B , &H20 , &H5D , &HE9 , &H7F
'----------------------------------------------------------------------------------------------------------------------
'-----------------------------------------    вторые 128 знаков    ----------------------------------------------------
'----------------------------------------------------------------------------------------------------------------------
    Data &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20
    Data &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20
    Data &HCB , &H20 , &H49 , &H69 , &H04 , &H20 , &HFE , &HEF , &HA2 , &HCC , &H00 , &HC9 , &H20 , &H20 , &H20 , &H02
    Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &HB5 , &H4E , &H00 , &H00 , &H00 , &H00 , &H00 , &H00
    Data &H41 , &HA0 , &H42 , &HA1 , &HE0 , &H45 , &HA3 , &HA4 , &HA5 , &HA6 , &H4B , &HA7 , &H4D , &H48 , &H4F , &HA8
    Data &H50 , &H43 , &H54 , &HA9 , &HAA , &H58 , &HE1 , &HAB , &HAC , &HE2 , &HAD , &HAE , &H62 , &HAF , &HB0 , &HB1
    Data &H61 , &HB2 , &HB3 , &HB4 , &HE3 , &H65 , &HB6 , &HB7 , &HB8 , &HB9 , &HBA , &HBB , &HBC , &HBD , &H6F , &HBE
    Data &H70 , &H63 , &HBF , &H79 , &HE4 , &H78 , &HE5 , &HC0 , &HC1 , &HE6 , &HC2 , &HC3 , &HC4 , &HC5 , &HC6 , &HC7
'----------------------------------------------------------------------------------------------------------------------
'**********************************************************************************************************************
'----------------------------------------------------------------------------------------------------------------------
'-----------------------------------------    первые 128 знаков    ----------------------------------------------------
'----------------------------------------------------------------------------------------------------------------------
'    Data " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " "
'    Data " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " "
'    Data " " , "!" , " " , "#" , "$" , "%" , "&" , "'" , "(" , ")" , "*" , "+" , "," , "-" , "." , "/"
'    Data "0" , "1" , "2" , "3" , "4" , "5" , "6" , "7" , "8" , "9" , ":" , ";" , "<" , "=" , ">" , "?"
'    Data "@" , "A" , "B" , "C" , "D" , "E" , "F" , "G" , "H" , "I" , "J" , "K" , "L" , "M" , "N" , "O"
'    Data "P" , "Q" , "R" , "S" , "T" , "U" , "V" , "W" , "X" , "Y" , "Z" , "[" , "\" , "]" , "^" , "_"
'    Data "`" , "a" , "b" , "c" , "d" , "e" , "f" , "g" , "h" , "i" , "j" , "k" , "l" , "m" , "n" , "o"
'    Data "p" , "q" , "r" , "s" , "t" , "u" , "v" , "w" , "x" , "y" , "z" , "{" , "|" , "}" , "~" , "¦"
'----------------------------------------------------------------------------------------------------------------------
'-----------------------------------------    вторые 128 знаков    ----------------------------------------------------
'----------------------------------------------------------------------------------------------------------------------
'    Data " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " "
'    Data " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " "
'    Data " " , " " , " " , " " , " " , " " , " " , " " , "ў" , " " , " " , " " , " " , " " , " " , " "
'    Data " " , " " , " " , " " , " " , " " , " " , " " , "µ" , " " , " " , " " , " " , " " , " " , " "
'    Data "A" , " " , "B" , "Ў" , "а" , "E" , "Ј" , "¤" , "Ґ" , "¦" , "K" , "§" , "M" , "H" , "O" , "Ё"
'    Data "P" , "C" , "T" , "©" , "Є" , "X" , "б" , "«" , "¬" , "в" , "­" , "®" , "b" , "Ї" , "°" , "±"
'    Data "a" , "І" , "і" , "ґ" , "г" , "e" , "¶" , "·" , "ё" , "№" , "є" , "»" , "ј" , "Ѕ" , "o" , "ѕ"
'    Data "p" , "c" , "ї" , "y" , "д" , "x" , "е" , "А" , "Б" , "ж" , "В" , "Г" , "Д" , "Е" , "Ж" , "З"
'----------------------------------------------------------------------------------------------------------------------
'**********************************************************************************************************************

'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
  Выводимый_русский_текст:
'-------------------------------------------------------------------------------
    Data "    "
    Data "Тест"
    Data "LCD "
    Data "Вот "
    Data "Так "
    Data "Оно "
    Data "Рабо"
    Data "тает"
'-------------------------------------------------------------------------------
'*******************************************************************************

'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
  Выводимый_русский_алфавит:
'-------------------------------------------------------------------------------
    Data "    "
    Data "АаБб"
    Data "ВвГг"
    Data "ДдЕе"
    Data "ЁёЖж"
    Data "ЗзИи"
    Data "ЙйКк"
    Data "ЛлМм"
    Data "НнОо"
    Data "ПпРр"
    Data "СсТт"
    Data "УуФф"
    Data "ХхЦц"
    Data "ЧчШш"
    Data "ЩщЪъ"
    Data "ЫыЬь"
    Data "ЭэЮю"
    Data "Яя"
'-------------------------------------------------------------------------------
'*******************************************************************************

http://s5.uploads.ru/t/EHoLr.jpg

Лично мне, нравится, больше всех остальных.

Отредактировано sasha_1973 (2013-07-19 13:58:05)

0

4

Вариант скоростного вывода на LCD с помощью библиотеки "lcd4busy.lbx".

Вариант описан с неоценимой помощью, пользователя этого форума под ником "Mrshilov". Огромное СПАСИБО!

При тестировании в железе получил следующие параметры (не удивляйтесь - это не опечатка, отличие от скорости стандартного вывода в ~ 40 раз)


Стандартное подключение (любые 6 ножек МК):

Что выводим:

LCD "asdfghjkloiuytrewsdf"
LCD "asdfghjkloiuytrewsdf"
LCD "asdfghjkloiuytrewsdf"
LCD "asdfghjkloiuytrewsdf"

Железо:

Atmega8A
Частота МК  8МГц

Результаты:

LCD WH2004D-YGH-CP - время вывода 20 символов в 4 строках    ~  110 ms

LCD WH2004D-TMI-CP  - время вывода 20 символов в 4 строках    ~  110 ms

LCD WH2004L-YGH-CP  - время вывода 20 символов в 4 строках    ~  110 ms

LCD WH2004L-TMI-CP  - время вывода 20 символов в 4 строках    ~  110 ms


Скоростное подключение (любой порт, - 1 ножка МК (свободная, может быть использована)):

Что выводим:

LCD "asdfghjkloiuytrewsdf"
LCD "asdfghjkloiuytrewsdf"
LCD "asdfghjkloiuytrewsdf"
LCD "asdfghjkloiuytrewsdf"

Железо:

Atmega8A
Частота МК  8МГц

Результаты:

LCD WH2004D-YGH-CP - время вывода 20 символов в 4 строках    ~  3,42 ms

LCD WH2004D-TMI-CP  - время вывода 20 символов в 4 строках    ~  3,26 ms  (проявилась болячка, (может именно у этого образца), при выводе больших цифр, нужно вводить искуственную задержку, не мене 1ms на строку, иначе не успевает выводить (срывается инициализация). На других, из описаных, не выявилось).

LCD WH2004L-YGH-CP  - время вывода 20 символов в 4 строках    ~  3,10 ms

LCD WH2004L-TMI-CP  - время вывода 20 символов в 4 строках    ~  3,04 ms


Время измерялось цифровым USB осцилографом, по переключению ножки МК.


Исходник для тестирования

'*******************************************************************************
'*****************                                   ***************************
'*****************       Конфигурация программы      ***************************
'*****************           и контроллера           ***************************
'*****************                                   ***************************
'*******************************************************************************
  $regfile = "m8def.dat" : $crystal = 8000000 : $framesize = 40 : $hwstack = 16 : $swstack = 32
'*******************************************************************************
'-------------------------------------------------------------------------------
'*******************************************************************************
'**************************     Конфигурация LCD     ***************************
'*******************************************************************************
'-------------------------------------------------------------------------------
  $lib "lcd4busy.lbx"       ' Используемая библиотека

  Const _lcdport = Portb       ' К чему подключен LCD
  Const _lcdddr = Ddrb
  Const _lcdin = Pinb
  Const _lcd_e = 3  ' Имеется ввиду PORTB.3
  Const _lcd_rw = 2 ' Имеется ввиду PORTB.2
  Const _lcd_rs = 1 ' Имеется ввиду PORTB.1

  Config Lcd = 20 * 4       ' Используемый LCD
  Initlcd           ' Инициализируем LCD
  Waitms 50         ' Ждем пока все запустится
  Cursor Off Noblink       ' Выключаем неморгающий курсор
'  Cursor On Noblink         ' Включаем неморгающий курсор
'  Cursor On Blink           ' Включаем моргающий курсор
  Cls               ' Чистим экран, на всякий случай
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
'------------------   Конфигурация выхода для светодиодика   -------------------
'-------------------------------------------------------------------------------
  Config Portd.7 = Output       ' Натраиваем порт на выход
  Светодиод Alias Portd.7       ' Присваиваем собственное имя ножке порта контроллера
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
'-----------------------   Оcновной_цикл_программы   ---------------------------
'-------------------------------------------------------------------------------
  Do
  Главный_цикл:
'-------------------------------------

    Lcd "asdfghjkloiuytrewsdf"       ' Любые 20 символов
    Lcd "asdfghjkloiuytrewsdf"       ' Любые 20 символов
    Lcd "asdfghjkloiuytrewsdf"       ' Любые 20 символов
    Lcd "asdfghjkloiuytrewsdf"       ' Любые 20 символов

'     Waitms 50

     Toggle Светодиод       ' Моргаем светодоидиком ( типа, все нормально, ещё не зависли)
'------------------------------------
  Goto Главный_цикл
  Loop
End
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------

Осцилограф
http://s5.uploads.ru/t/kbILp.jpg

Протеус
http://s5.uploads.ru/t/ZozkO.jpg

Обновление: 28.10.2016

Видео, выложено на файлообменник (~22 Mb) в формате МР4, поэтому кто с мобильных устройств, сделайте выводы  -  скачать

Архив со всем необходимым (исходник, эмуляция в "Протеус") -  скачать

Отредактировано sasha_1973 (2013-07-19 16:10:13)

+1

5

Все знают о проблеме удобочитаемого вывода русского текста на знакосинтезирующем дисплее с чипом HD44780

Кому будет интересно предлагаю такой вариант:

Исходник "Вывод русского текста (таблица byte)на LCD"

'*******************************************************************************
'*****************                                   ***************************
'*****************       Конфигурация программы      ***************************
'*****************           и контроллера           ***************************
'*****************                                   ***************************
'*******************************************************************************
  $regfile = "m8def.dat" : $crystal = 8000000 : $framesize = 0 : $hwstack = 0 : $swstack = 0 : $baud = 4800       '1200     '2400     '4800     '9600     '19200     '38400     '57600     '115000
'*******************************************************************************
'-------------------------------------------------------------------------------
'*******************************************************************************
'**************************     Конфигурация LCD     ***************************
'*******************************************************************************
'-------------------------------------------------------------------------------
  Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.1 , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5
  Config Lcd = 20 * 4 : Cursor Off Noblink : Cls
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
'*******************************************************************************
'************************     Объявляем подпограммы     ************************
'*******************************************************************************
'-------------------------------------------------------------------------------
'-----------    Подпрограмма вывода русского текста на LCD HD44780   -----------
'-------------------------------------------------------------------------------
  Declare Sub Lcd_print(byval Копия_lcd_print As String)       ' Подпрограмма вывода русского текста на LCD HD44780
'-------------------------------------------------------------------------------
  Dim Длина As Integer , Цикл_lcd_print As Integer
  Dim Код_символа As Byte , Код_символа_lcd As Byte
  Dim Символ_lcd As String * 1 , Символ As String * 1 , Вывод_на_lcd As String * 20
'-------------------------------------------------------------------------------
  Dim Строка_lcd As Byte , Курсор_lcd As Byte , Цикл_lcd As Byte
  Dim Буфер_lcd As String * 20
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
  Строка_lcd = 1 : Курсор_lcd = 1
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
  Do
'-------------------------------------------------------------------------------
    nop

    For Цикл_lcd = 1 To 5

      Буфер_lcd = Lookupstr(цикл_lcd , Выводимые_данные)

      Lcd_print Буфер_lcd

      Incr Строка_lcd : If Строка_lcd > 5 Then Строка_lcd = 1

      Waitms 500

    Next Цикл_lcd

    nop

'    Rcall Пишем_на_lcd

    Waitms 500
'-------------------------------------------------------------------------------
  Loop : End
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
'  Пишем_на_lcd:
'-------------------------------------------------------------------------------
'    Строка_lcd = 1 : Курсор_lcd = 1
'    Буфер_lcd = "       Привет       "
'    Lcd_print Буфер_lcd

'    Строка_lcd = 2 : Курсор_lcd = 1
'    Буфер_lcd = "  проверка  вывода  "
'    Lcd_print Буфер_lcd

'    Строка_lcd = 3 : Курсор_lcd = 1
'    Буфер_lcd = "  русского  текста  "
'    Lcd_print Буфер_lcd

'    Строка_lcd = 4 : Курсор_lcd = 1
'    Буфер_lcd = "      на   LCD      "
'    Lcd_print Буфер_lcd
'    Waitms 500
'    Буфер_lcd = "     в Протеусе     "
'    Lcd_print Буфер_lcd
'    Waitms 250

'-------------------------------------------------------------------------------
'  Return
'-------------------------------------------------------------------------------
'*******************************************************************************

  Выводимые_данные:

    Data "                    "
    Data "       Привет       "
    Data "  проверка  вывода  "
    Data "  русского  текста  "
    Data "      на   LCD      "
    Data "     в Протеусе     "

'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
  Sub Lcd_print(byval Копия_lcd_print As String * 20)
'-------------------------------------------------------------------------------
'   Local Длина As Integer , Цикл_lcd_print As Integer
'   Local Код_символа As Byte , Код_символа_lcd As Byte
'   Local Символ_lcd As String * 1 , Символ As String * 1 ', Вывод_на_lcd As String * 20
'-------------------------------------------------------------------------------
    Длина = Len(копия_lcd_print) : If Длина = 0 Then Exit Sub

    Вывод_на_lcd = ""

    For Цикл_lcd_print = 1 To Длина
      Символ = Mid(копия_lcd_print , Цикл_lcd_print , 1)
      Код_символа = Asc(символ)
      Код_символа_lcd = Lookup(код_символа , Cp1251_to_lcd_hd44780)
      Символ_lcd = Chr(код_символа_lcd)
      Вывод_на_lcd = Вывод_на_lcd + Символ_lcd
    Next Цикл_lcd_print

    Locate Строка_lcd , Курсор_lcd
    Lcd Вывод_на_lcd
'-------------------------------------------------------------------------------
  End Sub
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
'**********************************************************************************************************************
'************       Таблица для перекодировки из символов Cp1251 в символы знакосинтезирующего LCD        *************
'**********************************************************************************************************************
'----------------------------------------------------------------------------------------------------------------------
  Cp1251_to_lcd_hd44780:
'----------------------------------------------------------------------------------------------------------------------
'**********************************************************************************************************************
'----------------------------------------------------------------------------------------------------------------------
'-----------------------------------------    первые 128 знаков    ----------------------------------------------------
'----------------------------------------------------------------------------------------------------------------------
    Data &H00 , &H01 , &H02 , &H03 , &H04 , &H05 , &H06 , &H07 , &H08 , &H09 , &H0A , &H0B , &H0C , &H0D , &H0E , &H0F
    Data &H10 , &H11 , &H12 , &H13 , &H14 , &H15 , &H16 , &H17 , &H18 , &H19 , &H1A , &H1B , &H1C , &H1D , &H1E , &H1F
    Data &H20 , &H21 , &H22 , &H23 , &H24 , &H25 , &H26 , &H27 , &H28 , &H29 , &H2A , &H2B , &H2C , &H2D , &H2E , &H2F
    Data &H30 , &H31 , &H32 , &H33 , &H34 , &H35 , &H36 , &H37 , &H38 , &H39 , &H3A , &H3B , &H3C , &H3D , &H3E , &H3F
    Data &H40 , &H41 , &H42 , &H43 , &H44 , &H45 , &H46 , &H47 , &H48 , &H49 , &H4A , &H4B , &H4C , &H4D , &H4E , &H4F
    Data &H50 , &H51 , &H52 , &H53 , &H54 , &H55 , &H56 , &H57 , &H58 , &H59 , &H5A , &H5B , &H20 , &H5D , &H5E , &H5F
    Data &H60 , &H61 , &H62 , &H63 , &H64 , &H65 , &H66 , &H67 , &H68 , &H69 , &H6A , &H6B , &H6C , &H6D , &H6E , &H6F
    Data &H70 , &H71 , &H72 , &H73 , &H74 , &H75 , &H76 , &H77 , &H78 , &H79 , &H7A , &H5B , &H20 , &H5D , &HE9 , &H7F
'----------------------------------------------------------------------------------------------------------------------
'-----------------------------------------    вторые 128 знаков    ----------------------------------------------------
'----------------------------------------------------------------------------------------------------------------------
    Data &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20
    Data &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20
    Data &HCB , &H20 , &H49 , &H69 , &H04 , &H20 , &HFE , &HEF , &HA2 , &HCC , &H00 , &HC9 , &H20 , &H20 , &H20 , &H02
    Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &HB5 , &H4E , &H00 , &H00 , &H00 , &H00 , &H00 , &H00
    Data &H41 , &HA0 , &H42 , &HA1 , &HE0 , &H45 , &HA3 , &HA4 , &HA5 , &HA6 , &H4B , &HA7 , &H4D , &H48 , &H4F , &HA8
    Data &H50 , &H43 , &H54 , &HA9 , &HAA , &H58 , &HE1 , &HAB , &HAC , &HE2 , &HAD , &HAE , &H62 , &HAF , &HB0 , &HB1
    Data &H61 , &HB2 , &HB3 , &HB4 , &HE3 , &H65 , &HB6 , &HB7 , &HB8 , &HB9 , &HBA , &HBB , &HBC , &HBD , &H6F , &HBE
    Data &H70 , &H63 , &HBF , &H79 , &HE4 , &H78 , &HE5 , &HC0 , &HC1 , &HE6 , &HC2 , &HC3 , &HC4 , &HC5 , &HC6 , &HC7
'----------------------------------------------------------------------------------------------------------------------
'**********************************************************************************************************************
'----------------------------------------------------------------------------------------------------------------------
'-----------------------------------------    первые 128 знаков    ----------------------------------------------------
'----------------------------------------------------------------------------------------------------------------------
'    Data " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " "
'    Data " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " "
'    Data " " , "!" , " " , "#" , "$" , "%" , "&" , "'" , "(" , ")" , "*" , "+" , "," , "-" , "." , "/"
'    Data "0" , "1" , "2" , "3" , "4" , "5" , "6" , "7" , "8" , "9" , ":" , ";" , "<" , "=" , ">" , "?"
'    Data "@" , "A" , "B" , "C" , "D" , "E" , "F" , "G" , "H" , "I" , "J" , "K" , "L" , "M" , "N" , "O"
'    Data "P" , "Q" , "R" , "S" , "T" , "U" , "V" , "W" , "X" , "Y" , "Z" , "[" , "\" , "]" , "^" , "_"
'    Data "`" , "a" , "b" , "c" , "d" , "e" , "f" , "g" , "h" , "i" , "j" , "k" , "l" , "m" , "n" , "o"
'    Data "p" , "q" , "r" , "s" , "t" , "u" , "v" , "w" , "x" , "y" , "z" , "{" , "|" , "}" , "~" , "¦"
'----------------------------------------------------------------------------------------------------------------------
'-----------------------------------------    вторые 128 знаков    ----------------------------------------------------
'----------------------------------------------------------------------------------------------------------------------
'    Data " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " "
'    Data " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " "
'    Data " " , " " , " " , " " , " " , " " , " " , " " , "ў" , " " , " " , " " , " " , " " , " " , " "
'    Data " " , " " , " " , " " , " " , " " , " " , " " , "µ" , " " , " " , " " , " " , " " , " " , " "
'    Data "A" , " " , "B" , "Ў" , "а" , "E" , "Ј" , "¤" , "Ґ" , "¦" , "K" , "§" , "M" , "H" , "O" , "Ё"
'    Data "P" , "C" , "T" , "©" , "Є" , "X" , "б" , "«" , "¬" , "в" , "­" , "®" , "b" , "Ї" , "°" , "±"
'    Data "a" , "І" , "і" , "ґ" , "г" , "e" , "¶" , "·" , "ё" , "№" , "є" , "»" , "ј" , "Ѕ" , "o" , "ѕ"
'    Data "p" , "c" , "ї" , "y" , "д" , "x" , "е" , "А" , "Б" , "ж" , "В" , "Г" , "Д" , "Е" , "Ж" , "З"
'----------------------------------------------------------------------------------------------------------------------
'**********************************************************************************************************************

Исходник "Вывод русского текста (таблица string)на LCD"

'*******************************************************************************
'*****************                                   ***************************
'*****************       Конфигурация программы      ***************************
'*****************           и контроллера           ***************************
'*****************                                   ***************************
'*******************************************************************************
  $regfile = "m8def.dat" : $crystal = 1000000 : $framesize = 0 : $hwstack = 0 : $swstack = 0 : $baud = 4800       '1200     '2400     '4800     '9600     '19200     '38400     '57600     '115000
'-------------------------------------------------------------------------------
  Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.1 , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5
  Config Lcd = 20 * 4 : Cursor Off Noblink : Cls
'-------------------------------------------------------------------------------
'*******************************************************************************
  Dim Строка_lcd As Byte , Курсор_lcd As Byte
  Dim Буфер_lcd As String * 20
'-------------------------------------------------------------------------------
  Dim Длина As Integer , Цикл_lcd_print As Integer
  Dim Код_символа As Byte , Код_символа_lcd As Byte
  Dim Символ_lcd As String * 1 , Символ As String * 1 , Вывод_на_lcd As String * 20
'*******************************************************************************
'************************     Объявляем подпограммы     ************************
'*******************************************************************************
'-------------------------------------------------------------------------------
  Declare Sub Lcd_print(byval Копия_lcd_print As String)       ' Подпрограмма вывода русского языка на LCD HD44780
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
'  Буфер_lcd = "Привет"
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
  Do
'-------------------------------------------------------------------------------

    nop

    Строка_lcd = 1 : Курсор_lcd = 1
    Буфер_lcd = "       Привет       "
    Lcd_print Буфер_lcd

    Строка_lcd = 2 : Курсор_lcd = 1
    Буфер_lcd = "  проверка  вывода  "
    Lcd_print Буфер_lcd

    Строка_lcd = 3 : Курсор_lcd = 1
    Буфер_lcd = "  русского  текста  "
    Lcd_print Буфер_lcd

    Строка_lcd = 4 : Курсор_lcd = 1
    Буфер_lcd = "      на   LCD      "
    Lcd_print Буфер_lcd

    nop

'    Locate 1 , 1
'    Lcd "Ёpёіeї"                                  ' "Привет"

    Waitms 1

'-------------------------------------------------------------------------------
  Loop : End
'-------------------------------------------------------------------------------

'*******************************************************************************
'-------------------------------------------------------------------------------
  Sub Lcd_print(byval Копия_lcd_print As String * 20)
'-------------------------------------------------------------------------------
'   Local Длина As Integer , Цикл_lcd_print As Integer
'   Local Код_символа As Byte , Код_символа_lcd As Byte
'   Local Символ_lcd As String * 1 , Символ As String * 1 , Вывод_на_lcd As String * 20
'-------------------------------------------------------------------------------
    Длина = Len(копия_lcd_print) : If Длина = 0 Then Exit Sub

    Вывод_на_lcd = ""

    For Цикл_lcd_print = 1 To Длина
      Символ = Mid(копия_lcd_print , Цикл_lcd_print , 1)
      Код_символа = Asc(символ)
      Символ_lcd = Lookupstr(код_символа , Cp1251_to_lcd_hd44780)
      Вывод_на_lcd = Вывод_на_lcd + Символ_lcd
    Next Цикл_lcd_print

    Locate Строка_lcd , Курсор_lcd
    Lcd Вывод_на_lcd
'-------------------------------------------------------------------------------
  End Sub
'-------------------------------------------------------------------------------
'*******************************************************************************

'*******************************************************************************
'-------------------------------------------------------------------------------
  Cp1251_to_lcd_hd44780:
'-------------------------------------------------------------------------------
'    Data &H00 , &H01 , &H02 , &H03 , &H04 , &H05 , &H06 , &H07 , &H08 , &H09 , &H0A , &H0B , &H0C , &H0D , &H0E , &H0F
'    Data &H10 , &H11 , &H12 , &H13 , &H14 , &H15 , &H16 , &H17 , &H18 , &H19 , &H1A , &H1B , &H1C , &H1D , &H1E , &H1F
'    Data &H20 , &H21 , &H22 , &H23 , &H24 , &H25 , &H26 , &H27 , &H28 , &H29 , &H2A , &H2B , &H2C , &H2D , &H2E , &H2F
'    Data &H30 , &H31 , &H32 , &H33 , &H34 , &H35 , &H36 , &H37 , &H38 , &H39 , &H3A , &H3B , &H3C , &H3D , &H3E , &H3F
'    Data &H40 , &H41 , &H42 , &H43 , &H44 , &H45 , &H46 , &H47 , &H48 , &H49 , &H4A , &H4B , &H4C , &H4D , &H4E , &H4F
'    Data &H50 , &H51 , &H52 , &H53 , &H54 , &H55 , &H56 , &H57 , &H58 , &H59 , &H5A , &H5B , &H20 , &H5D , &H5E , &H5F
'    Data &H60 , &H61 , &H62 , &H63 , &H64 , &H65 , &H66 , &H67 , &H68 , &H69 , &H6A , &H6B , &H6C , &H6D , &H6E , &H6F
'    Data &H70 , &H71 , &H72 , &H73 , &H74 , &H75 , &H76 , &H77 , &H78 , &H79 , &H7A , &H5B , &H20 , &H5D , &HE9 , &H7F
'    Data &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20
'    Data &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20
'    Data &HCB , &H20 , &H49 , &H69 , &H04 , &H20 , &HFE , &HEF , &HA2 , &HCC , &H00 , &HC9 , &H20 , &H20 , &H20 , &H02
'    Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &HB5 , &H4E , &H00 , &H00 , &H00 , &H00 , &H00 , &H00
'    Data &H41 , &HA0 , &H42 , &HA1 , &HE0 , &H45 , &HA3 , &HA4 , &HA5 , &HA6 , &H4B , &HA7 , &H4D , &H48 , &H4F , &HA8
'    Data &H50 , &H43 , &H54 , &HA9 , &HAA , &H58 , &HE1 , &HAB , &HAC , &HE2 , &HAD , &HAE , &H62 , &HAF , &HB0 , &HB1
'    Data &H61 , &HB2 , &HB3 , &HB4 , &HE3 , &H65 , &HB6 , &HB7 , &HB8 , &HB9 , &HBA , &HBB , &HBC , &HBD , &H6F , &HBE
'    Data &H70 , &H63 , &HBF , &H79 , &HE4 , &H78 , &HE5 , &HC0 , &HC1 , &HE6 , &HC2 , &HC3 , &HC4 , &HC5 , &HC6 , &HC7
'-------------------------------------------------------------------------------
    Data " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " "
    Data " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " "
    Data " " , "!" , " " , "#" , "$" , "%" , "&" , "'" , "(" , ")" , "*" , "+" , "," , "-" , "." , "/"
    Data "0" , "1" , "2" , "3" , "4" , "5" , "6" , "7" , "8" , "9" , ":" , ";" , "<" , "=" , ">" , "?"
    Data "@" , "A" , "B" , "C" , "D" , "E" , "F" , "G" , "H" , "I" , "J" , "K" , "L" , "M" , "N" , "O"
    Data "P" , "Q" , "R" , "S" , "T" , "U" , "V" , "W" , "X" , "Y" , "Z" , "[" , "\" , "]" , "^" , "_"
    Data "`" , "a" , "b" , "c" , "d" , "e" , "f" , "g" , "h" , "i" , "j" , "k" , "l" , "m" , "n" , "o"
    Data "p" , "q" , "r" , "s" , "t" , "u" , "v" , "w" , "x" , "y" , "z" , "{" , "|" , "}" , "~" , "¦"
'-------------------------------------------------------------------------------    первые 127 знаков
    Data " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " "
    Data " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " "
    Data " " , " " , " " , " " , " " , " " , " " , " " , "ў" , " " , " " , " " , " " , " " , " " , " "
    Data " " , " " , " " , " " , " " , " " , " " , " " , "µ" , " " , " " , " " , " " , " " , " " , " "
    Data "A" , " " , "B" , "Ў" , "а" , "E" , "Ј" , "¤" , "Ґ" , "¦" , "K" , "§" , "M" , "H" , "O" , "Ё"
    Data "P" , "C" , "T" , "©" , "Є" , "X" , "б" , "«" , "¬" , "в" , "­" , "®" , "b" , "Ї" , "°" , "±"
    Data "a" , "І" , "і" , "ґ" , "г" , "e" , "¶" , "·" , "ё" , "№" , "є" , "»" , "ј" , "Ѕ" , "o" , "ѕ"
    Data "p" , "c" , "ї" , "y" , "д" , "x" , "е" , "А" , "Б" , "ж" , "В" , "Г" , "Д" , "Е" , "Ж" , "З"
'-------------------------------------------------------------------------------    вторые 127 знаков
'*******************************************************************************

Таблицы кодировки

'**********************************************************************************************************************
'----------------------------------------------------------------------------------------------------------------------
  Cp1251_to_lcd_hd44780:
'----------------------------------------------------------------------------------------------------------------------
'**********************************************************************************************************************
'----------------------------------------------------------------------------------------------------------------------
'-----------------------------------------    первые 128 знаков    ----------------------------------------------------
'----------------------------------------------------------------------------------------------------------------------
'    Data &H00 , &H01 , &H02 , &H03 , &H04 , &H05 , &H06 , &H07 , &H08 , &H09 , &H0A , &H0B , &H0C , &H0D , &H0E , &H0F
'    Data &H10 , &H11 , &H12 , &H13 , &H14 , &H15 , &H16 , &H17 , &H18 , &H19 , &H1A , &H1B , &H1C , &H1D , &H1E , &H1F
'    Data &H20 , &H21 , &H22 , &H23 , &H24 , &H25 , &H26 , &H27 , &H28 , &H29 , &H2A , &H2B , &H2C , &H2D , &H2E , &H2F
'    Data &H30 , &H31 , &H32 , &H33 , &H34 , &H35 , &H36 , &H37 , &H38 , &H39 , &H3A , &H3B , &H3C , &H3D , &H3E , &H3F
'    Data &H40 , &H41 , &H42 , &H43 , &H44 , &H45 , &H46 , &H47 , &H48 , &H49 , &H4A , &H4B , &H4C , &H4D , &H4E , &H4F
'    Data &H50 , &H51 , &H52 , &H53 , &H54 , &H55 , &H56 , &H57 , &H58 , &H59 , &H5A , &H5B , &H20 , &H5D , &H5E , &H5F
'    Data &H60 , &H61 , &H62 , &H63 , &H64 , &H65 , &H66 , &H67 , &H68 , &H69 , &H6A , &H6B , &H6C , &H6D , &H6E , &H6F
'    Data &H70 , &H71 , &H72 , &H73 , &H74 , &H75 , &H76 , &H77 , &H78 , &H79 , &H7A , &H5B , &H20 , &H5D , &HE9 , &H7F
'----------------------------------------------------------------------------------------------------------------------
'-----------------------------------------    вторые 128 знаков    ----------------------------------------------------
'----------------------------------------------------------------------------------------------------------------------
'    Data &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20
'    Data &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20
'    Data &HCB , &H20 , &H49 , &H69 , &H04 , &H20 , &HFE , &HEF , &HA2 , &HCC , &H00 , &HC9 , &H20 , &H20 , &H20 , &H02
'    Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &HB5 , &H4E , &H00 , &H00 , &H00 , &H00 , &H00 , &H00
'    Data &H41 , &HA0 , &H42 , &HA1 , &HE0 , &H45 , &HA3 , &HA4 , &HA5 , &HA6 , &H4B , &HA7 , &H4D , &H48 , &H4F , &HA8
'    Data &H50 , &H43 , &H54 , &HA9 , &HAA , &H58 , &HE1 , &HAB , &HAC , &HE2 , &HAD , &HAE , &H62 , &HAF , &HB0 , &HB1
'    Data &H61 , &HB2 , &HB3 , &HB4 , &HE3 , &H65 , &HB6 , &HB7 , &HB8 , &HB9 , &HBA , &HBB , &HBC , &HBD , &H6F , &HBE
'    Data &H70 , &H63 , &HBF , &H79 , &HE4 , &H78 , &HE5 , &HC0 , &HC1 , &HE6 , &HC2 , &HC3 , &HC4 , &HC5 , &HC6 , &HC7
'----------------------------------------------------------------------------------------------------------------------
'**********************************************************************************************************************
'----------------------------------------------------------------------------------------------------------------------
'-----------------------------------------    первые 128 знаков    ----------------------------------------------------
'----------------------------------------------------------------------------------------------------------------------
'    Data " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " "
'    Data " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " "
'    Data " " , "!" , " " , "#" , "$" , "%" , "&" , "'" , "(" , ")" , "*" , "+" , "," , "-" , "." , "/"
'    Data "0" , "1" , "2" , "3" , "4" , "5" , "6" , "7" , "8" , "9" , ":" , ";" , "<" , "=" , ">" , "?"
'    Data "@" , "A" , "B" , "C" , "D" , "E" , "F" , "G" , "H" , "I" , "J" , "K" , "L" , "M" , "N" , "O"
'    Data "P" , "Q" , "R" , "S" , "T" , "U" , "V" , "W" , "X" , "Y" , "Z" , "[" , "\" , "]" , "^" , "_"
'    Data "`" , "a" , "b" , "c" , "d" , "e" , "f" , "g" , "h" , "i" , "j" , "k" , "l" , "m" , "n" , "o"
'    Data "p" , "q" , "r" , "s" , "t" , "u" , "v" , "w" , "x" , "y" , "z" , "{" , "|" , "}" , "~" , "¦"
'----------------------------------------------------------------------------------------------------------------------
'-----------------------------------------    вторые 128 знаков    ----------------------------------------------------
'----------------------------------------------------------------------------------------------------------------------
'    Data " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " "
'    Data " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " " , " "
'    Data " " , " " , " " , " " , " " , " " , " " , " " , "ў" , " " , " " , " " , " " , " " , " " , " "
'    Data " " , " " , " " , " " , " " , " " , " " , " " , "µ" , " " , " " , " " , " " , " " , " " , " "
'    Data "A" , " " , "B" , "Ў" , "а" , "E" , "Ј" , "¤" , "Ґ" , "¦" , "K" , "§" , "M" , "H" , "O" , "Ё"
'    Data "P" , "C" , "T" , "©" , "Є" , "X" , "б" , "«" , "¬" , "в" , "­" , "®" , "b" , "Ї" , "°" , "±"
'    Data "a" , "І" , "і" , "ґ" , "г" , "e" , "¶" , "·" , "ё" , "№" , "є" , "»" , "ј" , "Ѕ" , "o" , "ѕ"
'    Data "p" , "c" , "ї" , "y" , "д" , "x" , "е" , "А" , "Б" , "ж" , "В" , "Г" , "Д" , "Е" , "Ж" , "З"
'----------------------------------------------------------------------------------------------------------------------
'**********************************************************************************************************************

'*******************************************************************************
'-------------------------------------------------------------------------------
'  Русский_шрифт:
'   АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮюЯя
'-------------------------------------------------------------------------------
'    Data "А" , "а" , "Б" , "б" , "В" , "в" , "Г" , "г" , "Д" , "д" , "Е" ,
'    Data "е" , "Ё" , "ё" , "Ж" , "ж" , "З" , "з" , "И" , "и" , "Й" , "й" ,
'    Data "К" , "к" , "Л" , "л" , "М" , "м" , "Н" , "н" , "О" , "о" , "П" ,
'    Data "п" , "Р" , "р" , "С" , "с" , "Т" , "т" , "У" , "у" , "Ф" , "ф" ,
'    Data "Х" , "х" , "Ц" , "ц" , "Ч" , "ч" , "Ш" , "ш" , "Щ" , "щ" , "Ъ" ,
'    Data "ъ" , "Ы" , "ы" , "Ь" , "ь" , "Э" , "э" , "Ю" , "ю" , "Я" , "я"
'-------------------------------------------------------------------------------
'*******************************************************************************

'*******************************************************************************
'-------------------------------------------------------------------------------
'  Русский_шрифт_lcd_hd44780:
'   Aa ІBіЎґагEeўµЈ¶¤·Ґё¦№Kє§»MјHЅOoЁѕPpCcTї©yЄдXxбе«А¬Бвж­В®ГbДЇЕ°Ж±З
'-------------------------------------------------------------------------------
'    Data "A" , "a" , " " , "І" , "B" , "і" , "Ў" , "ґ" , "а" , "г" , "E" ,
'    Data "e" , "ў" , "µ" , "Ј" , "¶" , "¤" , "·" , "Ґ" , "ё" , "¦" , "№" ,
'    Data "K" , "є" , "§" , "»" , "M" , "ј" , "H" , "Ѕ" , "O" , "o" , "Ё" ,
'    Data "ѕ" , "P" , "p" , "C" , "c" , "T" , "ї" , "©" , "y" , "Є" , "д" ,
'    Data "X" , "x" , "б" , "е" , "«" , "А" , "¬" , "Б" , "в" , "ж" , "­" ,
'    Data "В" , "®" , "Г" , "b" , "Д" , "Ї" , "Е" , "°" , "Ж" , "±" , "З"
'-------------------------------------------------------------------------------
'*******************************************************************************

'*******************************************************************************
'-------------------------------------------------------------------------------
'  Русский_шрифт_lcd_hd44780:
'   Aa ІBіЎґагEeўµЈ¶¤·Ґё¦№Kє§»MјHЅOoЁѕPpCcTї©yЄдXxбе«А¬Бвж­В®ГbДЇЕ°Ж±З
'-------------------------------------------------------------------------------
'    Data &H41 , &H61 , &HA0 , &HB2 , &H42 , &HB3 , &HA1 , &HB4 , &HE0 , &HE3 , &H45
'    Data &H65 , &HA2 , &HB5 , &HA3 , &HB6 , &HA4 , &HB7 , &HA5 , &HB8 , &HA6 , &HB9
'    Data &H4B , &HBA , &HA7 , &HBB , &H4D , &HBC , &H48 , &HBD , &H4F , &H6F , &HA8
'    Data &HBE , &H50 , &H70 , &H43 , &H63 , &H54 , &HBF , &HA9 , &H79 , &HAA , &HE4
'    Data &H58 , &H78 , &HE1 , &HE5 , &HAB , &HC0 , &HAC , &HC1 , &HE2 , &HE6 , &HAD
'    Data &HC2 , &HAE , &HC3 , &H62 , &HC4 , &HAF , &HC5 , &HB0 , &HC6 , &HB1 , &HC7,
'-------------------------------------------------------------------------------
'*******************************************************************************

Время вывода 4строк по 20 символов, при частоте МК 8МГЦ, ~110ms (при скоростном подключении, время вывода уменьшается в 10-ки(десятки) раз).
Как ни странно двойное преобразование (обратите внимание, не вывод на LCD, а именно перекодировка) работает на 30% быстрее чем сразу выводить строковое значение (String*20)

http://s5.uploads.ru/t/xeV1m.jpg

Все файлы, включая исходники в 2-х вариантах, файл эмуляции и библиотека (LCDALPHA.DLL) для работы протеуса, таблицы кодировки Cp1251 и знакогенератора HD44780, программы для перекодирования из под Windows, в архиве по ссылке:  скачать*

Отредактировано sasha_1973 (2013-07-19 17:51:50)

0

6

Обновлённая библиотека (LCDALPHA.DLL) для вывода русских символов на LCD (HD44780) в Протеус.
Предыдущий вариант иногда подглючивал.

скачать

0

7

Код:
$lib "lcd4busy.lbx"       ' Используемая библиотека

  Const _lcdport = Portb       ' К чему подключен LCD
  Const _lcdddr = Ddrb
  Const _lcdin = Pinb
  Const _lcd_e = 3  ' Имеется ввиду PORTB.3
  Const _lcd_rw = 2 ' Имеется ввиду PORTB.2
  Const _lcd_rs = 1 ' Имеется ввиду PORTB.1

Возможности назначить E, RW и RS на другой порт нет?

0

8

SIvan написал(а):

Возможности назначить E, RW и RS на другой порт нет?

Есть такая возможность, вопрос в том, что нужен весь порт:

  Const _lcdport = Portх       ' К чему подключен LCD
  Const _lcdddr = Ddrх
  Const _lcdin = Pinх
  Const _lcd_e = 3  ' Имеется ввиду PORTх.3
  Const _lcd_rw = 2 ' Имеется ввиду PORTх.2
  Const _lcd_rs = 1 ' Имеется ввиду PORTх.1

В справке Bascom написано более подробно.

0

9

Да, я немного не в ту тему запостил свой программный модуль.

Отпишусь и тут. Прилагаю ссылку на svn репозиторий, где лежит полностью самописный драйвер LCD на базе HD44780, который позволяет выводить текст на русском языке на русифицированный индикатор. Используется таблица перекодировки из CP1251 (Windows) в кодовую страницу HD44780.

Он состоит из двух файлов: LCD_Header.bas и LCD.bas.

В заголовочном файле можно найти список поддерживаемых функций для работы с индикатором. Кстати, вы можете расположить выводы данных и управления каким угодно образом. Пока работает 4-проводный интерфейс, 8-проводный на подходе. Ещё будут специальные функции по чтению адреса и данных из индикатора.

http://img.radiokot.ru/files/4453/thumbnail/6b945ltja.png

Отредактировано uni (2013-10-31 22:26:05)

0

10

Пишем в Bascome на русском и наблюдаем написанное на LCD от WinStara   (модернизация моего предыдущего варианта)

Исходник

''===============================================================================
  $map       ' Получаем карту распределения памяти в отчёте компиляции
  $regfile = "m328pdef.dat"       ' Используемый контроллер
  $crystal = 7372800       ' Частота работы контроллера
  $framesize = 100       ' Размер области используемой для преобразований
  $hwstack = 100       ' Размер аппаратного стека
  $swstack = 100       ' Размер программного стека
  $baud = 115200       ' Скорость трансляции по USART
'===============================================================================
' П О Д К Л Ю Ч Е Н И Е     К О Н Ф И Г У Р А Ц И О Н Н Ы Х     М О Д У Л Е Й
'===============================================================================

'===============================================================================
'          Настройка МК для работы с LCD на базе контроллера hd44780
'   Обратите внимание, библиотеки не используются, выводы могут быть любые
'===============================================================================
  Config Lcdpin = Pin , Rs = Portb.5 , E = Portb.4 , Db4 = Portb.3 , Db5 = Portb.2 , Db6 = Portb.1 , Db7 = Portb.0
  Config Lcd = 20 * 4       ' Используемый LCD
  Initlcd       ' Инициализируем LCD
  Waitms 50       ' Ждем пока все запустится
  Cursor Off Noblink       ' Выключаем неморгающий курсор
'  Cursor On Noblink         ' Включаем неморгающий курсор
'  Cursor On Blink       ' Включаем моргающий курсор
'  Upperline  1 строка, Lowerline  2 строка, Thirdline  3 строка, Fourthline 4 строка  - один из вариантов перехода на строку
  Cls       ' Чистим экран, на всякий случай

'===============================================================================
'            И С П О Л Ь З У Е М Ы Е     П О Д П Р О Г Р А М М Ы
'===============================================================================

'-----------    Подпрограмма вывода русского текста на LCD HD44780   -----------
  Declare Sub Lcd_print(byval Copy_строка As Byte , Byval Copy_знакоместо As Byte , Byval Copy_buffer_lcd As String)       ' Подпрограмма вывода русского текста на LCD HD44780

'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
'    З А П У С К    И    П Р Е Д В А Р И Т Е Л Ь Н Ы Е    Н А С Т Р О Й К И
'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\

' "!#$%&'( )*+,-./:;<=>?@`_°{|}~¦[\]"
' "1234567890"
' "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz"
' "АаБбВвГгДдЕеЁёЖжЗзИиЙйКлЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮюЯя"

'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
'--------------  Разрешаем работу необходимых прерываний  ----------------------

'------------  Разрешаем работу всех включенных прерываний  --------------------
'  Enable Interrupts
'===============================================================================
'                   Г Л А В Н Ы Й         Ц И К Л
  Главный_цикл:
'===============================================================================

    Locate 1 , 1
    Lcd "Aa ІBіЎґагEeўµЈ¶¤·Ґё"

    Locate 2 , 1
    Lcd "¦№Kє§»MјHЅOoЁѕPpCcTї"

    Locate 3 , 1
    Lcd "©yЄдXxбе«А¬Бвж­В®ГbД"

    Locate 4 , 1
    Lcd "®Е°Ж±З 0123456789 !?"
    Wait 2
    Cls

    Lcd_print 1 , 1 , "!#$%&'()*+,-./:;<=>?"
    Lcd_print 2 , 1 , "@`_{|}[]"
    Lcd_print 3 , 1 , "1234567890"
    Wait 2
    Cls

    Lcd_print 1 , 1 , "AaBbCcDdEeFfGgHhIiJj"
    Lcd_print 2 , 1 , "KkLlMmNnOoPpQqRrSsTt"
    Lcd_print 3 , 1 , "UuVvWwXxYyZz"
    Wait 2
    Cls

    Lcd_print 1 , 1 , "АаБбВвГгДдЕеЁёЖжЗзИи"
    Lcd_print 2 , 1 , "ЙйКлЛлМмНнОоПпРрСсТт"
    Lcd_print 3 , 1 , "УуФфХхЦцЧчШшЩщЪъЫыЬь"
    Lcd_print 4 , 1 , "ЭэЮюЯя"
    Wait 2
    Cls

'===============================================================================
  Goto Главный_цикл
End
'===============================================================================

'===============================================================================
'           Подпрограмма вывода русского текста на LCD HD44780
'===============================================================================
  Sub Lcd_print(byval Copy_строка As Byte , Byval Copy_знакоместо As Byte , Byval Copy_buffer_lcd As String)       ' Подпрограмма вывода русского текста на LCD HD44780
'-------------------------------------------------------------------------------
    Local Длина_строки As Byte , Цикл_lcd_print As Byte , Код_символа As Byte , Код_символа_lcd As Byte
    Local Строка As Byte , Знакоместо As Byte
    Local Символ_str As String * 1 , Символ_lcd_str As String * 1 , Вывод_на_lcd_str As String * 20

    Строка = Copy_строка
    Знакоместо = Copy_знакоместо
    Вывод_на_lcd_str = ""

    Длина_строки = Len(copy_buffer_lcd)       ' Узнаем количество выводимых символов
    If Длина_строки = 0 Then       ' Ecли длина строки "0", выходим из подпрограммы
        Exit Sub       ' Узнаем количество выводимых символов
    End If

    For Цикл_lcd_print = 1 To Длина_строки       ' В цикле занимаемся кодировкой символов
        Символ_str = Mid(copy_buffer_lcd , Цикл_lcd_print , 1)       ' Вынимаем по 1 символу из выводимого текста
        Код_символа = Asc(символ_str)       ' Узнаем код вынутого символа

        If Код_символа > 191 Then
            Код_символа_lcd = Lookup(код_символа , Cp1251_to_lcd_hd44780)       ' Берем код символа из таблицы (смотреть внизу исходника)
            Символ_lcd_str = Chr(код_символа_lcd)       ' Берем код символа знакогенератора LCD из таблицы (смотреть внизу исходника)
          Else
            Символ_lcd_str = Символ_str
        End If

        Вывод_на_lcd_str = Вывод_на_lcd_str + Символ_lcd_str       ' Собираем выводимый текст в формате LCD
    Next Цикл_lcd_print       ' Повторяем для всех символов выводимого текста

    Locate Строка , Знакоместо       ' Указываем координаты для вывода текста
    Lcd Вывод_на_lcd_str       ' Непосредственный вывод текста на LCD
'-------------------------------------------------------------------------------
  End Sub
'===============================================================================

'===============================================================================
'           Таблица для перекодировки из символов Cp1251
'                в символы знакосинтезирующего LCD
'===============================================================================
  Cp1251_to_lcd_hd44780:
'---------------  первые 128 знаков  -------------------------------------------
    Data &H00 , &H01 , &H02 , &H03 , &H04 , &H05 , &H06 , &H07 , &H08 , &H09
    Data &H0A , &H0B , &H0C , &H0D , &H0E , &H0F , &H10 , &H11 , &H12 , &H13
    Data &H14 , &H15 , &H16 , &H17 , &H18 , &H19 , &H1A , &H1B , &H1C , &H1D
    Data &H1E , &H1F , &H20 , &H21 , &H22 , &H23 , &H24 , &H25 , &H26 , &H27
    Data &H28 , &H29 , &H2A , &H2B , &H2C , &H2D , &H2E , &H2F , &H30 , &H31
    Data &H32 , &H33 , &H34 , &H35 , &H36 , &H37 , &H38 , &H39 , &H3A , &H3B
    Data &H3C , &H3D , &H3E , &H3F , &H40 , &H41 , &H42 , &H43 , &H44 , &H45
    Data &H46 , &H47 , &H48 , &H49 , &H4A , &H4B , &H4C , &H4D , &H4E , &H4F
    Data &H50 , &H51 , &H52 , &H53 , &H54 , &H55 , &H56 , &H57 , &H58 , &H59
    Data &H5A , &H5B , &H20 , &H5D , &H5E , &H5F , &H60 , &H61 , &H62 , &H63
    Data &H64 , &H65 , &H66 , &H67 , &H68 , &H69 , &H6A , &H6B , &H6C , &H6D
    Data &H6E , &H6F , &H70 , &H71 , &H72 , &H73 , &H74 , &H75 , &H76 , &H77
    Data &H78 , &H79 , &H7A , &H5B , &H20 , &H5D , &HE9 , &H7F
'---------------  вторые 128 знаков  -------------------------------------------
    Data &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20
    Data &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20
    Data &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20
    Data &H20 , &H20 , &HCB , &H20 , &H49 , &H69 , &H04 , &H20 , &HFE , &HEF
    Data &HA2 , &HCC , &H00 , &HC9 , &H20 , &H20 , &H20 , &H02 , &H00 , &H00
    Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &HB5 , &H4E , &H00 , &H00
    Data &H00 , &H00 , &H00 , &H00 , &H41 , &HA0 , &H42 , &HA1 , &HE0 , &H45
    Data &HA3 , &HA4 , &HA5 , &HA6 , &H4B , &HA7 , &H4D , &H48 , &H4F , &HA8
    Data &H50 , &H43 , &H54 , &HA9 , &HAA , &H58 , &HE1 , &HAB , &HAC , &HE2
    Data &HAD , &HAE , &H62 , &HAF , &HB0 , &HB1 , &H61 , &HB2 , &HB3 , &HB4
    Data &HE3 , &H65 , &HB6 , &HB7 , &HB8 , &HB9 , &HBA , &HBB , &HBC , &HBD
    Data &H6F , &HBE , &H70 , &H63 , &HBF , &H79 , &HE4 , &H78 , &HE5 , &HC0
    Data &HC1 , &HE6 , &HC2 , &HC3 , &HC4 , &HC5 , &HC6 , &HC7
'===============================================================================

http://sa.uploads.ru/t/5pmh4.jpg http://sa.uploads.ru/t/pesjg.jpg

+2

11

Очередная модернизация крайнего варианта.

Так сказать ускоряемся, есть вариант подпрограммы на ASM AVR + сильно уменьшена таблица знакогенератора

Кто не знает!

Получить символ градуса цельсия можно так:  нажать правый "Alt" и не отпуская набрать на цифровой клавиатуре (правое поле)  0176, получим это "°"

Симуляция + исходник на Bascom + исходник на ASM AVR + разные картинки по теме  --  скачать

http://sa.uploads.ru/t/eG4ZI.jpg http://sa.uploads.ru/t/mHSZj.jpg
http://sa.uploads.ru/t/TyIni.jpg

+2

12

Самый безглючный и быстрый вариант, прерывания таймеров запущены в качестве помехи

Исходник

'===============================================================================
  $map       ' Получаем карту распределения памяти в отчёте компиляции
  $regfile = "m328pdef.dat"       ' Используемый контроллер
  $crystal = 1000000       ' Частота работы контроллера
  $framesize = 64       ' Размер области используемой для преобразований
  $hwstack = 64       ' Размер аппаратного стека
  $swstack = 64       ' Размер программного стека
'  $baud = 115200       ' Скорость трансляции по USART
'===============================================================================
' П О Д К Л Ю Ч Е Н И Е     К О Н Ф И Г У Р А Ц И О Н Н Ы Х     М О Д У Л Е Й
'===============================================================================

'===============================================================================
'          Настройка МК для работы с LCD на базе контроллера hd44780
'   Обратите внимание, библиотеки не используются, выводы могут быть любые
'===============================================================================
  Config Lcdpin = Pin , Rs = Portb.5 , E = Portb.4 , Db4 = Portb.3 , Db5 = Portb.2 , Db6 = Portb.1 , Db7 = Portb.0
  Config Lcd = 20 * 4       ' Используемый LCD
  Initlcd       ' Инициализируем LCD
  Waitms 50       ' Ждем пока все запустится
  Cursor Off       ' Noblink       ' Выключаем неморгающий курсор
'  Cursor On Noblink         ' Включаем неморгающий курсор
'  Cursor Blink       ' Включаем моргающий курсор
'  Upperline  1 строка, Lowerline  2 строка, Thirdline  3 строка, Fourthline 4 строка  - один из вариантов перехода на строку
  Cls       ' Чистим экран, на всякий случай

  Dim Буфер_lcd As String * 20

'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
'    З А П У С К    И    П Р Е Д В А Р И Т Е Л Ь Н Ы Е    Н А С Т Р О Й К И
'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\

' "!#$%&'( )*+,-./:;<=>?@`_°{|}~¦[\]"
' "1234567890"
' "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz"
' "АаБбВвГгДдЕеЁёЖжЗзИиЙйКлЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮюЯя"

'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
'===============================================================================
' ТАЙМЕРА   ИСПОЛЬЗУЮТСЯ  В  КАЧЕСТВЕ   ПОМЕХИ, МЕШАЮЩЕЙ   ОБМЕНУ   ДАННЫМИ
'===============================================================================

  Dim Переменная_long_0 As Long
  Dim Переменная_long_2 As Long

  Config Timer0 = Timer , Prescale = 1       ' 1|8|64|256|1024
  On Timer0 Обработка_прерывания_timer0 Nosave

  Config Timer2 = Timer , Prescale = 1       ' 1|8|64|256|1024
  Timer2 = 128
  On Timer2 Обработка_прерывания_timer2 Nosave

'--------------  Разрешаем работу необходимых прерываний  ----------------------
  Enable Timer0
  Enable Timer2
'------------  Разрешаем работу всех включенных прерываний  --------------------
  Enable Interrupts
'===============================================================================

  Главный_цикл:

'===============================================================================

'    Locate 1 , 1
'    Lcd "Aa ІBіЎґагEeўµЈ¶¤·Ґё"

'    Locate 2 , 1
'    Lcd "¦№Kє§»MјHЅOoЁѕPpCcTї"

'    Locate 3 , 1
'    Lcd "©yЄдXxбе«А¬Бвж­В®ГbД"

'    Locate 4 , 1
'    Lcd "®Е°Ж±З 0123456789 !?"
'    Wait 2
'    Cls

'    Lcd_print 1 , 1 , "!#$%&'()*+,-./:;<=>?"
'    Lcd_print 2 , 1 , "@`_{|}[]"
'    Lcd_print 3 , 1 , "1234567890"
'    Waitms 200
'    Wait 2
'    Cls

'    Lcd_print 1 , 1 , "AaBbCcDdEeFfGgHhIiJj"
'    Lcd_print 2 , 1 , "KkLlMmNnOoPpQqRrSsTt"
'    Lcd_print 3 , 1 , "UuVvWwXxYyZz"
'    Waitms 200
'    Wait 2
'    Cls

'    Lcd_print 1 , 1 , "АаБбВвГгДдЕеЁёЖжЗзИи"
'    Строка = 1 : Знакоместо = 1
    Locate 1 , 1
    Буфер_lcd = "АаБбВвГгДдЕеЁёЖжЗзИи"
    Gosub Lcd_print

'    Lcd_print 2 , 1 , "ЙйКлЛлМмНнОоПпРрСсТт"
'    Строка = 2 : Знакоместо = 1
    Locate 2 , 1
    Буфер_lcd = "ЙйКлЛлМмНнОоПпРрСсТт"
    Gosub Lcd_print

'    Lcd_print 3 , 1 , "УуФфХхЦцЧчШшЩщЪъЫыЬь"
'    Строка = 3 : Знакоместо = 1
    Locate 3 , 1
    Буфер_lcd = "УуФфХхЦцЧчШшЩщЪъЫыЬь"
    Gosub Lcd_print

'    Lcd_print 4 , 1 , "ЭэЮюЯя °"
'    Строка = 4 : Знакоместо = 1
    Locate 4 , 1
    Буфер_lcd = "ЭэЮюЯя °"
    Gosub Lcd_print

    Waitms 500
'    Wait 2
    Cls

'===============================================================================
  Goto Главный_цикл
End
'===============================================================================

'===============================================================================
  Обработка_прерывания_timer0:
'-------------------------------------------------------------------------------
    !push R16       ' Время выполнения инструкции 2 такта
    !in R16 , sreg       ' Время выполнения инструкции 1 такт
    !push R16       ' Время выполнения инструкции 2 такта

    !lds  R16 , {Переменная_long_0}       ' Время выполнения инструкции 2 такта
    !SUBI R16 , (-1)       ' Время выполнения инструкции 1 такт
    !sts  {Переменная_long_0} , R16       ' Время выполнения инструкции 2 такта

    !lds  R16 , {Переменная_long_0 + 1}       ' Время выполнения инструкции 2 такта
    !SBcI R16 , (-1)       ' Время выполнения инструкции 1 такт
    !sts  {Переменная_long_0 + 1} , R16       ' Время выполнения инструкции 2 такта

    !lds  R16 , {Переменная_long_0 + 2}       ' Время выполнения инструкции 2 такта
    !SBcI R16 , (-1)       ' Время выполнения инструкции 1 такт
    !sts  {Переменная_long_0 + 2} , R16       ' Время выполнения инструкции 2 такта

    !lds  R16 , {Переменная_long_0 + 3}       ' Время выполнения инструкции 2 такта
    !SBcI R16 , (-1)       ' Время выполнения инструкции 1 такт
    !sts  {Переменная_long_0 + 3} , R16       ' Время выполнения инструкции 2 такта

    !pop R16       ' Время выполнения инструкции 2 такта
    !out sreg , R16       ' Время выполнения инструкции 1 такт
    !pop R16       ' Время выполнения инструкции 2 такта
'-------------------------------------------------------------------------------
  Return
'===============================================================================

'===============================================================================
  Обработка_прерывания_timer2:
'-------------------------------------------------------------------------------
    !push R16
    !in R16 , sreg
    !push R16

    !lds  R16 , {Переменная_long_2}       ' Время выполнения инструкции 2 такта
    !SUBI R16 , (-1)
    !sts  {Переменная_long_2} , R16

    !lds  R16 , {Переменная_long_2 + 1}       ' Время выполнения инструкции 2 такта
    !SBcI R16 , (-1)
    !sts  {Переменная_long_2 + 1} , R16

    !lds  R16 , {Переменная_long_2 + 2}       ' Время выполнения инструкции 2 такта
    !SBcI R16 , (-1)
    !sts  {Переменная_long_2 + 2} , R16

    !lds  R16 , {Переменная_long_2 + 3}       ' Время выполнения инструкции 2 такта
    !SBcI R16 , (-1)
    !sts  {Переменная_long_2 + 3} , R16

    !pop R16
    !out sreg , R16
    !pop R16
'------------------------------------------------------------------------------
  Return
'===============================================================================

'===============================================================================
'           Подпрограмма вывода русского текста на LCD HD44780
'===============================================================================
  Lcd_print:
'-------------------------------------------------------------------------------
    Loadadr Буфер_lcd , X       ' Узнаём адрес выводимой строки

    !ldi ZL , Low(Русские_символы * 2)       ' Узнаём адрес таблицы
    !ldi ZH , High(Русские_символы * 2)       ' Узнаём адрес таблицы
    !mov R20 , R30       ' Сохраняем адрес таблицы
    !mov R21 , R31       ' Сохраняем адрес таблицы

   Следующий_символ:
    !ld R16 , X+       ' Забираем символы из выводимой строки по порядку
    !cpi R16 , 0       ' Если "0"
    !Breq Выход_из_перекодировки       ' Перебрали все символы выводимой строки, идём печатать на LCD

    !cpi R16 , 168       ' Если меньше чем "Ё"; "ё"; "°"
    !BRLO Lcd_print_2       ' Переход на следующий символ из строки

    !cpi R16 , 168       ' Проверяем "Ё"
    !BREQ Забираем_ё_большое       ' Переход на метку, что-бы забрать код символа

    !cpi R16 , 184       ' Проверяем "ё"
    !BREQ Забираем_ё_маленькое       ' Переход на метку, что-бы забрать код символа

    !cpi R16 , 176       ' Проверяем "°"
    !BREQ Забираем_знак_градуса       ' Переход на метку, что-бы забрать код символа

   Lcd_print_0:
    !cpi R16 , 192       ' Если меньше кириллицы
    !BRLO Lcd_print_2       ' Переход на следующий символ из строки

    !SUBI R16 , 192       ' Вычитание константы
    !add R30 , R16       ' Высчитываем номер символа в таблице
    !lpm R16 , Z       ' Берем код символа знакогенератора LCD из таблицы (смотреть внизу исходника)

   Lcd_print_1:
    !st -X , R16       ' Обновляем символ в строке
    !inc R26       ' Следующий символ

   Lcd_print_2:
    !mov R30 , R20       ' Забираем ранее сохранённый адрес таблицы с кодами знакогенератора LCD hd44780
    !mov R31 , R21       ' Забираем ранее сохранённый адрес таблицы с кодами знакогенератора LCD hd44780

   rjmp Следующий_символ       ' Топаем за следующим символом

   Выход_из_перекодировки:

    Lcd Буфер_lcd       ' Непосредственный вывод текста на LCD
'-------------------------------------------------------------------------------
  Return       ' End Sub
'-------------------------------------------------------------------------------
   Забираем_ё_большое:
     ldi R16 , &HA2
   rjmp Lcd_print_1

   Забираем_ё_маленькое:
     ldi R16 , &HB5
   rjmp Lcd_print_1

   Забираем_знак_градуса:
     ldi R16 , &HEF
   rjmp Lcd_print_1
'===============================================================================
  Русские_символы:
    '     "А"    "Б"    "В"    "Г"    "Д"    "Е"    "Ж"    "З"    "И"    "Й"
    Data &H41 , &HA0 , &H42 , &HA1 , &HE0 , &H45 , &HA3 , &HA4 , &HA5 , &HA6
    '     "К"    "Л"    "М"    "Н"    "О"    "П"    "Р"    "С"    "Т"    "У"
    Data &H4B , &HA7 , &H4D , &H48 , &H4F , &HA8 , &H50 , &H43 , &H54 , &HA9
    '     "Ф"    "Х"    "Ц"    "Ч"    "Ш"    "Щ"    "Ъ"    "Ы"    "Ь"    "Э"
    Data &HAA , &H58 , &HE1 , &HAB , &HAC , &HE2 , &HAD , &HAE , &H62 , &HAF
    '     "Ю"    "Я"    "а"    "б"    "в"    "г"    "д"    "е"    "ж"    "з"
    Data &HB0 , &HB1 , &H61 , &HB2 , &HB3 , &HB4 , &HE3 , &H65 , &HB6 , &HB7
    '     "и"    "й"    "к"    "л"    "м"    "н"    "о"    "п"    "р"    "с"
    Data &HB8 , &HA6 , &HBA , &HBB , &HBC , &HBD , &H6F , &HBE , &H70 , &H63
    '     "т"    "у"    "ф"    "х"    "ц"    "ч"    "ш"    "щ"    "ъ"    "ы"
    Data &HBF , &H79 , &HE4 , &H78 , &HE5 , &HC0 , &HC1 , &HE6 , &HC2 , &HC3
    '     "ь"    "э"    "ю"    "я"    "Ё"    "ё"    "°"
    Data &HC4 , &HC5 , &HC6 , &HC7 , &HA2 , &HB5 , &HEF
'===============================================================================

0

13

Nord написал(а):

При использовании способа вывода крупных символов отсюда Исследование LCD на базе HD44780 ( только вывод информации!). (пост 3, "Скругленные цифры") выявилось следующее.

При выводе цифр "1", "4" и "7" рядом с вертикальной линией вылезают посторонние символы из знакогенератора...
После замены Chr(20) на " " все стало нормально.
Было:

Код:
Case "1":
       Locate X1 , Y : Lcd Chr(7) ; Chr(255) ; Chr(20)
       Locate X2 , Y : Lcd Chr(20) ; Chr(255) ; Chr(20)

Стало:

Код:
Case "1":
       Locate X1 , Y : Lcd Chr(7) ; Chr(255) ; " "
       Locate X2 , Y : Lcd " " ; Chr(255) ; " "

Причина, думаю, в разных "начинках" знакогенераторов дисплеев.
Использовал WEH001602AGPP5N OLED со страницей з/г "0", валявшийся без дела... ;)

Спасибо !

+2


Вы здесь » Программирование ATMEL в BASCOM. » Примеры применения в среде Баском » ! Исследование LCD на базе HD44780 ( только вывод информации!). !