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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Исходники » Помогите с запуском LCD 4x20 по i2c


Помогите с запуском LCD 4x20 по i2c

Сообщений 181 страница 210 из 210

181

sasha_1973, я что то уже запутался, какой именно архив, по предыдущей ссылке где "2 вариант"? Там несколько иные названия библиотек  :x
Блин дисплейчик OLED 128x64 на SSD1306 гараздо проще в освоении, но и очень хочется и 1602 по I2C победить

0

182

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

какой именно архив, по предыдущей ссылке где "2 вариант"? Там несколько иные названия библиотек

В этом сообщении ссылка

0

183

sasha_1973, тот архив я качал, библиотеки видел но там несколько иные названия библиотек, там lcd_HD44780_pcf8574.lib и multi_i2c_lcd_HD44780_pcf8574.lib , а интересовался я этой lcd_pcf8574.lib пост 20, 22 этой ветки

0

184

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

а интересовался я этой lcd_pcf8574.lib пост 20, 22 этой ветки


Зачем Вам устаревшие варианты ?

В крайнем случае, переименуйте так, как Вам нравится.

Отредактировано sasha_1973 (2017-07-21 22:25:20)

0

185

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

Зачем Вам устаревшие варианты ?

Да я с целью попробовать, хоть что бы на нем отобразилось, хоть "Hello World", а пока только получается зажигать и тушить подсветку :)
Понял, значит она мне не нужна

0

186

sasha_1973
Решение остается одно выпаять штырек RW и на дисплее соединить его с VSS ?

0

187

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

Решение остается одно выпаять штырек RW и на дисплее соединить его с VSS ?

Код выложил выше (проверял с ардуино). Штырьки не выпаивал. Все работает.

0

188

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

Да я с целью попробовать, хоть что бы на нем отобразилось, хоть "Hello World", а пока только получается зажигать и тушить подсветку


Скиньте свой исходник, сюда или на mail. И на всякий случай макро-фотку платки с двух сторон.

0

189

Пётр написал(а):

Код выложил выше (проверял с ардуино). Штырьки не выпаивал. Все работает.

Значит что то у меня не то....

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

И на всякий случай макро-фотку платки с двух сторон.

Платка пока запаяна на LCD
Фотки сделал всего что используется в моем случае на всякий (всё из Китая)

http://habaroved.net/_fr/2/8164754.jpg
http://habaroved.net/_fr/2/2804679.jpg
http://habaroved.net/_fr/2/8263100.jpg

Вдруг критично, все модули покупались по отдельности, у разных продавцов в разное время, платка руками припаивалась к LCD, после пайки мультиметром прозвонил контакты, вроде ок всё
Ну а это как сказать мозг, мега 32Л, кварц на 16 мГц, в фьюзах стоит тактирование от внешнего кварца, питание 5В

http://habaroved.net/_fr/2/1708053.jpg

По коду, у меня как сказать своего нет, пробую примеры которые размещены тут.
Правлю камень, тактовую частоту и пины SDA SCL согласно распиновки меги 32Л, SDA - PORTC.1, SCL - PORTC.0
Вот код залитый сейчас в МК

Код:
$Regfile="m32def.dat"
$Crystal=16000000
$hwstack=40
$swstack=16
$framesize=32
$baud = 19200

'Config Sda = Portc.1       ' Конфигурация вывода Sda
'Config Scl = Portc.0       ' Конфигурация вывода Scl

$lib "i2c_twi.lbx"                                ' die "echte" TWI benutzen



'------------------------------------------------------------------------------
' Definition von HW-Ressourcen
'------------------------------------------------------------------------------

Sda_port Alias Portc.1                            'Definition der I2C-Ports
Scl_port Alias Portc.0

Config Sda = Sda_port
Config Scl = Scl_port

'Config Portd.7 = Output
'Led Alias Portd.7

'------------------------------------------------------------------------------
' Definition von SW-Ressourcen
'------------------------------------------------------------------------------

'Const Addr_lcd_pcf_r = &h41
Const Addr_lcd_pcf_w = &H4E ' &H4E                      'Adresse des PCF8574

Dim Lcd_beleuchtung As Bit
Set Lcd_beleuchtung                               'LCD_Beleuchtung einschalten
'Reset Lcd_beleuchtung                                       'LCD_Beleuchtung ausschalten

Dim I As Byte                                     'Zдhler-Variable

Dim Lcd_port As Byte                              'Definition des LCDs am PCF8574
Lcd_port_rs Alias Lcd_port.0                      'Display-Pin RS an Port.0
Lcd_port_rw Alias Lcd_port.1                      'Display-Pin R/W an Port.1
Lcd_port_e Alias Lcd_port.2                       'Display-Pin E an Port.2
Lcd_port_bel Alias Lcd_port.3                     'Beleuchtung an Port.3
Lcd_port_db4 Alias Lcd_port.4                     'Display-Pin DB4 an Port.4
Lcd_port_db5 Alias Lcd_port.5                     'Display-Pin DB5 an Port.5
Lcd_port_db6 Alias Lcd_port.6                     'Display-Pin DB6 an Port.6
Lcd_port_db7 Alias Lcd_port.7                     'Display-Pin DB7 an Port.7

'------------------------------------------------------------------------------
' Definition von Subs / Prototyping
'------------------------------------------------------------------------------

Declare Sub Lcd_write(byval Text As String )      'Die Funktion zum Schreiben von Text auf das Display

'------------------------------------------------------------------------------
' Programm - Initialisierungen
'------------------------------------------------------------------------------

'I2C-Initialisierungen
I2cinit

Config Twi = 100000                               ' Taktfrequenz 100 kBaud
Twcr = &B00000100                                 ' nur TWEN setzen
Twsr = 0                                          ' Status und Prescaler Register
Twbr = 152                                        ' Bit Rate Register, 72 = 100kHz   152 = 50kHz(0 bis 255)
Config I2cdelay = 40

'Initialisierung des LCD
Gosub Lcd_init

'Testaufrufe
Call Lcd_write( "TEST")
Gosub Lcd_gotoline_2
Call Lcd_write( "blub")
Gosub Lcd_gotoline_1
Call Lcd_write( "blubblub")
Wait 2
Gosub Lcd_cls

'------------------------------------------------------------------------------
' Programm - Hauptschleife
'------------------------------------------------------------------------------
Do

  !rCall Lcd_cls

  Gosub Lcd_gotoline_1
  Call Lcd_write( "1234")

  Gosub Lcd_gotoline_2
  Call Lcd_write( "аўгµ5678")


  Waitms 1000

'  Toggle Led

Loop
'------------------------------------------------------------------------------
' Subroutinen
'------------------------------------------------------------------------------

Sub Lcd_write(byval Text As String)

   Dim Lcd_char As String * 1
   Dim Lcd_char_val As Byte

   'starte Ьbertragung
   I2cstart
   I2cwbyte Addr_lcd_pcf_w

   Set Lcd_port_rs

   For I = 1 To Len(text)
     Lcd_char = Mid(text , I , 1)
     Lcd_char_val = Asc(lcd_char)
     Lcd_port_db7 = Lcd_char_val.7
     Lcd_port_db6 = Lcd_char_val.6
     Lcd_port_db5 = Lcd_char_val.5
     Lcd_port_db4 = Lcd_char_val.4
     I2cwbyte Lcd_port
     Gosub Lcd_pulse_e
     Lcd_port_db7 = Lcd_char_val.3
     Lcd_port_db6 = Lcd_char_val.2
     Lcd_port_db5 = Lcd_char_val.1
     Lcd_port_db4 = Lcd_char_val.0
     I2cwbyte Lcd_port
     Gosub Lcd_pulse_e
   Next

   Reset Lcd_port_db7
   Reset Lcd_port_db6
   Reset Lcd_port_db5
   Reset Lcd_port_db4
   Reset Lcd_port_rs

   I2cstop

End Sub


