LCD kezelés

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

LCD kezelés

Hozzászólás Szerző: Robert »

Az LCD-k 4 bites módban az Arduino 0012 verziójától beépítve tartalmazza a függvénykönyvtárat.

Kód: Egész kijelölése

#include <LiquidCrystal.h>

// LiquidCrystal display with:
// rs on pin 12
// rw on pin 11
// enable on pin 10
// d0, d1, d2, d3 on pins 5, 4, 3, 2
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);

void setup()
{
  // Print a message to the LCD.
  lcd.print("hello, world!");
}

void loop()
{
}

Beépített parancsok:
* lcd.clear() - képtörlés és 1,1 pozícióra ugrás
* lcd.home() - 1,1 pozícióra ugrás
* setCursor() - megadható pozícióra ugrás
* write() - LCD-re paraméterben megadott dolog írása (pl. serial.input())
* print() - LCD-re szöveg/szám kiírása
Avatar
efop
Újonc
Újonc
Hozzászólások: 1
Csatlakozott: 2009. augusztus 28. péntek, 6:00

Hozzászólás Szerző: efop »

Mivel az elmúlt napokban volt egy kis problémám az AVR-Duino és a Ext1 shield boardon lévő LCD vezérlésével ezért leírom mi volt a probléma okulásul.
Az LCD a shopban kapható EW162G0GR modul volt, a pin kiosztása úgylátom szabványos. Az opás oka az volt hogy nem tulajdonítottam nagy jelentőséget a kontraszt beállításnak, pedig ha nincs jól beállítva egyszerűen nem jelenik meg semmi.
Gyárilag pont az LCD alatti poti szabályozza a kontrasztot ezért le kell kapni az LCD-t és valamelyik végállásba tekerni a potit, ha nem az egyik akkor a másik végállásba. És a program amivel működik:

Kód: Egész kijelölése

#include <LiquidCrystal.h>

 const int numRows = 2;
 const int numCols = 16;

 // initialize the library with the numbers of the interface pins
 // LiquidCrystal(rs, rw, enable, d4, d5, d6, d7)
 
 LiquidCrystal lcd(4, 5, 6, 7, 8, 9);  // ext1 ben

 void setup() {
   // set up the LCD's number of rows and columns: 
   //lcd.begin(numRows, numCols);
   lcd.begin(numCols, numRows);
   lcd.display();
 }

 void loop() {
   // loop from ASCII 'a' to ASCII 'z':
   for (int thisLetter = 'a'; thisLetter <= 'z'; thisLetter++) {
     // loop over the rows:
     for (int thisRow= 0; thisRow < numRows; thisRow++) {
       // loop over the columns:
       for (int thisCol = 0; thisCol < numCols; thisCol++) {
         // set the cursor position:
         lcd.setCursor(thisCol,thisRow);
         // print the letter:
         lcd.print(thisLetter, BYTE);
         delay(200);
       }
     }
   }
 }
Avatar
zolsza
DrótVégénSzéndarab
Hozzászólások: 32
Csatlakozott: 2008. október 14. kedd, 6:00

Hozzászólás Szerző: zolsza »

Sziasztok! Egy abszolút kezdő kérdésem lenne. Ext1 shield boardon lévő LCD háttérvilágítását szeretném bekapcsolni.
Evvel a progival próbálkoztam, de nem működik:

#include <LiquidCrystal.h>
LiquidCrystal lcd(4, 5, 6, 7, 8, 9, 16); // ext1 ben
void setup()
{
pinMode(13, OUTPUT);
lcd.print("hello, world!");
}
void loop()
{digitalWrite(13, HIGH);
}
bakter
Avatar
szegoj
SzínkódFestő
Hozzászólások: 92
Csatlakozott: 2010. február 4. csütörtök, 7:00

Hozzászólás Szerző: szegoj »

zolsza írta:Sziasztok! Egy abszolút kezdő kérdésem lenne. Ext1 shield boardon lévő LCD háttérvilágítását szeretném bekapcsolni.
Evvel a progival próbálkoztam, de nem működik:

#include <LiquidCrystal.h>
LiquidCrystal lcd(4, 5, 6, 7, 8, 9, 16); // ext1 ben
void setup()
{
pinMode(13, OUTPUT);
lcd.print("hello, world!");
}
void loop()
{digitalWrite(13, HIGH);
}
A háttérvilágítás bekapcsolásához jó a próbálkozás, de az LCD konfigurálás nem jó. Ha hét paramétert adsz meg, a második az R/W bit.

LiquidCrystal(rs, rw, enable, d4, d5, d6, d7)

Az EXT1 panelen az R/W kivezetés a földre van kötve, így csak 6 paramétert kell megadnod.

LiquidCrystal(rs, enable, d4, d5, d6, d7)

Még egy kérdés: nálad mi a 16? Az Arduino-nak csak 14 digitális IO kivezetése van (0-13 számozással)
Avatar
zolsza
DrótVégénSzéndarab
Hozzászólások: 32
Csatlakozott: 2008. október 14. kedd, 6:00

Hozzászólás Szerző: zolsza »

"Még egy kérdés: nálad mi a 16? Az Arduino-nak csak 14 digitális IO kivezetése van (0-13 számozással)"

Ext1 shield board felhasználói dokumentációból Az LCD ezen kivezetése van az Ardunio D13-as kivezetésére kötve
bakter
Avatar
Gerifield
DrótVégénSzéndarab
Hozzászólások: 27
Csatlakozott: 2011. szeptember 19. hétfő, 6:00

Hozzászólás Szerző: Gerifield »

Az ext1-en az lcd-hez ennyi kell:

Kód: Egész kijelölése

LiquidCrystal lcd(4, 5, 6, 7, 8, 9);
Többször használtam!

A háttér világításhoz pedig csak a 13-as portra kell HIGH-t adni és kész.
(Elég 1* a setup-ban ezt megcsinálni!)


EDIT:
Feldobtam ide pár kódot, részben meghagytam az angol kommenteket, részben hozzáírtam kicsit: http://dl.dropbox.com/u/3592094/avr_dui ... peldak.zip

Van benne, LCD kezelés, analóg inputok olvasása (ami a panelen van és serialra írása), illetve a hőmérő szenzor olvasása.
Avatar
Moon_Walker
DrótVégénSzéndarab
Hozzászólások: 35
Csatlakozott: 2011. szeptember 29. csütörtök, 6:00

Hozzászólás Szerző: Moon_Walker »

sziasztok,

I2C, MCP23017, LCD(HD44780)...

