Cách hiển thị hình ảnh trên màn hình TFT LCD

Cách hiển thị hình ảnh trên màn hình TFT LCD

Để hiển thị hình ảnh trên màn hình TFT LCD, bạn chỉ cần chuyển đổi dữ liệu kỹ thuật số thành dữ liệu mà bạn có thể nhìn thấy.

Màn hình tinh thể lỏng TFT LCD hay còn gọi là màn hình Transistor màng mỏng Đây là loại màn hình LCD thường được sử dụng trong nhiều thiết bị khác nhau. Bao gồm điện thoại thông minh, máy tính bảng và TV LCD TFT, được biết đến với chất lượng hình ảnh cao. Thời gian phản hồi nhanh và mức tiêu thụ năng lượng thấp

Công dụng phổ biến nhất của TFT LCD là hiển thị hình ảnh. Điều này làm cho nó trở nên lý tưởng cho các dự án như khung ảnh kỹ thuật số, biển báo kỹ thuật số và các dự án tự làm. Trong bài viết này, chúng tôi sẽ chỉ cho bạn cách hiển thị hình ảnh trên màn hình LCD TFT bằng thẻ SD và Arduino Due.

Những gì bạn sẽ cần

  • Bo mạch vi điều khiển Arduino Due
  • TFT 240x320 với ST7789VI hoặc IC tương đương (NHD-2.4-240320AF-CSXP)
  • Bo mạch đột phá FFC 40 chân, khoảng cách 0,5 mm ( NHD-FFC40 )
  • Thẻ SD
  • Bảng phân tách thẻ SD
  • Bảng mạch
  • Cáp nối
  • Cáp USB cho vi điều khiển
  • Phần mềm Arduino IDE
  • Phần mềm chuyển đổi hình ảnh LCD

Bảng chân cắm

Mô tả chân cắm và kết nối đầy đủ để kết nối giữa TFT LCD, bảng mạch mở rộng thẻ SD và Arduino Due.

TFT LCD và Arduino có Pinout được chỉ định.

Sơ đồ chân cắm của bo mạch mở rộng thẻ SD:

Sơ đồ đấu dây

Sơ đồ nối dây bên dưới cho thấy cách kết nối màn hình LCD TFT và thẻ SD với Arduino để hiển thị đồ họa và truy cập thẻ SD.

Sơ đồ nối dây giữa TFT LCD, thẻ SD và Arduino để hiển thị hình ảnh trên màn hình.

Chuyển đổi hình ảnh thành tập tin văn bản và lưu vào thẻ SD.

Hầu hết màn hình LCD không trực tiếp giải thích các định dạng hình ảnh chuẩn như JPEG hoặc PNG mà sử dụng dữ liệu pixel thô. Thường được hiển thị ở định dạng thập lục phân. Đầu tiên, chúng ta cần chuyển đổi hình ảnh thành mảng dữ liệu hình ảnh bằng cách tải xuống phần mềm LCD Image Converter và làm theo các bước sau:

  1. Mở phần mềm LCD Image Converter.
  2. Vào Image -> Import và mở hình ảnh bạn muốn hiển thị trên màn hình LCD. Độ phân giải của tệp hình ảnh phải phù hợp với độ phân giải của màn hình LCD.
  3. Vào Tùy chọn -> Biến đổi và đảm bảo rằng cài đặt trước “Màu R5G6B5” được chọn.
  4. Nhấp vào tab “Hình ảnh”, trong phần “Chung”, bỏ chọn “Chia thành hàng” và đặt kích thước khối thành “8 bit”.
  5. Ở góc dưới bên trái của cửa sổ, nhấp vào “Xem trước”.
  6. Sao chép và dán giá trị thập lục phân vào trình soạn thảo văn bản và lưu tệp dưới dạng “image1.txt”.
  7. Chuyển tệp văn bản sang thẻ SD và lắp thẻ SD vào bảng mạch đột phá.

Sao chép mã mẫu vào Arduino IDE.

Mở Arduino IDE và bắt đầu một Sketch mới, xóa mã trước đó. Sau đó sao chép và dán mã được cung cấp bên dưới.

