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ớ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)

lcd1602 1

Sơ đồ chân – Pin Out

  1. VSS: GND – cực âm
  2. VDD: VCC – cực dương (5V)
  3. Contrast Voltage (V0): điều chỉnh độ tương phản của chữ trên màn hình
  4. 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ị)
  5. Read/Write (RW): RW = 0 là ghi vào LCD, RW = 1 là đọc từ LCD
  6. Enable (EN): chân cho phép, tạo xung để LCD chốt lệnh/dữ liệu
  7. 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
  8. 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
Sơ đồ khối LCD1602
Sơ đồ khối LCD1602

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).

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, kéo lên 1 nếu gửi dữ liệu (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 ở chế độ Input, chân MCU kết nối vào ở chế độ Output
  4. 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.

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 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.

lcd 1602 write

Quy trình đọc LCD1602:

  1. 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
  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 ở chế độ Output, chân MCU kết nối vào ở chế độ Input
  4. 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.

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:

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.

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ế độ 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.
lcd1602 8

 

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ở).

lcd1602 11

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.

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

Trong Project Manager chọn Toolchain/IDE 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 Files

stm32 lcd1602 8bit 6

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

stm32 lcd1602 8bit 7

Include 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 mình.

Khởi tạo 1 buffer để hiển thị lên LCD và biến Count.

stm32 lcd1602 8bit 9

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.

stm32 lcd1602 8bit 10

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.

stm32 lcd1602 8bit 11

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.

lcd1602 4bit

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

5/5 - (4 bình chọn)

5 những suy nghĩ trên “Lập trình STM32 điều khiển LCD1602 chế độ 8bit và 4bit”

  1. Bao.N nói:

    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 .

  2. dương hoàng nói:

    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 ạ

  3. Thuc nói:

    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

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *