การคลี่คลายความซับซ้อนของการแสดงภาพบนจอ TFT LCD เป็นเพียงเรื่องของการเชี่ยวชาญกระบวนการแปลงข้อมูลดิจิทัลให้เป็นจอแสดงผลภาพที่มีประสิทธิภาพ
TFT LCD หรือจอแสดงผลคริสตัลเหลวแบบทรานซิสเตอร์ฟิล์มบาง เป็นประเภทหนึ่งของ LCD ที่ใช้กันทั่วไปในอุปกรณ์ต่างๆ รวมถึงสมาร์ทโฟน แท็บเล็ต และทีวี TFT LCD ขึ้นชื่อในเรื่องคุณภาพของภาพที่สูง เวลาตอบสนองที่รวดเร็ว และการใช้พลังงานต่ำ
การใช้งาน TFT LCD ที่นิยมใช้กันมากที่สุดคือการแสดงภาพ ทำให้เหมาะสำหรับโครงการต่างๆ เช่น กรอบรูปดิจิทัล ป้ายดิจิทัล และโครงการ DIY ในบทความนี้ เราจะแสดงวิธีแสดงภาพบน TFT LCD โดยใช้การ์ด SD และ Arduino Due
คำอธิบายพินเอาต์และการเชื่อมต่อแบบสมบูรณ์สำหรับการเชื่อมต่อระหว่าง TFT LCD, บอร์ดเบรกเอาต์การ์ด SD และ Arduino Due
แผนผังสายไฟด้านล่างแสดงวิธีการเชื่อมต่อ TFT LCD และการ์ด SD เข้ากับ Arduino Due เพื่อแสดงกราฟิกและเข้าถึงการ์ด SD
แผนผังการเดินสายไฟระหว่าง TFT LCD, การ์ด SD และ Arduino เนื่องจากการแสดงภาพบนหน้าจอ
จอ LCD ส่วนใหญ่ไม่แปลความหมายรูปแบบภาพมาตรฐาน เช่น JPEG หรือ PNG โดยตรง แต่จะใช้ข้อมูลพิกเซลดิบ ซึ่งมักแสดงในรูปแบบเลขฐานสิบหก ขั้นแรก เราต้องแปลงภาพเป็นอาร์เรย์ข้อมูลภาพโดยดาวน์โหลด ซอฟต์แวร์ LCD Image Converter และทำตามขั้นตอนเหล่านี้:
เปิด Arduino IDE และเริ่ม Sketch ใหม่ ลบโค้ดที่มีอยู่ก่อนหน้านี้ จากนั้นคัดลอกและวางโค้ดที่ให้ไว้ด้านล่าง
#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();
}
ขั้นตอนสุดท้ายคือการอัปโหลดโค้ดไปยัง Arduino IDE
เมื่ออัพโหลดรหัสสำเร็จแล้ว รูปภาพของคุณควรปรากฏบนหน้าจอ LCD
ไม่ว่าคุณจะกำลังเรียนรู้ สร้างต้นแบบ หรือต้องการสนุกสนานไปกับการเล่นกับอุปกรณ์อิเล็กทรอนิกส์ บทช่วยสอนนี้จะอธิบายพื้นฐานของการอ่านข้อมูลภาพเลขฐานสิบหกจากการ์ด SD และแสดงบนจอ LCD TFT นี่เป็นเพียงจุดเริ่มต้นเท่านั้น และยังมีความเป็นไปได้ในการขยายเพิ่มเติมอีกมากมาย เราหวังว่าคุณจะสนุกกับบทช่วยสอนนี้