#include <Wire.h>
#include <SPI.h>
#include <SD.h>
/****************************************************
*         PINOUT: Arduino Due -> 2.4" TFT           *
*****************************************************/
#define    RS   2     
#define    WR  11
const char slave = 0x38;
const int ChipSelect = 49;
int image_value = 0;
File myFile;
/****************************************************
*                 Function Commands                  *
******************************************************/
void comm_out(unsigned char c)
{
  PIOB -> PIO_CODR = 1 << 25;   //RS LOW
  REG_PIOC_ODSR = c << 1; 
  PIOD -> PIO_CODR = 1 << 7;    //WR LOW
  PIOD -> PIO_SODR = 1 << 7;    //WR HIGH
}
void data_out(unsigned char d)
{
  PIOB -> PIO_SODR = 1 << 25;   //RS HIGH
  REG_PIOC_ODSR = d << 1;
  PIOD -> PIO_CODR = 1 << 7;    //WR LOW
  PIOD -> PIO_SODR = 1 << 7;    //WR HIGH
}
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//  Window Set Function
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
void window_set(unsigned s_x, unsigned e_x, unsigned s_y, unsigned e_y)
{
  comm_out(0x2a);    //SET column address
  data_out((s_x)>>8);     //SET start column address
  data_out(s_x);
  data_out((e_x)>>8);     //SET end column address
  data_out(e_x);
  comm_out(0x2b);    //SET page address
  data_out((s_y)>>8);     //SET start page address
  data_out(s_y);
  data_out((e_y)>>8);     //SET end page address
  data_out(e_y);
}
/****************************************************
*         Initialization and Setup Routine          *
*****************************************************/
void setup()
{
  delay(100);
  pinMode(RS,OUTPUT);  
  pinMode(WR,OUTPUT);  
  PIOC->PIO_OER = 0xFFFFFFFF;
  digitalWrite(WR, LOW);
  comm_out(0x28);  //display off
  comm_out(0x11);  //exit SLEEP mode
  delay(100);
  comm_out(0x36);  //MADCTL: memory data access control
  data_out(0x10);  //changing from 0x88
  comm_out(0x21);  //display inversion
  comm_out(0x3A);  //COLMOD: Interface Pixel format  *** 65K-colors in 16bit/pixel (5-6-5) format when using 16-bit interface to allow 1-byte per pixel
  data_out(0x55);  //0x55 = 65k   //0x65 = 262k
  comm_out(0xB2);  //PORCTRK: Porch setting
  data_out(0x0C);
  data_out(0x0C);
  data_out(0x00);
  data_out(0x33);
  data_out(0x33);
  comm_out(0xB7);  //GCTRL: Gate Control
  data_out(0x35);
  comm_out(0xBB);  //VCOMS: VCOM setting
  data_out(0x2B);
  comm_out(0xC0);  //LCMCTRL: LCM Control
  data_out(0x2C);
  comm_out(0xC2);  //VDVVRHEN: VDV and VRH Command Enable
  data_out(0x01);
  data_out(0xFF);
  comm_out(0xC3);  //VRHS: VRH Set
  data_out(0x11);
  comm_out(0xC4);  //VDVS: VDV Set
  data_out(0x20);
  comm_out(0xC6);  //FRCTRL2: Frame Rate control in normal mode
  data_out(0x0F);
  comm_out(0xD0);  //PWCTRL1: Power Control 1
  data_out(0xA4);
  data_out(0xA1);
  comm_out(0xE0);  //PVGAMCTRL: Positive Voltage Gamma control  
  data_out(0xD0);
  data_out(0x00);
  data_out(0x05);
  data_out(0x0E);
  data_out(0x15);
  data_out(0x0D);
  data_out(0x37);
  data_out(0x43);
  data_out(0x47);
  data_out(0x09);
  data_out(0x15);
  data_out(0x12);
  data_out(0x16);
  data_out(0x19);
  comm_out(0xE1);  //NVGAMCTRL: Negative Voltage Gamma control  
  data_out(0xD0);
  data_out(0x00);
  data_out(0x05);
  data_out(0x0D);
  data_out(0x0C);
  data_out(0x06);
  data_out(0x2D);
  data_out(0x44);
  data_out(0x40);
  data_out(0x0E);
  data_out(0x1C);
  data_out(0x18);
  data_out(0x16);
  data_out(0x19);
  comm_out(0x2A);  //X address set
  data_out(0x00);
  data_out(0x00);
  data_out(0x00);
  data_out(0xEF);
  comm_out(0x2B);  //Y address set
  data_out(0x00);
  data_out(0x00);
  data_out(0x01);
  data_out(0x3F);
  delay(10);
  comm_out(0x29);  //display ON
  delay(10);
  SD.begin(ChipSelect);
}
/*****************************************************
*           Loop Function, to run repeatedly         *
*****************************************************/
void loop()
{ 
  SD_Card_Image(1);
  delay(5000);
  //SD_Card_Image(2);
  //delay(5000);
  //SD_Card_Image(3);
  //delay(5000);
  //SD_Card_Image(4);
  //delay(5000);
  //SD_Card_Image(5);
  //delay(5000);
}
void SD_Card_Image(unsigned char image){       /*The images used are in a textfile*/
    unsigned char dummy;
    unsigned int incr =0;
    switch (image){
      case 1: 
        image_value=1;
        myFile = SD.open("image1.txt");  
        break;
      case 2:
        image_value=2;
        myFile =SD.open("image2.txt");    
        break;    
      case 3:
        image_value=3;
        myFile = SD.open("image3.txt");   
        break;     
      case 4:
        image_value=4;
        myFile = SD.open("image4.txt");   
        break; 
      case 5:
        image_value=5;
        myFile = SD.open("image5.txt");   
        break;           
    }
  comm_out(0x2A);  /*X address set*/
  data_out(0x00);
  data_out(0x00);
  data_out(0x00);
  data_out(0xEF);
  comm_out(0x2B);  /*Y address set*/
  data_out(0x00);
  data_out(0x00);
  data_out(0x01);
  data_out(0x3F);      
  comm_out(0x2C);  /*command to begin writing to frame memory     */
  byte  data_in1,data_in2,data_in,data_out_value;
  uint8_t data_send;
  char data_conv[1]={0};
  int i;  
  int track ;
  while (myFile.available()){ /*convert the input char data to integers*/
        dummy = myFile.read(); 
        dummy = myFile.read(); 
        data_in1 = myFile.read(); 
        data_in2 = myFile.read(); 
        data_in=data_in1;
        if(data_in >=48 && data_in<=57){    /*if values are in range of 0-9 values*/
            data_in1 = data_in-48;
            track=1;
          }
          if(data_in <=102 && data_in>=97){ /*if values are in range of a-f*/
            data_in1 = data_in - 87; 
            track=1;
          }
          if( data_in ==32/*Space*/ || data_in==44 /*comma*/ || data_in == 120 /*x*/){
            dummy =data_in;
            track=0;
            data_in1 =0;
            data_in2 =0;
          }      
        data_in=data_in2;
        if(data_in >=48 && data_in<=57){   /*if values are in range of 0-9 values*/
            data_in2 = data_in-48;
            track=1;
          }
          if(data_in <=102 && data_in>=97){/*if values are in range of a-f*/
            data_in2 = data_in - 87; 
            track=1;
          }
          if( data_in ==32/*Space*/ || data_in==44 /*comma*/ || data_in == 120 /*x*/){/*skip dummy data*/
            dummy =data_in;
            track=0;
            data_in1 =0;
            data_in2 =0;
          }              
        dummy = myFile.read(); 
        dummy = myFile.read();  
        data_out_value = data_in1<<4 | data_in2;  
        data_out(data_out_value);
      }
      myFile.close();   
}
	

Tải mã lên Arduino

Bước cuối cùng là tải mã lên Arduino IDE.

  1. Kết nối Arduino với máy tính bằng cáp USB-B.
  2. Trong Arduino IDE, chọn bo mạch và cổng.
  3. Nhấp vào nút “Tải lên” để lập trình Arduino bằng mã của bạn.

Sau khi mã được tải lên thành công, hình ảnh của bạn sẽ xuất hiện trên màn hình LCD.

Phần kết luận

Cho dù bạn đang học, tạo mẫu hay chỉ muốn vui chơi với thiết bị điện tử. Hướng dẫn này sẽ giải thích những điều cơ bản về cách đọc dữ liệu hình ảnh thập lục phân từ thẻ SD và hiển thị trên màn hình LCD TFT. Đây chỉ là sự khởi đầu. Và vẫn còn nhiều khả năng mở rộng hơn nữa. Chúng tôi hy vọng bạn thích hướng dẫn này.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

Win a Raspberry Pi!

Answer 5 questions for your chance to win!
Question 1

What color is the sky?

Tìm kiếm bằng danh mục

Chọn danh mục