[Diao Ye learns programming] Arduino hands-on (153) --- 2.4-inch TFT LCD touch screen module 8

The reference to 37 sensors and actuators has been widely circulated on the Internet. In fact, there must be more than 37 sensor modules compatible with Arduino. In view of the fact that I have accumulated some sensor and actuator modules on hand, according to the concept of practice to get true knowledge (must be done), for the purpose of learning and communication, I am going to try a series of experiments one by one, regardless of success (the program goes through) or not, They will be recorded - small progress or unsolvable problems, hoping to inspire others.

[Arduino] 168 sensor module series experiments (data code + simulation programming + graphics programming)

Experiment 156: 2.4-inch TFT LCD touch screen color screen module TFT-LCD high-definition true color display

insert image description here
Adafruit_TFLCD library related functions

class Adafruit_TFTLCD : public Adafruit_GFX {
    
    

public:

 Adafruit_TFTLCD(uint8_t cs, uint8_t cd, uint8_t wr, uint8_t rd, uint8_t rst);

 Adafruit_TFTLCD(void);

 void begin(uint16_t id = 0x9325);

 void drawPixel(int16_t x, int16_t y, uint16_t color);

 void drawFastHLine(int16_t x0, int16_t y0, int16_t w, uint16_t color);

 void drawFastVLine(int16_t x0, int16_t y0, int16_t h, uint16_t color);

 void fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t c);

 void fillScreen(uint16_t color);

 void reset(void);

 void setRegisters8(uint8_t *ptr, uint8_t n);

 void setRegisters16(uint16_t *ptr, uint8_t n);

 void setRotation(uint8_t x);

 void setAddrWindow(int x1, int y1, int x2, int y2);

 void pushColors(uint16_t *data, uint8_t len, boolean first);

 uint16_t color565(uint8_t r, uint8_t g, uint8_t b),

   readPixel(int16_t x, int16_t y), readID(void);

 uint32_t readReg(uint8_t r);

private:

 void init(),


1. Create an object

Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
void setup(void) {
    
    
  tft.reset();
  tft.begin(0x9341);
}

First, create an Adafruit_TFLCD object named tft, and the pin definition is omitted here.

0x9341 in the begin method means to change the driver of TFT LCD to ILI9341, and others will not be introduced here

2. Screen

void fillScreen(uint16_t color);
uint16_t width();  //屏幕的宽度
uint16_t height();  //屏幕的高度

The full screen is filled with the color color, and the previously displayed content will be blocked again

the case

tft.fillScreen(BLACK);
  delay(1000);
  tft.fillScreen(RED);
  delay(1000);
  tft.fillScreen(BLUE);
  delay(1000);

3 points

void drawPixel(int16_t x, int16_t y, uint16_t color);
copy code

Draw a pixel with color color on the point (x, y).

the case

tft.drawPixel(1,1,RED);
  tft.drawPixel(10,10,RED);
  tft.drawPixel(20,20,RED);
  tft.drawPixel(40,40,RED);
  tft.drawPixel(60,60,RED);

4. Line

void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color);  
  void drawFastHLine(int16_t x0, int16_t y0, int16_t w, uint16_t color);
  void drawFastVLine(int16_t x0, int16_t y0, int16_t h, uint16_t color);

The simplest is two points to determine a straight line, of course, you can also determine a point, direction, length, the last two are to draw a horizontal line or a plumb line.

the case

tft.drawFastHLine(10,10,170,RED);
tft.drawFastVLine(10,10,170,RED);
tft.drawLine(10,10,100,180,RED);

5. Rectangle && rounded rectangle

void drawRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t c);
void fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t c);
void drawRoundRect(int16_t x, int16_t y, int16_t w, int16_t h, int16_t radius, uint16_t color);
void fillRoundRect(int16_t x, int16_t y, int16_t w, int16_t h, int16_t radius, uint16_t color);

The rectangle of drawRect draws the border directly, without filling the inside. If you need to fill the inside with color, you need to use fillRect

The rounded rectangle has one more parameter raduis to set the radius of the rounded corner, whether the fill is the same as above.

the case

  tft.drawRect(10,10,150,100,RED);
  tft.fillRect(10,120,150,100,RED);
tft.drawRoundRect(10,10,150,100,10,RED);
tft.fillRoundRect(10,120,150,100,10,RED);

6. Round

void drawCircle(uint16_t x0, uint16_t y0, uint16_t r, uint16_t color);
void fillCircle(uint16_t x0, uint16_t y0, uint16_t r, uint16_t color);

This is relatively simple, center coordinates (x0, y0), radius r, color color

the case

tft.drawCircle(100,100,50,WHITE);
tft.fillCircle(100,260,50,BLUE);

7. Triangle

void drawTriangle(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color);
void fillTriangle(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color);

A triangle needs to determine three vertices and colors

the case

tft.drawTriangle(10,10,100,15,180,100,GREEN);
tft.fillTriangle(10,110,100,115,180,200,GREEN);

8. Character && English text

void drawChar(uint16_t x, uint16_t y, char c, uint16_t color, uint16_t bg, uint8_t size);
void setCursor(uint16_t x0, uint16_t y0);  //字体左上角顶点坐标
void setTextColor(uint16_t color); //字体前景色
void setTextColor(uint16_t color, uint16_t backgroundcolor);//字体前景色与背景色
void setTextSize(uint8_t size);  //字体大小放法因子
void setTextWrap(boolean w);    //是否自动换行,默认为true,滚动显示设置为false

drawChar can only display a single character, you need to determine the coordinates (x, y) of the upper left corner, the character c, the color color, the foreground color color, the background color bg, the size size, when the size is 1, it means 5 * 8 pixels, when it is 2, it means 10*16

Custom fonts do not support background color, you can draw shapes filled with color before this, such as rounded rectangles

the case

tft.fillScreen(GREEN);
tft.drawChar(150,10,'A',RED,WHITE,5);
tft.setCursor(10,50);
tft.print("AB 3.14");  //默认前景色white、无背景色、大小为1
tft.setCursor(10,80);
tft.setTextSize( 4);
tft.print("AB 3.14");
tft.setCursor(10,115);
tft.setTextColor(RED); //背景色不做设置
tft.setTextSize( 4);
tft.print("AB你好3.141516");
  tft.setCursor(10,180);
  tft.setTextColor(RED, WHITE);
tft.setTextSize( 4);
tft.setTextWrap(false);
tft.print("AB你好3.141516");

You can see that the default font does not support Chinese, you need to use Chinese and add it later

9. Rotate

void setRotation(uint8_t rotation);

The rotation parameter can be 0, 1, 2 or 3, corresponding to 0, 90, 180 or 270 degrees respectively.

For displays that are part of the Arduino shield, a rotation value of 0 sets the display to portrait (tall) mode, and a rotation value of 2 is also portrait mode. Rotation 1 is landscape mode, and rotation 3 is also landscape mode.

the case

//tft.setRotation(1); //注释和未注释的情况下做对比
tft.fillScreen(GREEN);
tft.drawChar(150,10,'A',RED,WHITE,5);
tft.setCursor(10,50);
tft.print("AB 3.14");  //默认前景色white、无背景色、大小为1
tft.setCursor(10,80);
tft.setTextSize( 4);
tft.print("AB 3.14");
tft.setCursor(10,115);
tft.setTextColor(RED); //背景色不做设置
tft.setTextSize( 4);
tft.print("AB你好3.141516");
  tft.setCursor(10,180);
  tft.setTextColor(RED, WHITE);
