LCD1602 được sử dụng rất nhiều trong lập trình. Tuy rằng nó ít được sử dụng trong các sản phẩm thương mại, thế nhưng để làm quen với LCD thì LCD1602 rất phù hợp.
Trong bài này chúng ta sẽ học cách sử dụng STM32 điều khiển LCD1602 ở chế độ 8bit và 4bit.
Bài viết nằm trong Serie Lập trình STM32 từ A tới Z
Tổng quan về LCD1602
LCD là gì?
LCD (Liquid Crystal Display) là màn hình tinh thể lỏng. Nó gồm một lớp tinh thể lỏng nằm giữa 2 tấm kính phân cực. Khi không có điện áp, các tinh thể xếp xoắn và cho ánh sáng đi qua. Khi có điện áp đặt vào một điểm, các tinh thể ở đó xoay thẳng hàng lại và chặn ánh sáng, điểm đó trở thành màu tối. Bản thân tinh thể lỏng không phát sáng, nên LCD cần đèn nền (Back Light) phía sau hoặc ánh sáng phản xạ từ bên ngoài.
Với màn hình màu (TFT), mỗi điểm ảnh gồm 3 điểm con đỏ, xanh lá, xanh dương, mỗi điểm được điều khiển bởi 1 transistor nhỏ. Còn LCD1602 là loại LCD kí tự đơn sắc, đơn giản hơn nhiều: mỗi kí tự là 1 ô điểm 5×8 chỉ có 2 trạng thái sáng/tối.
Các màn hình LCD thời kỳ đầu tiêu thụ nhiều điện năng, độ tương phản thấp, cho đến khi các nhà khoa học người Anh tìm ra “Biphenyl” – vật liệu chính của tinh thể lỏng, thì LCD mới thực sự phổ biến. LCD xuất hiện đầu tiên trong các máy tính cầm tay, trò chơi điện tử cầm tay, đồng hồ điện tử,…
Theo Wikipedia
LCD1602 overview
- Điện áp hoạt động là 5V.
- Kích thước: 80 x 36 x 12.5 mm
- Chữ đen, nền xanh lá
- Khoảng cách giữa hai chân kết nối là 0.1 inch, tiện dụng khi cắm trên Breadboard.
- Tên các chân được ghi ở mặt sau của màn hình LCD, hỗ trợ việc kết nối, đi dây.
- Có đèn LED nền, có thể dùng biến trở hoặc PWM điều chỉnh độ sáng để tiết kiệm điện năng.
- Có thể được điều khiển chỉ với 6 dây tín hiệu (chế độ 4bit: RS, EN, D4 – D7)

Sơ đồ chân – Pin Out
- VSS: GND – cực âm
- VDD: VCC – cực dương (5V)
- Contrast Voltage (V0): điều chỉnh độ tương phản của chữ trên màn hình
- Register Select (RS): chọn thanh ghi, RS = 0 là gửi lệnh (command), RS = 1 là gửi dữ liệu (kí tự cần hiển thị)
- Read/Write (RW): RW = 0 là ghi vào LCD, RW = 1 là đọc từ LCD
- Enable (EN): chân cho phép, tạo xung để LCD chốt lệnh/dữ liệu
- D0 – D7: 8 chân dữ liệu. Khi ghi, MCU đặt mức HIGH/LOW lên các chân này để gửi 1 byte cho LCD; khi đọc, LCD sẽ xuất dữ liệu ra các chân này để MCU đọc
- Backlight (Backlight Anode (+) và Backlight Cathode (-)): cấp nguồn cho đèn nền màn hình LCD.
Cách điều khiển LCD1602
Cấu tạo và cách hoạt động của LCD1602
Tham khảo datasheet: https://cdn-shop.adafruit.com/datasheets/TC1602A-01T.pdf
Màn hình LCD1602 cấu tạo từ 3 phần:
- Chip driver (thường là HD44780 hoặc tương đương): điều khiển LCD, giao tiếp với vi điều khiển
- LCD Panel: hiển thị ra bên ngoài
- Back Light: đèn nền LCD

