Lập trình STM32 điều khiển LCD1602 chế độ 8bit và 4bit

stm32 lcd1602 4bit 8bit

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

lcd1602 1

Sơ đồ chân – Pin Out

  1. VSS: tương đương với GND – cực âm
  2. VDD: tương đương với VCC – cực dương (5V)
  3. Constrast Voltage (Vo): điều khiển độ sáng màn hình
  4. Register Select (RS): điều khiển địa chỉ nào sẽ được ghi dữ liệu
  5. 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.
  6. Enable pin: Cho phép ghi vào LCD
  7. 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)
  8. 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
Sơ đồ khối LCD1602
Sơ đồ khối LCD1602

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.

Sơ đồ Display RAM LCD1602
Sơ đồ Display RAM LCD1602

Cách đọc và ghi vào LCD1602

Quy trình ghi vào LCD1602 như sau:

  1. 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)
  2. Chân R/W: Kéo xuống 0 ghi dữ liệu
  3. 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
  4. 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.

Timing Diagram Write Mode
Timing Diagram Write Mode – Cách ghi dữ liệu vào LCD
lcd1602 4
Bảng Timing ghi vào LCD1602

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é!

lcd 1602 write

Quy trình đọc LCD1602:

  1. 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)
  2. Chân R/W: Kéo lên 1 để đọc dữ liệu
  3. 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
  4. 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.

Timing Diagram Read Mode - Cách đọc dữ liệu từ LCD
Timing Diagram Read Mode – Cách đọc dữ liệu từ LCD

lcd1602 6

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.

Tập lệnh trong LCD1602
Tập lệnh trong LCD1602

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:

lcd1602 7

Để 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.
lcd1602 8

 

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.

lcd1602 11

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.

stm32 lcd1602 8bit 1

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.

stm32 lcd1602 8bit 3

Khởi tạo chọn tools chain là MDK-ARM V5.

stm32 lcd1602 8bit 5

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

stm32 lcd1602 8bit 6

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

stm32 lcd1602 8bit 7

Add CLCD.h vào main.c

stm32 lcd1602 8bit 8

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.

stm32 lcd1602 8bit 9

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

stm32 lcd1602 8bit 10

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.

stm32 lcd1602 8bit 11

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

lcd1602 4bit

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

5/5 - (3 bình chọn)
5 1 đánh giá
Đánh giá bài viết
Theo dõi
Thông báo của
guest

5 Góp ý
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất
Phản hồi nội tuyến
Xem tất cả bình luận
Bao.N
Bao.N
2 năm trước

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 .

dương hoàng
dương hoàng
2 năm trước

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 ạ

Thuc
Thuc
9 tháng trước

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

Giang
Giang
9 tháng trước

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