tft.setTextSize( 4);
tft.setTextWrap(false);
tft.print("AB你好3.141516");

  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

  实验一百五十三:2.4寸TFT液晶触摸屏 彩屏模块 TFT-LCD 高清真彩显示屏

  项目二十一:几何图形的点线面循环
/*

 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

 实验一百五十三:2.4寸TFT液晶触摸屏 彩屏模块 TFT-LCD 高清真彩显示屏

 项目二十一:几何图形的点线面循环

 模块直插,引脚用法如下:

 LCD_CS LCD_CD LCD_WR LCD_RD LCD_RST SD_SS SD_DI SD_DO SD_SCK

 Arduino Uno A3 A2 A1 A0 A4 10 11 12 13

 LCD_D0 LCD_D1 LCD_D2 LCD_D3 LCD_D4 LCD_D5 LCD_D6 LCD_D7

 Arduino Uno 8 9 2 3 4 5 6 7

*/

#include <Adafruit_GFX.h>  // Core graphics library

#include <Adafruit_TFTLCD.h> // Hardware-specific library

#include <TouchScreen.h>

#define LCD_CS A3

#define LCD_CD A2

#define LCD_WR A1

#define LCD_RD A0

#define LCD_RESET A4

Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);

#define BLACK  0x0000

#define BLUE  0x001F

#define RED   0xF800

#define GREEN  0x07E0

#define WHITE  0xFFFF

void setup(void) {
    
    

 tft.reset();

 tft.begin(0x9341);

 tft.fillScreen(BLACK);

}

void loop() {
    
    

 // 点

 tft.drawPixel(1, 1, RED);

 tft.drawPixel(10, 10, RED);

 tft.drawPixel(20, 20, RED);

 tft.drawPixel(40, 40, RED);

 tft.drawPixel(60, 60, RED);

 delay(500);

 // 线

 tft.drawFastHLine(10, 10, 170, RED);

 tft.drawFastVLine(10, 10, 170, RED);

 tft.drawLine(10, 10, 100, 180, RED);

 delay(500);

 // 矩形

 tft.drawRect(10, 10, 150, 100, RED);

 tft.fillRect(10, 120, 150, 100, RED);

 delay(500);

 // 圆角矩形

 tft.drawRoundRect(10, 10, 150, 100, 10, RED);

 tft.fillRoundRect(10, 120, 150, 100, 10, RED);

 delay(500);

 // 圆形

 tft.drawCircle(100, 100, 50, WHITE);

 tft.fillCircle(100, 260, 50, BLUE);

 delay(500);

 // 三角形

 tft.drawTriangle(10, 10, 100, 15, 180, 100, GREEN);

 tft.fillTriangle(10, 110, 100, 115, 180, 200, GREEN);

 delay(500);

 //旋转

 tft.setRotation(0);

 delay(500);

 //字符与文本

 tft.fillScreen(GREEN);

 tft.drawChar(150, 10, 'A', RED, WHITE, 5);

 tft.setCursor(10, 50);

 tft.print("AB 3.14");  //默认前景色white、无背景色、大小为1

 tft.setCursor(10, 80);

 tft.setTextSize( 4);

 tft.print("AB 3.14");

 tft.setCursor(10, 115);

 tft.setTextColor(RED); //背景色不做设置

 tft.setTextSize( 4);

 tft.print("AB 3.141516");

 tft.setCursor(10, 180);

 tft.setTextColor(RED, WHITE);

 tft.setTextSize( 4);

 tft.setTextWrap(false);

 tft.print("AB 3.141516");

 delay(500);

 //屏幕

 tft.fillScreen(BLACK);

 delay(1000);

 tft.fillScreen(GREEN);

 delay(1000);

 //旋转

 tft.setRotation(1);

 delay(500);

 tft.fillScreen(RED);

 delay(1000);

 tft.fillScreen(BLUE);

 delay(1000);

 //旋转

 tft.setRotation(2);

 delay(500);

 tft.fillScreen(BLACK);

 delay(1000);

 //旋转

 tft.setRotation(0);

 delay(500);

}

[Arduino] 168 sensor module series experiments (data code + simulation programming + graphics programming)

Experiment 156: 2.4-inch TFT LCD touch screen color screen module TFT-LCD high-definition true color display

Project 21: Point, Line and Surface Cycle of Geometric Figures

Experiment dynamic diagram https://imagemc.dfrobot.com.cn/data/attachment/forum/202107/08/065538kdc22d3yesy0b3uo.gif

insert image description here

[Arduino] 168 sensor module series experiments (data code + simulation programming + graphics programming)

Experiment 156: 2.4-inch TFT LCD touch screen color screen module TFT-LCD high-definition true color display

Project 22: Create a simple painting application using an Arduino 2.4 touchscreen

Experimental open source code

/*

 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

 实验一百五十三:2.4寸TFT液晶触摸屏 彩屏模块 TFT-LCD 高清真彩显示屏

 项目二十二:使用 Arduino 2.4 触摸屏创建简易绘画应用程序

 模块直插,引脚用法如下:

 LCD_CS LCD_CD LCD_WR LCD_RD LCD_RST SD_SS SD_DI SD_DO SD_SCK

 Arduino Uno A3 A2 A1 A0 A4 10 11 12 13

 LCD_D0 LCD_D1 LCD_D2 LCD_D3 LCD_D4 LCD_D5 LCD_D6 LCD_D7

 Arduino Uno 8 9 2 3 4 5 6 7

*/

#include <Adafruit_GFX.h>

#include <Adafruit_TFTLCD.h>

#include <TouchScreen.h>

#if defined(__SAM3X8E__)

#undef __FlashStringHelper::F(string_literal)

#define F(string_literal) string_literal

#endif

#define YP A2

#define XM A1

#define YM 6

#define XP 7

#define TS_MINX 150

#define TS_MINY 120

#define TS_MAXX 920

#define TS_MAXY 940

TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);

#define LCD_CS A3

#define LCD_CD A2

#define LCD_WR A1

#define LCD_RD A0

#define LCD_RESET A4

#define BLACK  0x0000

#define BLUE  0x001F

#define RED   0xF800

#define GREEN  0x07E0

#define CYAN  0x07FF

#define MAGENTA 0xF81F

#define YELLOW 0xFFE0

#define WHITE  0xFFFF

Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);

#define BOXSIZE 40

#define PENRADIUS 3

int oldcolor, currentcolor;

void setup(void) {
    
    

 Serial.begin(9600);

 tft.reset();

 tft.begin(0x9341);

 tft.fillScreen(BLACK);

 tft.fillRect(0, 0, BOXSIZE, BOXSIZE, RED);

 tft.fillRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, YELLOW);

 tft.fillRect(BOXSIZE * 2, 0, BOXSIZE, BOXSIZE, GREEN);

 tft.fillRect(BOXSIZE * 3, 0, BOXSIZE, BOXSIZE, CYAN);

 tft.fillRect(BOXSIZE * 4, 0, BOXSIZE, BOXSIZE, BLUE);

 tft.fillRect(BOXSIZE * 5, 0, BOXSIZE, BOXSIZE, MAGENTA);

 tft.drawRect(0, 0, BOXSIZE, BOXSIZE, WHITE);

 currentcolor = RED;

 pinMode(13, OUTPUT);

}

