Lập trình STM32 với TFT LCD ST7735 giao thức SPI

stm32 lcd st7735

TFT LCD ST7735 là một trong những dòng LCD hiển thị màu phổ biến hiện nay. Với giao thức SPI đơn giản, đỡ tốn tài nguyên nhưng tốc độ vẫn rất ổn định, nó rất phù hợp với các dự án nhỏ.

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

Tông quát về màn hình TFT LCD ST7735

Màn hình LCD TFT 1.8 inch ST7735 giao tiếp SPI được tích hợp sẵn IC ổn áp và IC chuyển mức logic, nên có thể tương thích với cả hai mức điện áp logic thông dụng là 3.3VDC và 5VDC. Một điểm đặc biệt nữa của màn hình LCD này là có sơ đồ chân tương thích để có thể cắm trực tiếp với Arduino mà không cần thêm dây nối.

THÔNG SỐ KỸ THUẬT MÀN HÌNH TFT LCD ST7735

  • Điện áp sử dụng: 3.3~5VDC
  • Điện áp giao tiếp: TTL 3.3~5VDC
  • IC Driver hiển thị: ST7735
  • Cỡ màn hình: 1.8 inch
  • Độ phân giải: 128 x 160 pixels
  • Tích hợp khe thẻ nhớ MicroSD giao tiếp SPI.
  • Sơ đồ chân cắm trực tiếp được lên một số board vi điều khiển mà không cần đi dây
  • Có sẵn vị trí để hàn thêm chip SPI Flash (chứa font chữ) phục vụ cho ứng dụng mở rộng

1 8 inch TFT m un m n h nh m u ST7735 SPI t nh

Hướng dẫn điều khiển TFT LCD ST7735

Để bắt đầu chúng ta tham khảo Datasheet: https://www.displayfuture.com/Display/datasheet/controller/ST7735.pdf

Sơ đồ khối TFT LCD ST7735

st7735 block diagram

 

Chuẩn giao tiếp SPI – 3 wire Serial

LCD ST7735 hỗ trợ 5 phương thức giao tiếp, được chọn bởi các bit IM[2:0].

st7735 interface

Trong bài này chúng ta sử dụng giao tiếp nối tiếp (Serial) và chỉ truyền 1 chiều từ STM32 sang LCD, nên phía STM32 cấu hình SPI ở chế độ Transmit Only (do Module đã thiết kế sẵn như vậy). Các chân gồm:

Chân CS – Chip Select: chọn chip trong giao tiếp SPI

Chân RST – Reset: reset chip

Chân RS – Register Select (hoặc D/CX trong datasheet): chọn dữ liệu truyền qua Serial là lệnh (Command) hay dữ liệu (Data)

Chân SCL – Clock: xung đồng hồ trong giao tiếp SPI

Chân SDA – Data: ở mode này chân SDA chính là chân dữ liệu vào (tương đương MOSI)

Vi điều khiển phải ghi các mức 1, 0 vào các chân này để có thể điều khiển được LCD ST7735.

st7735 interface pin

Module của chúng ta sử dụng mode Serial 4 line (4 dây: CSX, SCL, SDA và D/CX), vậy nên chân SPI4W phải được kéo lên 1.

  • Với chế độ 3 Line: bit D/CX (data/command) được gửi kèm trong dữ liệu, mỗi lần truyền gồm 1 bit D/CX và 8 bit dữ liệu (9 bit)
  • Với chế độ 4 Line: bit D/CX được chọn bằng phần cứng, điều khiển qua 1 chân GPIO riêng, nhờ vậy dữ liệu truyền đúng 8 bit như SPI thông thường

st7735 interface 4line

Dưới đây là bảng phương thức giao tiếp kiểu Serial 4 Wire. Nói chung nó là SPI thôi, chỉ cần khi giao tiếp bạn đặt chân RS (D/CX) để chọn gửi Command hay Data là được.

st7735 interface 4line protocol

Cấu tạo điểm ảnh TFT LCD ST7735

Data Color Coding

LCD ST7735 hỗ trợ 3 định dạng màu sắc khác nhau:

  • 4k colors, RGB 4,4,4 – bit input.
  • 65k colors, RGB 5,6,5 – bit input.
  • 262k colors, RGB 6,6,6 – bit input.

Định dạng chúng ta sử dụng sẽ là RGB 565. Đây cũng là một định dạng rất phổ biến thường gặp trong LCD, bởi vì nó tròn 16 bit, truyền cho đơn giản 😀

