搜索
bottom↓
回复: 7

[已解决]求助:Arduino的TFT-eSPI库要如何改动才能驱动HX8347的TFT?

[复制链接]

出0入26汤圆

发表于 2022-1-15 17:00:16 | 显示全部楼层 |阅读模式
本帖最后由 lizengmao 于 2022-1-15 23:44 编辑

目前我在使用ESP32制作一个USB 电流表.手上有几个HX8347I,SPI界面的TFT.
在试图使用TFT-eSPI库进行驱动这个TFT时有发现TFT-eSPI库不支持HX8347.以下是TFT-eSPI库支持的驱动列表https://github.com/Bodmer/TFT_eSPI
逐一测试TFT-eSPI库自带的驱动IC,没有发现一个库是可以点亮这个TFT的.
好消息是我使用其他库可以点亮这个TFT,如下库https://github.com/schreibfaul1/ESP32-TFT-Library-ILI9341-HX8347D
但是这个库,不能像TFT-eSPI库一样使用"Sprites"以避免刷新显示内容时带来的闪烁,且如果我要建立基于LCDMenuLib2的菜单库时,仍需要使用TFT-eSPI库.
我做如下尝试,结果仍无法使用TFT-eSPI在TFT上显示字符:
1.TFT-eSPI库中的User_Setup.h中启用HX8457驱动,且HX8357D_Init.h内容替换成可以点亮的ESP32-TFT-Library-ILI9341-HX8347D库的初始化内容,禁用设定TFT方向函数setRotation.尝试运行TFT-eSPI库自带All_Free_Fonts_Demo这个Demo时TFT不显示任何内容(已正确设定SPI所使用的GPIO).失败!
2.同时使用TFT-eSPI库和ESP32-TFT-Library-ILI9341-HX8347D库,但把TFT-eSPI库的初始化TFT函数删除,设定TFT方向函数setRotation禁用.在使用ESP32-TFT-Library-ILI9341-HX8347D库时可以在TFT上显示字符,但是使用TFT-eSPI库尝试打印/绘制字符时在TFT上不能显示字符.失败.
我要如何做,才能在TFT-eSPI上使用HX8347这个驱动IC的TFT呢?
以下是方法2的测试代码:
#include "Arduino.h"
#include "SPI.h"
#include "tft.h"
//ePSI
#define TEXT "aA MWyz~12" // Text that will be printed on screen in any font
//#include "Free_Fonts.h" // Include the header file attached to this sketch
#include "SPI.h"
#include "TFT_eSPI.h"
#include "Free_Fonts.h" // Include the header file attached to this sketch
TFT_eSPI etft = TFT_eSPI();
//
#define TFT_CS        5    // do not use GPI032 or GPIO33 here
#define TFT_DC        4    // do not use GPI032 or GPIO33 here
#define SPI_MOSI      23
#define SPI_MISO      25
#define SPI_SCK       18
#define TFT_RST       16
#define TFT_BL        19
TFT tft(1); //0=ILI9341, 1= HX8347D


void setup() {
  Serial.begin(115200);
  Serial.println("tft test start");
  String txt = "";
  pinMode(TFT_BL, OUTPUT);
  digitalWrite(TFT_BL, HIGH); // disable the touchpad
  pinMode(TFT_RST, OUTPUT);
  digitalWrite(TFT_RST, LOW);
  delay(15);
  digitalWrite(TFT_RST, HIGH);
  delay(15);


  SPI.begin(SPI_SCK, SPI_MISO, SPI_MOSI);
  tft.begin(TFT_CS, TFT_DC, SPI_MOSI, SPI_MISO, SPI_SCK);
  tft.fillScreen(TFT_BLACK);

  tft.fillScreen(TFT_RED);
  delay(1000);
  tft.setRotation(3);
  tft.setCursor(0, 0);
  //tft.setFont(Old_English_Text_MT26x26);
  tft.setFont(Times_New_Roman15x14);
  tft.setTextColor(TFT_WHITE);
  tft.setTextSize(3);
  txt = "    abcdefghijklmnopqrstuvwxyz,\n";
  txt += "    ABCDEFGHIJKLMN\n    OPQRSTUVWXYZ\n";
  txt += "    0123456789....\n    ~!@#$%^&*();'\n";
  txt += "    hellow world?,\n    Text test!";
  tft.print(txt); //此处可以在TFT显示字符
  Serial.println("TFT_eSPI Start...");
  delay(1000);  
  etft.begin(); //此处使用TFT-eSPI初始化后,TFT无变化
  Serial.println("TFT_eSPI Begin...");
  etft.setTextColor(TFT_WHITE );  //文本顏色
  etft.setTextSize(1);//文本的放大(1~7倍)
  etft.setTextFont(FONT4);
  etft.drawString("TFT-eSPI Test...", 180,180,FONT4);//此处使用TFT-eSPI绘制字符串到TFT,TFT无变化
}
//-------------------------------------------------------------------------------------
void loop(void) {
  delay(2000);
}


更新:改为使用GFX库驱动,不使用TFT-eSPI库.见2楼.

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入26汤圆

 楼主| 发表于 2022-1-15 23:42:09 | 显示全部楼层
晚上趁散步时间想了一下,以及搜索了一下,决定放弃TFT-eSPI库.改为使用GFX库,GFX已经包含HX8347的驱动.库地址:[url]https://github.com/adafruit/Adafruit-GFX-Library[/url]
但是仍不能直接用.如果直接用,在目前的TFT上显示为左右镜像.因此仍需修改GFX库中HX8347的相关函数.
经查看HX8347规格数,0X36寄存器用于设定Source和Gate的扫描方向,改Source driver的扫描方向后,左右镜像问题已解决.因此GFX库的HX8347的setRotation函数需重新写.
查看GFX的说明,使用canvas可以避免刷新局部显示内容时的闪烁问题,但是会需要更多的RAM空间,类似TFT-eSPI的"Sprites"
以下是测试用的代码:
#include <Arduino_GFX_Library.h>
#include <font/FreeSans24pt7b.h>
#define font_w 44
#define font_h 44
/* More dev device declaration: https://github.com/moononournati ... -Device-Declaration */
#if defined(DISPLAY_DEV_KIT)
Arduino_GFX *gfx = create_default_Arduino_GFX();
#else /* !defined(DISPLAY_DEV_KIT) */

