Lập trình STM32 – Kết nối LCD trực tiếp
11/11/2021, bởi Thầy TiiL trong mục: Lập trình nhúng STM32LCD là một màn hình nhiều điểm ảnh, có thể coi là một Led ma trận dạng lớn, tuy nhiên chúng ta không cần đi vào điều khiển từng Pixel hay là từng chấm nhỏ như bài led ma trận.
Ta sẽ điều khiển qua lệnh, con trỏ… để hiển thị thông tin một cách dễ dàng hơn. Có nhiều loại LCD, trong bài này ta dùng loại đơn giản 16×2.
Các chủ đề chính
Cấu tạo màn hình LCD

Chân | Ký hiệu | Mô tả | Giá trị |
1 | VSS | GND | 0V |
2 | VCC | 5V | |
3 | V0 | Độ tương phản | |
4 | RS | Lựa chọn thanh ghi | RS=0 (mức thấp) chọn thanh ghi lệnh
RS=1 (mức cao) chọn thanh ghi dữ liệu |
5 | R/W | Chọn thanh ghi đọc/viết dữ liệu | R/W=0 thanh ghi viết
R/W=1 thanh ghi đọc |
6 | E | Enable | |
7 | DB0 | Chân truyền dữ liệu | 8 bit: DB0DB7 |
8 | DB1 | ||
9 | DB2 | ||
10 | DB3 | ||
11 | DB4 | ||
12 | DB5 | ||
13 | DB6 | ||
14 | DB7 | ||
15 | A | Cực dương led nền | 0V đến 5V |
16 | K | Cực âm led nền | 0V |
Hình mô phỏng trong Proteus
Tiếp theo chúng ta học về cách kết nối, lập trình để sử dụng LCD. Trước tiên chúng ta phải gửi lệnh vào cho LCD biết nó phải làm gì. Cách gửi lệnh như sau:
Các em có thể xem một số lệnh sau đây. Những lệnh này gọi là lệnh khởi tạo LCD.
Sau khi gửi các lệnh vào LCD (qua các chân D0 – D7) để nó biết sẽ phải làm gì (bật màn hình, hiển thị hay tắt con trỏ, di chuyển con trỏ …), chúng ta sẽ phải gửi lệnh chứa các kí tự mà chúng ta muốn hiển thị. Cách gửi dữ liệu ra cũng tương tự như cách gửi lệnh, các em có thể xem trong hình sau:
Bước 1 thường là mặc định. Các bước sau tương tự như việc gửi lệnh vào LCD. Tại sao B1 lại là mặc định, vì chúng ta thường dùng LCD để hiển thị chứ không để nhận dữ liệu vào.
Ví dụ Kết nối và Lập trình STM32 với LCD
- Sơ đồ kết nối, và kết quả thực hiện
2. Full code đến hết hàm main
#include "main.h" void SystemClock_Config(void); static void MX_GPIO_Init(void); // Ham gui data/cmd ra 8 chan cua LCD void send8BitLCD(char D) { // Dem D and so hoc voi 2^i de biet bit thu i =0 hay khac ko // tim gia tri cac bit int b0,b1,b2, b3,b4, b5, b6, b7; if ((D & 1) == 0) b0=0; // 1== 2^0 else b0 =1; if ((D & 2) == 0) b1=0; // 2== 2^1 else b1 =1; if ((D & 4) == 0) b2=0; // 4== 2^2 else b2 =1; if ((D & 8) == 0) b3=0; // 8== 2^3 else b3 =1; if ((D & 16) == 0) b4=0; // 16== 2^4 else b4 =1; if ((D & 32) == 0) b5=0; // 32== 2^5 else b5 =1; if ((D & 64) == 0) b6=0; // 64== 2^6 else b6 =1; if ((D & 128) == 0) b7=0; // 128== 2^7 else b7 =1; HAL_GPIO_WritePin(GPIOD,GPIO_PIN_0, b0); HAL_GPIO_WritePin(GPIOD,GPIO_PIN_1, b1); HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2, b2); HAL_GPIO_WritePin(GPIOD,GPIO_PIN_3, b3); HAL_GPIO_WritePin(GPIOD,GPIO_PIN_4, b4); HAL_GPIO_WritePin(GPIOD,GPIO_PIN_5, b5); HAL_GPIO_WritePin(GPIOD,GPIO_PIN_6, b6); HAL_GPIO_WritePin(GPIOD,GPIO_PIN_7, b7); } // Ham gui lenh void sendCMD2LCD(char cmd) { //B1. Done //B2. Dat chan RS =0, de noi rang cmd là lenh HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET); //B3. Gui 8 bit CMD vao 8 pin send8BitLCD(cmd); //B4. Enable cho cmd-->lcd HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET); // HAL_Delay(1); } // Ham gui ky tu hien thi void sendChar2LCD(char Char) { //B1. Done //B2. Dat chan RS =1, HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET); //B3. Gui 8 bit CMD vao 8 pin send8BitLCD(Char); //B4. Enable cho cmd-->lcd HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET); // HAL_Delay(1); } void sendString2LCD(char *str) { for (int i=0; str[i] != '\0'; i++) { sendChar2LCD(str[i]); } } int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); // Xoa noi dung tren LCD sendCMD2LCD(0x01); // Bat hien thi man hinh, tat con tro sendCMD2LCD(0x0C); // Test thu chuoi Hello sendString2LCD("Hello K17 TNU"); // Xuong dong 2 sendCMD2LCD(0x38); // CHE DO 2 DONG sendCMD2LCD(0xC0); // TRO XUONG DONG 2 sendString2LCD("MAI CUONG THO"); HAL_Delay(1000); while (1) { } }
Xuất giá trị số ra LCD
Sử dụng hàm, chuyển đổi con số ra chuỗi ký tự số, rồi gọi hàm hiện chuỗi
Dưới đây là code hàm chuyển đổi
/*Function return size of string and convert signed * *integer to ascii value and store them in array of * *character with NULL at the end of the array */ int Num2String(int value,char *ptr) { int count=0,temp; if(ptr==NULL) return 0; if(value==0) { *ptr='0'; return 1; } if(value<0) { value*=(-1); *ptr++='-'; count++; } for(temp=value;temp>0;temp/=10,ptr++); *ptr='\0'; for(temp=value;temp>0;temp/=10) { *--ptr=temp%10+'0'; count++; } return count; }
Sử dụng hàm:
char str[10]; Num2String(-150,str); sendString2LCD(str);
Full video hướng dẫn
Thẻ:Lập trình nhúngBài viết liên quan
- Lập trình STM32 - Truyền thông nối tiếp bất đồng bộ UART [Lập trình nhúng STM32]
- Tài liệu Thực hành Lập trình nhúng STM32 [Kho tài liệu học lập trình]
- Nguồn cấp xung clock cho STM32 và Ngoại vi [Lập trình nhúng STM32]
- Bài 5. Điều khiển độ sáng đèn với Cảm biến ánh sáng [Tự động hóa & Robot]