In this Arduino LCD Tutorial we will learn how to connect an LCD (Liquid Crystal Display) to the Arduino board. LCDs like these are very popular and broadly used in electronics projects as they are good for displaying information like sensors data from your project, and also they are very cheap.
You can watch the following video or read the written tutorial below.
It has 16 pins and the first one from left to right is the Ground pin. The second pin is the VCC which we connect the 5 volts pin on the Arduino Board. Next is the Vo pin on which we can attach a potentiometer for controlling the contrast of the display.
Next, The RS pin or register select pin is used for selecting whether we will send commands or data to the LCD. For example if the RS pin is set on low state or zero volts, then we are sending commands to the LCD like: set the cursor to a specific location, clear the display, turn off the display and so on. And when RS pin is set on High state or 5 volts we are sending data or characters to the LCD.
Next comes the R / W pin which selects the mode whether we will read or write to the LCD. Here the write mode is obvious and it is used for writing or sending commands and data to the LCD. The read mode is used by the LCD itself when executing the program which we don’t have a need to discuss about it in this tutorial.
Next is the E pin which enables the writing to the registers, or the next 8 data pins from D0 to D7. So through this pins we are sending the 8 bits data when we are writing to the registers or for example if we want to see the latter uppercase A on the display we will send 0100 0001 to the registers according to the ASCII table. The last two pins A and K, or anode and cathode are for the LED back light.
After all we don’t have to worry much about how the LCD works, as the Liquid Crystal Library takes care for almost everything. From the Arduino’s official website you can find and see the functions of the library which enable easy use of the LCD. We can use the Library in 4 or 8 bit mode. In this tutorial we will use it in 4 bit mode, or we will just use 4 of the 8 data pins.
Components needed for this Arduino LCD Tutorial
You can get these components from any of the sites below:
- 16×2 Character LCD…………………….. Amazon / Banggood / AliExpress
- Potentiometer ……………………………. Amazon / Banggood / AliExpress
- Arduino Board …………………………… Amazon / Banggood / AliExpress
- Breadboard and Jump Wires ……… Amazon / Banggood / AliExpress
Disclosure: These are affiliate links. As an Amazon Associate I earn from qualifying purchases.
Circuit Schematic
We will use just 6 digital input pins from the Arduino Board. The LCD’s registers from D4 to D7 will be connected to Arduino’s digital pins from 4 to 7. The Enable pin will be connected to pin number 2 and the RS pin will be connected to pin number 1. The R/W pin will be connected to Ground and the Vo pin will be connected to the potentiometer.
Source Codes
First thing we need to do is it insert the Liquid Crystal Library. We can do that like this: Sketch > Include Library > Liquid Crystal. Then we have to create an LC object. The parameters of this object should be the numbers of the Digital Input pins of the Arduino Board respectively to the LCD’s pins as follow: (RS, Enable, D4, D5, D6, D7). In the setup we have to initialize the interface to the LCD and specify the dimensions of the display using the begin() function.
In the loop we write our main program. Using the print() function we print on the LCD. The setCursor() function is used for setting the location at which subsequent text written to the LCD will be displayed. The blink() function is used for displaying a blinking cursor and the noBlink() function for turning off. The cursor() function is used for displaying underscore cursor and the noCursor() function for turning off. Using the clear() function we can clear the LCD screen.
Here’s the source code of the first example from the video:
/* * Arduino LCD Tutorial * * Crated by Dejan Nedelkovski, * www.HowToMechatronics.com * */ #include <LiquidCrystal.h> // includes the LiquidCrystal Library LiquidCrystal lcd(1, 2, 4, 5, 6, 7); // Creates an LC object. Parameters: (rs, enable, d4, d5, d6, d7) void setup() { lcd.begin(16,2); // Initializes the interface to the LCD screen, and specifies the dimensions (width and height) of the display } } void loop() { lcd.print("Arduino"); // Prints "Arduino" on the LCD delay(3000); // 3 seconds delay lcd.setCursor(2,1); // Sets the location at which subsequent text written to the LCD will be displayed lcd.print("LCD Tutorial"); delay(3000); lcd.clear(); // Clears the display lcd.blink(); //Displays the blinking LCD cursor delay(4000); lcd.setCursor(7,1); delay(3000); lcd.noBlink(); // Turns off the blinking LCD cursor lcd.cursor(); // Displays an underscore (line) at the position to which the next character will be written delay(4000); lcd.noCursor(); // Hides the LCD cursor lcd.clear(); // Clears the LCD screen }
It is also possible to write a custom characters to the LCD. It supports up to 8 characters of 5×8 pixels. We can specify the appearance of each character by an array of 8 bytes. In the source code below we can notice how we can specify the appearance of the character by changing the 0 into 1 which represents the 5×8 pixels. In the setup we have to create the custom character using the createChar() function. The first parameter in this function is a number between 0 and 7, or we have to reserve one of the 8 supported custom characters. The second parameter is the name of the array of bytes. We write the custom character to the display using the write() function and as a parameter we use the number of the character.
Here’s the source code of the second example for custom characters:
#include <LiquidCrystal.h> byte slash[8]= { // Array of bytes B00001, // B stands for binary formatter and the 5 numbers are the pixels B00010, B00100, B01000, B10000, B00000, B00000, B00000, }; LiquidCrystal lcd(1, 2, 4, 5, 6, 7); // Creates an LC object. Parameters: (rs, enable, d4, d5, d6, d7) void setup() { lcd.begin(16,2); // Initializes the interface to the LCD screen, and specifies the dimensions (width and height) of the display lcd.createChar(7, slash); // Create a custom character for use on the LCD. Up to eight characters of 5x8 pixels are supported } void loop() { for(int i=0;i<=15;i++) { lcd.setCursor(i,0); // Sets the location at which subsequent text written to the LCD will be displayed lcd.write(7); // Writes a character to the LCD delay(1000); // 1 second delay lcd.clear(); // Write a character to the LCD } }
Feel free to ask any question in the comments section below.
thank you so much! i have learn’t so much better with hands on and you made it perfect for me ! thanks again!!!
I’m glad to hear that. You are welcome!
I highly appreciate that your video for LCD. I like to know whether you have upload video for LCD though I2C module?. if so kindly pass me a link (URL)
Thanks. Sorry but I don’t have such a tutorial yet.
Why put code that doe’s not compile…???
The code is working properly. You might be doing something wrong. What error do you get?
Strange to use the D1 pin,
is that wanted or specific to RS LCD functionalism ?
avrdude: ser_open(): can’t open device “\\.\COM13”: The system cannot find the file specified.
There’s an error. How to fix this.
Check what’s your COM Port number.
sir, if use I2c, what the codes ?
It would be different. I don’t have that code.
can we print something permanently , I mean its displayed again on the LCD after reboot the LCD ?
and never changed again until you run the programming again ?
Not really, you can print something permanently, but sure you can make a code that would display what you want even after rebooting the LCD, for example, using the EEPROM of the Arduino which can store data when the power is off.
I made it ! finally, it is working !
But you should not connect Anode to Vcc directly, since there is a LED, so may burn it. You need a resistor of 220 Ohm, and you can increase the resistance of you want a dimmer backlight. I connected my resistor to a PMW port to control the backlight from the code.
Great, connecting the backlight control to a PMW port and a resistor is cool idea.
Have no experience with writing code but you have made it easier to understand the basics, TY Dejan!
I’m glad to hear this. Thanks.
Really appreciate your work!
why use potentiometer, can i remove potentiometer?
Yes, you can remove it, but you will need to set two resistors as a voltage dividers to get the proper voltage for getting the proper contrast of the LCD.
For those who don’t have a potentiometer, the potentiometer is optional, you can use ‘analogWrite()’ function:
void setup() {
some code here;
analogWrite(your VO pin, 50);
some code here too;
}
I GREATLY appreciate the help to be able to understand how to use the the LCD!
Hello! I know it is late but I have to ask this question, my lcd only shows blue screen I checked wires tons of times and tried to adjust potentiometer but not works. I hope you could help me
Hey, well you have already tried the recommended things when it comes to that problem, only blue screen. Very often it’s problem with the contrast, but you said you have tried with a potentiometer. Try also by making a 3.3v voltage divider using two resistors. Also the problem might be something else, maybe your LCD have a different driver on its board that might not be compatible with this example, I don’t know, maybe. Or maybe, your LCD is faulty one.