DISPLAY DATA RAM (DD RAM): bộ nhớ dữ liệu hiển thị
Điều khiển LCD1602 chính là thay đổi giá trị của DD RAM, mỗi ô trên DD RAM tương ứng với một vị trí trên màn hình.
LCD1602 có 2 dòng:
- Line 1: địa chỉ DD RAM từ 0x00 tới 0x0F, tương ứng lệnh Set DDRAM Address từ 0x80 tới 0x8F
- Line 2: địa chỉ DD RAM từ 0x40 tới 0x4F, tương ứng lệnh Set DDRAM Address từ 0xC0 tới 0xCF
Ví dụ: nếu bạn muốn hiển thị ở ô đầu tiên của Line 1, chúng ta gửi lệnh 0x80 để trỏ tới ô đó rồi ghi mã kí tự vào. Mã kí tự này sẽ được tra trong bảng mã của CG ROM, từ đó hiển thị ra đúng hình dạng kí tự được lưu trong đó.
Lệnh để nhảy giữa các ô nhớ là Set Cursor (đặt con trỏ). Bạn cứ hình dung DD RAM giống như 2 dãy ghế trong rạp chiếu phim, mỗi ghế có 1 số ghế (địa chỉ), muốn đặt người (kí tự) vào ghế nào thì gọi đúng số ghế đó.
Character Generator ROM (CG ROM): bộ nhớ kí tự chỉ đọc
Đây là bộ nhớ được ghi sẵn của LCD, chứa hình dạng các kí tự mà LCD hỗ trợ. LCD1602 hỗ trợ 2 kiểu font kí tự là 5×8 và 5×10 điểm.
Character Generator RAM (CG RAM): bộ nhớ kí tự có thể lập trình
Đây là bộ nhớ để người sử dụng có thể tự tạo ra các kí tự riêng trên LCD của mình (tối đa 8 kí tự 5×8).

Cách đọc và ghi vào LCD1602
Quy trình ghi vào LCD1602 như sau:
- Chân RS kéo xuống 0 nếu gửi lệnh (Command) điều khiển LCD, kéo lên 1 nếu gửi dữ liệu (ghi vào DD RAM)
- Chân R/W: kéo xuống 0 để ghi dữ liệu
- Các chân D0 – D7: khi ghi dữ liệu, các chân D0 – D7 của LCD ở chế độ Input, chân MCU kết nối vào ở chế độ Output
- Chân EN được kéo lên 1 rồi nhả về 0, LCD chốt dữ liệu ở sườn xuống của xung EN
Khi lập trình chúng ta sẽ dựa vào bảng Timing để delay thời gian cho phù hợp.


Trong STM32 chúng ta sẽ lập trình như sau:
Lưu ý: Trong thư viện này mình chỉ sử dụng chế độ Write, vậy nên chân R/W phải nối cứng xuống GND. LCD1602 chạy 5V, nếu để R/W lên 1 (chế độ đọc), LCD sẽ xuất mức 5V ra các chân D0 – D7 và có thể làm hỏng các chân STM32 không chịu được 5V. Ở chiều ghi, mức 3.3V từ STM32 vẫn đủ để LCD nhận là mức 1.

Quy trình đọc LCD1602:
- Chân RS kéo xuống 0 nếu đọc cờ bận (Busy Flag) và địa chỉ, kéo lên 1 nếu đọc dữ liệu từ DD RAM/CG RAM
- Chân R/W: kéo lên 1 để đọc dữ liệu
- Các chân D0 – D7: khi đọc dữ liệu, các chân D0 – D7 của LCD ở chế độ Output, chân MCU kết nối vào ở chế độ Input
- Chân EN được kéo lên 1, LCD xuất dữ liệu ra D0 – D7, MCU đọc dữ liệu trong lúc EN = 1 rồi nhả EN về 0
Khi lập trình chúng ta sẽ dựa vào bảng Timing để delay thời gian cho phù hợp.


Các lệnh trong LCD1602
Để ghi các lệnh vào LCD1602 chúng ta sử dụng bảng lệnh sau:
Bit 1 cao nhất trong byte lệnh cho biết đó là lệnh gì, các bit thấp hơn bit đó là tham số của lệnh.
Ví dụ: khi gửi lệnh Entry Mode Set, chúng ta dùng giá trị gốc 0x04, sau đó OR với 2 bit tham số I/D (bit 1) và S (bit 0), đồng thời đặt chân RS và R/W về 0.

Quy trình khởi tạo LCD1602
Để khởi tạo cho LCD chế độ 8bit, chúng ta sẽ lập trình theo trình tự sau:

Để khởi tạo LCD1602 chế độ 4bit chúng ta sẽ lập trình theo trình tự sau:
Với chế độ 4bit, để gửi 1 byte (8bit) chúng ta sẽ gửi 2 lần 4bit (4 bit cao trước, 4 bit thấp sau) qua các chân D4 – D7.
Cách kết nối phần cứng STM32 với LCD1602
Để điều chỉnh độ tương phản của LCD, chúng ta bắt buộc phải nối chân V0 vào biến trở (hoặc cầu phân áp bằng điện trở).

Lưu ý: Nạp code xong mà màn hình không thấy chữ thì đừng vội sửa code, hãy vặn biến trở ở chân V0 trước. Nếu dòng 1 hiện 16 ô vuông đen còn dòng 2 trống, tức là LCD có nguồn nhưng chưa được khởi tạo, khi đó mới kiểm tra lại dây nối và các chân trong code.
Lập trình STM32 điều khiển LCD1602 chế độ 8bit
Khởi tạo LCD1602 chế độ 8bit trên CubeMX
Trong STM32 CubeMX khởi tạo với MCU STM32F103C8T6, trong SYS chọn Debug – Serial Wire.

Trong GPIO khởi tạo các chân chế độ Output, đặt tên tương ứng với các chân trên LCD1602.

Trong Project Manager chọn Toolchain/IDE là MDK-ARM V5.

Lập trình STM32 LCD1602 chế độ 8bit
Sau khi Gen code chúng ta sẽ mở bằng Keil C. Để download thư viện các bạn hãy đọc bài viết: Hướng dẫn download thư viện STM32
Add file CLCD.c vào Project bằng cách nhấn chuột phải -> Add Existing Files

Thêm đường dẫn tới thư viện mà bạn tải về: nhấn vào biểu tượng Options for Target -> C/C++ -> Include Paths, sau đó trỏ tới nơi lưu file CLCD.h

Include CLCD.h vào main.c

Khởi tạo một LCD tên là LCD1.
Các bạn có thể khởi tạo nhiều LCD trong project của mình.
Khởi tạo 1 buffer để hiển thị lên LCD và biến Count.

Truyền vào các tham số setup như: &LCD1 (địa chỉ của biến LCD1), số cột và hàng 16×2, các chân kết nối với LCD.

Trong while:
Đầu tiên nhảy con trỏ tới nơi cần ghi, sau đó ghi chuỗi vào ô 0,0.
Lệnh sprintf sẽ ghi giá trị của Count vào chuỗi, sau đó ghi chuỗi đó ra LCD.
Tiếp theo tăng giá trị Count và delay 1s.

Kết quả
Lập trình STM32 LCD1602 chế độ 4bit
Với chế độ 4bit, chúng ta chỉ cần khởi tạo lại LCD với chế độ 4bit (chỉ nối D4 – D7, bỏ trống D0 – D3).
Sau đó ghi LCD như bình thường.

Kết
Đến đây bạn đã có thể điều khiển LCD1602, sử dụng LCD1602 để hiển thị kết quả đo đạc từ cảm biến hay các linh kiện khác rất đơn giản. Hi vọng bạn đã hiểu rõ cách điều khiển LCD.
Nếu thấy bài viết này hay, hãy chia sẻ tới những người bạn học hay đồng nghiệp của mình. Và nếu thắc mắc điều gì, hãy để lại bình luận nhé.
Và cùng gia nhập những người nghiện lập trình tại đây nhé: Hội anh em nghiện lập trình


Em có làm theo a hướng dẫn cả 2 trường hợp thì lcd của em chỉ sáng nền mà không xuất chữ , em sử dụng stm32f4 black board . Em đã đổi thư viện về f4. Có những nguyên do nào không sáng vậy anh .
Em xem con biến trở đã vặn chưa, chỉnh độ tương phản ấy
a có thế nào chỉ cho em vẽ lưu đồ giải thuật cho ct stm32 điều khiển lcd 16.2 hiển thị tên với mssv đc k ạ
Thầy Khuê Nguyễn ơi
HAL_GPIO_WritePin(LCD->D4_PORT, LCD->D4_PIN, Data_H&0x01?GPIO_PIN_SET:GPIO_PIN_RESET);
Trong câu lệnh trên:Data_H&0x01?GPIO_PIN_SET:GPIO_PIN_RESET
Đoạn lệnh này Thầy có thể giải thích chi tiết được không ạ?
Đọc chưa hiểu sao Data_H&0x01?GPIO_PIN_SET:GPIO_PIN_RESET
có nên học cách viết thư viện luôn k ạ hay chỉ nên học cách dùng