LCD 20X4 using I2C with STM32
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 40msHAL_Delay(50); // wait for >40ms
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);
lcd_send_cmd (0x28); // Function set --> DL=0 (4 bit mode), N = 1 (2 line display) F = 0 (5x8 characters) HAL_Delay(1);
lcd_send_cmd (0x08); //Display on/off control --> D=0,C=0, B=0 ---> display off HAL_Delay(1);
lcd_send_cmd (0x01); // clear display HAL_Delay(1);
lcd_send_cmd (0x06); //Entry mode set --> I/D = 1 (increment cursor) & S = 0 (no shift) HAL_Delay(1);
lcd_send_cmd (0x0C); //Display on/off control --> D = 1, C and B = 0. (Cursor and blink, last two bits)
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.
Result
100%
Recent Posts
- Interface WS2812 with STM32 April 16, 2021
- PWM with DMA in STM32 April 8, 2021
- Control Stepper motor using Rotary Angle Sensor March 21, 2021
- External Interrupt using Registers March 17, 2021
- STM32F103 Clock Setup using Registers March 3, 2021
- STM32 I2C Configuration using Registers February 26, 2021