'------------------------------------------------------------------------------
' LCD-GOSubs
'------------------------------------------------------------------------------

Lcd_init:

   I2cstart                                       ' START-Sequenz senden
   I2cwbyte Addr_lcd_pcf_w                        'Adresse vom PCF
   Lcd_port = 0
   I2cwbyte Lcd_port                              'alles lцschen


   '8-Bit setzen, 3 mal DB4 und 5 mit nachfolgendem E-Pulse
   Set Lcd_port_db4
   Set Lcd_port_db5
   For I = 1 To 3
      I2cwbyte Lcd_port
      Gosub Lcd_pulse_e
   Next I
   Reset Lcd_port_db4
   Reset Lcd_port_db5


   '4-Bit Datamode setzen, DB5
   Set Lcd_port_db5
   I2cwbyte Lcd_port
   Gosub Lcd_pulse_e
   Reset Lcd_port_db5

   '4-Bit Data transfer setzen, DB5, danach DB7
   Set Lcd_port_db5
   I2cwbyte Lcd_port
   Gosub Lcd_pulse_e
   Reset Lcd_port_db5
   Set Lcd_port_db7
   I2cwbyte Lcd_port
   Gosub Lcd_pulse_e
   Reset Lcd_port_db7


   'Display und Cursor anschalten, 0-Polse, dann DB6 und DB7
   I2cwbyte Lcd_port
   Gosub Lcd_pulse_e
   Set Lcd_port_db6
   Set Lcd_port_db7
   I2cwbyte Lcd_port
   Gosub Lcd_pulse_e
   Reset Lcd_port_db6
   Reset Lcd_port_db7

   'CLS, DB4
   I2cwbyte Lcd_port
   Gosub Lcd_pulse_e
   Set Lcd_port_db4
   I2cwbyte Lcd_port
   Gosub Lcd_pulse_e
   Reset Lcd_port_db4

   'cursor setzen, DB5 und DB6
   I2cwbyte Lcd_port
   Gosub Lcd_pulse_e
   Set Lcd_port_db5
   Set Lcd_port_db6
   I2cwbyte Lcd_port
   Gosub Lcd_pulse_e
   Reset Lcd_port_db5
   Reset Lcd_port_db6

   'Beleuchtung ausschalten
   Lcd_port_bel = Lcd_beleuchtung
   I2cwbyte Lcd_port

   I2cstop

Return

Lcd_pulse_e:
   Set Lcd_port_e
   I2cwbyte Lcd_port
   Reset Lcd_port_e
   I2cwbyte Lcd_port
Return

Lcd_gotoline_1:
   I2cstart
   I2cwbyte Addr_lcd_pcf_w
   I2cwbyte Lcd_port
   Gosub Lcd_pulse_e
   Set Lcd_port_db5
   I2cwbyte Lcd_port
   Gosub Lcd_pulse_e
   Reset Lcd_port_db5
   I2cstop
Return

Lcd_gotoline_2:
   I2cstart
   I2cwbyte Addr_lcd_pcf_w
   Set Lcd_port_db7
   Set Lcd_port_db6
   I2cwbyte Lcd_port
   Gosub Lcd_pulse_e
   Reset Lcd_port_db7
   Reset Lcd_port_db6
   I2cwbyte Lcd_port
   Gosub Lcd_pulse_e
   I2cstop
Return

Lcd_cls:
   I2cstart
   I2cwbyte Addr_lcd_pcf_w
   I2cwbyte Lcd_port
   Gosub Lcd_pulse_e
   Set Lcd_port_db4
   I2cwbyte Lcd_port
   Gosub Lcd_pulse_e
   I2cstop
Return

End

Отредактировано artur (2017-07-22 09:48:33)

0

190

Только подключил

http://s5.uploads.ru/t/cangT.jpg http://s9.uploads.ru/t/7AbfN.jpg

Исходник

'--------------------   Конфигурация используемого МК   ------------------------
  $regfile = "m328pdef.dat"
  $crystal = 8000000
  $framesize = 128
  $hwstack = 128
  $swstack = 128

'------------------------  Настройка таймера  ----------------------------------
  Const Const_доп_делитель_timer2 = 131

  Config Timer2 = Timer , Prescale = 64 , Clear Timer = 0       ' PRESCALE= 1|8|64|256|1024
  On Timer2 Обработка_прерывания_timer2 Nosave       ' Подпрограмма для обработки прерывания
  Stop Timer2
  Timer2 = Const_доп_делитель_timer2       ' Закидываем значение дополнительного делителя в TIMER2

  Const Const_счетчик_timer2 = 1000
  Dim Const_счетчик_timer2_low As Byte : Const_счетчик_timer2_low = Low(const_счетчик_timer2)
  Dim Const_счетчик_timer2_high As Byte : Const_счетчик_timer2_high = High(const_счетчик_timer2)

  Dim Счетчик_timer2 As Word
  Dim Флаг_прерывание_timer2 As Byte

  Dim Время_работы_часы As Byte
  Dim Время_работы_минуты As Byte
  Dim Время_работы_секунды As Byte

  Dim Время_работы_str As String * 8 : Время_работы_str = " 0:00:00"
  Dim Время_работы_часы_str As String * 2 : Время_работы_часы_str = " 0"
  Dim Время_работы_минуты_str As String * 2 : Время_работы_минуты_str = "00"
  Dim Время_работы_секунды_str As String * 2 : Время_работы_секунды_str = "00"

'------------------------   Подключаемые библиотеки   --------------------------
  $lib "lcd_HD44780_pcf8574.lib"

'-----------------------   Конфигурация шины I2c   -----------------------------
  Config Scl = Portc.5       ' Конфигурация I2c Scl
  Config Sda = Portc.4       ' Конфигурация I2c Sda
  Config I2cdelay = 20       ' Частота I2c = частота МК / I2cdelay  (работает в железе начиная с 20, меньше работает через раз)
  I2cinit
  Waitms 50       ' Инициализируем шину I2c, ждем

  Const Const_буфер_lcd = 16
  Config Lcd = 20 * 4

'-----------------------  Дополнительные_символы--------------------------------
Deflcdchar 1 , 12 , 18 , 18 , 12 , 32 , 32 , 32 , 32       'значек градуса

'--------------------   Переменные для работы библиотеки   ---------------------
  Dim _backlight As Byte : _backlight = 1       ' Переменная для управления подсветкой
  Dim _lcd_e As Byte : _lcd_e = 192       ' !!! Не трогать, не будет работать !!!

'------------------   Переменная для адресации PCF8574х   ----------------------
  Const Pcf8574_lcd = &H4E       ' Адрес 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       ' RS
  Const Pcf_bl = 3       ' Подсветка
  Const Pcf_e2 = 2       ' Е
  Const Pcf_e1 = 1       ' Висит в воздухе
'------------------------------------
  Const Pcf_d4 = 4       ' D4
  Const Pcf_d5 = 5       ' D5
  Const Pcf_d6 = 6       ' D6
  Const Pcf_d7 = 7       ' D7

  Initlcd       ' Обязательно инициализируем LCD
  Cursor Off       ' Выключаем курсор
  Cls       ' Чистим экран, на всякий случай, можно не делать
  Waitms 100

  Declare Sub Print_lcd(byval Copy_строка_lcd As Byte , Byval Copy_знакоместо_lcd As Byte , Byval Copy_буфер_lcd As String * 20)

  Dim Флаг_обновить_lcd As Byte

  Dim Буфер_lcd_1_строка_str As String * Const_буфер_lcd
  Dim Буфер_lcd_2_строка_str As String * Const_буфер_lcd
  Dim Буфер_lcd_3_строка_str As String * Const_буфер_lcd
  Dim Буфер_lcd_4_строка_str As String * Const_буфер_lcd

'-------------------------------------------------------------------------------
'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
'    З А П У С К    И    П Р Е Д В А Р И Т Е Л Ь Н Ы Е    Н А С Т Р О Й К И
'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
  Dim Val_long As Long
  Dim Val_long_str As String * 10