Mỗi điểm ảnh sẽ được biểu diễn bởi 16 bit (2 byte), trong đó:

  • R: Red 5 bit
  • G: Green 6 bit (mắt người nhạy với màu xanh lá nhất nên được thêm 1 bit)
  • B: Blue 5 bit

st7735 data color

Bản đồ bộ nhớ DRAM

st7735 display ram

LCD ST7735 tích hợp bộ nhớ hiển thị (Static RAM) có kích thước 132x162x18 bit, nghĩa là lưu được một hình ảnh kích thước 132×162 pixel với 18 bit/pixel.

st7735 display

Địa chỉ hàng và cột được đánh số bởi RA (Row Address) và CA (Column Address). Thứ tự này sẽ thay đổi khi có các lệnh Mirror, giúp chúng ta xoay LCD theo các chiều khác nhau.

Với module màn hình TFT LCD ST7735, chúng ta sử dụng độ phân giải 160×128. Vậy nên bản đồ bộ nhớ hiển thị như sau:

st7735 display address

Phương thức quét

Chiều quét mặc định của ST7735 là từ trái sang phải và từ trên xuống dưới. Chiều quét có thể được lập trình lại bởi các câu lệnh.

st7735 data streaming oder 2

Lệnh điều khiển

Các lệnh điều khiển các bạn tham khảo mục Command trong Datasheet nhé.

Lập trình STM32 điều khiển TFT LCD ST7735

Kết nối STM32 Blue Pill với LCD ST7735

SCL (Clock) —- PA5 (SPI1_SCK)

SDA (Data) —- PA7 (SPI1_MOSI)

RS —- PB8

RST —- PB7

CS —- PB6

Lưu ý: Chân SDA và SCL trên module ST7735 chỉ là tên in trên mạch, đây là SPI chứ không phải I2C. SCL phải nối vào SCK (PA5) và SDA phải nối vào MOSI (PA7) của SPI1. Nối đảo 2 chân này thì màn hình chỉ sáng trắng mà không hiện gì cả.

Cấu hình cubemx

Mở CubeMX, chọn chip STM32F103C8. SYS chọn Debug Serial Wire. RCC chọn Crystal/Ceramic Resonator. Quá quen thuộc rồi anh em nhỉ.

Trong GPIO chúng ta tạo ra 3 chân Output CS, RS, RST để điều khiển LCD.

st7735 cube config 1

SPI1 chọn chế độ Transmit Only Master và tham số chọn như ảnh sau. Lưu ý: First Bit phải là MSB nhé.

st7735 cube config 2

Trong Clock Configuration chọn tần số là 24MHz.

st7735 cube config 4

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

Download thư viện LCD ST7735 theo bài viết: Hướng dẫn download tài liệu lập trình STM32

Thêm các thư viện vào project.

st7735 keilc 1

Chỉnh đường dẫn vào thư viện.

st7735 keilc 2

Include thư viện và ảnh trong main.c

st7735 keilc 3

Khởi tạo ST7735

st7735 keilc 4

