Arduino:解决M5Stack官方库显示自定义图案时花屏

买了一个M5Stack这款开发板,觉得有点意思。本质上还是ESP32开发板,但已被封装成一个大约五六厘米见方样子的小方盒,自带充电电池、显示屏、小喇叭、按钮等,非常的美观实用。售价不算低,但毕竟切实的解决了一些痛点,所以这个问题见仁见智了。

装完M5官方的库之后测试自带的TFT_Flash_Bitmap,顺利通过。然而在此基础上打算进一步测试M5.Lcd.drawBitmap,显示使用自己的图案时出现了问题:屏幕“花屏”。但这个花屏仍能隐约能看出应有的图案,但颜色系统彻底出现了紊乱。

自定义图案是使用ImageConvert565做的,一直在用没出过问题,所以可以排除字节生成工具的因素。猜测是显示驱动方面的因素。

打开默认位置(我的文档\Arduino\libraries\M5Stack\src),看到M5Display.h和M5Display.cpp。粗略分析了一下,发现其也是基于TFT_eSPI库的,这就好办了。经过一番测试,发现问题出在setSwapBytes(true);。改false就一切正常。

怕直接改影响现有的功能,所以打开M5Display.cpp,再复制黏贴一遍drawBitmap函数并加上自己的重载,新加一个bool参数,让本来写死的true用这个参数来控制。当然,M5Display.h里也要把这几个新建的函数名也贴一遍。参考代码如下:

cpp里:
///////////////////////////
void M5Display::drawBitmap(int16_t x0, int16_t y0, int16_t w, int16_t h, const uint16_t *data,bool swapBytes) {
  setSwapBytes(swapBytes);
  pushImage((int32_t)x0, (int32_t)y0, (uint32_t)w, (uint32_t)h, data);
}

void M5Display::drawBitmap(int16_t x0, int16_t y0, int16_t w, int16_t h, uint16_t *data,bool swapBytes) {
  setSwapBytes(swapBytes);
  pushImage((int32_t)x0, (int32_t)y0, (uint32_t)w, (uint32_t)h, data);
}

void M5Display::drawBitmap(int16_t x0, int16_t y0, int16_t w, int16_t h, const uint16_t *data, uint16_t transparent,bool swapBytes) {
  setSwapBytes(swapBytes);
  pushImage((int32_t)x0, (int32_t)y0, (uint32_t)w, (uint32_t)h, data, transparent);
}

void M5Display::drawBitmap(int16_t x0, int16_t y0, int16_t w, int16_t h, const uint8_t *data,bool swapBytes) {
  setSwapBytes(swapBytes);
  pushImage((int32_t)x0, (int32_t)y0, (uint32_t)w, (uint32_t)h, (const uint16_t*)data);
}

void M5Display::drawBitmap(int16_t x0, int16_t y0, int16_t w, int16_t h, uint8_t *data,bool swapBytes) {
  setSwapBytes(swapBytes);
  pushImage((int32_t)x0, (int32_t)y0, (uint32_t)w, (uint32_t)h, (uint16_t*)data);
}
//////////////////////////



头文件里:
void drawBitmap(int16_t x0, int16_t y0, int16_t w, int16_t h, const uint16_t *data ,bool swapBytes);
void drawBitmap(int16_t x0, int16_t y0, int16_t w, int16_t h, const uint8_t *data ,bool swapBytes);
void drawBitmap(int16_t x0, int16_t y0, int16_t w, int16_t h, uint16_t *data ,bool swapBytes);
void drawBitmap(int16_t x0, int16_t y0, int16_t w, int16_t h, uint8_t *data ,bool swapBytes);
void drawBitmap(int16_t x0, int16_t y0, int16_t w, int16_t h, const uint16_t *data, uint16_t transparent ,bool swapBytes);

正式代码中,示例中的drawIcon可以完全无视,直接调用原生的drawImage即可。Info.h略,参考示例,按实际需要黏贴代码就好。

#include <M5Stack.h>
#include "Info.h"

void setup()
{
  M5.begin();
  M5.Lcd.setBrightness(128);  //设置背光亮度
  M5.Lcd.fillScreen(TFT_BLACK);
  

  // Draw the icons
  // drawIcon不必用了
  //drawIcon(info, 0, 0, infoWidth, infoHeight);
  M5.Lcd.drawBitmap(0,0,infoWidth,infoHeight,info,false);

}

void loop()
{


}

嗯,这是女儿最喜欢的小松鼠玩具。

====新问题====

又入了一个,这回倒是不花屏了,但显示的颜色是反相的(底片)。百思不得其姐。不管了,做图片的时候就先反相,有空了慢慢研究。

发布了122 篇原创文章 · 获赞 61 · 访问量 53万+

猜你喜欢

转载自blog.csdn.net/ki1381/article/details/88804713