REKLAMA

_Arduino_I2C_subs.txt

Bascom AVR PCF8574 - Sterowanie LCD protokołem i2c

Witam po kilku dniach szperania po sieci, szukając programu pozwalającego sterować Attiny45 wyświetlaczem LCD 16x2 przy użyciu i2c z poziomu Bascoma w pierwszej kolejności natknąłem się na skrypt Pana Kent Andersson. Niestety skrypt mnie nie zadowalał ponieważ nie było możliwości sterowania podświetleniem przez port PCF8574 a ze względu ze dopiero się uczę programować szukałem dalej. Szukając dalej znalazłem program którego autorem jest użytkownik o nicku Cassio. Cassio udostępnił program pozwalający na sterowanie rożnymi wyświetlaczami oraz podświetleniem używając wyłącznie PCF8574, ostatnia wersja programy z dnia 08.06.2012 aby program sie kapilował minimalna wersja Bascom to 2.0.7.4 LCD i2c Bascom listing wsadu Uc możliwy do pobrania po zarejestrowaniu, wiec udostępniam go poniżej. Zmieniając w kilku miejscach parametry możemy sterować rożnymi wyświetlaczami nie będę się rozpisywał na ten temat nie jest to skomplikowane. schemat podłączenia PCF8574 do LCD znajduje się w programie. Zapoznając się z tematem w programie użytkowania Cassio były problemy ze symbolami Deflcdchar ale i na to znalazł się sposób. Użytkownik Riesen na stronie 12 udostępnił trochę zmieniony kod. Różni się on także sposobem podłączenia PCF8574 do lcd ponieważ użył gotowej przystawki "mjkdz" opos wyprowadzeń znajduje się w pliku: I2C_LCD_universal_declare.bas ' Port-Definition für Mjkdz.com Lcd_rs Alias Cha.6 Lcd_rw Alias Cha.5 Lcd_e Alias Cha.4 Lcd_bl Alias Cha.7 Lcd_d4 Alias Cha.0 Lcd_d5 Alias Cha.1 Lcd_d6 Alias Cha.2 Lcd_d7 Alias Cha.3. A samą przystawkę można znaleźć na ebay Wsady użytkownika Cassio to: _Arduino_I2C_ _Arduino_I2C_declare _Arduino_I2C_subs Wsady użytkownika Riesen to: I2C_LCD_universal I2C_LCD_universal_declare LCD_Arduino_Mini168_I2C_universal Pliki należny umieścić w jednym folderze i zmienić rozszerzenie na .bas. Udostępniam również schemat i wzór płytki przystawki do LCD w eagle, pin 1 do lcd po prawej stronie złącze J3. złącze J2: 1-VCC, 2-SDA, 3-SCL, 4-GND. Pozdrawiam


Pobierz plik - link do postu

$nocompile


' #############################################################################
Sub Lcda_init
'Lcd_init: 'Sub zum Initialisieren beider Displaycontroller
Init(1) = & H00 + Bl
Init(2) = & H00 + BL
I2csend Lcd_arduino , Init(1) , 2
Waitms 50

Init(1) = & H34 + BL
Init(2) = & H30 + BL
I2csend Lcd_arduino , Init(1) , 2 '03h
Waitms 4
I2csend Lcd_arduino , Init(1) , 2 '03h
Waitms 1
I2csend Lcd_arduino , Init(1) , 2 '03h
Waitms 1
Init(1) = & H24 + BL
Init(2) = & H20 + BL
I2csend Lcd_arduino , Init(1) , 2 '02h (4Bit Modus)
Waitms 1

I2csend Lcd_arduino , Init(1) , 2
Init(1) = & H84 + BL
Init(2) = & H80 + BL
I2csend Lcd_arduino , Init(1) , 2 '28h (4 Zeilen Dispaly)
Waitms 1

Init(1) = & H04 + BL
Init(2) = & H00 + BL
I2csend Lcd_arduino , Init(1) , 2
Init(1) = & HE4 + BL
Init(2) = & HE0 + BL
I2csend Lcd_arduino , Init(1) , 2 '0Eh (Select Mode)
Waitms 1

Init(1) = & H04 + BL
Init(2) = & H00 + BL
I2csend Lcd_arduino , Init(1) , 2
Init(1) = & H64 + BL
Init(2) = & H60 + BL
I2csend Lcd_arduino , Init(1) , 2 '06h (Select Mode)
Waitms 1