#define MINPRESSURE 10

#define MAXPRESSURE 1000

void loop() {
    
    

 digitalWrite(13, HIGH);

 TSPoint p = ts.getPoint();

 digitalWrite(13, LOW);

 pinMode(XM, OUTPUT);

 pinMode(YP, OUTPUT);

 if (p.z > MINPRESSURE && p.z < MAXPRESSURE) {
    
    

  if (p.y < (TS_MINY - 5)) {
    
    

   tft.fillRect(0, BOXSIZE, tft.width(), tft.height() - BOXSIZE, BLACK);

  }

  p.x = map(p.x, TS_MINX, TS_MAXX, tft.width(), 0);

  p.y = map(p.y, TS_MINY, TS_MAXY, tft.height(), 0);

  if (p.y < BOXSIZE) {
    
    

   oldcolor = currentcolor;

   if (p.x < BOXSIZE) {
    
    

    currentcolor = RED;

    tft.drawRect(0, 0, BOXSIZE, BOXSIZE, WHITE);

   } else if (p.x < BOXSIZE * 2) {
    
    

    currentcolor = YELLOW;

    tft.drawRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, WHITE);

   } else if (p.x < BOXSIZE * 3) {
    
    

    currentcolor = GREEN;

    tft.drawRect(BOXSIZE * 2, 0, BOXSIZE, BOXSIZE, WHITE);

   } else if (p.x < BOXSIZE * 4) {
    
    

    currentcolor = CYAN;

    tft.drawRect(BOXSIZE * 3, 0, BOXSIZE, BOXSIZE, WHITE);

   } else if (p.x < BOXSIZE * 5) {
    
    

    currentcolor = BLUE;

    tft.drawRect(BOXSIZE * 4, 0, BOXSIZE, BOXSIZE, WHITE);

   } else if (p.x < BOXSIZE * 6) {
    
    

    currentcolor = MAGENTA;

    tft.drawRect(BOXSIZE * 5, 0, BOXSIZE, BOXSIZE, WHITE);

   } if (oldcolor != currentcolor) {
    
    

    if (oldcolor == RED) tft.fillRect(0, 0, BOXSIZE, BOXSIZE, RED);

    if (oldcolor == YELLOW) tft.fillRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, YELLOW);

    if (oldcolor == GREEN) tft.fillRect(BOXSIZE * 2, 0, BOXSIZE, BOXSIZE, GREEN);

    if (oldcolor == CYAN) tft.fillRect(BOXSIZE * 3, 0, BOXSIZE, BOXSIZE, CYAN);

    if (oldcolor == BLUE) tft.fillRect(BOXSIZE * 4, 0, BOXSIZE, BOXSIZE, BLUE);

    if (oldcolor == MAGENTA) tft.fillRect(BOXSIZE * 5, 0, BOXSIZE, BOXSIZE, MAGENTA);

   }

  } if (((p.y - PENRADIUS) > BOXSIZE) && ((p.y + PENRADIUS) < tft.height())) {
    
    

   tft.fillCircle(p.x, p.y, PENRADIUS, currentcolor);

  }

 }

 tft.setRotation(3);

}

[Arduino] 168 sensor module series experiments (data code + simulation programming + graphics programming)

Experiment 153: 2.4-inch TFT LCD touch screen color screen module TFT-LCD high-definition true color display

Project 22: Create a simple painting application using an Arduino 2.4 touchscreen

Experimental scene graph

insert image description here
[Arduino] 168 sensor module series experiments (data code + simulation programming + graphics programming)

Experiment 153: 2.4-inch TFT LCD touch screen color screen module TFT-LCD high-definition true color display

Project Twenty Three: A Minimalist Switch Board with Two Buttons

Experimental open source code

/*

 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

  实验一百五十三:2.4寸TFT液晶触摸屏 彩屏模块 TFT-LCD 高清真彩显示屏

 项目二十三:两个按钮的极简开关板

 模块直插,引脚用法如下:

 LCD_CS LCD_CD LCD_WR LCD_RD LCD_RST SD_SS SD_DI SD_DO SD_SCK

 Arduino Uno A3 A2 A1 A0 A4 10 11 12 13

 LCD_D0 LCD_D1 LCD_D2 LCD_D3 LCD_D4 LCD_D5 LCD_D6 LCD_D7

 Arduino Uno 8 9 2 3 4 5 6 7

*/

#if 1

#include <Adafruit_GFX.h>

#include <MCUFRIEND_kbv.h>

MCUFRIEND_kbv tft;

#include <TouchScreen.h>

#define MINPRESSURE 200

#define MAXPRESSURE 1000

// 所有触摸屏和接线都是不同的

const int XP = 6, XM = A2, YP = A1, YM = 7; //ID=0x9341

const int TS_LEFT = 907, TS_RT = 136, TS_TOP = 942, TS_BOT = 139;

TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);

Adafruit_GFX_Button on_btn, off_btn;

int pixel_x, pixel_y;   //更新全局变量

bool Touch_getXY(void) {
    
    

 TSPoint p = ts.getPoint();

 pinMode(YP, OUTPUT);   //恢复共享引脚

 pinMode(XM, OUTPUT);

 digitalWrite(YP, HIGH);  //因为 TFT 控制引脚

 digitalWrite(XM, HIGH);

 bool pressed = (p.z > MINPRESSURE && p.z < MAXPRESSURE);

 if (pressed) {
    
    

  pixel_x = map(p.x, TS_LEFT, TS_RT, 0, tft.width()); //kbv 对我有意义

  pixel_y = map(p.y, TS_TOP, TS_BOT, 0, tft.height());

 }

 return pressed;

}

#define BLACK  0x0000

#define BLUE  0x001F

#define RED   0xF800

#define GREEN  0x07E0

#define CYAN  0x07FF

#define MAGENTA 0xF81F

#define YELLOW 0xFFE0

#define WHITE  0xFFFF

void setup(void) {
    
    

 Serial.begin(9600);

 tft.reset();

 tft.begin(0x9341);

 tft.fillScreen(BLACK);

 tft.setRotation(2); // 翻转180度,对应硬件

 delay(500);

 on_btn.initButton(&tft, 60, 200, 100, 40, WHITE, CYAN, BLACK, "ON", 2);

 off_btn.initButton(&tft, 180, 200, 100, 40, WHITE, CYAN, BLACK, "OFF", 2);

 on_btn.drawButton(false);

 off_btn.drawButton(false);

 tft.fillRect(40, 80, 160, 80, RED);

}

// 两个按钮很简单

void loop(void) {
    
    

 bool down = Touch_getXY();

 on_btn.press(down && on_btn.contains(pixel_x, pixel_y));

 off_btn.press(down && off_btn.contains(pixel_x, pixel_y));

 if (on_btn.justReleased())

  on_btn.drawButton();

 if (off_btn.justReleased())

  off_btn.drawButton();

 if (on_btn.justPressed()) {
    
    

  on_btn.drawButton(true);

  tft.fillRect(40, 80, 160, 80, GREEN);

 }

 if (off_btn.justPressed()) {
    
    

  off_btn.drawButton(true);

  tft.fillRect(40, 80, 160, 80, RED);

 }

}

