Click here to Skip to main content
13,198,322 members (54,451 online)
Click here to Skip to main content
Add your own
alternative version


10 bookmarked
Posted 14 Feb 2016

HD44780 LCD Module Driver for Windows 10 IoT

, 16 Mar 2016
Rate this:
Please Sign up or sign in to vote.
Very simple experiment, a bit vintage, for driving a common alphanumeric LCD module (HD44780-based) with a Raspberry PI 2 and Windows 10 IoT

This is my first post about Windows 10 IoT and small computers (embedded) after some experiences in the past with the .NET MicroFramework (Netduino, in essence).

I must say that this Windows 10 is finally a small masterpiece, or “everything you ever asked and none never responded you”. The programming way is easy but very flexible, although still many bricks are missing (in development).

Here is a very simple experiment, a bit vintage, of driving a common alphanumeric LCD module (HD44780-based) with a Raspberry PI 2 and Windows 10 IoT.


The project isn’t anything new, but rather kinda “refresh” of another of mine where the Netduino board was used (see below). Some of you may wonder “why” I am still using such an old LCD module when several graphics are available on the market. Well, my first answer is: “why not?”. As said, this project hasn’t any specific purpose (although many of you may dig into their “miracles box” and pull out an “almost useless” LCD module). The aim is to test how hard it is to drive something that is well known.

The Hardware

All you need is very easy to find:

  • Raspberry PI2 (with Windows 10 IoT installed)
  • Any suitable HD44780 LCD display module (mine is a 4×20)
  • 74HC595 shift-register
  • 220 Ohms resistor, only if you need the backlight
  • 10kOhms trimpot (22k or 47k are fine the same)

For the sake of simplicity, I won’t detail how to set up the Raspberry, but there are many articles which describe that very well. I followed the Microsoft site and everything went fine, except for the suggested SD minimum size: I found that a 8GB won’t work. Simply consider a 16GB.



The Software

I wanted to publish the project keeping the sources simpler as possible. A similar application won’t have sense in a complex hardware (full-featured TFT displays and HDMI monitors perform way better than this module). The general guideline is: if you find it convenient to connect a LCD module to a RPI, then make it work in minutes.

Since the LCD module’s capabilities are very limited, I embraced the idea to expose the APIs as it were a kind of “Console”. Just a “write” and something more, where a background task should manage the physical transfer by itself.

The project contains two different demos:

  1. A basic one, where some strings’ content is reflected on the display;
  2. A slightly more complex demo, which gets a bunch of RSS news from the channel, and rotates the titles on the screen.

Basic Demo

class BasicDemo
    public async Task RunAsync()
        //write a static string
            "This is a basic demo",
            new Point(0, 0)

        int n = 0;
        while (true)
            //display a simple counter
                new Point(0, 1)

            //display current time and date
            var now = DateTime.Now;
                now.ToString("T") + "   ",
                new Point(0, 2)

                now.ToString("M") + "   ",
                new Point(0, 3)

            await Task.Delay(1000);


RSS Demo

class RssDemo
    public async Task RunAsync()
        //write a static string
            "Getting RSS...",
            new Point(0, 0)

        //get the latest news using a normal HTTP GET request
        var http = new HttpClient();
        var endpoint = new Uri("");

        var srss = await http.GetStringAsync(endpoint);
        var xrss = XDocument.Parse(srss);

        //extract the news items, and sort them by date-time descending
        var xnews = xrss.Root
            .OrderByDescending(_ => (DateTime)_.Element("pubDate"))

        int n = 0;
        while (true)
            * Loop the news as one per page

            //the first row is for the publication date-time
            var dt = (DateTime)xnews[n].Element("pubDate");
                new Point(0, 0)

            //the three other rows are for the title
            var title = (string)xnews[n].Element("title");
            title = title + new string(' ', 60);

            for (int row = 0; row < 3; row++)
                    title.Substring(row * 20, 20),
                    new Point(0, row + 1)

            //wait some seconds before flipping page
            n = (n + 1) % xnews.Count;
            await Task.Delay(3000);



You may wonder how well the driver performs. Well, there are two stages involved in the displaying process:

  1. The calls from the main application to the driver
  2. The physical data transfer

Any invocation by the main app always involves the cache: no matter how many calls are made, because everything is hosted in memory. For this reason, any manipulation is irrelevant in terms of performance impact. However, a fixed rate (typically 200ms) there’s a cache dump to the LCD screen, that is: the physical data transfer though the SPI.

How Long Does the Entire Screen Dump Take via SPI?

The circuit is very simple, thus there’s no way to take the transfer faster than the machine execution speed. Even adjusting the SPI clock rate, the resulting duration won’t change notably. Please bear in mind that a SPI clock rate that is too high could face signal degradation due to the wire length. I used a perfect 1 MHz value, and you can see from the below screenshot that the total transfer duration is less than 30ms.


If you are interested in a faster way to dump the data via SPI, I suggest you read the following section which requires a decent knowledge about electronics.

The Old “LCD Boost” Library

The original project was tailored for the .NET MicroFramework (Netduino) and many things were optimized for speed reasons. Moreover, the NetMF had some leaky problems mostly due to the super squeezed CLR, thus many solutions were solved as it were a low-level device.

Here are some links to the original articles of mine:


This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


About the Author

Mario Vernari
Software Developer (Senior) CET Electronics
Italy Italy
Played with transistors and ICs before being ten. First approaches to programming (PET Commodore) in the early '80.
Then AppleSoft, TurboPascal, Assembler and VisualBasic.
Currently employed at CET Electronics as lead software developer, involved in creation of industrial control systems.
Loving graphics technologies, I had some great time with SVG.
Since 2006 my primary language is C#, where I am focusing on WPF.

You may also be interested in...

Comments and Discussions

QuestionFunction of the Shift-Register 74HC595 ? Pin
Member 1052527115-Feb-16 4:03
memberMember 1052527115-Feb-16 4:03 
AnswerRe: Function of the Shift-Register 74HC595 ? Pin
Mario Vernari15-Feb-16 6:11
memberMario Vernari15-Feb-16 6:11 
GeneralRe: Function of the Shift-Register 74HC595 ? Pin
Member 1052527115-Mar-16 1:56
memberMember 1052527115-Mar-16 1:56 
GeneralRe: Function of the Shift-Register 74HC595 ? Pin
Mario Vernari16-Mar-16 21:47
memberMario Vernari16-Mar-16 21:47 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Terms of Use | Mobile
Web01 | 2.8.171020.1 | Last Updated 17 Mar 2016
Article Copyright 2016 by Mario Vernari
Everything else Copyright © CodeProject, 1999-2017
Layout: fixed | fluid