LCD 20x4 i2c
: 18 sty 2018, 21:29
Witam czytających czy ktoś przerabiał temat wyświetlacza 20x4 na i2c - moje próby kończą się fiaskiem - o ile przy korzystaniu z 2 pierwszych linii - program źródłowy zapożyczony ze strony Kolegi Kaktusa http://kaktusa.pl/lcd-cob-kaktusa-zabawy/
działa prawidłowo, o tyle po dopisaniu czegokolwiek dla 3 i 4 linii kończy się "wysypaniem lcd" czy mogę liczyć na pomoc w rozwiązaniu problemu.
pozdrawiam Jacek
P.S. mój wyświetlacz Lcd ma tylko 1 linie E - wiem że dla lcd z 2 liniami E jest rozwiązanie na stronie MCS https://www.mcselec.com/index.php?opti ... Itemid=57
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- 'I2c LCD on Arduino Nano 16x2 display with backlight
- $regfile = "M328pdef.dat" ' the used chip
- $crystal = 16000000 ' frequency used
- $baud = 9600 ' baud rate
- $lib "i2c_twi.lib" 'hardware i2c/TWI
- $lib "bl_Lcd_i2c.lib" ' AN #118 library from Kent
- Config Twi = 100000
- ' with this addition
- ' * lds r27,{backlight}
- ' andi _temp2,&hf7
- ' or _temp2,r27
- 'LCD-display including backlight
- '0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1
- '1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6
- 'G 5 C R R E D D D D D D D D B B
- 'N O S W 0 1 2 3 4 5 6 7 L L
- 'D V N S
- 'PCF8574
- 'P7 = D7
- 'P6 = D6
- 'P5 = D5
- 'P4 = D4
- 'P3 = 1 = backlight on / 0 = backlight off
- 'P2 = E
- 'P1 = RW
- 'P0 = RS
- '(
- Const Pcf_d4 = 4
- Const Pcf_d5 = 5
- Const Pcf_d6 = 6
- Const Pcf_d7 = 7
- Const Pcf_rs = 0
- Const Pcf_rw = 1
- Const Pcf_e1 = 2
- ')
- Const Pcf_rs = 0
- Const Pcf_rw = 1 'not used, set to 0 to ground for write
- Const Pcf_e1 = 2
- Const Pcf_e2 = 3 'podświetlenie ON/OFF
- Const Pcf_d4 = 4
- Const Pcf_d5 = 5
- Const Pcf_d6 = 6
- Const Pcf_d7 = 7
- Declare Sub I2c_scan
- Dim B As Byte
- Dim A As Byte
- Dim _lcd_e As Byte
- Dim Backlight As Byte
- Backlight_on Alias &H08
- Backlight_off Alias &H00
- Backlight = Backlight_on
- _lcd_e = 128
- Const Pcf8574_lcd = &H7E '40 'definicja adresu bazowego ekspandera I/O dla naszego LCD
- Config Scl = Portc.5 'konfiguracja magistrali TWI
- Config Sda = Portc.4
- 'I2cinit
- 'Call I2c_scan 'if you want to check if the PCF8574 is seen activate this
- Wait 2
- Do
- Cls
- Home 'kursor w pierwszej pozycji pierwszej linii
- Lcd "i2c-display" 'wyświetlamy tekst
- Wait 1
- Lowerline 'przejście do niższej lini, kursor na pierwszą pozycję
- Wait 1
- Lcd "Shift this." 'wyświetlamy tekst
- Wait 1
- For A = 1 To 8 '10
- Shiftlcd Right 'przesuwamy tekst o jedną pozycję w prawo
- Waitms 250 'krótka przerwa w działaniu
- Next
- For A = 1 To 8 '10
- Shiftlcd Left 'przesuwamy tekst o jedną pozycje w lewo
- Waitms 250 'krótka przerwa w działaniu
- Next
- Locate 2 , 1 'ustawiamy kursor w pozycji
- Lcd "*" 'wyświetlamy jeden znak
- Wait 1 'krótka przerwa w działaniu
- Shiftcursor Right 'przesunięcie kursora
- Lcd "@" 'wyświetlamy jeden znak
- Wait 1 'krótka przerwa w działaniu
- Home Upper 'przejście do linii wyżej, kursor na pierwszą pozycję
- Lcd "Replaced." 'nadpisujemy stary tekst
- Wait 1 'krótka przerwa w działaniu
- Cursor Off Noblink 'ukrywamy kursor
- Wait 1 'krótka przerwa w działaniu
- Cursor On Blink 'uaktywniamy kursor
- Wait 1 'krótka przerwa w działaniu
- Display Off 'wyświetlacz off
- Wait 1 'krótka przerwa w działaniu
- Display On 'wyświetlacz on
- 'Now lets build a special character
- 'the first number is the characternumber (0-7)
- 'The other numbers are the rowvalues
- 'Use the LCD tool to insert this line
- Deflcdchar 2 , 32 , 10 , 32 , 14 , 17 , 17 , 17 , 14 ' replace ? with number (0-7)
- Deflcdchar 0 , 32 , 4 , 32 , 14 , 18 , 18 , 18 , 13 ' replace ? with number (0-7)
- Deflcdchar 1 , 32 , 10 , 32 , 14 , 18 , 18 , 18 , 13 ' replace ? with number (0-7)
- _lcd_e = 128
- Cls 'select data RAM
- Rem it is important that a CLS is following the deflcdchar statements because it will set the controller back in datamode
- Lcd Chr(0) ; Chr(1) 'print the special character
- ' wait 2
- '----------------- Now use an internal routine ------------
- _temp1 = 2 'value into ACC
- !rCall _write_lcd 'put it on LCD
- '**************************************************************************
- Wait 2
- Loop
- End
- Sub I2c_scan ' check all devices on the I2c-bus
- Print "Scan start"
- For B = 0 To 254 Step 2 'for all odd addresses
- I2cstart 'send start
- I2cwbyte B 'send address
- If Err = 0 Then 'we got an ack
- Print "Slave at : " ; B ; " hex : " ; Hex(b) ; " bin : " ; Bin(b)
- End If
- I2cstop 'free bus
- Next
- Print "End Scan"
- End Sub
pozdrawiam Jacek
P.S. mój wyświetlacz Lcd ma tylko 1 linie E - wiem że dla lcd z 2 liniami E jest rozwiązanie na stronie MCS https://www.mcselec.com/index.php?opti ... Itemid=57