Init(1) = & H04 + BL
Init(2) = & H00 + BL
I2csend Lcd_arduino , Init(1) , 2
Init(1) = & HC4 + BL
Init(2) = & HC0 + BL
I2csend Lcd_arduino , Init(1) , 2 '0Ch (Select Mode)
Waitms 1

Init(1) = & H04 + BL
Init(2) = & H00 + BL
I2csend Lcd_arduino , Init(1) , 2
Init(1) = & H14 + BL
Init(2) = & H10 + BL
I2csend Lcd_arduino , Init(1) , 2 '01h (Cls)
Waitms 500

End Sub



' #############################################################################
Sub Lcda_cls
'Clear Screen Anweisung
Init(1) = & H04 + BL
Init(2) = & H00 + BL
I2csend Lcd_arduino , Init(1) , 2 '0h für E1 senden
Init(1) = & H14 + BL
Init(2) = & H10 + BL
I2csend Lcd_arduino , Init(1) , 2 '1h für E1 senden
Waitus 400

'Erste Zeile, erstes Zeichen anwählen
Init(1) = & H84 + BL
Init(2) = & H80 + BL '8h für E1 senden
I2csend Lcd_arduino , Init(1) , 2
Init(1) = & H04 + BL
Init(2) = & H00 + BL '0h für E1 senden
I2csend Lcd_arduino , Init(1) , 2
Waitus 400

End Sub


' #############################################################################
Sub Hbl(byval Ea As Byte)
Bl = Ea
Init(1) = Bl
I2csend Lcd_arduino , Init(1) , 1
End Sub



' #############################################################################
Sub Lcda_(byval X1 As Byte , Byval X2 As Byte , Byval Text1 As String * 20)
Text = Text1 'max.40 Zeichen String übergeben

If Lcd_zeilen & lt; 3 Then
Select Case X1
Case 1
Pos = & H7F + X2
Gosub Lcd1
Case 2
Pos = & HBF + X2
Gosub Lcd1
Case Else
End Select
Else
Select Case X1
Case 1
Pos = & H7F + X2
Gosub Lcd1
Case 2
Pos = & HBF + X2
Gosub Lcd1
Case 3
Pos = & H7F + Lcd_spalten
Pos = Pos + X2
Gosub Lcd1
Case 4
Pos = & HBF + Lcd_spalten
Pos = Pos + X2
Gosub Lcd1
Case Else
End Select
End If


End Sub


' #############################################################################
Lcd1: 'Sub zur LCD-Ausgabe auf 1.Displaycontroller
Zz = Len(text)

Init(2) = Pos And & HF0 'Zeichen-Startposition Bit7-4
Init(2) = Init(2) + Bl

Init(4) = Pos And & H0F 'Zeichen-Startposition Bit3-0
Shift Init(4) , Left , 4
Init(4) = Init(4) + BL


Init(1) = Init(2) + & H04 'Bit7-4 + E1
Init(3) = Init(4) + & H04 'Bit3-0 + E1
I2csend Lcd_arduino , Init(1) , 4 'Start-Array zum Display senden
Waitus 500

Ascii_zeichen(5) = & H00 + BL

For Zi = 1 To Zz 'Zeichenlänge des Strings ermitteln
Ascii_zeichen(1) = Lcd_text(zi) And & HF0 'ASCII-Wert Bit7-4
Ascii_zeichen(1) = Ascii_zeichen(1) + BL
Ascii_zeichen(2) = Ascii_zeichen(1) + & H01 'Bit7-4 + RS-Pin
Ascii_zeichen(1) = Ascii_zeichen(1) + & H05 'Bit7-4 + RS + E1

Ascii_zeichen(3) = Lcd_text(zi) And & H0F 'ASCII-Wert Bit3-0
Shift Ascii_zeichen(3) , Left , 4
Ascii_zeichen(3) = Ascii_zeichen(3) + BL
Ascii_zeichen(4) = Ascii_zeichen(3) + & H01 'Bit3-0 + RS-Pin
Ascii_zeichen(3) = Ascii_zeichen(3) + & H05 'Bit3-0 + RS + E1
I2csend Lcd_arduino , Ascii_zeichen(1) , 5 'ASCII-Daten zum Display senden
Waitus 500
Next Zi 'je nach Anzahl der Zeichen im String wiederholen

Return