Description

100%
100%

In this tutorial we are going to interface LCD 20×4 Display with STM32 using I2C. I am using STM32F103C8 microcontroller and I2C device is PCF8574 with the slave address of 0x4E.

You can use the same code for any other LCD display Type (i.e 16×2, 16X4 etc), except the DDRAM addresses. You can google the addresses for your LCD Type.

How To

Working with these LCD displays is pretty simple. All we need to do is the following :-

  • Initialize the display
  • Write the address of the DDRAM
  • Write the character to be dispalyed

Initialization

According to the datasheet, To initialize the 20×4 LCD we need to send some sequence of commands to the display. They are as follows:-

 First  of all we need to wait for more than 40ms

HAL_Delay(50);  // wait for >40ms

 Send  the function set instruction with the command (0x30), 3 times and delay between each command varies as shown below. This entire process is than followed by another function set command (0x20)

lcd_send_cmd (0x30);
HAL_Delay(5);  // wait for >4.1ms
lcd_send_cmd (0x30);
HAL_Delay(1);  // wait for >100us
lcd_send_cmd (0x30);
HAL_Delay(10);
lcd_send_cmd (0x20);  // 4bit mode
HAL_Delay(10);

 Than  Send the function set command (0x28) to set the display in 4 bit mode (DL=0), 2 line display (N=1) and 5×8 fonts (F=0)

lcd_send_cmd (0x28); // Function set --> DL=0 (4 bit mode), N = 1 (2 line display) F = 0 (5x8 characters)
HAL_Delay(1);

 Write  to the Display On/OFF Control and turn the display off (D=0), Cursor off (C=0) and Blink OFF (B=0)

lcd_send_cmd (0x08); //Display on/off control --> D=0,C=0, B=0  ---> display off
HAL_Delay(1);

 Clear  the display by writing command

lcd_send_cmd (0x01);  // clear display
HAL_Delay(1);

 Set  the entry mode of your choice. I am setting Cursor move as increment (I/D=1) and display shift as OFF (S=0)

lcd_send_cmd (0x06); //Entry mode set --> I/D = 1 (increment cursor) & S = 0 (no shift)
HAL_Delay(1);

 Turn  the display ON (D=1) along withe choice for cursor and blinking. I am setting both to 0 (C=0, B=0)

lcd_send_cmd (0x0C); //Display on/off control --> D = 1, C and B = 0. (Cursor and blink, last two bits)

YOU CAN DOWNLOAD FULL CODE AT THE END OF THIS POST

Addresses

Addresses for the DDRAM of the LCD 20×4 is shown below.

While setting an address we need to OR (|) it with the 0x80. For eg if I want to set the cursor to 3rd row, I have to set the address as (0x80|0x40).

If you want to use a 16×4 LCD than the addresses for the DDRAM are shown below. Use the same code with just the change in address.

We will cover CGRAM and custom characters in the upcoming tutorials.

100%
100%

Result

100%
100%
Check out the VIDEO Below
100%
100%

DOWNLOAD

You can buy me a coffee sensor 🙂

Or just Download the code below

100%
100%

3
Leave a Reply

avatar
2 Comment threads
1 Thread replies
1 Followers
 
Most reacted comment
Hottest comment thread
3 Comment authors
adminCrisDen Recent comment authors
  Subscribe  
newest oldest most voted
Notify of
Den
Guest
Den

You have library i2c-lcd.h i2c-lcd.c ?????

Cris
Guest
Cris

Hi nice post!! do you have a command to turn off the lcd´s light, like a standby mode.

Menu