LCD4Bit for 20x4 displays!

hmm that worked!

Ok but now as I uploaded the sketch nothing
appears on the screen.

Hmm could you pls send me your library and sketch...
I think I messed it up...

PS: The Display shows:

Geko

hmm that worked!

Hmm could you pls send me your library and sketch...
I think I messed it up...
Geko

This evenig i wil send it to you when i'am home.

Hi,

I put my library online at:
http://www.ineonline.nl/download/LCD4Bit.zip

Good luck.

thx a lot.
I'm gonna try this...

Geko

ok great your code works for a 4x20 Display
It does work on my 4x40 Display but of course it
does show the second line on the first line just 20
characters to the right :slight_smile:

So I changed your cpp to:

void LCD4Bit::cursorTo(int line_num, int x){
  //first, put cursor home
  commandWrite(CMD_HOME);
  if (x>39)
  {
        x=39;
  }
switch (line_num)
  {
 case 1:
    x+=0x00 ; break;
  case 2: 
    x+= 0x80 ; break;
  case 3: 
    x+= 0x28 ; break; // In fact, line 3 is an extension of the line 1 (beyond the 20 first characters)
  case 4: 
    x+= 0xa8 ; break; // Line 4 is an extension of line 2
  }
  //
  commandWrite(0x80+x);
}

but it does not work. Could you help me pls....

Geko

My quistion to you is, don't you have 2 enable pins on you LCD?
in that case look at the repost in this trat Reply #7 from legba7

Else, tray to play with the x e.d. : x+= 0x80 ,0x14 0x54

I don't have your LCD so i can't try.

Good luck, and let us no if it works and with what values.

Yes I know I posted this link put it does not work for my LCD.
Nothing appears the LCD is just empty....

Phu that's a hard nut....

Geko

Here it is: http://bjonnh.free.fr/LCD4Bit.zip This is the old version, I'm using this one for now (an urgent project to do)

Here it is: http://bjonnh.free.fr/LCD4Bit.zip This is the old version, I'm using this one for now (an urgent project to do)

so do you have a 4x40 Display running with this code?
Hmm mine does not work. I got 2 Enable signals so I
could just connect one of them...

Thx
geko

Hi, I was looking for something like this and it works for me on an mtc-c204dply-1n 4x20 lcd display with 1 enable pin.

Gordon

I'm stuck! I can't get any text to display, and it seems to be hanging up somewhere since the debug LED never goes off.

I'm using a WH2004A 4x20 with the KS0066 driver.

I'm at a loss at what to do, any ideas?

edit

A bit of an update. I'm fairly sure that the Freeduino is talking to the LCD, since the lcd.clear command is working. Also, I inserted a small debug script for the LED, it blinks once for the first command, twice for the second ect. It's not just staying on anymore, it's blinking like it's supposed to (the LED) but I still don't have any text output on the display. Here's the code I've been using, any suggestions?

//example use of LCD4Bit library

#include <LCD4Bit.h>
//create object to control an LCD.
//number of lines in display=1
LCD4Bit lcd = LCD4Bit(4);

void setup() {
pinMode(13, OUTPUT); //we'll use the debug LED to output a heartbeat

lcd.init();
//optionally, now set up our application-specific display settings, overriding whatever the lcd did in lcd.init()
//lcd.commandWrite(0x0F);//cursor on, display on, blink on. (nasty!)

}