#endif


[Arduino] 168 sensor module series experiments (data code + simulation programming + graphics programming)

Experiment 153: 2.4-inch TFT LCD touch screen color screen module TFT-LCD high-definition true color display

Project Twenty Three: A Minimalist Switch Board with Two Buttons

Arduino experiment scene diagram

insert image description here
[Arduino] 168 sensor module series experiments (data code + simulation programming + graphics programming)

Experiment 153: 2.4-inch TFT LCD touch screen color screen module TFT-LCD high-definition true color display

Item 24: Dynamic Ring Percentage Chart

Experimental open source code

/*

 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

  实验一百五十三:2.4寸TFT液晶触摸屏 彩屏模块 TFT-LCD 高清真彩显示屏

 项目二十四:动态环形百分比图表

 模块直插,引脚用法如下:

 LCD_CS LCD_CD LCD_WR LCD_RD LCD_RST SD_SS SD_DI SD_DO SD_SCK

 Arduino Uno A3 A2 A1 A0 A4 10 11 12 13

 LCD_D0 LCD_D1 LCD_D2 LCD_D3 LCD_D4 LCD_D5 LCD_D6 LCD_D7

 Arduino Uno 8 9 2 3 4 5 6 7

*/

#include "Adafruit_GFX.h"

#include "MCUFRIEND_kbv.h"

#include "Temperature.h"

MCUFRIEND_kbv tft;

#define PI 3.1415926535897932384626433832795

int n, f;

int j, j2;

int i, i2;

int pct = 0;

int d[5] = {
    
    10, 60, 16, 9, 10};

uint16_t col[5] = {
    
    0x7006, 0xF986, 0x6905, 0x7FF7, 0x024D};

void setup() {
    
    

 tft.reset();

 Serial.begin(9600);

 tft.begin(0x9341);

 tft.invertDisplay(true);

 tft.setTextSize(2);

}

void loop() {
    
    

 tft.fillScreen(0x0042);

 tft.setRotation(1);

 for (int p = 0; p < 4000; p++) {
    
    

  j = 120 * (sin(PI * p / 2000));

  i = 120 * (cos(PI * p / 2000));

  j2 = 60 * (sin(PI * p / 2000));

  i2 = 60 * (cos(PI * p / 2000));

  tft.drawLine(i2 + 160, j2 + 160, i + 160, j + 160, col[n]);

 }

 n = 0;

 for (int a = 0; a < 5; a++) {
    
    

  pct += d[n] * 40;

  f = 4000 - pct;

  for (int b = 0; b < f; b++) {
    
    

   j = 120 * (sin(PI * b / 2000));

   i = 120 * (cos(PI * b / 2000));

   j2 = 60 * (sin(PI * b / 2000));

   i2 = 60 * (cos(PI * b / 2000));

   tft.drawLine(i2 + 160, j2 + 160, i + 160, j + 160, col[n + 1]);

  }

  tft.fillCircle(380, 100 + (30 * n), 10, col[n]);

  tft.setTextColor(0xffff);

  tft.setCursor(400, 94 + (30 * n));

  tft.print(d[n]); tft.print("%");

  n++;

 }

 while (1);

}


Item 24: Dynamic Ring Percentage Chart

Arduino experiment scene diagram

insert image description here
[Arduino] 168 sensor module series experiments (data code + simulation programming + graphics programming)

Experiment 153: 2.4-inch TFT LCD touch screen color screen module TFT-LCD high-definition true color display

Project 25: Display touch screen phone panel

Experimental open source code

/*

 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

  实验一百五十三:2.4寸TFT液晶触摸屏 彩屏模块 TFT-LCD 高清真彩显示屏

 项目二十五:显示触摸屏电话面板

 模块直插,引脚用法如下:

 LCD_CS LCD_CD LCD_WR LCD_RD LCD_RST SD_SS SD_DI SD_DO SD_SCK

 Arduino Uno A3 A2 A1 A0 A4 10 11 12 13

 LCD_D0 LCD_D1 LCD_D2 LCD_D3 LCD_D4 LCD_D5 LCD_D6 LCD_D7

 Arduino Uno 8 9 2 3 4 5 6 7

*/

#include <TouchScreen.h> //导入触摸库

#include <LCDWIKI_GUI.h> //Core graphics library

#include <LCDWIKI_KBV.h> //Hardware-specific library

//if the IC model is known or the modules is unreadable,you can use this constructed function

LCDWIKI_KBV my_lcd(ILI9341, A3, A2, A1, A0, A4); //model,cs,cd,wr,rd,reset

//if the IC model is not known and the modules is readable,you can use this constructed function

//LCDWIKI_KBV my_lcd(240,320,A3,A2,A1,A0,A4);//width,height,cs,cd,wr,rd,reset

/* r   g  b */

#define BLACK    0x0000 /*  0,  0,  0 */

#define BLUE     0x001F /*  0,  0, 255 */

#define RED     0xF800 /* 255,  0,  0 */

#define GREEN    0x07E0 /*  0, 255,  0 */

#define CYAN     0x07FF /*  0, 255, 255 */

#define MAGENTA   0xF81F /* 255,  0, 255 */

#define YELLOW    0xFFE0 /* 255, 255,  0 */

#define WHITE    0xFFFF /* 255, 255, 255 */

#define NAVY     0x000F /*  0,  0, 128 */

#define DARKGREEN  0x03E0 /*  0, 128,  0 */

#define DARKCYAN   0x03EF /*  0, 128, 128 */

#define MAROON    0x7800 /* 128,  0,  0 */

#define PURPLE    0x780F /* 128,  0, 128 */

#define OLIVE    0x7BE0 /* 128, 128,  0 */

#define LIGHTGREY  0xC618 /* 192, 192, 192 */

#define DARKGREY   0x7BEF /* 128, 128, 128 */

#define ORANGE    0xFD20 /* 255, 165,  0 */

#define GREENYELLOW 0xAFE5 /* 173, 255, 47 */

#define PINK     0xF81F /* 255,  0, 255 */

/******************* UI details */

#define BUTTON_R 25 //the radius of button 

#define BUTTON_SPACING_X 25 //the horizontal distance between button

#define BUTTON_SPACING_Y 5 //the vertical distance between button

#define EDG_Y 5 //lower edge distance 

#define EDG_X 20 //left and right distance

#define YP A2 // must be an analog pin, use "An" notation!

#define XM A1 // must be an analog pin, use "An" notation!

#define YM 6  // can be a digital pin

#define XP 7  // can be a digital pin

//X 的触摸灵敏度

#define TS_MINX 124

#define TS_MAXX 906

//Y 的触摸灵敏度

#define TS_MINY 83

#define TS_MAXY 893

// 有一个状态行,例如 FONA 是否在工作

#define STATUS_X 10

#define STATUS_Y 65

//按下时的触摸灵敏度

#define MINPRESSURE 10

#define MAXPRESSURE 1000

TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);

