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ề LCD thì sử dụng LCD1602 rất phù hợp.
Trong bài này chúng ta sẽ học các 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 là một loại vật chất phản xạ ánh sáng khi điện thế thay đổi. Nó hoạt động dựa trên nguyên tắc ánh sáng nền (Back Light). Nó bao gồm một lớp chất lỏng nằm giữa 2 lớp kính phân cực ánh sáng. Bình thường, khi không có điện áp, các tinh thể này được xếp thẳng hàng giữa hai lớp cho phép ánh sáng truyền qua theo hình xoắn ốc. Hai bộ lọc phân cực, 2 bộ lọc màu và 2 bộ cân chỉnh sẽ xác định cường độ ánh sáng đi qua và màu nào được tạo ra trên một pixel.
Khi có điện áp cấp vào, lớp canh chỉnh sẽ tạo một vùng điện tích, canh chỉnh lại các tinh thể lỏng đó. Nó không cho phép ánh sáng đi qua để hiện thị lên hình ảnh tại vị trí điểm ảnh đó. Các điểm ảnh trong màn hình LCD là một transistor cực nhỏ ở một trong 2 chế độ: cho phép ánh sáng đi qua hoặc không.
Điểm ảnh bao gồm 3 yếu tố màu: đỏ, xanh lá, xanh dương. Các màn hình LCD trước đây thường tiêu thụ điện năng nhiều, độ 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 Wikimedia
LCD1602 overview
- Điện áp hoạt động là 5 V.
- 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 kết nối với 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 điện.
- Có đèn led nền, có thể dùng biến trở hoặc PWM điều chình độ sáng để sử dụng ít điện năng hơn.
- Có thể được điều khiển với 6 dây tín hiệu
Sơ đồ chân – Pin Out
- VSS: tương đương với GND – cực âm
- VDD: tương đương với VCC – cực dương (5V)
- Constrast Voltage (Vo): điều khiển độ sáng màn hình
- Register Select (RS): điều khiển địa chỉ nào sẽ được ghi dữ liệu
- Read/Write (RW): Bạn sẽ đọc (read mode) hay ghi (write mode) dữ liệu? Nó sẽ phụ thuộc vào bạn gửi giá trị gì vào.
- Enable pin: Cho phép ghi vào LCD
- D0 – D7: 8 chân dư liệu, mỗi chân sẽ có giá trị HIGH hoặc LOW nếu bạn đang ở chế độ đọc (read mode) và nó sẽ nhận giá trị HIGH hoặc LOW nếu đang ở chế độ ghi (write mode)
- Backlight (Backlight Anode (+) và Backlight Cathode (-)): Tắt bật đè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: Điều khiển LCD, giao tiếp với vi điều khiển theo interface LCD
- LCD Panel: Hiển thị ra bên ngoài
- Back Light: Đèn nền LCD
DISPLAY DATA RAM (DD RAM): Bộ nhớ hiển thị dữ liệu
Đ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í của màn hình.
Với LCD1602 chúng có 2 line
- Line 1: từ 0x80 tới 0x8F
- Line 2: từ 0xC0 tới 0xCF
Ví dụ: Nếu bạn muốn hiển thị ở Line 1 ô đầu tiên, Chúng ta sẽ thay đổi giá trị của ô nhớ địa chỉ 0x80. Giá trị được ghi sẽ so sánh với bảng mã trong CG ROM, từ đó hiển thị ra đúng kí tự được lưu trên đó.
Lệnh để nhảy giữa các ô nhớ là Set cursor ( con trỏ)
Character Generator ROM (CG ROM): Bộ nhớ kí tự chỉ đọc
Đây là bộ nhớ đươc ghi sẵn của LCD, trong đó chứa các kí tự mà lcd hỗ trợ. Có hai mẫu Character mà LCD1602 hỗ trợ đó là 5×8 và 5×10
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 font chữ riêng trên LCD của mình.
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, lên 1 gửi data (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 sẽ ở chế độ Input, chân MCU kết nối vào sẽ ở chế độ OutPut
- Chân EN sẽ được kéo lên 1 để chốt dữ liệu vào LCD, sau đó lại nhả về 0
Khi lập trình chúng ta sẽ sử dụng 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 mặc định đã được nối xuống 0 rồi nhé!
Quy trình đọc LCD1602:
- Chân RS kéo xuống 0 nếu gửi Lệnh (Command) điều khiển LCD, lên1 gửi data (ghi vào DD 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 sẽ ở chế độ Output, chân MCU kết nối vào sẽ ở chế độ Input
- Chân EN sẽ được kéo lên 1 để chốt dữ liệu vào LCD, sau đó lại nhả về 0
Khi lập trình chúng ta sẽ sử dụng 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:
Các bit 1 tương ứng với lệnh, và các bit sau bit 1 tương ứng với tham số.
VD: Khi gửi lệnh INPUT SET chúng ta sẽ sử dụng lệnh 0x40, sau đó AND với 2bit I/D và S và set các 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ế độ 4 bit chúng ta sẽ lập trình theo trình tự sau:
Với chế độ 4bit, để gửi 1byte (8bit) chúng ta sẽ gửi 2 lần 4bit.
Cách kết nối phần cứng STM32 với LCD1602
Để điều khiển độ 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 trở để điểu khiển độ tương phản.
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.
Khởi tạo chọn tools chain 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
Thêm đường dẫn vào thư viện mà bạn down về. Nhấn vào biểu tượng Option -> C/C++ -> Inclue Path. Sau đó trỏ tới nơi lưu file CLCD.h
Add 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 bạn.
Khởi tạo 1 buffer để hiển thị lên LCD và biến Count.
Truyền vào LCD1 các tham số setup như: &LCD1 địa chỉ LCD, số hàng và cột 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 giá trị vào ô 0,0
Lệnh sprintf sẽ ghi giá trị của Count vào chuỗi. Sau đó ghi vào LCD.
Tiếp tới tăng giá trị Count và delay 1s.
Kết quả
Lập trình STM32 LCD1602 chế độ 4bit
Với chế dộ 4bit, chúng ta chỉ cần khởi tạo lại LCD với chế độ 4bit
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ị một số kết quả đo đạc từ sensor 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