买了一个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
#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()
{
}
嗯,这是女儿最喜欢的小松鼠玩具。
====新问题====
又入了一个,这回倒是不花屏了,但显示的颜色是反相的(底片)。百思不得其姐。不管了,做图片的时候就先反相,有空了慢慢研究。