Trong while chúng ta sẽ hiển thị ảnh, text, vẽ các đường thẳng…

		ST7735_DrawImage(0,0,128, 160,(uint8_t*)gImage_yua);
		HAL_Delay(3000);
	
		ST7735_WriteString(20, 100, "Censored", Font_11x18, ST7735_RED, ST7735_WHITE);
		HAL_Delay(3000);
    ST7735_FillScreen(ST7735_BLACK);
		
    for(int x = 0; x < ST7735_WIDTH; x++) {
        ST7735_DrawPixel(x, 0, ST7735_RED);
        ST7735_DrawPixel(x, ST7735_HEIGHT-1, ST7735_RED);
    }

    for(int y = 0; y < ST7735_HEIGHT; y++) {
        ST7735_DrawPixel(0, y, ST7735_RED);
        ST7735_DrawPixel(ST7735_WIDTH-1, y, ST7735_RED);
    }

    HAL_Delay(1000);

    // Check fonts
    ST7735_FillScreen(ST7735_BLACK);
    ST7735_WriteString(0, 0, "Font_7x10, red on black, lorem ipsum dolor sit amet", Font_7x10, ST7735_RED, ST7735_BLACK);
    ST7735_WriteString(0, 3*10, "Font_11x18, green, lorem ipsum", Font_11x18, ST7735_GREEN, ST7735_BLACK);
    ST7735_WriteString(0, 3*10+3*18, "Font_16x26", Font_16x26, ST7735_BLUE, ST7735_BLACK);
    HAL_Delay(2000);

    // Check colors
    ST7735_FillScreen(ST7735_BLACK);
    ST7735_WriteString(0, 0, "BLACK", Font_11x18, ST7735_WHITE, ST7735_BLACK);
    HAL_Delay(500);

    ST7735_FillScreen(ST7735_BLUE);
    ST7735_WriteString(0, 0, "BLUE", Font_11x18, ST7735_BLACK, ST7735_BLUE);
    HAL_Delay(500);

    ST7735_FillScreen(ST7735_RED);
    ST7735_WriteString(0, 0, "RED", Font_11x18, ST7735_BLACK, ST7735_RED);
    HAL_Delay(500);

    ST7735_FillScreen(ST7735_GREEN);
    ST7735_WriteString(0, 0, "GREEN", Font_11x18, ST7735_BLACK, ST7735_GREEN);
    HAL_Delay(500);

    ST7735_FillScreen(ST7735_CYAN);
    ST7735_WriteString(0, 0, "CYAN", Font_11x18, ST7735_BLACK, ST7735_CYAN);
    HAL_Delay(500);

    ST7735_FillScreen(ST7735_MAGENTA);
    ST7735_WriteString(0, 0, "MAGENTA", Font_11x18, ST7735_BLACK, ST7735_MAGENTA);
    HAL_Delay(500);

    ST7735_FillScreen(ST7735_YELLOW);
    ST7735_WriteString(0, 0, "YELLOW", Font_11x18, ST7735_BLACK, ST7735_YELLOW);
    HAL_Delay(500);

    ST7735_FillScreen(ST7735_WHITE);
    ST7735_WriteString(0, 0, "WHITE", Font_11x18, ST7735_BLACK, ST7735_BLUE);
    HAL_Delay(500);

 

Tô màu toàn màn hình: ST7735_FillScreen

Hiển thị text: ST7735_WriteString

Vẽ điểm ảnh: ST7735_DrawPixel

Hiển thị ảnh: ST7735_DrawImage

Cách chuyển ảnh sang mảng để hiển thị

Để thay đổi ảnh chúng ta sử dụng công cụ Image2LCD mà mình cũng đã đề cập tại bài LCD OLED SSD1306.

Link download: https://drive.google.com/file/d/1I296gQr562STMv3DgOz2iBrdOCZc85Kg/view

Tải ảnh cần convert, chỉnh lại kích thước theo đúng mong muốn bằng Photoshop. Chúng ta có thể dùng công cụ Image Size (phóng to thu nhỏ theo kích thước) và Canvas Size (thêm hoặc cắt ảnh theo kích thước).

Screenshot 3

Mở tool Image2LCD:

  1. Nhấn Open, mở ảnh vừa chỉnh trong Photoshop
  2. Chọn các tùy chọn như hình gồm: kiểu quét, chế độ màu (16 bit), độ phân giải, các tùy chọn khác
  3. Nhấn Save, lưu thành file .h, nhớ trỏ vào trong thư mục Inc trong project của bạn nhé.

st7735 convert image

Trong main.c thêm #include "Tên_File.h" là có thể sử dụng được rồi.

Lưu ý: Phải tích chọn vào MSB First cho phù hợp với kiểu truyền dữ liệu của SPI nhé. Nếu chọn sai thứ tự byte, ảnh vẫn hiện đúng hình nhưng màu sắc sẽ bị đảo lộn hoàn toàn.

Kết quả

Kết

Viết Driver cho màn hình TFT LCD ST7735 cũng khá phức tạp do có rất nhiều lệnh, nhưng nguyên lý chung trong lập trình LCD thì không đổi. Bạn chỉ cần nắm rõ những nguyên lý đó thì việc lập trình cũng trở nên đơn giản hơn rất nhiều.

Nếu bạn thấy bài viết này có ích hãy để lại bình luận và đừng quên gia nhập Hội Anh Em Nghiện Lập trình nhé.

 

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

6 những suy nghĩ trên “Lập trình STM32 với TFT LCD ST7735 giao thức SPI”

  1. HUY nói:

    lcdtft\lcdtft.axf: error: L6047U: The size of this image (58492 bytes) exceeds the maximum allowed for this version of the linker. Anh ơi e bị lỗi này thì phải làm như thế nào ạ

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