Благодаря пользователю этого форума Сергею Шилову (ник "Mrshilov"), удалось решить проблему вывода информации на символьный LCD с контроллером (HD44780).
Он исправил, а по сути переписал заново, якобы рабочую библиотеку выложенную - здесь (запустить её, так и не удалось). Если вдруг у кого получится, выложите рабочий вариант.
Огромное ему СПАСИБО, от меня лично и думаю от других тоже!
Вывод проверен в железе, пока только на 2 LCD одновременно, для большего количества надо делать макетку, позже проверю обязательно.
Если найдёте ошибки, обязательно напишите, исправлю!
Тема будет наполняться постепенно, так, что наберитесь терпения!
'-------------------------------------------------------------------------------
'-------------------- Конфигурация используемого МК ------------------------
'-------------------------------------------------------------------------------
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32
'-------------------------------------------------------------------------------
'------------------------ Подключаемые библиотеки --------------------------
'-------------------------------------------------------------------------------
$lib "lcd_pcf8574_8.lib"
'-------------------------------------------------------------------------------
'------------------------ Настройка таймера TIMER0 --------------------------
'-------------------------------------------------------------------------------
' Config Timer0 = Timer , Prescale = 1024 , Clear Timer = 0
' Config Timer0 = Timer , Prescale = 256 , Clear Timer = 0
' Config Timer0 = Timer , Prescale = 64 , Clear Timer = 0
' Config Timer0 = Timer , Prescale = 8 , Clear Timer = 0
Config Timer0 = Timer , Prescale = 1 , Clear Timer = 0
'-------------------------------------------------------------------------------
'--------------- Настройка дополнительного делителя таймера ----------------
'-------------------------------------------------------------------------------
Const Значение_регистра_tcnt0_timer0 = 254 ' Значение регистра TCNT0
Tcnt0 = Значение_регистра_tcnt0_timer0 ' Настройка дополнительного делителя таймера
'-------------------------------------------------------------------------------
'----------- Подпрограмма выполняемая после прерывания TIMER0 --------------
'-------------------------------------------------------------------------------
On Timer0 Обработка_прерывания_timer0 ' Переход на подпрограмму после каждого прерывания TIMER0
Config Portb.0 = Output
'-------------------------------------------------------------------------------Dim _lcd_e As Byte
Dim _backlight As Byte'-------------------------------------------------------------------------------
'----------------------- Конфигурация шины I2c -----------------------------
'-------------------------------------------------------------------------------
Config Scl = Portc.5 ' Конфигурим I2c Scl
Config Sda = Portc.4 ' Конфигурим I2c Sda
Config I2cdelay = 2 ' частота I2c = частота МК / I2cdelay (работает в железе до 800кГц)
'-------------------------------------------------------------------------------
'----------------------- Инициализация шины I2c ----------------------------
'-------------------------------------------------------------------------------
I2cinit
Waitms 10
'-------------------------------------------------------------------------------
'--------------------- Конфигурация используемого LCD ----------------------
'-------------------------------------------------------------------------------
Config Lcd = 20 * 4
'-------------------------------------------------------------------------------
'--------------------- Адресация PCF8574 или PCF8574A ----------------------
'-------------------------------------------------------------------------------
Const Pcf8574_lcd = &H7E ' Адрес PCF8574A восьмого LCD
'-------------------------------------------------------------------------------
'------------------------------------------------------------------
'| | PCF8574,PCF8574N, PCF8575 | PCF8574A, PCF8574AP |
'|-------------|----------------------------|----------------------|
'| A0 A1 A2 | Write | Read | Write | Read |
'|-------------|-------------|--------------|-----------|----------|
'| 0 0 0 | &H40 | &H41 | &H70 | &H71 |
'| 1 0 0 | &H42 | &H43 | &H72 | &H73 |
'| 0 1 0 | &H44 | &H45 | &H74 | &H75 |
'| 1 1 0 | &H46 | &H47 | &H76 | &H77 |
'| 0 0 1 | &H48 | &H49 | &H78 | &H79 |
'| 1 0 1 | &H4A | &H4B | &H7A | &H7B |
'| 0 1 1 | &H4C | &H4D | &H7C | &H7D |
'| 1 1 1 | &H4E | &H4F | &H7E | &H7F |
'------------------------------------------------------------------
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'--------------------- Конфигурация выводов PCF8574x -----------------------
'-------------------------------------------------------------------------------Const Pcf_rs = 0
Const Pcf_bl = 1
Const Pcf_e2 = 2
Const Pcf_e1 = 3
'-------------------
Const Pcf_d4 = 4
Const Pcf_d5 = 5
Const Pcf_d6 = 6
Const Pcf_d7 = 7
'-------------------
_lcd_e = 192 ' 64=E2 (3 & 4 stering) 128=E1 (1 & 2 string) 192=E1+E2 (all 4 strings)
_backlight = 0 'initial Backlight state
'-------------------------------------------------------------------------------
'----------------- Чистим индикатор ----------------------------------------
'-------------------------------------------------------------------------------
Initlcd
Waitms 10
'-------------------------------------------------------------------------------
'----------- Подпрограмма вывода русского текста на 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
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'------------------------ Запускаем прерывания -----------------------------
'-------------------------------------------------------------------------------
Enable Timer0
Enable Interrupts
'-------------------------------------------------------------------------------Do : Nop
Строка_lcd = 1 : Курсор_lcd = 1
Lcd_print "Вывод русскоязычного"Строка_lcd = 2 : Курсор_lcd = 1
Lcd_print " сообщения "Строка_lcd = 3 : Курсор_lcd = 1
Lcd_print "компилятором Bascom"Строка_lcd = 4 : Курсор_lcd = 1
Lcd_print "в эмуляторе Протеус"Waitms 200
Cls
Waitms 100
Строка_lcd = 1 : Курсор_lcd = 1
Lcd_print "АаБбВвГгДдЕеЁёЖжЗзИи"Строка_lcd = 2 : Курсор_lcd = 1
Lcd_print "ЙйКкЛлМмНнОоПпРрСсТт"Строка_lcd = 3 : Курсор_lcd = 1
Lcd_print "УуФфХхЦцЧчШшЩщЪъЫыЬь"Строка_lcd = 4 : Курсор_lcd = 1
Lcd_print "ЭэЮюЯя 0123456789 !?"Waitms 100
Cls
Waitms 100
Toggle _backlight
Loop
End
'-------------------------------------------------------------------------------
'*******************************************************************************
'***************** Подпрограмма обработки прерывания TIMER0 ****************
'***************** происходит каждые 2,048 ms ****************
'*******************************************************************************
'-------------------------------------------------------------------------------
Обработка_прерывания_timer0:
'-------------------------------------------------------------------------------Toggle Portb.0
'-------------------------------------------------------------------------------
' Делитель TIMER0 = 1000/(1000000/1024/(256-254))=1000/(976,5625/2) = 2,048 ms
'-------------------------------------------------------------------------------' Tcnt0 = Значение_регистра_tcnt0_timer0
'-------------------------------------------------------------------------------
Return
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
'----------- Подпрограмма вывода русского текста на LCD HD44780 -----------
'-------------------------------------------------------------------------------
Sub Lcd_print(byval Копия_lcd_print 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_printLocate Строка_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
'----------------------------------------------------------------------------------------------------------------------
'**********************************************************************************************************************
'----------------------------------------------------------------------------------------------------------------------
Эмуляция в "Протеус", исходник, библиотека "Bascom" для вывода через PCF8574 (выводы назначаются в исходнике) - скачать
Atmega8 и 2 LCD через 2 PCF8574x
Эмуляция в "Протеус" - скачать
Atmega8 и 4 LCD через 4 PCF8574x
Эмуляция в "Протеус" - скачать
Atmega8 и 8 LCD через 8 PCF8574x
Эмуляция в "Протеус" - скачать
Attiny85 и 8 LCD через 8 PCF8574x
Эмуляция в "Протеус" - скачать
Отредактировано sasha_1973 (2013-12-28 22:33:03)
