typedef struct _button_info {
    
    

 uint8_t button_name[10];

 uint8_t button_name_size;

 uint16_t button_name_colour;

 uint16_t button_colour;

 uint16_t button_x;

 uint16_t button_y;

} button_info;

//按钮的定义

button_info phone_button[15] = {
    
    

 "1", 3, BLACK, CYAN, EDG_X + BUTTON_R - 1, my_lcd.Get_Display_Height() - EDG_Y - 4 * BUTTON_SPACING_Y - 9 * BUTTON_R - 1,

 "2", 3, BLACK, CYAN, EDG_X + 3 * BUTTON_R + BUTTON_SPACING_X - 1, my_lcd.Get_Display_Height() - EDG_Y - 4 * BUTTON_SPACING_Y - 9 * BUTTON_R - 1,

 "3", 3, BLACK, CYAN, EDG_X + 5 * BUTTON_R + 2 * BUTTON_SPACING_X - 1, my_lcd.Get_Display_Height() - EDG_Y - 4 * BUTTON_SPACING_Y - 9 * BUTTON_R - 1,

 "4", 3, BLACK, CYAN, EDG_X + BUTTON_R - 1, my_lcd.Get_Display_Height() - EDG_Y - 3 * BUTTON_SPACING_Y - 7 * BUTTON_R - 1,

 "5", 3, BLACK, CYAN, EDG_X + 3 * BUTTON_R + BUTTON_SPACING_X - 1, my_lcd.Get_Display_Height() - EDG_Y - 3 * BUTTON_SPACING_Y - 7 * BUTTON_R - 1,

 "6", 3, BLACK, CYAN, EDG_X + 5 * BUTTON_R + 2 * BUTTON_SPACING_X - 1, my_lcd.Get_Display_Height() - EDG_Y - 3 * BUTTON_SPACING_Y - 7 * BUTTON_R - 1,

 "7", 3, BLACK, CYAN, EDG_X + BUTTON_R - 1, my_lcd.Get_Display_Height() - EDG_Y - 2 * BUTTON_SPACING_Y - 5 * BUTTON_R - 1,

 "8", 3, BLACK, CYAN, EDG_X + 3 * BUTTON_R + BUTTON_SPACING_X - 1, my_lcd.Get_Display_Height() - EDG_Y - 2 * BUTTON_SPACING_Y - 5 * BUTTON_R - 1,

 "9", 3, BLACK, CYAN, EDG_X + 5 * BUTTON_R + 2 * BUTTON_SPACING_X - 1, my_lcd.Get_Display_Height() - EDG_Y - 2 * BUTTON_SPACING_Y - 5 * BUTTON_R - 1,

 "*", 3, BLACK, PINK, EDG_X + BUTTON_R - 1, my_lcd.Get_Display_Height() - EDG_Y - BUTTON_SPACING_Y - 3 * BUTTON_R - 1,

 "0", 3, BLACK, CYAN, EDG_X + 3 * BUTTON_R + BUTTON_SPACING_X - 1, my_lcd.Get_Display_Height() - EDG_Y - BUTTON_SPACING_Y - 3 * BUTTON_R - 1,

 "#", 3, BLACK, PINK, EDG_X + 5 * BUTTON_R + 2 * BUTTON_SPACING_X - 1, my_lcd.Get_Display_Height() - EDG_Y - BUTTON_SPACING_Y - 3 * BUTTON_R - 1,

 "end", 2, BLACK, RED, EDG_X + BUTTON_R - 1, my_lcd.Get_Display_Height() - EDG_Y - BUTTON_R - 1,

 "call", 2, BLACK, GREEN, EDG_X + 3 * BUTTON_R + BUTTON_SPACING_X - 1, my_lcd.Get_Display_Height() - EDG_Y - BUTTON_R - 1,

 "dele", 2, BLACK, LIGHTGREY, EDG_X + 5 * BUTTON_R + 2 * BUTTON_SPACING_X - 1, my_lcd.Get_Display_Height() - EDG_Y - BUTTON_R - 1,

};

//显示字符串

void show_string(uint8_t *str, int16_t x, int16_t y, uint8_t csize, uint16_t fc, uint16_t bc, boolean mode) {
    
    

 my_lcd.Set_Text_Mode(mode);

 my_lcd.Set_Text_Size(csize);

 my_lcd.Set_Text_colour(fc);

 my_lcd.Set_Text_Back_colour(bc);

 my_lcd.Print_String(str, x, y);

}

//检查是否按下

boolean is_pressed(int16_t x1, int16_t y1, int16_t x2, int16_t y2, int16_t px, int16_t py) {
    
    

 if ((px > x1 && px < x2) && (py > y1 && py < y2))

 {
    
    

  return true;

 }

 else

 {
    
    

  return false;

 }

}

//显示主菜单

void show_menu(void)

{
    
    

 uint16_t i;

 for (i = 0; i < sizeof(phone_button) / sizeof(button_info); i++)

 {
    
    

  my_lcd.Set_Draw_color(phone_button[i].button_colour);

  my_lcd.Fill_Circle(phone_button[i].button_x, phone_button[i].button_y, BUTTON_R);

  show_string(phone_button[i].button_name, phone_button[i].button_x - strlen(phone_button[i].button_name)*phone_button[i].button_name_size * 6 / 2 + 1, phone_button[i].button_y - phone_button[i].button_name_size * 8 / 2 + 1, phone_button[i].button_name_size, phone_button[i].button_name_colour, BLACK, 1);

 }

 my_lcd.Set_Draw_color(BLACK);

 my_lcd.Fill_Rectangle(1, 1, my_lcd.Get_Display_Width() - 2, 3);

 my_lcd.Fill_Rectangle(1, 29, my_lcd.Get_Display_Width() - 2, 31);

 my_lcd.Fill_Rectangle(1, 1, 3, 31);

 my_lcd.Fill_Rectangle(my_lcd.Get_Display_Width() - 4, 1, my_lcd.Get_Display_Width() - 2, 31);

}

void setup(void) {
    
    

 Serial.begin(9600);

 my_lcd.Init_LCD();

 Serial.println(my_lcd.Read_ID(), HEX);

 my_lcd.Fill_Screen(BLUE);

 show_menu();

}

uint16_t text_x = 10, text_y = 6, text_x_add = 6 * phone_button[0].button_name_size, text_y_add = 8 * phone_button[0].button_name_size;

uint16_t n = 0;