'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\

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

'                   Г Л А В Н Ы Й         Ц И К Л
  Главный_цикл:
'###############################################################################

   'Print_lcd 1 , 1 , "12345678901234567890"
    Print_lcd 1 , 1 , "!#$%&'()*+,-./:;<=>?"
    Print_lcd 2 , 1 , "AaBbCcDdEeFfGgHhIiJj"
    Print_lcd 3 , 1 , "KkLlMmNnOoPpQqRrSsTt"
    Print_lcd 4 , 1 , "UuVvWwXxYyZz 0123456"

    Wait 1
    Cls

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

    Wait 1
    Cls

'    If Флаг_прерывание_timer2 <> 0 Then
'        Gosub Время_работы
'        Флаг_прерывание_timer2 = 0
'        Флаг_обновить_lcd = 1
'        Goto Главный_цикл
'    End If

'    Буфер_lcd_1_строка_str = Время_работы_str
'    Буфер_lcd_2_строка_str = Val_long_str
'    Locate 1 , 1
'    Lcd Буфер_lcd_1_строка_str
'    Locate 2 , 1
'    Lcd Буфер_lcd_2_строка_str

'    Incr Val_long
'    Val_long_str = Str(val_long)
'    Val_long_str = Format(val_long_str , "       0")

    Waitms 100

'===============================================================================
  Goto Главный_цикл
End
'===============================================================================
'       П О Д К Л Ю Ч Е Н И Е     Р А Б О Ч И Х     М О Д У Л Е Й
'===============================================================================

'===============================================================================
  Обработка_прерывания_timer2:       ' Время обработки прерывания 55 тактов + 8 тактов вход + 5 тактов выход
'-------------------------------------------------------------------------------
   'Т.к. будем использовать логические операции, !!! ОБЯЗАТЕЛЬНО сохраняем SREG !!!
    !push R16
    !in R16 , sreg
    !push R16
    !push R26
    !push R27

    !lds R26 , {Счетчик_timer2}
    !lds R27 , {Счетчик_timer2 + 1}
    !ADIW R26 , 1

    !lds R16 , {Const_счетчик_timer2_low}
    !cp  R26 , R16
    !lds R16 , {Const_счетчик_timer2_high}
    !cpc R27 , R16
    !breq Прошла_секунда
    !rjmp Выход_прерывания_timer2

   Прошла_секунда:
    !clr R26
    !clr R27
    !ldi R16 , 1
    !sts {Флаг_прерывание_timer2} , R16

   Выход_прерывания_timer2:
    !sts {Счетчик_timer2} , R26
    !sts {Счетчик_timer2 + 1} , R27

    !ldi R16 , Const_доп_делитель_timer2
    !out tcnt2 , R16

   'Восстанавливаем ранее сохранённые регистры и SREG
    !pop R27
    !pop R26
    !pop R16
    !out sreg , R16
    !pop R16
    !reti
'-------------------------------------------------------------------------------
  Return
'===============================================================================

'===============================================================================
  Время_работы:
'-------------------------------------------------------------------------------
    Incr Время_работы_секунды
    If Время_работы_секунды > 59 Then
        Время_работы_секунды = 0
        Incr Время_работы_минуты
        Время_работы_минуты_str = Str(время_работы_минуты)
        If Время_работы_минуты < 10 Then Время_работы_минуты_str = "0" + Время_работы_минуты_str
        If Время_работы_минуты > 59 Then
            Время_работы_минуты = 0
            Incr Время_работы_часы
            If Время_работы_часы > 23 Then
                Время_работы_часы = 0
            End If       ' If Время_работы_часы > 23 Then
            Время_работы_часы_str = Str(время_работы_часы)
            If Время_работы_часы < 10 Then Время_работы_часы_str = " " + Время_работы_часы_str
        End If       ' If Время_работы_минуты > 59 Then
    End If       ' If Время_работы_секунды > 59 Then
    Время_работы_секунды_str = Str(время_работы_секунды)
    If Время_работы_секунды < 10 Then Время_работы_секунды_str = "0" + Время_работы_секунды_str

    Время_работы_str = Время_работы_часы_str + ":" + Время_работы_минуты_str + ":" + Время_работы_секунды_str