void loop() {
digitalWrite(13, HIGH); //light the debug LED
delay(200);
digitalWrite(13, LOW);
delay(1000);

//lcd.clear();
digitalWrite(13, HIGH); //debug lcd.clear
delay(200);
digitalWrite(13, LOW);
delay(1000);

lcd.cursorTo(1,0);
lcd.printIn("Line 1");
digitalWrite(13, HIGH); //debug first line of print
delay(200);
digitalWrite(13, LOW);
delay(200);
digitalWrite(13, HIGH);
delay(200);
digitalWrite(13, LOW);
delay(1000);

lcd.cursorTo(2,0);
lcd.printIn("Line 2");
digitalWrite(13, HIGH); // debug second line
delay(200);
digitalWrite(13, LOW);
delay(200);
digitalWrite(13, HIGH);
delay(200);
digitalWrite(13, LOW);
delay(200);
digitalWrite(13, HIGH);
delay(200);
digitalWrite(13, LOW);
delay(1000);

lcd.cursorTo(3,0);
lcd.printIn("Line 3");
digitalWrite(13, HIGH); //debug third line
delay(200);
digitalWrite(13, LOW);
delay(200);
digitalWrite(13, HIGH);
delay(200);
digitalWrite(13, LOW);
delay(200);
digitalWrite(13, HIGH);
delay(200);
digitalWrite(13, LOW);
delay(200);
digitalWrite(13, HIGH);
delay(200);
digitalWrite(13, LOW);
delay(1000);

lcd.cursorTo(4,0);
lcd.printIn("Line 4");
digitalWrite(13, HIGH); //debug fourth line
delay(200);
digitalWrite(13, LOW);
delay(200);
digitalWrite(13, HIGH);
delay(200);
digitalWrite(13, LOW);
delay(200);
digitalWrite(13, HIGH);
delay(200);
digitalWrite(13, LOW);
delay(200);
digitalWrite(13, HIGH);
delay(200);
digitalWrite(13, LOW);
delay(200);
digitalWrite(13, HIGH);
delay(200);
digitalWrite(13, LOW);
delay(1000);

delay(1000);
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW); //end debug LED

}

another edit

Yes I did comment out the lcd.clear command on purpose, just to see if it was clearing the 2 lines of blocks when I powered it up, and yes it does, if it's commented out, the blocks stay on the screen.

yet another edit

Ok, for some reason, when the cursor goes to line 3, the blocks dissapear. I'm guessing that there's no problem in communication, as things are happening, it's just that I'm getting no text output on the screen.

Hi,

I am using the code below to write user-defined code, but it is not working. I am using HD44780 4x20 LCD module.

void LCD4Bit::WriteCGRAM(int adress, char code[]) {
commandWrite(0x40+(adress<<3));

for (int i=0 ; i <= 7 ; i++)
{
print(code*);*

  • }*
  • commandWrite(CMD_HOME);*
    }[/quote]

Hi all!
I'm using to a 4x20 LCD a wintec 2004.

Now i have it working and what i note in it is this, to print the complete scren needs a little bit time :'(, so what i do is minimize all the delays() inside the lcd4bit lib.

Now works great, but what will be nice is send the complete screen and then turn on the display, i meen charge it first and then show the text. :o

Can be done? using what cmd ? ;D

Best Regads
Frank

Ok guys i need help!!!!

Here is the screen i have:

http://www.futurlec.com/LED/BLUELCD16x2BL.shtml ( but i have the 16x4 verison )

I have copied over the code from Billyboy's post but all i can get on my screen is chinese looking symbols on lines 1 and 3.

Im a complete newb to this so if anyone can see what ive done worng please could you show me my errors!!!

Here is the .cpp file:

/*
LCD4Bit v0.1 16/Oct/2006 neillzero http://abstractplain.net

What is this?
An arduino library for comms with HD44780-compatible LCD, in 4-bit mode (saves pins)

Sources:

Tested only with a DEM 16216 (maplin "N27AZ" - http://www.maplin.co.uk/Search.aspx?criteria=N27AZ)
If you use this successfully, consider feeding back to the arduino wiki with a note of which LCD it worked on.

Usage:
see the examples folder of this library distribution.

*/

#include "LCD4Bit.h"
extern "C" {
#include <stdio.h> //not needed yet
#include <string.h> //needed for strlen()
#include <inttypes.h>
#include "WConstants.h" //all things wiring / arduino
}

//command bytes for LCD
#define CMD_CLR 0x01
#define CMD_RIGHT 0x1C
#define CMD_LEFT 0x18
#define CMD_HOME 0x02

// --------- PINS -------------------------------------
//is the RW pin of the LCD under our control? If we're only ever going to write to the LCD, we can use one less microcontroller pin, and just tie the LCD pin to the necessary signal, high or low.
//this stops us sending signals to the RW pin if it isn't being used.
int USING_RW = false;

//RS, RW and Enable can be set to whatever you like
int RS = 11;
int RW = FALSE;
int Enable = 12;
//DB should be an unseparated group of pins - because of lazy coding in pushNibble()
int DB[] = {7, 8, 9, 10}; //wire these to DB4~7 on LCD.

