Lập trình STM32 với LCD I2C sử dụng module PCF8574

stm32 lcd i2c pcf8574

Trong bài này chúng ta sẽ học cách lập trình STM32 với Module LCD I2C sử dụng chip PCF8574. Đây là một module rất phù hợp khi điều khiển các loại Character LCD có trên thị trường hiện nay.

Bài này nằm trong Serie Học STM32 từ A tới Z

Tổng quan về module LCD I2C PCF8574

LCD có quá nhiều chân, gây khó khăn trong quá trình đấu nối và chiếm dụng nhiều chân trên vi điều khiển. Chính vì vậy module PCF8574 ra đời. Thay vì phải mất 6 chân vi điều khiển để kết nối với LCD 16×2 (RS, EN, D7, D6, D5 và D4), với module I2C bạn chỉ cần tốn 2 chân (SCL, SDA).

Module I2C hỗ trợ các loại LCD sử dụng driver HD44780 (LCD 16×2, LCD 20×4, …), nói chung là hầu hết các loại LCD Character hiện nay.

Module PCF8574 cũng được thiết kế để hàn nhanh vào các loại LCD 16×2, 20×4…, khiến việc đấu nối trở nên dễ dàng hơn rất nhiều.

pcf8574

 

Thông số kĩ thuật

  • Điện áp hoạt động: 2.5 – 6V DC.
  • Hỗ trợ màn hình: LCD1602, 1604, 2004 (driver HD44780).
  • Giao tiếp: I2C.
  • Địa chỉ mặc định: 0x27 (với chip PCF8574) hoặc 0x3F (với chip PCF8574A), có thể thay đổi bằng cách hàn nối các chân A0/A1/A2.
  • Tích hợp Jumper để bật/tắt đèn nền LCD
  • Tích hợp biến trở xoay điều chỉnh độ tương phản cho LCD.

Cách kết nối với LCD và vi điều khiển

Chúng ta hàn trực tiếp module PCF8574 vào sau LCD như hình sau:

pcf8574 lcd1602

Để kết nối với vi điều khiển, chúng ta chỉ sử dụng 2 chân SDA, SCL và 2 đường nguồn là được. Với I2C1 của STM32F103C8 (KIT Blue Pill), nối như sau: GND → GND, VCC → 5V, SDA → PB7, SCL → PB6. Các bạn nên cấp điện 5V cho module để LCD sáng rõ hơn, vì có những loại LCD chỉ chạy ở mức 5V.

Lưu ý: Module LCD I2C có sẵn điện trở kéo lên SDA, SCL lên chân VCC, nên khi cấp 5V thì đường I2C cũng ở mức 5V. PB6 và PB7 của STM32F103 là chân chịu được 5V (5V tolerant) nên dùng được, nhưng nếu bạn đổi sang chân I2C khác thì phải kiểm tra trong datasheet xem chân đó có ghi FT hay không.

Cách điều khiển Module LCD I2C PCF8574

Các bạn tải datasheet tại đây: https://www.nxp.com/docs/en/data-sheet/PCF8574_PCF8574A.pdf

Với module PCF8574, chúng ta sẽ điều khiển tương tự như LCD chế độ 4 bit, nhưng thay vì phải xuất tín hiệu ra các chân RS, RW, EN và D4 – D7, chúng ta chỉ cần xuất tín hiệu ra 2 chân SDA và SCL là được. PCF8574 sẽ nhận byte qua I2C rồi xuất ra 8 chân của nó, nối thẳng vào LCD.

Sơ đồ khối

pcf8574 block diagram

Nhìn vào sơ đồ khối của PCF8574 chúng ta thấy, đầu ra của nó gồm 8 chân P0 – P7. Trên module LCD I2C thông dụng, 4 chân thấp P0 – P3 nối với RS, RW, EN, BL (Back Light) và 4 chân cao P4 – P7 nối với 4 bit dữ liệu D4 – D7 trên LCD.

Đầu vào gồm 2 chân SDA và SCL giao tiếp với vi điều khiển, và 3 chân A0, A1, A2 để thay đổi địa chỉ cho PCF8574. Nghĩa là bạn có thể mắc chung tối đa 8 module PCF8574 (và thêm 8 module PCF8574A) trên cùng 1 bus I2C.

Cách cấu hình địa chỉ cho Module LCD I2C PCF8574

Khi truyền nhận I2C, byte đầu tiên chúng ta luôn phải truyền địa chỉ của chip I2C cần giao tiếp. Byte đầu tiên trong PCF8574 được tổ chức như sau:

pcf8574 i2c address

