Sziasztok,
Próbálok életet lehelni a WiFi demópanelen keresztül a 8x2-es LCD kijelzőbe, egyelőre sikertelenül.
A teszteléshez az AVR-en fut egy kis program, ami az MCP23008 IO Expander minden kimenetét egyszerre villogtatja, közben pedig próbáltam összevadászni a panel és az LCD modul dokumentációja alapján, hogy mit ronthattam el.
A panel doksija szerint a két hüvelysoron az LCD D4-D7 adatlábai vannak kivezetve, de én a D1-D4 helyén levő csatlakozókon találtam meg a "villogást". Simán lehet, hogy a sok kísérletezés után elnéztem valamit, de olyan mintha az RJ-11 aljzattól távolabb eső hüvelysor bekötése fordított lenne.
Valaki próbálta már az LCD használatát ezzel a panellel?
AVR-Duino/WiFi
Szia!
Nekem a következő program működött. Az LCD bekötés a szövegben...
Megjegyzés:
A program elején a setbit, clearbit definició csak próbálkozás volt, az Arduino nyelvben vannak hasonló nevű parancsok!
Nekem a következő program működött. Az LCD bekötés a szövegben...
Megjegyzés:
A program elején a setbit, clearbit definició csak próbálkozás volt, az Arduino nyelvben vannak hasonló nevű parancsok!
Kód: Egész kijelölése
/*----------------------------------------------------------------
Projekt: AVR-DUINO/WiFiShield board
------------------------------------------------------------------
MCP23008 expanderre kötött LCD kijelzőt kezeli
------------------------------------------------------------------
Az LCD kijelző bekötése
-----------------------
DB4..DB7 -> GPIO 0-3
RS -> GPIO 4
RW -> GPIO 5
E -> GPIO 7
----------------------------------------------------------------*/
#include <Wire.h>
#define setBit(var, bitnum) ((var)|=(1<<(bitnum)))
#define clearBit(var, bitnum) ((var)&=~(1<<(bitnum)))
const byte LCD_CLEAR = 0b00000001;
const byte LCD_INCR = 0b00000110;
const byte LCD_DECR = 0b00000100;
const byte LCD_LSHIFT = 0b00011000;
const byte LCD_RSHIFT = 0b00011100;
const byte LCD_BLINK = 0b00001111;
const byte LCD_NOBLINK = 0b00001110;
const byte LCD_SHOWCURSOR = 0b00001110;
const byte LCD_HIDECURSOR = 0b00001100;
const byte LCD_ON = 0b00001100;
const byte LCD_OFF = 0b00001000;
const byte MCP_addr = 0x27; // A2 - A0 = 111;
const byte LED = 9;
const byte IODIR = 0;
const byte OLAT = 10;
const byte RS = 4;
const byte E = 7;
byte c;
void MCP_write(byte address, byte value){
Wire.beginTransmission(MCP_addr);
Wire.send(address);
Wire.send(value);
Wire.endTransmission();
}
void LCD_write(byte chr) {
setBit(chr, E); // E=1
MCP_write(OLAT, chr);
delayMicroseconds(100);
clearBit(chr, E); // E=0
MCP_write(OLAT, chr);
delayMicroseconds(100);
}
void LCD_command(byte data) {
c = data >> 4;
LCD_write(c);
c = data & 15;
LCD_write(c);
}
void LCD_char(byte data) {
c = data >> 4;
setBit(c, RS);
LCD_write(c);
c = data & 15;
setBit(c, RS);
LCD_write(c);
}
void LCD_string(const char * s) {
while(*s) LCD_char(*s++);
}
void LCD_cursor(byte x, byte y) {
switch (y) {
case 1:
LCD_command(0x80 + x);
break;
case 2:
LCD_command(0xC0 + x);
break;
}
}
void LCD_init() {
delay(1000);
LCD_write(3);
delay(10);
LCD_write(3);
delay(1);
LCD_write(3); // 8 bites interfész
delayMicroseconds(100);
LCD_write(2); // 4 bites interfész
delayMicroseconds(100);
LCD_command(0b00101000); // 2 soros LCD
LCD_command(LCD_HIDECURSOR);
LCD_command(LCD_CLEAR);
delay(2);
LCD_command(LCD_INCR);
}
void setup() {
pinMode(LED, OUTPUT);
digitalWrite(LED, HIGH);
Wire.begin(); // i2c master
MCP_write(IODIR, 0); // kimenet konfigurálás
}
void loop() {
LCD_init();
while(1) {
LCD_string("Hello");
delay(2000);
LCD_cursor(1, 2);
LCD_string("World ");
delay(2000);
LCD_command(LCD_OFF);
delay(1000);
LCD_command(LCD_ON);
delay(1000);
LCD_command(LCD_OFF);
delay(1000);
LCD_command(LCD_ON);
delay(1000);
for (int i=0; i<5; i++) {
LCD_command(LCD_LSHIFT);
delay(1000);
}
for (int i=0; i<5; i++) {
LCD_command(LCD_RSHIFT);
delay(1000);
}
LCD_command(LCD_SHOWCURSOR);
delay(1000);
LCD_command(LCD_HIDECURSOR);
delay(1000);
LCD_command(LCD_CLEAR);
delay(1000);
}
}
Szia,
Köszönöm a kódrészletet. Kipróbáltam egy az egyben (wire.send helyett wire.write volt az egyetlen módosítás), de sajnos ez sem működött.
A bekötéssel kapcsolatban az lenne a kérdésem, hogy Te az LCD csatlakoztatásakor közvetlenül a WiFi Shield hüvelysorát használtad, vagy pl. breadboardon keresztül csatlakoztattad a lábakat?
Köszönöm a kódrészletet. Kipróbáltam egy az egyben (wire.send helyett wire.write volt az egyetlen módosítás), de sajnos ez sem működött.
A bekötéssel kapcsolatban az lenne a kérdésem, hogy Te az LCD csatlakoztatásakor közvetlenül a WiFi Shield hüvelysorát használtad, vagy pl. breadboardon keresztül csatlakoztattad a lábakat?
A WiFi shield csatlakozójába dugtam az LCD-t, a rajz szerint kell behelyezni
A gond az, hogy a panel hüvelysorai kb. egy fél raszterrel távolabb vannak egymástól, mint az LCD lábsorai. Ráadásul az LCD-nek vékony drót lábacskái vannak, amik rosszul érintkeznek, lötyögnek a hüvelysorban. Közbülső csatlakozóként IC foglalatból ledarabolt hüvelysorokba dugtam az LCD-t, és azzal együtt csatlakoztam a shield panelre (mint zokni).
A gond az, hogy a panel hüvelysorai kb. egy fél raszterrel távolabb vannak egymástól, mint az LCD lábsorai. Ráadásul az LCD-nek vékony drót lábacskái vannak, amik rosszul érintkeznek, lötyögnek a hüvelysorban. Közbülső csatlakozóként IC foglalatból ledarabolt hüvelysorokba dugtam az LCD-t, és azzal együtt csatlakoztam a shield panelre (mint zokni).