//--------------------------------------------------------

//how many lines has the LCD? (don't change here - specify on calling constructor)
int g_num_lines = 2;

//pulse the Enable pin high (for a microsecond).
//This clocks whatever command or data is in DB4~7 into the LCD controller.
void LCD4Bit::pulseEnablePin(){
digitalWrite(Enable,LOW);
delayMicroseconds(1);
// send a pulse to enable
digitalWrite(Enable,HIGH);
delayMicroseconds(1);
digitalWrite(Enable,LOW);
delay(1); // pause 1 ms. TODO: what delay, if any, is necessary here?
}

//push a nibble of data through the the LCD's DB4~7 pins, clocking with the Enable pin.
//We don't care what RS and RW are, here.
void LCD4Bit::pushNibble(int value){
int val_nibble= value & 0x0F; //clean the value. (unnecessary)

for (int i=DB[0]; i <= DB[3]; i++) {
digitalWrite(i,val_nibble & 01);
val_nibble >>= 1;
}
pulseEnablePin();
}

//push a byte of data through the LCD's DB4~7 pins, in two steps, clocking each with the enable pin.
void LCD4Bit::pushByte(int value){
int val_lower = value & 0x0F;
int val_upper = value >> 4;
pushNibble(val_upper);
pushNibble(val_lower);
}

//stuff the library user might call---------------------------------
//constructor. num_lines must be 1 or 2, currently.
LCD4Bit::LCD4Bit (int num_lines) {
g_num_lines = num_lines;
if (g_num_lines < 1)
{
g_num_lines = 1;
}
if (g_num_lines > 4)
{
g_num_lines = 4;
}
}

void LCD4Bit::commandWriteNibble(int nibble) {
digitalWrite(RS, LOW);
if (USING_RW) { digitalWrite(RW, LOW); }
pushNibble(nibble);
}

void LCD4Bit::commandWrite(int value) {
digitalWrite(RS, LOW);
if (USING_RW) { digitalWrite(RW, LOW); }
pushByte(value);
//TODO: perhaps better to add a delay after EVERY command, here. many need a delay, apparently.
}

//print the given character at the current cursor position. overwrites, doesn't insert.
void LCD4Bit::print(int value) {
//set the RS and RW pins to show we're writing data
digitalWrite(RS, HIGH);
if (USING_RW) { digitalWrite(RW, LOW); }

//let pushByte worry about the intricacies of Enable, nibble order.
pushByte(value);
}

//print the given string to the LCD at the current cursor position. overwrites, doesn't insert.
//While I don't understand why this was named printIn (PRINT IN?) in the original LiquidCrystal library, I've preserved it here to maintain the interchangeability of the two libraries.
void LCD4Bit::printIn(char msg[]) {
uint8_t i; //fancy int. avoids compiler warning when comparing i with strlen()'s uint8_t
for (i=0;i < strlen(msg);i++){
print(msg*);*

  • }*
    }
    //send the clear screen command to the LCD
    void LCD4Bit::clear(){
  • commandWrite(CMD_CLR);*
  • delay(1);*
    }
    // initiatize lcd after a short pause
    //while there are hard-coded details here of lines, cursor and blink settings, you can override these original settings after calling .init()
    void LCD4Bit::init () {
  • pinMode(Enable,OUTPUT);*
  • pinMode(RS,OUTPUT);*
  • if (USING_RW) { pinMode(RW,OUTPUT); }*
  • pinMode(DB[0],OUTPUT);*
  • pinMode(DB[1],OUTPUT);*
  • pinMode(DB[2],OUTPUT);*
  • pinMode(DB[3],OUTPUT);*
  • delay(50);*
  • //The first 4 nibbles and timings are not in my DEM16217 SYH datasheet, but apparently are HD44780 standard...*
  • commandWriteNibble(0x03);*
  • delay(5);*
  • commandWriteNibble(0x03);*
  • delayMicroseconds(100);*
  • commandWriteNibble(0x03);*
  • delay(5);*
  • // needed by the LCDs controller*
  • //this being 2 sets up 4-bit mode.*
  • commandWriteNibble(0x02);*
  • commandWriteNibble(0x02);*
  • //todo: make configurable by the user of this library.*
  • //NFXX where*
  • //N = num lines (0=1 line or 1=2 lines).*
  • //F= format (number of dots (0=5x7 or 1=5x10)).*
  • //X=don't care*
  • int num_lines_ptn = g_num_lines - 1 << 3;*
  • int dot_format_ptn = 0x00; //5x7 dots. 0x04 is 5x10*
  • commandWriteNibble(num_lines_ptn | dot_format_ptn);*
  • delayMicroseconds(60);*
  • //The rest of the init is not specific to 4-bit mode.*
  • //NOTE: we're writing full bytes now, not nibbles.*
  • // display control:*
  • // turn display on, cursor off, no blinking*
  • commandWrite(0x0C);*
  • delayMicroseconds(60);*
  • //clear display*
  • commandWrite(0x01);*
  • delay(3);*
  • // entry mode set: 06*
  • // increment automatically, display shift, entire shift off*
  • commandWrite(0x06);*
  • delay(1);//TODO: remove unnecessary delays*
    }
    //non-core stuff --------------------------------------
    //move the cursor to the given absolute position. line numbers start at 1.
    //if this is not a 2-line LCD4Bit instance, will always position on first line.
    void LCD4Bit::cursorTo(int line_num, int x){
  • //first, put cursor home*
    commandWrite(CMD_HOME);
    if (x>19)
    {
  • x=19;*
    }
    switch (line_num)
    {
    case 1:
  • x+=0x00 ; break;*
    case 2:
  • x+= 0x40 ; break;*
    case 3:
  • x+= 0x14 ; break; // In fact, line 3 is an extension of the line 1 (beyond the 20 first characters)*
    case 4:
  • x+= 0x54 ; break; // Line 4 is an extension of line 2*
    }
    //
    commandWrite(0x80+x);
    }
    }
    //scroll whole display to left
    void LCD4Bit::leftScroll(int num_chars, int delay_time){
  • for (int i=0; i<num_chars; i++) {*
  • commandWrite(CMD_LEFT);*
  • delay(delay_time);*
  • }*
    }
    //Improvements ------------------------------------------------
    //Remove the unnecessary delays (e.g. from the end of pulseEnablePin()).
    //Allow the user to pass the pins to be used by the LCD in the constructor, and store them as member variables of the class instance.
    //-------------------------------------------------------------
    and here is the test program:
    #include <LCD4Bit.h>
    LCD4Bit lcd = LCD4Bit(4);
    void setup() {
    pinMode(13, OUTPUT); //we'll use the debug LED to output a heartbeat
    lcd.init();
    }
    *void loop() { *
    digitalWrite(13, HIGH); //light the debug LED
    lcd.clear();
    lcd.cursorTo(1,0);
    lcd.printIn("Line 1");
    lcd.cursorTo(2,0);
    lcd.printIn("Line 2");
    lcd.cursorTo(3,0);
    lcd.printIn("Line 3");
    lcd.cursorTo(4,0);
    lcd.printIn("Line 4");
    delay(1000);
    digitalWrite(13, LOW); //clear the debug LED
    }
    Any help in this would be sooo great!!!

Anyone has a valid link to Jonathan's modified LCD4bit library for 20x4 LCD? none of the original links work and not even the ones on the arduino website or playground site.

Thanks! The other ones use 2 enable pins, which is not what i have.

Thanks again, Benny

Hi,

like benedetoula i am searching for a valid link to the modified LCD4bit library.

I own a 20x2 Datavision DV-20208 and with the standard LCD4bit library i only got the first row working.

Is there a chance to get the modified library? Please post it or send it via PN.

Big thx

Go with the LiquidCrystal library. Its much better and has better overall support for all the features the Hitachi based LCDs have.

Has someone edited the new "LiquidCrystal library" to use 2 enables pins, for two chips on one LCD???

EDIT:
It has been done!! And works!
http://healthriskappraisal.org/LiquidCrystal440.zip
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1264823411/0

Hi Guys,

Big thanks to people for creating this library. I have a 20x4 LCD which is working fine with the mods mem suggested.

The only problem is that when I try and integrate the LCD functions in to another sketch I have been working on the text garbles and prints in random locations.

The sketch that I am integrating in to features a DS1307 I2C so uses the wire library. Could that effect the results?

Thanks

Thom