Các bit 7 – 4 được cố định sẵn (0100 với PCF8574, 0111 với PCF8574A), chỉ có các bit 3, 2, 1 tương ứng với A2, A1, A0 là có thể thay đổi bằng cách hàn các chân trên board (mặc định là 1 1 1), bit 0 là bit R/W. Để tính toán địa chỉ chúng ta dựa vào bảng sau:

pcf8574 i2c address map

pcf8574A i2c address map

Một lưu ý khi giao tiếp I2C với STM32 HAL đó là địa chỉ 7 bit luôn phải được dịch trái 1 bit (ví dụ 0x27 << 1 = 0x4E), bit 0 dành cho bit R/W do HAL tự OR vào. Chi tiết mình đã nói rõ trong bài STM32 I2C, các bạn nếu quên thì đọc lại nhé!

Lưu ý: Module bán ngoài thị trường có thể dùng chip PCF8574 (địa chỉ 0x27) hoặc PCF8574A (địa chỉ 0x3F), nhìn bề ngoài gần như giống hệt nhau. Nếu nạp code xong LCD chỉ sáng đèn nền mà không hiện chữ, hãy thử đổi địa chỉ, hoặc dùng HAL_I2C_IsDeviceReady() quét từ 0x08 tới 0x77 để tìm đúng địa chỉ.

Cách truyền dữ liệu cho module LCD I2C PCF8574

Lệnh ghi lên LCD I2C

pcf8574A i2c write

Để ghi lên LCD I2C chúng ta sẽ làm theo các bước:

<S> <slave address + write> <ACK> <data out> <ACK> <data out> <ACK> … … <data out> <ACK> <P>

Khi bắt đầu truyền dữ liệu, MCU sẽ truyền địa chỉ lên bus I2C, module nào có cùng địa chỉ sẽ trả về ACK. Sau đó MCU gửi các byte dữ liệu tương ứng với lệnh (Command) và tham số truyền vào LCD theo chế độ 4 bit.

Trong file .h chúng ta sẽ define các bit tương ứng với các chân RS, RW, BL, EN.

pcf8574A i2c write code define

Trong hàm Write vào LCD, mỗi byte gửi cho LCD được tách làm 2 nửa 4 bit. Mỗi nửa được đặt vào 4 bit cao (P4 – P7, nối với D4 – D7), sau đó OR với các bit điều khiển RS, RW, EN, BL ở 4 bit thấp (P0 – P3), rồi gửi qua I2C.

pcf8574A i2c write code

Lệnh đọc LCD I2C

pcf8574A i2c read

Để đọc từ LCD I2C chúng ta sẽ làm theo các bước:

<S> <slave address + read> <ACK> <data in> <ACK> <data in> <ACK> … … <data in> <NACK> <P>

Ở byte cuối cùng, MCU (master) trả về NACK để báo cho PCF8574 biết là đã đọc xong, rồi mới gửi điều kiện Stop. Trong bài viết này mình không sử dụng chức năng đọc trên LCD I2C nên sẽ không đi sâu.

Lập trình STM32 với LCD I2C

Cấu hình trên CubeMX

Mở CubeMX, chọn chip stm32f103c8. Trong SYS chọn Debug Serial Wire.

lap trinh stm32 lcd1602 i2c 1

Trong Connectivity chọn I2C1

lap trinh stm32 lcd1602 i2c 2

Gen code với MDK-ARM V5

lap trinh stm32 lcd1602 i2c 3

Lập trình STM32 I2C với Keil C

Mở project đã Gen bằng Keil C. Download thư viện LCD I2C, link trong bài viết: https://khuenguyencreator.com/huong-dan-download-va-su-dung-tai-lieu-lap-trinh-stm32/

Nhấp đúp chuột vào nhóm trong cây project và add file CLCD.c vào project.

Chỉnh lại đường dẫn thư viện trong tab C/C++ (Include Paths).

lap trinh stm32 lcd1602 i2c 4

Khởi tạo LCD I2C tên là LCD1.

lap trinh stm32 lcd1602 i2c 5

Khởi tạo LCD I2C với I2C1 trên STM32, sau đó sử dụng các hàm ghi lên màn hình.

lap trinh stm32 lcd1602 i2c 6

Kết quả

Thay đổi code tùy thích các bạn nhé. Rút Jumper bên tay phải để bật/tắt đèn nền, dùng tua vít vặn biến trở trên module để chỉnh độ tương phản.

Kết

LCD I2C được sử dụng rất rộng rãi khi chúng ta muốn điều khiển LCD Character, module này tương thích với các dòng LCD1602, 2004… Việc lập trình cũng khá đơn giản, các bạn chỉ cần thay đổi cách gửi dữ liệu từ 4bit song song sang I2C là xong.

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)

3 những suy nghĩ trên “Lập trình STM32 với LCD I2C sử dụng module PCF8574”

Để 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 *