void loop(void) {
    
    

 uint16_t i;

 digitalWrite(13, HIGH);

 TSPoint p = ts.getPoint();

 digitalWrite(13, LOW);

 pinMode(XM, OUTPUT);

 pinMode(YP, OUTPUT);

 if (p.z > MINPRESSURE && p.z < MAXPRESSURE)

 {
    
    

  //p.x = my_lcd.Get_Display_Width()-map(p.x, TS_MINX, TS_MAXX, my_lcd.Get_Display_Width(), 0);

  //p.y = my_lcd.Get_Display_Height()-map(p.y, TS_MINY, TS_MAXY, my_lcd.Get_Display_Height(), 0);

  p.x = map(p.x, TS_MINX, TS_MAXX, 0, my_lcd.Get_Display_Width());

  p.y = map(p.y, TS_MINY, TS_MAXY, 0, my_lcd.Get_Display_Height());

  // }

  for (i = 0; i < sizeof(phone_button) / sizeof(button_info); i++) {
    
    

   //按下按钮

   if (is_pressed(phone_button[i].button_x - BUTTON_R, phone_button[i].button_y - BUTTON_R, phone_button[i].button_x + BUTTON_R, phone_button[i].button_y + BUTTON_R, p.x, p.y))

   {
    
    

    my_lcd.Set_Draw_color(DARKGREY);

    my_lcd.Fill_Circle(phone_button[i].button_x, phone_button[i].button_y, BUTTON_R);

    show_string(phone_button[i].button_name, phone_button[i].button_x - strlen(phone_button[i].button_name)*phone_button[i].button_name_size * 6 / 2 + 1, phone_button[i].button_y - phone_button[i].button_name_size * 8 / 2 + 1, phone_button[i].button_name_size, WHITE, BLACK, 1);

    delay(100);

    my_lcd.Set_Draw_color(phone_button[i].button_colour);

    my_lcd.Fill_Circle(phone_button[i].button_x, phone_button[i].button_y, BUTTON_R);

    show_string(phone_button[i].button_name, phone_button[i].button_x - strlen(phone_button[i].button_name)*phone_button[i].button_name_size * 6 / 2 + 1, phone_button[i].button_y - phone_button[i].button_name_size * 8 / 2 + 1, phone_button[i].button_name_size, phone_button[i].button_name_colour, BLACK, 1);

    if (i < 12)

    {
    
    

     if (n < 13)

     {
    
    

      show_string(phone_button[i].button_name, text_x, text_y, phone_button[i].button_name_size, GREENYELLOW, BLACK, 1);

      text_x += text_x_add - 1;

      n++;

     }

    }

    else if (12 == i) //节目通话结束

    {
    
    

     my_lcd.Set_Draw_color(BLUE);

     my_lcd.Fill_Rectangle(0, 33, my_lcd.Get_Display_Width() - 1, 42);

     show_string("Calling ended", CENTER, 33, 1, OLIVE, BLACK, 1);

    }

    else if (13 == i) //显示呼叫

    {
    
    

     my_lcd.Set_Draw_color(BLUE);

     my_lcd.Fill_Rectangle(0, 33, my_lcd.Get_Display_Width() - 1, 42);

     show_string("Calling...", CENTER, 33, 1, OLIVE, BLACK, 1);

    }

    else if (14 == i) //删除按钮

    {
    
    

     if (n > 0)

     {
    
    

      my_lcd.Set_Draw_color(BLUE);

      text_x -= (text_x_add - 1);

      my_lcd.Fill_Rectangle(text_x, text_y, text_x + text_x_add - 1, text_y + text_y_add - 2);

      n--;

     }

    }

   }

  }

 }

}

[Arduino] 168 sensor module series experiments (data code + simulation programming + graphics programming)

Experiment 153: 2.4-inch TFT LCD touch screen color screen module TFT-LCD high-definition true color display

Project 25: Display touch screen phone panel

Experimental scene graph

insert image description here
[Arduino] 168 sensor module series experiments (data code + simulation programming + graphics programming)

Experiment 153: 2.4-inch TFT LCD touch screen color screen module TFT-LCD high-definition true color display

Item 26: Display Dynamic Chinese—Welcome to Shenzhen

Experimental open source code

/*

 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

 实验一百五十三:2.4寸TFT液晶触摸屏 彩屏模块 TFT-LCD 高清真彩显示屏

 项目二十六:显示动态中文——深圳市欢迎您

 模块直插,引脚用法如下:

 LCD_CS LCD_CD LCD_WR LCD_RD LCD_RST SD_SS SD_DI SD_DO SD_SCK

 Arduino Uno A3 A2 A1 A0 A4 10 11 12 13

 LCD_D0 LCD_D1 LCD_D2 LCD_D3 LCD_D4 LCD_D5 LCD_D6 LCD_D7

 Arduino Uno 8 9 2 3 4 5 6 7

*/

#include <LCDWIKI_GUI.h> //Core graphics library

#include <LCDWIKI_KBV.h> //Hardware-specific library

#include "font.h"

//if the IC model is known or the modules is unreadable,you can use this constructed function

LCDWIKI_KBV my_lcd(ILI9341, A3, A2, A1, A0, A4); //model,cs,cd,wr,rd,reset

//if the IC model is not known and the modules is readable,you can use this constructed function

//LCDWIKI_KBV my_lcd(240,320,A3,A2,A1,A0,A4);//width,height,cs,cd,wr,rd,reset

#define BLACK  0x0000

#define BLUE  0x001F

#define RED   0xF800

#define GREEN  0x07E0

#define CYAN  0x07FF

#define MAGENTA 0xF81F

#define YELLOW 0xFFE0

#define WHITE  0xFFFF

char *aspect_name[] = {
    
    "PORTRAIT", "LANDSCAPE", "PORTRAIT_REV", "LANDSCAPE_REV"};

char *color_name[] = {
    
     "BLUE", "GREEN", "RED", "WHITE" , "CYAN", "MAGENTA", "YELLOW"};

uint16_t color_mask[] = {
    
     0x001F, 0x07E0, 0xF800, 0xFFFF, 0x07FF, 0xF81F, 0xFFE0 };

void show_16font(uint16_t x, uint16_t y, uint16_t fc, uint16_t bc, uint8_t *str, uint8_t mode)

{
    
    

 uint16_t i, j, k, c_num, color = 0;

 boolean first = true;

 c_num = sizeof(tfont16) / sizeof(typFNT_GB16);

 for (k = 0; k < c_num; k++)

 {
    
     //pgm_read_byte

  if ((pgm_read_byte(&tfont16[k].Index[0]) == *str) && (pgm_read_byte(&tfont16[k].Index[1]) == *(str + 1)))

  {
    
    

   my_lcd.Set_Addr_Window(x, y, x + 16 - 1, y + 16 - 1);

   for (j = 0; j < 32; j++)

   {
    
    

    for (i = 0; i < 8; i++)

    {
    
    

     if (mode) //叠加模式

     {
    
    

      if (pgm_read_byte(&tfont16[k].Msk[j]) & (0x80 >> i))

      {
    
    

       my_lcd.Set_Draw_color(fc);

       my_lcd.Draw_Pixel(x + ((j * 8 + i) % 16), y + ((j * 8 + i) / 16));

      }

      // x++;

      // if((x-x0)==16)

      // {
    
    

      //   x = x0;

      //   y++;

      // }

     }

     else  //非叠加模式

     {
    
    

      if (pgm_read_byte(&tfont16[k].Msk[j]) & (0x80 >> i))

      {
    
    

       color = fc;

      }

      else

      {
    
    

       color = bc;

      }

      my_lcd.Push_Any_Color(&color, 1, first, 0);

      first = false;

     }

    }

   }

  }

 }

}

void show_24font(uint16_t x, uint16_t y, uint16_t fc, uint16_t bc, uint8_t *str, uint8_t mode)