sajna nem jön össze még a háttérvilágítás bekapcsolása sem... :-(
  • #define expander B01000000 //expander address
    ...
    void setup()
    {
    Wire.begin(); // start I2C

    Wire.beginTransmission(expander);
    Wire.send(0x0A);
    Wire.send(B00001100);
    Wire.endTransmission();


    Wire.beginTransmission(expander);
    Wire.send(0x15); //pointer
    Wire.send(B00100000); // setup for command mode
    Wire.endTransmission();


    delayMicroseconds(100);
Mi lehet a gond?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Bascom alatt:

Kód: Egész kijelölése

   Const Iocon = &B00001100
   Const Iodirki = 0
   Const Iodirbe = 255
   Dim I2c_lcd_b As Byte
   Const Bit_rs = 4
   Const Bit_e = 7
   Const Bit_bl = 6
   Const I2c_lcd_bl = 1                                     'hattervilagitas

   Prog30:
      'I2CInit
      Inputhex "MCP23017 - LCD address (hex):" , Temp1b
      I2cinit
      I2cstart                                              'Sends start condition
      I2cwbyte Temp1b                                       '000 cimu eszkoz (kimenet)IOCON regiszter beállítása
      I2cwbyte &H0A                                         'A es B
      I2cwbyte Iocon
      I2cstop

      I2cstart                                              '000 - Kimenet B csatorna beállítás
      I2cwbyte Temp1b
      I2cwbyte 1
      I2cwbyte Iodirki
      I2cstop


      'Device be
      I2cstart                                              '000 - Bemenet A csatorna beállítás
      I2cwbyte Temp1b                                       'A
      I2cwbyte 0
      I2cwbyte Iodirbe
      I2cstop

      I2cstart                                              '000 - Bemenet A Pull Up beállítás
      I2cwbyte Temp1b                                       'A
      I2cwbyte &H0C
      I2cwbyte 255
      I2cstop

      I2cstart                                              '000 - Bemenet A Invert beállítás
      I2cwbyte Temp1b                                       'A
      I2cwbyte &H02
      I2cwbyte 255
      I2cstop

      Waitms 15
      'set 8-bit mode (attention)
      'toggle the E -line
      I2c_lcd_b = &B10000011
      Call I2c_lcd_portkiir
      I2c_lcd_b = &B00000011
      Call I2c_lcd_portkiir

      Waitms 4

      'set 8-bit mode (attention)
      I2c_lcd_b = &B10000011
      Call I2c_lcd_portkiir
      I2c_lcd_b = &B00000011
      Call I2c_lcd_portkiir

      Waitms 1

      'set 8-bit mode (attention)
      I2c_lcd_b = &B10000011
      Call I2c_lcd_portkiir
      I2c_lcd_b = &B00000011
      Call I2c_lcd_portkiir

      Waitms 4

      'set 4-bit operation
      I2c_lcd_b = &B10000011
      Call I2c_lcd_portkiir
      I2c_lcd_b = &B00000011
      Call I2c_lcd_portkiir


      Waitms 1
      'set 8-bit mode (attention)
      I2c_lcd_b = &B10000010
      Call I2c_lcd_portkiir
      I2c_lcd_b = &B00000010
      Call I2c_lcd_portkiir


      I2c_lcd_b = &B10001000
      Call I2c_lcd_portkiir
      I2c_lcd_b = &B10001000
      Call I2c_lcd_portkiir


      Waitms 1

      I2c_lcd_b = &B10000000
      Call I2c_lcd_portkiir
      I2c_lcd_b = &B00000000
      Call I2c_lcd_portkiir


      'Display off, cursor off, blink off
      I2c_lcd_b = &B10001000
      Call I2c_lcd_portkiir
      I2c_lcd_b = &B00001000
      Call I2c_lcd_portkiir

      Waitms 1

      I2c_lcd_b = &B10000000
      Call I2c_lcd_portkiir
      I2c_lcd_b = &B00000000
      Call I2c_lcd_portkiir

      'display on, cursor off, blinking off
      I2c_lcd_b = &B10001100
      Call I2c_lcd_portkiir
      I2c_lcd_b = &B00001100
      Call I2c_lcd_portkiir

      Waitms 1

      I2c_lcd_b = &B10000000
      Call I2c_lcd_portkiir
      I2c_lcd_b = &B00000000
      Call I2c_lcd_portkiir


      'clear display and send cursor to address 0
      I2c_lcd_b = &B10000001
      Call I2c_lcd_portkiir
      I2c_lcd_b = &B00000001
      Call I2c_lcd_portkiir

      Waitms 1
   Return


   Prog33:
      'I2C_lcd_gomb
      Inputhex "MCP23017 - LCD address (hex):" , Temp1b
      I2cstart
      I2cwbyte Temp1b
      I2cwbyte &H12
      I2cstop
      I2cstart
      Temp1b = Temp1b + 1
      I2cwbyte Temp1b
      I2crbyte Temp2b , Nack
      I2cstop
      Decr Temp1b
      Waitms 10                                             'prell kivedese
      I2cstart
      I2cwbyte Temp1b
      I2cwbyte &H12
      I2cstop

      I2cstart
      I2cwbyte Temp1b
      I2crbyte Temp3b , Nack
      I2cstop

      If Temp3b <> Temp2b Then
         Temp3b = 0
         Else
         If Temp3b <> 0 Then Gosub Csipog1
      End If
      If Temp3b = 0 Then Goto Prog15
      Print "Gomb : " ; Bin(temp3b) ; " : ";
      If Temp3b = &B00001000 Then Print "1"
      If Temp3b = &B00100000 Then Print "2"
      If Temp3b = &B00000001 Then Print "3"
      If Temp3b = &B00000010 Then Print "4"
      If Temp3b = &B10000000 Then Print "5"
      If Temp3b = &B11000000 Then Print "5M"
      Wait 3
   Return



Sub I2c_lcd_portkiir
   I2c_lcd_b.bit_bl = I2c_lcd_bl
   I2cstart
   I2cwbyte Temp1b
   I2cwbyte &H15
   I2cwbyte I2c_lcd_b
   I2cstop
End Sub


Avatar
Moon_Walker
DrótVégénSzéndarab
Hozzászólások: 35
Csatlakozott: 2011. szeptember 29. csütörtök, 6:00

Hozzászólás Szerző: Moon_Walker »

Köszi Robi!

Ez sokat segített.
Láthatólag inicializálja a kijelzőt....
Már csak valami kiírás kellene....
átírtam wiring-ba:
  • #include <Wire.h>

    //redefine highByte and lowByte to return byte, not int

    #define loByte (byte)lowByte
    #define hiByte (byte)highByte

    #define opcode B0100000 // address = 000; 7 bits!
    #define ioconbyte B00100000 // disable sequential operation mode;

    #define iocon 0x0A
    #define iodira 0x00
    #define gpioa 0x12
    #define gppua 0x0C //pullups
    #define gpintena 0x04
    #define defvala 0x06
    #define intcona 0x08
    #define intfa 0x0E
    #define intcapa 0x10
    #define ipola 0x02

    byte I2c_lcd_b;

    void setup()
    {
    Serial.begin(9600);

    Wire.begin();

    Wire.beginTransmission(opcode);
    Wire.send(iocon);
    Wire.send(ioconbyte);
    Wire.endTransmission();

    MCPstore (0,iodira,0x0000); // all output
    // MCPstore (0,gppua, 0xf000); // all pullups on
    delay(15);
    I2c_lcd_portkiir(0, 0x15, B10000011);
    I2c_lcd_portkiir(0, 0x15, B00000011);
    delay(4);
    I2c_lcd_portkiir(0, 0x15, B10000011);
    I2c_lcd_portkiir(0, 0x15, B00000011);
    delay(1);
    I2c_lcd_portkiir(0, 0x15, B10000011);
    I2c_lcd_portkiir(0, 0x15, B00000011);
    delay(4);
    I2c_lcd_portkiir(0, 0x15, B10000011);
    I2c_lcd_portkiir(0, 0x15, B00000011);
    delay(1);
    I2c_lcd_portkiir(0, 0x15, B10000010);
    I2c_lcd_portkiir(0, 0x15, B00000010);

    I2c_lcd_portkiir(0, 0x15, B10001000);
    I2c_lcd_portkiir(0, 0x15, B00001000);
    delay(1);
    I2c_lcd_portkiir(0, 0x15, B10000000);
    I2c_lcd_portkiir(0, 0x15, B00000000);

    I2c_lcd_portkiir(0, 0x15, B10001000);
    I2c_lcd_portkiir(0, 0x15, B00001000); //'Display off, cursor off, blink off
    delay(1);
    I2c_lcd_portkiir(0, 0x15, B10000000);
    I2c_lcd_portkiir(0, 0x15, B00000000);

    I2c_lcd_portkiir(0, 0x15, B10001100);
    I2c_lcd_portkiir(0, 0x15, B00001100); //'display on, cursor off, blinking off
    delay(1);
    I2c_lcd_portkiir(0, 0x15, B10000000);
    I2c_lcd_portkiir(0, 0x15, B00000000);

    I2c_lcd_portkiir(0, 0x15, B10000001);
    I2c_lcd_portkiir(0, 0x15, B00000001);
    delay(1);
    }

    void loop()
    {
    // MCPstore (0,gpioa, 0x4000);
    // delay(1000);
    // MCPstore (0,gpioa, 0x0000);
    // delay(1000);

    I2c_lcd_portkiir(0, 0x15, 0x40);
    delay(1000);
    I2c_lcd_portkiir(0, 0x15, 0x00);
    delay(1000);

    }

    void MCPstore (byte i2caddress, byte i2cregister, word i2cdata) // Store 16 bits in specified register of MCP23017
    {
    byte controlbyte = B0100000 | i2caddress; // note that bit 0 not used b/c 7-bit opcode for Wire library

    Wire.beginTransmission(controlbyte);
    Wire.send(i2cregister);
    Wire.send(loByte(i2cdata));
    Wire.send(hiByte(i2cdata));
    Wire.endTransmission();
    }

    void I2c_lcd_portkiir(byte i2caddress, byte i2cregister, byte I2c_lcd_b)
    {
    byte controlbyte = B0100000 | i2caddress;

    //bitWrite(I2c_lcd_b, 6, 1);

    Wire.beginTransmission(controlbyte);
    Wire.send(i2cregister);
    Wire.send(I2c_lcd_b);
    Wire.endTransmission();


    }
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

A kovetkezo lepes, hogy kiirsz valami kodot - az maga a karakter...
Pl. a 65-t kuldod ki, akkor egy A betu kerul a 0,0 pozicioba...

Ami tipp meg, hogy I2C portbovitore valo fuggvenykonyvtarral kinalod meg. Igy a sima LCD parancsok hasznalhatoak.


http://avr.tavir.hu/modules.php?name=Do ... oad&cid=17

EthShield LCD-vez. minta alapján....
Avatar
Moon_Walker
DrótVégénSzéndarab
Hozzászólások: 35
Csatlakozott: 2011. szeptember 29. csütörtök, 6:00

Hozzászólás Szerző: Moon_Walker »

Köszi Robi!

végülis összegereblyéztem a kiírást....
elég sokat küszködtem, és a felét sem nagyon értem, de változtatni kellett ezt-azt a libekben a Port-B használata miatt.
Ha érdekel valakit felrakhatom a libeket/progit:
cLCD+MCP23017.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

file cserebere alá, ha megoldható :)

Köszönöm szépen....
Avatar
Moon_Walker
DrótVégénSzéndarab
Hozzászólások: 35
Csatlakozott: 2011. szeptember 29. csütörtök, 6:00

Hozzászólás Szerző: Moon_Walker »

Feltöltöttem egy RC1-et ide a csere-bere szekcióba:

"wiznet_sd_1wire_rtc_lcd.rar"
Avatar
Jackal
Újonc
Újonc
Hozzászólások: 12
Csatlakozott: 2012. június 30. szombat, 6:00

I2c probléma

Hozzászólás Szerző: Jackal »

Sziasztok,

Egy kis segítségre lenne szükségem, Ethmax Shielden keresztül (ha jól gondolom I2C-vel) nem tudom működésre bírni a HD44780-es LCD-t.
Innen vadásztam vezérlő könyvtárt hozzá:
http://arduino.cc/playground/Code/LCDi2c
,de se 0x20 se 0x21-es porton nem hajlandó menni még egy nyavadt hello world se... :S
Az lcd maga a sima alapboardra kötve teljesen jó.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Melyik EthMax? A letöltések közt nem találtad a mintát?
Válasz küldése