'-------------------------------------------------------------------------------
  Return
'===============================================================================

'===============================================================================
'           Подпрограмма вывода русского текста на LCD HD44780
'===============================================================================
  Sub Print_lcd(byval Copy_строка_lcd As Byte , Byval Copy_знакоместо_lcd As Byte , Byval Copy_буфер_lcd As String * 45)
'-------------------------------------------------------------------------------
    Loadadr Copy_буфер_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       ' Высчитываем номер символа в таблице
    !clr R16
    !adc R31 , 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 Следующий_символ       ' Топаем за следующим символом
  '---------------------
   Забираем_ё_большое:
     !ldi R16 , &HA2
   !rjmp Lcd_print_1

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

   Забираем_знак_градуса:
     !ldi R16 , &HEF
   !rjmp Lcd_print_1
  '---------------------

   Выход_из_перекодировки:
   'Непосредственный вывод текста на LCD
    Locate Copy_строка_lcd , Copy_знакоместо_lcd
    Lcd Copy_буфер_lcd       ' Непосредственный вывод текста на LCD

   Выход_из_print_lcd:
'-------------------------------------------------------------------------------
  End Sub
'===============================================================================

'===============================================================================
  Русские_символы:
'-------------------------------------------------------------------------------
    '     "А"    "Б"    "В"    "Г"    "Д"    "Е"    "Ж"    "З"    "И"    "Й"
    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
'===============================================================================

+1

191

Обратите внимание на строчку:

Config I2cdelay = 20       ' Частота I2c = частота МК / I2cdelay  (работает в железе начиная с 20, меньше работает через раз)

при частоте МК 16 Мгц, поставьте больше задержку, например 40

0

192

artur написал(а):
Код:
$hwstack=40
$swstack=16
$framesize=32

Поставьте по 100 для теста как в моем коде.

0

193

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

Обратите внимание на строчку:
Config I2cdelay = 20       ' Частота I2c = частота МК / I2cdelay  (работает в железе начиная с 20, меньше работает через раз)
при частоте МК 16 Мгц, поставьте больше задержку, например 40

Попробовал, результат тот же, просто горит подсветка дисплея, нажатие на ресет приводит к кратковременному однократному морганию подсветки

Пётр написал(а):

Поставьте по 100 для теста как в моем коде.

Попробовал, результат тот же, разница только в момент заливки прошивки подсветка тухнет потом вновь загорается, реакция на ресете та же, кратковременно моргание.

В обоих случаях на дисплее не было ни одного символа  :'(

0

194

При подаче питания в верхней строке есть "квадратики"?

0

195

Вообще нет ничего. Только кратковременное моргание подсветки при нажатии ресета.

0

196

А в Протеусе работает ?

0

197

sasha_1973
Я что то с протеусом ещё не сталкивался

0

198

И что Вам мешает взять его на абордаж ?

0

199

Не знаю, можно попробовать, может и разберусь, пошел качать

0

200

В этом архиве есть симуляция

меняете мегу на свою, подключаете в свойствах свой исходник и вперед

Отредактировано sasha_1973 (2017-07-22 15:07:08)

0

201

Faq по Протеусу

0

202

sasha_1973
Спасибо, пока ставится, далее буду разбираться

0

203

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

Вообще нет ничего.

Переменный резистор на плате крутили? Нужно крутить до тех пор пока на экране что не появится. Если не поможет, то есть вероятность что дисплей нерабочий.

+1

204

Пётр
Прямоугольные блоки чуть просвечивают, но ради чистоты эксперимента добавлю ещё контрастности

0

205

Друзья извините!!!
Мой косяк, дело в контрастности, в подстроичнике на плате, прямоугольничьки прослеживались, думал и так достаточная контрастность.
blubblubblub работает однозначно, остальные тоже проверю, так ради интереса