{
    
    

 uint16_t i, j, k, c_num, color;

 boolean first = true;

 c_num = sizeof(tfont24) / sizeof(typFNT_GB24);

 for (k = 0; k < c_num; k++)

 {
    
    

  if ((pgm_read_byte(&tfont24[k].Index[0]) == *str) && (pgm_read_byte(&tfont24[k].Index[1]) == *(str + 1)))

  {
    
    

   my_lcd.Set_Addr_Window(x, y, x + 24 - 1, y + 24 - 1);

   for (j = 0; j < 72; j++)

   {
    
    

    for (i = 0; i < 8; i++)

    {
    
    

     if (mode) //叠加模式

     {
    
    

      if (pgm_read_byte(&tfont24[k].Msk[j]) & (0x80 >> i))

      {
    
    

       my_lcd.Set_Draw_color(fc);

       my_lcd.Draw_Pixel(x + ((j * 8 + i) % 24), y + ((j * 8 + i) / 24));

      }

      //  x++;

      //  if((x-x0)==32)

      //  {
    
    

      //   x = x0;

      //   y++;

      //  }

     }

     else  //非叠加模式

     {
    
    

      if (pgm_read_byte(&tfont24[k].Msk[j]) & (0x80 >> i))

      {
    
    

       color = fc;

      }

      else

      {
    
    

       color = bc;

      }

      my_lcd.Push_Any_Color(&color, 1, first, 0);

      first = false;

     }

    }

   }

  }

 }

}

void show_32font(uint16_t x, uint16_t y, uint16_t fc, uint16_t bc, uint8_t *str, uint8_t mode)

{
    
    

 uint16_t i, j, k, c_num, color;

 boolean first = true;

 c_num = sizeof(tfont32) / sizeof(typFNT_GB32);

 for (k = 0; k < c_num; k++)

 {
    
    

  if ((pgm_read_byte(&tfont32[k].Index[0]) == *str) && (pgm_read_byte(&tfont32[k].Index[1]) == *(str + 1)))

  {
    
    

   my_lcd.Set_Addr_Window(x, y, x + 32 - 1, y + 32 - 1);

   for (j = 0; j < 128; j++)

   {
    
    

    for (i = 0; i < 8; i++)

    {
    
    

     if (mode) //叠加模式

     {
    
    

      if (pgm_read_byte(&tfont32[k].Msk[j]) & (0x80 >> i))

      {
    
    

       my_lcd.Set_Draw_color(fc);

       my_lcd.Draw_Pixel(x + ((j * 8 + i) % 32), y + ((j * 8 + i) / 32));

      }

      // x++;

      //  if((x-x0)==32)

      // {
    
    

      //   x = x0;

      //   y++;

      // }

     }

     else  //非叠加模式

     {
    
    

      if (pgm_read_byte(&tfont32[k].Msk[j]) & (0x80 >> i))

      {
    
    

       color = fc;

      }

      else

      {
    
    

       color = bc;

      }

      my_lcd.Push_Any_Color(&color, 1, first, 0);

      first = false;

     }

    }

   }

  }

 }

}

void show_chinese(uint16_t x, uint16_t y, uint16_t fc, uint16_t bc, uint8_t *str, uint16_t csize, uint8_t mode)

{
    
    

 int i = 0;

 if (x > (my_lcd.Get_Display_Width() - csize) || y > (my_lcd.Get_Display_Height() - csize))

 {
    
    

  return;

 }

 while (*str != '\0')

 {
    
    

  //   i += 5;

  //   my_lcd.Draw_Fast_VLine(i, 10, 100);

  if (csize == 32)

  {
    
    

   show_32font(x, y, fc, bc, str, mode);

  }

  else if (csize == 24)

  {
    
    

   show_24font(x, y, fc, bc, str, mode);

  }

  else

  {
    
    

   show_16font(x, y, fc, bc, str, mode);

  }

  str += 3;

  x += csize;

 }

}

void show_chinese_test(void)

{
    
    

 uint16_t i;

 my_lcd.Set_Rotation(1);

 show_chinese(0, 10, RED, BLACK, "深圳市欢迎您", 16, 1);

 show_chinese(0, 26, RED, BLACK, "深圳市欢迎您", 24, 1);

 show_chinese(0, 50, RED, BLACK, "深圳市欢迎您", 32, 1);

 show_chinese(0, 82, GREEN, BLACK, "深圳市欢迎您", 16, 1);

 show_chinese(0, 98, GREEN, BLACK, "深圳市欢迎您", 24, 1);

 show_chinese(0, 122, GREEN, BLACK, "深圳市欢迎您", 32, 1);

 show_chinese(0, 154, BLUE, BLACK, "深圳市欢迎您", 16, 1);

 show_chinese(0, 170, BLUE, BLACK, "深圳市欢迎您", 24, 1);

 show_chinese(0, 194, BLUE, BLACK, "深圳市欢迎您", 32, 1);

 for (i = 1; i <= my_lcd.Get_Display_Width(); i++)

 {
    
    

  my_lcd.Vert_Scroll(0, my_lcd.Get_Display_Width(), i);

  delay(10);

 }

 delay(2000);

 my_lcd.Fill_Screen(BLACK);

 show_chinese(0, 10, RED, WHITE, "深圳市欢迎您", 16, 0);

 show_chinese(0, 26, RED, WHITE, "深圳市欢迎您", 24, 0);

 show_chinese(0, 50, RED, WHITE, "深圳市欢迎您", 32, 0);

 show_chinese(0, 82, GREEN, WHITE, "深圳市欢迎您", 16, 0);

 show_chinese(0, 98, GREEN, WHITE, "深圳市欢迎您", 24, 0);

 show_chinese(0, 122, GREEN, WHITE, "深圳市欢迎您", 32, 0);

 show_chinese(0, 154, BLUE, WHITE, "深圳市欢迎您", 16, 0);

 show_chinese(0, 170, BLUE, WHITE, "深圳市欢迎您", 24, 0);

 show_chinese(0, 194, BLUE, WHITE, "深圳市欢迎您", 32, 0);

 delay(1000);

}

void show_pic(void)

{
    
    

 int i;

 my_lcd.Set_Addr_Window(my_lcd.Get_Display_Width() - 40 - 40, 20, my_lcd.Get_Display_Width() - 40 - 1, 59);

 my_lcd.Push_Any_Color(penguin_pic, 1600, 1, 1);

}

void windowScroll(int16_t x, int16_t y, int16_t wid, int16_t ht, int16_t dx, int16_t dy, uint16_t *buf)

{
    
    

 if (dx)

 {
    
    

  for (int16_t row = 0; row < ht; row++)

  {
    
    

   my_lcd.Read_GRAM(x, y + row, buf, wid, 1);

   my_lcd.Set_Addr_Window(x, y + row, x + wid - 1, y + row);

   my_lcd.Push_Any_Color(buf + dx, wid - dx, 1, 0);

   my_lcd.Push_Any_Color(buf + 0, dx, 0, 0);

  }

 }

 if (dy)

 {
    
    

  for (int16_t col = 0; col < wid; col++)

  {
    
    

   my_lcd.Read_GRAM(x + col, y, buf, 1, ht);

   my_lcd.Set_Addr_Window(x + col, y, x + col, y + ht - 1);

   my_lcd.Push_Any_Color(buf + dy, ht - dy, 1, 0);

   my_lcd.Push_Any_Color(buf + 0, dy, 0, 0);

  }

 }

}

void show_string(uint8_t *str, int16_t x, int16_t y, uint8_t csize, uint16_t fc, uint16_t bc, boolean mode)

