タイトル:TFT LCD ILI9341Display_1日付
:2020-08-27 16:33:31
タグ: 'MCU'
記事ディレクトリ
前書き
プロジェクトの要件により、ボタン制御とタッチ制御をサポートする画面制御を行う必要があります
いくつか検討した結果、より簡単なArduinoUnoとタッチ付き2.4インチTFTLCD(ILI9341)を選択しました。
必要な図書館
Adafruit_GFX
Adafruit_TFTLCD
座標
この座標を整理したところ、2つのタイプがあることがわかりました。。2番目のタイプは今のところ検証されていないので、まだ立てません。
画面サイズが240×320なので、最初の表示座標系についてお話します。
したがって、GFXライブラリで採用されている座標系はピクセル単位であり、サイズは完全に明確です。
Adafruit_GFX
class Adafruit_GFX : public Print {
public:
Adafruit_GFX(int16_t w, int16_t h); // Constructor
virtual void drawPixel(int16_t x, int16_t y, uint16_t color) = 0;
virtual void startWrite(void);
virtual void writePixel(int16_t x, int16_t y, uint16_t color);
virtual void writeFillRect(int16_t x, int16_t y, int16_t w, int16_t h,
uint16_t color);
virtual void writeFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color);
virtual void writeFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color);
virtual void writeLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1,
uint16_t color);
virtual void endWrite(void);
virtual void setRotation(uint8_t r);
virtual void invertDisplay(bool i);
virtual void drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color);
virtual void drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color);
virtual void fillRect(int16_t x, int16_t y, int16_t w, int16_t h,
uint16_t color);
virtual void fillScreen(uint16_t color);
// Optional and probably not necessary to change
virtual void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1,
uint16_t color);
virtual void drawRect(int16_t x, int16_t y, int16_t w, int16_t h,
uint16_t color);
// These exist only with Adafruit_GFX (no subclass overrides)
void drawCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color);
void drawCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername,
uint16_t color);
void fillCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color);
void fillCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername,
int16_t delta, uint16_t color);
void drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2,
int16_t y2, uint16_t color);
void fillTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2,
int16_t y2, uint16_t color);
void drawRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h,
int16_t radius, uint16_t color);
void fillRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h,
int16_t radius, uint16_t color);
void drawBitmap(int16_t x, int16_t y, const uint8_t bitmap[], int16_t w,
int16_t h, uint16_t color);
void drawBitmap(int16_t x, int16_t y, const uint8_t bitmap[], int16_t w,
int16_t h, uint16_t color, uint16_t bg);
void drawBitmap(int16_t x, int16_t y, uint8_t *bitmap, int16_t w, int16_t h,
uint16_t color);
void drawBitmap(int16_t x, int16_t y, uint8_t *bitmap, int16_t w, int16_t h,
uint16_t color, uint16_t bg);
void drawXBitmap(int16_t x, int16_t y, const uint8_t bitmap[], int16_t w,
int16_t h, uint16_t color);
void drawGrayscaleBitmap(int16_t x, int16_t y, const uint8_t bitmap[],
int16_t w, int16_t h);
void drawGrayscaleBitmap(int16_t x, int16_t y, uint8_t *bitmap, int16_t w,
int16_t h);
void drawGrayscaleBitmap(int16_t x, int16_t y, const uint8_t bitmap[],
const uint8_t mask[], int16_t w, int16_t h);
void drawGrayscaleBitmap(int16_t x, int16_t y, uint8_t *bitmap, uint8_t *mask,
int16_t w, int16_t h);
void drawRGBBitmap(int16_t x, int16_t y, const uint16_t bitmap[], int16_t w,
int16_t h);
void drawRGBBitmap(int16_t x, int16_t y, uint16_t *bitmap, int16_t w,
int16_t h);
void drawRGBBitmap(int16_t x, int16_t y, const uint16_t bitmap[],
const uint8_t mask[], int16_t w, int16_t h);
void drawRGBBitmap(int16_t x, int16_t y, uint16_t *bitmap, uint8_t *mask,
int16_t w, int16_t h);
void drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color,
uint16_t bg, uint8_t size);
void drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color,
uint16_t bg, uint8_t size_x, uint8_t size_y);
void getTextBounds(const char *string, int16_t x, int16_t y, int16_t *x1,
int16_t *y1, uint16_t *w, uint16_t *h);
void getTextBounds(const __FlashStringHelper *s, int16_t x, int16_t y,
int16_t *x1, int16_t *y1, uint16_t *w, uint16_t *h);
void getTextBounds(const String &str, int16_t x, int16_t y, int16_t *x1,
int16_t *y1, uint16_t *w, uint16_t *h);
void setTextSize(uint8_t s);
void setTextSize(uint8_t sx, uint8_t sy);
void setFont(const GFXfont *f = NULL);
void setCursor(int16_t x, int16_t y) {
cursor_x = x;
cursor_y = y;
}
void setTextColor(uint16_t c) { textcolor = textbgcolor = c; }
void setTextColor(uint16_t c, uint16_t bg) {
textcolor = c;
textbgcolor = bg;
}
void setTextWrap(bool w) { wrap = w; }
void cp437(bool x = true) { _cp437 = x; }
using Print::write;
#if ARDUINO >= 100
virtual size_t write(uint8_t);
#else
virtual void write(uint8_t);
#endif
int16_t width(void) const { return _width; };
int16_t height(void) const { return _height; }
uint8_t getRotation(void) const { return rotation; }
int16_t getCursorX(void) const { return cursor_x; }
int16_t getCursorY(void) const { return cursor_y; };
protected:
void charBounds(unsigned char c, int16_t *x, int16_t *y, int16_t *minx,
int16_t *miny, int16_t *maxx, int16_t *maxy);
int16_t WIDTH; ///< This is the 'raw' display width - never changes
int16_t HEIGHT; ///< This is the 'raw' display height - never changes
int16_t _width; ///< Display width as modified by current rotation
int16_t _height; ///< Display height as modified by current rotation
int16_t cursor_x; ///< x location to start print()ing text
int16_t cursor_y; ///< y location to start print()ing text
uint16_t textcolor; ///< 16-bit background color for print()
uint16_t textbgcolor; ///< 16-bit text color for print()
uint8_t textsize_x; ///< Desired magnification in X-axis of text to print()
uint8_t textsize_y; ///< Desired magnification in Y-axis of text to print()
uint8_t rotation; ///< Display rotation (0 thru 3)
bool wrap; ///< If set, 'wrap' text at right edge of display
bool _cp437; ///< If set, use correct CP437 charset (default is off)
GFXfont *gfxFont; ///< Pointer to special font
};
/// A simple drawn button UI element
class Adafruit_GFX_Button {
public:
Adafruit_GFX_Button(void);
// "Classic" initButton() uses center & size
void initButton(Adafruit_GFX *gfx, int16_t x, int16_t y, uint16_t w,
uint16_t h, uint16_t outline, uint16_t fill,
uint16_t textcolor, char *label, uint8_t textsize);
void initButton(Adafruit_GFX *gfx, int16_t x, int16_t y, uint16_t w,
uint16_t h, uint16_t outline, uint16_t fill,
uint16_t textcolor, char *label, uint8_t textsize_x,
uint8_t textsize_y);
// New/alt initButton() uses upper-left corner & size
void initButtonUL(Adafruit_GFX *gfx, int16_t x1, int16_t y1, uint16_t w,
uint16_t h, uint16_t outline, uint16_t fill,
uint16_t textcolor, char *label, uint8_t textsize);
void initButtonUL(Adafruit_GFX *gfx, int16_t x1, int16_t y1, uint16_t w,
uint16_t h, uint16_t outline, uint16_t fill,
uint16_t textcolor, char *label, uint8_t textsize_x,
uint8_t textsize_y);
void drawButton(bool inverted = false);
bool contains(int16_t x, int16_t y);
void press(bool p) {
laststate = currstate;
currstate = p;
}
bool justPressed();
bool justReleased();
bool isPressed(void) { return currstate; };
private:
Adafruit_GFX *_gfx;
int16_t _x1, _y1; // Coordinates of top-left corner
uint16_t _w, _h;
uint8_t _textsize_x;
uint8_t _textsize_y;
uint16_t _outlinecolor, _fillcolor, _textcolor;
char _label[10];
bool currstate, laststate;
};
class GFXcanvas1 : public Adafruit_GFX {
public:
GFXcanvas1(uint16_t w, uint16_t h);
~GFXcanvas1(void);
void drawPixel(int16_t x, int16_t y, uint16_t color);
void fillScreen(uint16_t color);
bool getPixel(int16_t x, int16_t y) const;
uint8_t *getBuffer(void) const { return buffer; }
protected:
bool getRawPixel(int16_t x, int16_t y) const;
private:
uint8_t *buffer;
#ifdef __AVR__
static const uint8_t PROGMEM GFXsetBit[], GFXclrBit[];
#endif
};
class GFXcanvas8 : public Adafruit_GFX {
public:
GFXcanvas8(uint16_t w, uint16_t h);
~GFXcanvas8(void);
void drawPixel(int16_t x, int16_t y, uint16_t color);
void fillScreen(uint16_t color);
void writeFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color);
uint8_t getPixel(int16_t x, int16_t y) const;
uint8_t *getBuffer(void) const { return buffer; }
protected:
uint8_t getRawPixel(int16_t x, int16_t y) const;
private:
uint8_t *buffer;
};
class GFXcanvas16 : public Adafruit_GFX {
public:
GFXcanvas16(uint16_t w, uint16_t h);
~GFXcanvas16(void);
void drawPixel(int16_t x, int16_t y, uint16_t color);
void fillScreen(uint16_t color);
void byteSwap(void);
uint16_t getPixel(int16_t x, int16_t y) const;
uint16_t *getBuffer(void) const { return buffer; }
protected:
uint16_t getRawPixel(int16_t x, int16_t y) const;
private:
uint16_t *buffer;
};
Adafruit_TFTLCD
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(),
それについて話すだけ
オブジェクトを作成する
Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
void setup(void) {
tft.reset();
tft.begin(0x9341);
}
最初に、tftという名前のAdafruit_TFTLCDオブジェクトが作成され、ピン定義はここでは省略されています。
beginメソッドの0x9341は、TFT LCDのドライバーをILI9341に変更することを意味します。その他は、ここでは紹介しません。
画面
void fillScreen(uint16_t color);
uint16_t width(); //屏幕的宽度
uint16_t height(); //屏幕的高度
全画面をカラーで塗りつぶすと、前に表示されていたコンテンツが再びブロックされます
場合
tft.fillScreen(BLACK);
delay(1000);
tft.fillScreen(RED);
delay(1000);
tft.fillScreen(BLUE);
delay(1000);
ポイント
void drawPixel(int16_t x, int16_t y, uint16_t color);
ポイント(x、y)に色付きのピクセルを描画します。
場合
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);
ライン
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);
最も簡単なのは、2点の直線を決定することです。もちろん、点、方向、長さを決定することもできます。最後の2つは、水平線または垂直線を描画することです。
場合
tft.drawFastHLine(10,10,170,RED);
tft.drawFastVLine(10,10,170,RED);
tft.drawLine(10,10,100,180,RED);
長方形&&丸みを帯びた長方形
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);
drawRectの長方形は、内側を塗りつぶさずに直接境界線を描画します。内側の色を塗りつぶす必要がある場合は、fillRectを使用する必要があります。
丸みを帯びた長方形には、丸みを帯びた角の半径を設定し、塗りつぶしが上記と同じかどうかを設定するための追加のパラメーターraduisがあります。
場合
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);
円形
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);
これは比較的単純で、中心座標(x0、y0)、半径r、色の色
場合
tft.drawCircle(100,100,50,WHITE);
tft.fillCircle(100,260,50,BLUE);
三角形
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);
三角形は3つの頂点と色を決定する必要があります
場合
tft.drawTriangle(10,10,100,15,180,100,GREEN);
tft.fillTriangle(10,110,100,115,180,200,GREEN);
文字&&英語テキスト
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は単一の文字しか表示できません。左上隅の頂点座標(x、y)、文字c、色の色、前景色、背景の色bg、サイズ、サイズを決定する必要があります。1は5 * 8ピクセル、2は2を意味します。 10 * 16
カスタムフォントは背景色をサポートしていません。丸みを帯びた長方形など、その前に塗りつぶされた色で図形を描画できます
場合
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");
デフォルトのフォントは中国語をサポートしていないことがわかります。別の日を構成するには中国語を使用する必要があります
スピン
void setRotation(uint8_t rotation);
回転パラメータは0、1、2、または3で、それぞれ0、90、180、または270度に対応します。
Arduinoシールドに属するディスプレイの場合、回転値0はディスプレイをポートレート(高)モードに設定し、回転値2もポートレートモードになります。回転1は横向きモードで、回転3も横向きモードです。
場合
//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");
結論
これまで、ケースプログラムTestDraw_1.inoがgithub、アドレスポータルにアップロードされました
次のポータルでは、中国語の表示、モデルを使用してビットマップを作成する、画像を表示する、タッチ機能など、コンテンツの一部がゆっくりと更新されます。
参考文献
- https://github.com/adafruit/TFTLCD-Library
- https://github.com/adafruit/Adafruit-GFX-Library
- https://github.com/BackMountainDevil/UNO-TFTLCD-ILI9341-デモ
- https://blog.csdn.net/weixin_43031092/article/details/108159783
- https://blog.csdn.net/weixin_43031092/article/details/10800748