0

206

Тупой наверное вопрос
Вывожу строку на дисплей и хочу что бы справа от надписи Тест было значение переменной Т, вместо точки с запятой пробовал просто запятую, результат тот же

Код:
Gosub Lcd_gotoline_1
  Call Lcd_write( "Test"; T)

Но при компиляции ругается
variable not dimensioned [ "Test"; T] in file .....
Переменная обозвана ранее Dim T As Byte
А вывод происходит вызовом Lcd_write который может вывести только строку
Sub Lcd_write(byval Text As String)

Отредактировано artur (2017-07-22 23:04:43)

0

207

Как понимаю для вывода через Lcd_write надо как то тип Byte в String преобразовать?
Получилось в бинарном виде выводить
Gosub Lcd_gotoline_1
Call Lcd_write(bin(T))
Но это несколько не то, хотелось бы десятеричное представление видеть на LCD
Или как то саму процедуру Lcd_write поправить?

Код:
Sub Lcd_write(byval Text As String)

   Dim Lcd_char As String * 1
   Dim Lcd_char_val As Byte

   'starte ?bertragung
   I2cstart
   I2cwbyte Addr_lcd_pcf_w
   Set Lcd_port_rs
   For I = 1 To Len(text)
     Lcd_char = Mid(text , I , 1)
     Lcd_char_val = Asc(lcd_char)
     Lcd_port_db7 = Lcd_char_val.7
     Lcd_port_db6 = Lcd_char_val.6
     Lcd_port_db5 = Lcd_char_val.5
     Lcd_port_db4 = Lcd_char_val.4
     I2cwbyte Lcd_port
     Gosub Lcd_pulse_e
     Lcd_port_db7 = Lcd_char_val.3
     Lcd_port_db6 = Lcd_char_val.2
     Lcd_port_db5 = Lcd_char_val.1
     Lcd_port_db4 = Lcd_char_val.0
     I2cwbyte Lcd_port
     Gosub Lcd_pulse_e
   Next
   Reset Lcd_port_db7
   Reset Lcd_port_db6
   Reset Lcd_port_db5
   Reset Lcd_port_db4
   Reset Lcd_port_rs
   I2cstop

End Sub

0

208

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

Call Lcd_write( "Test"; T)


dim t as byte
dim t_str as string*3

dim 1_line_str as string*20
dim 2_line_str as string*20
dim 3_line_str as string*20
dim 4_line_str as string*20

t_str = str(t)  'делаем строковую переменную
t_str = format(t_str,"  0")  'убираем незначащие нули

1_line_str = "Test " + t_str   'собираем строку выводимую на lcd

Call Lcd_write( 1_line_str)   'выводим строку на lcd


Чем Вам библиотека не пришлась ко двору ?  Наверное смутила выпайка контакта.

Отредактировано sasha_1973 (2017-07-23 05:23:54)

+1

209

sasha_1973
Спасибо большое.

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

Чем Вам библиотека не пришлась ко двору ?  Наверное смутила выпайка контакта.

Почему не пришлась :) я попробовал и код с ней, если я ничего не перепутал то и без выпайки контакта работает, по крайней мере какая то информация выводилась на экран. Но я ещё не остановился на выборе библиотеки и кода, я как бы хочу с практической стороны разобраться, хоть в общих чертах, этот код на первый взгляд показался проще (я как бы новичок в этом деле, да и больше по паскалю и делфям, а бейсик был давно да и только в рамках ZXSrectrum и Корвета и как сказать в небольших количествах), но я и тот обязательно попробую, но сначала в этом научусь выводить переменные.

0

210

sasha_1973, всё получилось, спасибо.
Очередной психрометр :D но по шине I2C
http://habaroved.net/_fr/2/5893349.jpg

sasha_1973, Пётр огромное вам спасибо за терпение и помощь!

Ну а я продолжу разбираться с I2C и дисплейчиком 1602

0


Вы здесь » Программирование ATMEL в BASCOM. » Исходники » Помогите с запуском LCD 4x20 по i2c