4 LCD displays on 1 Arduino

I’m planning an Arduino based project where I would like to use two of the 16×2 character based LCD displays, but at the same time, don’t want to use all the I/O pins, I need some for data input also.

Therefor, I decided to do a test, and see if it’s possible for multiple displays to share some of the pins. The displays have an enable pin, so in theory it should be possible, and after a few tests, I can confirm that it works very well. I’m using the LiquidCrystal library that comes with Arduino 0018. That library is object oriented, and you set each pin for the display in the constructor, making it very easy to set separate pins for the enable pin for each display, and use a bus for the 4 data lines and RS. I’m not reading from the displays, to I simply tied R/W to GND, indicating write only.

This setup uses a total of 5 shared pins on the Arduino (Data and RS), and then one pin (Enable) for each display.

Below is my modified version of the HelloWorld example from the LiquidCrystal library, that initializes 4 displays and outputs individual content to each display.

// include the library code:
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd1(12, 5, 7, 8, 9, 10);
LiquidCrystal lcd2(12, 4, 7, 8, 9, 10);
LiquidCrystal lcd3(12, 3, 7, 8, 9, 10);
LiquidCrystal lcd4(12, 2, 7, 8, 9, 10);
void setup() {
  // set up the LCD's number of rows and columns: 
  lcd1.begin(16, 2);
  lcd2.begin(16, 2);
  lcd3.begin(16, 2);
  lcd4.begin(16, 2);
  // Print a message to the LCD.
void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd1.setCursor(0, 1);
  lcd2.setCursor(0, 1);
  lcd3.setCursor(0, 1);
  lcd4.setCursor(0, 1);
 // print the number of seconds since reset:

My test setup is all powered via USB, and the contrast is controlled using a single trim pot, feeding all the displays with the same voltage for the contrast pin (V0).

I’m using pin 7, 8, 9 and 10 on the Arduino for the data lines, pin 12 for RS and pin 2, 3, 4 and 5 for the enable signal for display 1, 2, 3 and 4 respectively, but that’s easy to change if you use some of them for other tasks.


I have made a PDF file with the connection diagram for the breadboard setup. I have tried to draw the wires so that they can be traced, but if something is unclear, feel free to ask and I’ll do my best to clarify.

33 thoughts on “4 LCD displays on 1 Arduino”

  1. Francisco Javier Torres Ponce says:

    Thanks for this article. I used it to improve my little lap & time slot counter joining an additional display. Now it has one display per lane (it has two).
    You can see the old one in this video:

    The new one is almost ready.

  2. Hi Francisco,

    That looks great!

    I’m glad that you could use my little “proof of concept” setup documentation for your project.

    If you make a video of the next version, feel free to post a comment with a link, I’d love to see that!


  3. Winston Pike says:

    thanx for the R&D on the displays. I’m sure this will help a lot of people who want to display more data. Other than having to use multiple serial LCDs; this is just as good.
    especially if you have a few parallel LCDs laying around.

  4. john wrigley says:

    thank you for the “LiquidCrystal” multiple display sketch example!! I felt for sure there was a simple way to do this and you found it! Interesting that the official arduino reference site did not have this simple suggestion…but, oh well…

  5. Naadir says:

    Could you please do a post on hacking a natural display calculator 31-dot × 96-dot LCD screen with an arduino, still keep it looking like a normal calculator

  6. Gustavo says:

    Hi there,

    I need to be very efficient using pins for a project I’m working on (I must admit that I’m kind of a newbie). I love what you did, but I had a couple of questions:

    1- is it possible that you share how you did the connections (schematics, perhaps)?

    2- I have recently read about using an MCP23017 I2C chip to master 1 LCD on 2 Pins, I was wondering in the need for 4 LCDs, if it was possible to be more efficient than your current arrangement?

    Thanks in advance for your thoughts.

  7. Hi Gustavo,

    If you really need to save pins, one option is to unload the LCD control to a separate chip, eg. another avr… there is even a sketch in the Arduino environment that makes a serially controlled LCD. That sketch could probably be modified a little to be able to control multiple displays and only require a single I/O pin from the main controller to run some UART commands (could probably be soft serial if the hardware serial is occupied).

    Using shift registers or I/O expanders is probably also possible, but I haven’t tried it myself.

    I hope it helps,


  8. Hi Naadir,

    I guess you are talking about the Casio fx350es or something similar, right? Even though it could be fun, I can think of a lot of other projects that I would rather spend time on. Calculators are often custom silicon with all features put together in one “blob” and difficult to interface with. But I do have some graphics display modules that I will probably use in some projects in the future.

  9. Ben Porter says:

    Hi Thomas,

    I was wondering if you had tried to connect the LCD displays together within the code so that, for example, you could have a message that scrolled across all 4 displays?

    I say this because I am currently working on a project using an array of the Nokia 5110 LCD screens and it would be extremely useful if you could give an insight into how you might go about having an array of LCD screens physically but coding them as one large screen.



  10. Hi Ben,

    That is an interesting idea, but not something I have tried, I have treated each display by themselves.

    I don’t think the standard library in Arduino would be able to do that, but a few hacks might get close. I would probably look in the direction of letting all displays “see” the complete picture, and then give each a “viewing window” to display. This way, you can also decide to have a little spacing between the viewing windows, since there will be a bit of distance in the real world. Scrolling or circles will look weird if they jump from one display to the next.

    If it’s just a uniform scrolling, you might be able to just start each display with a certain time delay, and the same “animation” and you will end up with something that looks like a continued motion, but it’s a hack and not efficient coding ;-)

    I hope this is useful for you project.


  11. Amir says:

    Thomas, this is exactly what I was looking for. I can’t believe it possible. I am so happy to see you we’re able to do it. Since I am a complete newb in arduino, is there any chance you can post some schematics of how to connect all this?
    In my project I will connect the 4 lcd and report (and continuously update) status of 4 different items. Thanks again.

  12. Hi Amir,

    I’m happy that you like my little setup. I have made a PDF file with all the wires drawn up, so that is’t a bit easier to see where each wire goes. Hope it helps, otherwise, please let me know what’s making trouble and I’ll do my best to help.



  13. Amir says:

    Thomas, fantastic. I was able to duplicate this.
    Thank you very much!
    Is there an easy way to reference the different LCDs using 1 object?
    I mean to have something like this:

    if intVar = 1 then reference lcd1 as lcd2write
    elseif intVar = 2 then reference lcd2 as lcd2write
    elseif intVar = 3 then reference lcd3 as lcd2write
    elseif intVar = 4 then reference lcd4 as lcd2write

    then I can have code
    ld2write.clear() which will clear the display based on the value of intVar.

    I know it can be done, but have no idea how to do it in arduino code.

  14. Hi Amir,

    I would look into having the different LiquidCrystal objects in an array like this:

    LiquidCrystal lcds[4] = {LiquidCrystal(12, 5, 7, 8, 9, 10),
    LiquidCrystal(12, 4, 7, 8, 9, 10),
    LiquidCrystal(12, 3, 7, 8, 9, 10),
    LiquidCrystal(12, 2, 7, 8, 9, 10)};

    and then use intVar to simply select the object you want to work with:


    and skip the if/else altogether.

    I haven’t tried this code on an Arduino, but it seems to compile OK.

    Let me know how it goes!


  15. Angel says:

    The schematics were wrong in my case.

    11 (Data 4)
    12 (Data 5)
    13 (Data 6)
    14 (Data 7)
    15 (LED +5V)
    16 (LED GND)
    so the 4 data wires had to move one position to the left

    But I’m a n00b and have a 20×4 display. Don’t know if one of these facts made the difference ;)

    Great tut… I needed exactly that for connecting 3 LCDs to my flightsim homecockpit.

  16. Hi Angel,

    Thanks for letting me know, you are right, the two left most displays have the data wires connected to the wrong pins, I’ll try to get the drawing corrected and upload a new one.

    But I’m glad that you liked it!


  17. Jim says:

    Hello there,

    could you tell me what type/model of LCD’s you are using?



  18. Hi Jim,

    The displays are the standard 16×2 character displays based on the Hitachi HD44780 (or a compatible) chipset. The specific ones I’m using is from defective battery chargers, where I have scavenged them, but similar displays are used in all sorts of devices.


  19. Benjamin Vis says:

    Dear Thomas:
    Great project to put more LCDs on one Arduino !
    Hereunder my source to connect two LCDs to one Arduino.
    Unfortunately only lcd1 works OK.
    lcd2 (here blocked) gives either strange characters or nothing at all.
    The Enable pin was connected to resp. pins 6, 9, 10 on the Arduino, which work OK for lcd1.
    What did I wrong ?

    /* Vis_1xLCD

    The circuit:
    * 10k pot; ends to +5V and GND; wiper to LCD AO
    * LCD-pin 4 6 11 12 13 14 5
    * LCD RS E DB4 DB5 DB6 DB7 R/W //for lcd1
    * Ardu D12 D11 D5 D4 D3 D2 GND

    LiquidCrystal lcd1(12, 11, 5, 4, 3, 2);
    //LiquidCrystal lcd2(12, 6, 5, 4, 3, 2);
    float voltage;
    int mA = 257;

    void setup(){
    lcd1.begin(16, 2);
    // lcd2.begin(16, 2);

    lcd1.print(“Volt mA”);
    // lcd2.print(“Display TWO”);
    void loop() {
    voltage = 3.14; //if no pot. <===========================
    lcd1.setCursor(0, 1);
    lcd1.print(" ");

  20. Hi Benjamin,

    Your code looks correct, only thing I notice is the #include line that’s missing the library, but that might be the comment system stripping that off.

    I would try to swap the two displays (if you haven’t done it already) to make sure both displays work correctly and in the same way.

    Second, if you have confirmed that both displays are functioning correctly, I would try to comment out lcd1, to see if the second display can operate by itself.

    Remember that both displays should be connected with power, contrast, RS, R/W and data in the same way, only EN should be on two different pins on the Arduino.

    Unfortunately, I have made an error in the PDF that I link to with the connection diagram, so the two left most displays have the data connections shifted one pin, which is wrong, they should be connected as the two right most displays in the PDF.

    Hope this helps, if not, please post a link to a photo of your setup or similar, if you want me to check out your connections.


  21. Benjamin Vis says:

    Dear Thomas:
    Thanks for your suggestions.
    Indeed I had “ #include ” in my code, but apparently, as you said, the library was deleted during the copying process, Probably because of the “”signs.
    Sorry if I disturbed you, but it was only after a few hours that I got it to work, probably through the mass on the breadboard.
    Now it is working fine and I am happy.
    During all the massing around I found that the potmeter for the contrast may be very useful. Until now I just put LCD-pin 3 to GND, but especially for an old LCD without backlight it regulates fine.
    So the more problems you have the more you keep learning.

    Thanks again,

  22. I’m glad that you got it to work, and you are always welcome to ask questions or comment.

    If you have a link to a description of your project, feel fee to post it!


  23. stephane says:

    bonjour Thomas,

    j’ai actuellement 2 afficheur I2c oled 16×02 (op162i)
    et carte Arduino uno R3

    est-il possible de brancher 2 afficheur I2c oled 16×02 ?

    actuellemnt j’ai brancher 1 afficheur sur l’Arduino par 4 fils (gnd,5v sur Power)et (sda->A4 ,scl->A5 sur Analog in) tous marche bien!
    ma librairie est :sample_code

    voici un extrait

    // — WIDE.HK—//
    // — Revised Date : 06/30/2013
    // — I2C Arduino – Arduino UNO Demo —//
    // — SSD131x PMOLED Controller —//
    // — SCL, SDA, GND, VCC(3.3v -5v) —//

    #include // *** I2C Mode
    #define OLED_Address 0x3c
    #define OLED_Command_Mode 0x80
    #define OLED_Data_Mode 0x40

    void setup()

    void loop()

    // *** I2C initial *** //
    sendCommand(0x2A); // **** Set “RE”=1 00101010B

    sendCommand(0x08); // **** Set Sleep Mode On
    sendCommand(0x2A); // **** Set “RE”=1 00101010B
    sendCommand(0x79); // **** Set “SD”=1 01111001B

    sendCommand(0x78); // **** Set “SD”=0

    sendCommand(0x08); // **** Set 5-dot, 3 or 4 line(0x09), 1 or 2 line(0x08)

    sendCommand(0x06); // **** Set Com31–>Com0 Seg0–>Seg99

    // **** Set OLED Characterization *** //
    sendCommand(0x2A); // **** Set “RE”=1
    sendCommand(0x79); // **** Set “SD”=1

    // **** CGROM/CGRAM Management *** //
    sendCommand(0x72); // **** Set ROM
    sendCommand(0x00); // **** Set ROM A and 8 CGRAM

    sendCommand(0xDA); // **** Set Seg Pins HW Config

    sendCommand(0x81); // **** Set Contrast

    sendCommand(0xDB); // **** Set VCOM deselect level
    sendCommand(0x30); // **** VCC x 0.83

    sendCommand(0xDC); // **** Set gpio – turn EN for 15V generator on.

    sendCommand(0x78); // **** Exiting Set OLED Characterization
    //sendCommand(0x05); // **** Set Entry Mode
    sendCommand(0x06); // **** Set Entry Mode
    sendCommand(0x28); // **** Set “IS”=0 , “RE” =0 //28
    sendCommand(0x80); // **** Set DDRAM Address to 0x80 (line 1 start)

    sendCommand(0x0C); // **** Turn on Display

    // ********************************************************************//
    // **** Show Data Value *** //

    sendCommand(0xC0); // **** New Line
    //sendCommand(0x01); // **** Clear display

    // **** Show Data Value *** //
    // ********************************************************************//


    void sendData(unsigned char data)
    Wire.beginTransmission(OLED_Address); // **** Start I2C
    Wire.write(OLED_Data_Mode); // **** Set OLED Data mode
    Wire.endTransmission(); // **** End I2C

    void sendCommand(unsigned char command)
    Wire.beginTransmission(OLED_Address); // **** Start I2C
    Wire.write(OLED_Command_Mode); // **** Set OLED Command mode
    Wire.endTransmission(); // **** End I2C

    void send_string(const char *String)
    unsigned char i=0;
    sendData(String[i]); // *** Show String to OLED

    comment je doit modifie ma librairie pour faire marcher 2 afficheur oled 16×02 ?

    cordialement et merci

  24. ha says:

    Your code run Ok with my hardware -Mega2560, can I use it with all of MEga 2560’s pin? just change the Enable pin, all LCD’s pin share the same, it means that can I use one Mega 2560 with 40 LCD with these connection pin schematics?

  25. Yes, the code should work with the different versions of Arduinos, and also other AVR chips, and having a lot of displays should be possible, but at some point you will of course end up with a lower update frequency.

    If you do a setup with 40 displays, please post a link to a photo or video, I’d love to see that.


  26. Sujit Joshi says:

    I am pretty new to the arduino project. I needed to use 4 lcds in a project, and this example was of great help. Thank you. Now that the project is working fine, I am intrigued as to why the LCDs display different data, even though you have connected the data connections of all four LCDs to the same pins. I understand that the enable pins of each lcd has been connected to different pins, and obviously that is the reason things work out the way they do. But why just because of the enable pin difference is my question. Is the enable pin of the lcds like an address, which is used to assign ‘names’ like lcd1, lcd2 and so on?

  27. Hi Sujit,

    I’m very happy that you could use this project. The reason it works is that the displays ignores the levels on the data pins when the enable pin isn’t active. It’s sort of the same principle that is used in all bus systems, but the addressing part is somewhat simplified (just one pin directly from the controller to the devices). If you had to save pins on the controller or if you wanted more displays than you have pins on your controller, it would be possible to use an I/O expander or similar, but those require changes to the LCD library too, so not good for a beginner.

    I hope it helps a bit more.


  28. Sujit Joshi says:

    Hi Thomas
    Thank you for you reply.
    So what happens is the enable pin is activated only when we try printing the code on a specific lcd?
    like for example, if the code is lcd2.print(“jajaja”); , then the enable pin of lcd2 becomes high, and the data, which theoretically was sent to all data pins of all the lcds is ‘accepted’ only on lcd2?

  29. Hi Sujit,

    Yes, though I cant remember if the enable pin is active high or active low.


  30. erikblade says:

    i know that topic is a bit old but i have a doubt about the limits of that architecture.
    you have probed with 4 lcd at the same bus.¿there is any kind of limitation in the number of lcd can connect?
    it´s posible connect 10 lcd at the same bus? there will be any problem with the mA in arduino outputs?
    thanks for your time

  31. Hi Erik,

    You should be able to use more that 4 displays, and I don’t think it’s gonna be a problem with 10 at all. The displays are not powered via the data lines, so the current draw isn’t via those connections to the microcontroller and it’s a standard bus design, that is made for multiple devices. You limitations will more likely be that you don’t have enough I/O for the enables lines, since you need one for each display. If you want to stay with a regular Arduino and want a lot of displays, you could look into something like an I/O expander for the enable pins, but then you will probably need to change the library a little bit.

    Another thing is update speed. The architecture I’m using in this article only allows for one display to be updated at any given moment. If what you want to show on the screens does not update too often, it shouldn’t be a problem.

    Hope it helps.


  32. erikblade says:

    hi thomas
    i´ll have no problem with i/o. i´ll use an arduino mega and i´ll have i/o enought for them. the update it´s not a problem because the system is for a heating control. each display shows the temperature of a different room. my doubt was suported because i´ve read that bus data lines have a current sink but i was no been able to find what is the value of that current sink.
    but don´t worry i´ve evaluated the i/o i have free and if it´s necesary i can use two buses. each bus for 5 lcd.

    thanks for you response

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>