{
    
    

 my_lcd.Set_Text_Mode(mode);

 my_lcd.Set_Text_Size(csize);

 my_lcd.Set_Text_colour(fc);

 my_lcd.Set_Text_Back_colour(bc);

 my_lcd.Print_String(str, x, y);

}

void color_test()

{
    
    

 int n, i;

 int cnum = sizeof(color_mask) / sizeof(uint16_t);

 for (i = 0; i < cnum; i++)

 {
    
    

  for (n = 0; n < 32; n++)

  {
    
    

   my_lcd.Set_Draw_color(n * 8, n * 8, n * 8);

   my_lcd.Set_Draw_color(my_lcd.Get_Draw_color()&color_mask[i]);

   my_lcd.Fill_Rectangle(n * my_lcd.Get_Display_Width() / 32, (my_lcd.Get_Display_Height() / cnum)*i, (n + 1)*my_lcd.Get_Display_Width() / 32, (my_lcd.Get_Display_Height() / cnum) * (i + 1));

  }

  show_string(color_name[i], 0, ((my_lcd.Get_Display_Height() / cnum) - 16) / 2 + (my_lcd.Get_Display_Height() / cnum)*i, 2, color_mask[i], BLACK, 1);

 }

 delay(500);

}

void text_test(void)

{
    
    

 show_string("Hello World!", 0, 0, 1, RED, BLACK, 0);

 my_lcd.Set_Text_colour(YELLOW);

 my_lcd.Set_Text_Size(2);

 my_lcd.Print_Number_Float(01234.56789, 4, 0, 8, '.', 0, ' ');

 show_string("ABCDEF123456", 0, 24, 3, BLUE, BLACK, 0);

 show_string("Good", 0, 56, 5, GREEN, BLACK, 0);

 show_string("By utilizing breath", 0, 96, 2, GREEN, BLACK, 0);

 show_string("we soften our experiences.", 0, 112, 1, GREEN, BLACK, 0);

 show_string("If we dam them up,", 0, 120, 1, GREEN, BLACK, 0);

 show_string("our lives will stagnate,", 0, 128, 1, GREEN, BLACK, 0);

 show_string("but we keep them flowing,", 0, 136, 1, GREEN, BLACK, 0);

 show_string("we allow more newness", 0, 144, 1, GREEN, BLACK, 0);

 show_string("and greater experiences", 0, 152, 1, GREEN, BLACK, 0);

 show_string("to blossom.Yes OK", 0, 160, 1, GREEN, BLACK, 0);

}

void setup()

{
    
    

 Serial.begin(9600);

 my_lcd.Init_LCD();

 Serial.println(my_lcd.Read_ID(), HEX);

 my_lcd.Fill_Screen(BLACK);

 // show_chinese_test();

 // show_pic();

}

void loop()

{
    
    

 uint16_t max_scroll, rotation, i, n;

 my_lcd.Set_Rotation(0);

 uint16_t scrollbuf[my_lcd.Get_Display_Height()];

 show_chinese_test();

 delay(250);

 for (rotation = 0; rotation < 4; rotation++)

 {
    
    

  my_lcd.Set_Rotation(rotation);

  my_lcd.Fill_Screen(BLACK);

  //text

  color_test();

  my_lcd.Fill_Screen(BLACK);

  delay(500);

  text_test();

  delay(500);

  for (n = 0; n < 32; n++)

  {
    
    

   my_lcd.Set_Draw_color(n * 8, n * 8, n * 8);

   my_lcd.Set_Draw_color(my_lcd.Get_Draw_color()&color_mask[rotation]);

   my_lcd.Fill_Rectangle(n * my_lcd.Get_Display_Width() / 32, 48, (n + 1)*my_lcd.Get_Display_Width() / 32, 112);

  }

  show_string("COLOR TESTING", 50, 72, 2, color_mask[rotation + 1], BLACK, 1);

  show_string(aspect_name[rotation], 0, 184, 2, WHITE, BLACK, 0);

  show_pic();

  show_string("VERTICAL SCROLL UP", 0, 168, 2, YELLOW, BLACK, 0);

  if (my_lcd.Get_Rotation() & 1)

  {
    
    

   max_scroll = my_lcd.Get_Display_Width();

  }

  else

  {
    
    

   max_scroll = my_lcd.Get_Display_Height();

  }

  for (i = 1; i <= max_scroll; i++)

  {
    
    

   my_lcd.Vert_Scroll(0, max_scroll, i);

   delay(10);

  }

  my_lcd.Vert_Scroll(0, max_scroll, 0);

  show_string("VERTICAL SCROLL DN", 0, 168, 2, GREEN, BLACK, 0);

  for (i = 1; i <= max_scroll; i++)

  {
    
    

   my_lcd.Vert_Scroll(0, max_scroll, 0 - i);

   delay(10);

  }

  delay(500);

  my_lcd.Vert_Scroll(0, max_scroll, 0);

  if (!(rotation & 1))

  {
    
    

   show_string("ONLY THE COLOR BAND", 0, 200, 2, BLUE, BLACK, 0);

   for (i = 1; i <= 64; i++)

   {
    
    

    my_lcd.Vert_Scroll(48, 64, i);

    delay(20);

   }

   delay(500);

   my_lcd.Vert_Scroll(0, max_scroll, 0);

  }

  show_string("SOFTWARE SCROLL", 0, 216, 2, YELLOW, BLACK, 0);

  for (int16_t i = my_lcd.Get_Display_Width(), dx = 4, dy = 0; i > 0; i -= dx)

  {
    
    

   windowScroll(0, 216, my_lcd.Get_Display_Width(), 16, dx, dy, scrollbuf);

  }

  delay(1000);

 }

 my_lcd.Invert_Display(true);

 delay(1000);

 my_lcd.Invert_Display(false);

 my_lcd.Fill_Screen(BLACK);

}


[Arduino] 168 sensor module series experiments (data code + simulation programming + graphics programming)

Experiment 153: 2.4-inch TFT LCD touch screen color screen module TFT-LCD high-definition true color display

Item 26: Display Dynamic Chinese—Welcome to Shenzhen

Experimental scene diagram https://imagemc.dfrobot.com.cn/data/attachment/forum/202107/08/114904ww7x7qjwjvn8a1q9.gif

insert image description here
[Arduino] 168 sensor module series experiments (data code + simulation programming + graphics programming)

Experiment 153: 2.4-inch TFT LCD touch screen color screen module TFT-LCD high-definition true color display

Item 26: Display Dynamic Chinese—Welcome to Shenzhen

Experimental Scene 2 https://imagemc.dfrobot.com.cn/data/attachment/forum/202107/08/115644rvtovda4jdtu9bbd.gif

insert image description here

[Arduino] 168 sensor module series experiments (data code + simulation programming + graphics programming)

Experiment 165: 2.4-inch TFT LCD touch screen color screen module TFT-LCD high-definition true color display

Item 26: Display Dynamic Chinese—Welcome to Shenzhen

Experiment video (1 minute 30 seconds)

https://v.youku.com/v_show/id_XNTE3OTIxOTY4MA==.html

Guess you like

Origin blog.csdn.net/weixin_41659040/article/details/131626535
Recommended