/* More data bus class: https://github.com/moononournati ... wiki/Data-Bus-Class */
Arduino_DataBus *bus = create_default_Arduino_DataBus();

/* More display class: https://github.com/moononournation/Arduino_GFX/wiki/Display-Class */
Arduino_GFX *gfx = new Arduino_HX8347D(bus, TFT_RST, 0 /* rotation */, false /* IPS */);
Arduino_GFX *canvas = new Arduino_Canvas(150,font_h*5,gfx);

#endif /* !defined(DISPLAY_DEV_KIT) */
/*******************************************************************************
   End of Arduino_GFX setting
******************************************************************************/

void display_ini() {
  gfx->begin();
  canvas->begin();
  gfx->setRotation(3);  //设置显示发现
  gfx->fillScreen(BLACK); //清屏

#ifdef TFT_BL
  pinMode(TFT_BL, OUTPUT);
  digitalWrite(TFT_BL, HIGH);
#endif
  //以下测试显示是否正常
  gfx->fillScreen(BLACK); //清屏
  gfx->setFont(&FreeSans24pt7b);

  //gfx->setTextSize(1);
  gfx->setTextColor(GREEN);
  gfx->setCursor(0, font_h * 1);
  gfx->print("GFX Test...");

  //gfx->setTextSize(2);
  gfx->setTextColor(RED);
  gfx->setCursor(0, font_h * 2);
  gfx->print("GFX Test...");

  //gfx->setTextSize(3);
  gfx->setTextColor(WHITE);
  gfx->setCursor(0, font_h * 3);
  gfx->print("GFX Test...");

  //gfx->setTextSize(4);
  gfx->setTextColor(YELLOW);
  gfx->setCursor(0, font_h * 4);
  gfx->print("GFX Test...");

  gfx->setTextColor(ORANGE);
  gfx->setCursor(0, font_h * 5);
  gfx->print("GFX Test...");
  delay(500);
  gfx->fillScreen(BLACK); //清屏

  //以下绘制显示的单位
  gfx->setFont(&FreeSans24pt7b);  
  gfx->setCursor(150,font_h);
  gfx->setTextColor(GREEN);
  gfx->print("V");
  gfx->setTextColor(RED);
  gfx->setCursor(150,font_h*2);
  gfx->print("A");
  gfx->setTextColor(WHITE);
  gfx->setCursor(150,font_h*3);
  gfx->print("W");
  gfx->setTextColor(ORANGE);
  gfx->setCursor(150,font_h*4);
  gfx->print("Ah");
}

void display_INA219() {
  //以下用canvas的方式绘制数值,避免闪烁
  canvas->fillRect(0,0,150,font_h*5,BLACK);
  canvas->setFont(&FreeSans24pt7b);
  canvas->setTextColor(GREEN);
  canvas->setCursor(0,font_h*1);
  canvas->print(batvoltage,3);

  canvas->setTextColor(RED);
  canvas->setCursor(0,font_h*2);
  canvas->print(current_A,3);

  canvas->setTextColor(WHITE);
  canvas->setCursor(0,font_h*3);
  canvas->print(power,3);

  canvas->setTextColor(ORANGE);
  canvas->setCursor(0,font_h*4);
  canvas->print(Ah,3);
  
  canvas->flush();  
}


以下是显示效果,电流电压数值的刷新TFT毫无闪烁.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出5入0汤圆

发表于 2022-1-16 12:57:52 来自手机 | 显示全部楼层
lizengmao 发表于 2022-1-15 23:42
晚上趁散步时间想了一下,以及搜索了一下,决定放弃TFT-eSPI库.改为使用GFX库,GFX已经包含HX8347的驱动.库地 ...

INA219跟INA226有什么区别

出200入2554汤圆

发表于 2022-1-16 13:05:57 来自手机 | 显示全部楼层
库里不应该有镜像接口么,改库从来都像野路子

出0入26汤圆

 楼主| 发表于 2022-1-16 13:21:46 | 显示全部楼层
NM2012 发表于 2022-1-16 12:57
INA219跟INA226有什么区别

不清楚,我没有仔细对规格书。只是手上有219就用这个

出0入26汤圆

 楼主| 发表于 2022-1-16 13:22:24 | 显示全部楼层
t3486784401 发表于 2022-1-16 13:05
库里不应该有镜像接口么,改库从来都像野路子

要不,您给个具体的函数?对GFX库不熟啊。

出200入2554汤圆

发表于 2022-1-16 17:57:22 | 显示全部楼层
lizengmao 发表于 2022-1-16 13:22
要不,您给个具体的函数?对GFX库不熟啊。

目测这两个接口就行:



就算要重写,ada 大姐不是已经写好了 vitrual 虚函数了么,派生个类就能搞定的事情。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2022-1-17 09:56:00 | 显示全部楼层
本帖最后由 ANHOME 于 2022-1-17 09:59 编辑

这个库我以前花费了几天功夫就移植和修改好了,能支持TFT-eSPI 的HX8347 SPI驱动(只需要4根SPI数据线),可惜源码在重装系统后没保存下来
现在不想再从头研究了。配套的TFT 2.8”倒是还有1300多个库存, 年底清仓裸屏10元出了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-16 06:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表