因此,我试图将图像的字节数组放入外部eeprom(c24LC16B)中,并使用Adafruit gfx库中的drawBitmap()函数在Nokia 3310 LCD(带有Adafruit PCD8544库)上绘制它。但是问题是,drawBitmap()只能使用静态字节PROGMEM数组。 With不好,我需要从eeprom读取img数组到缓冲区(字节buf [504] {};),然后在显示器上绘制它。
我尝试了一些在网上找到的修改,例如将其添加到Adafruit_GFX.ccp:
void Adafruit_GFX::drawBitmap(int16_t x, int16_t y,
uint8_t *bitmap, int16_t w, int16_t h,
uint16_t color) {
int16_t i, j, byteWidth = (w + 7) / 8;
for(j=0; j<h; j++) {
for(i=0; i<w; i++ ) {
if(bitRead(bitmap[j], 7-i))
drawPixel(x+i, y+j, color);
}
}
}
但它仍然只显示垃圾
那么,为什么PROGMEM和普通数组有这么大的问题呢?来自PROGMEM和SRAM的字节不相同吗?
也为我的语法感到抱歉。
最佳答案
我做的 !
我要做的就是编写自己的函数! = D
只需将其添加到Adafruit_GFX.ccp
void Adafruit_GFX::drawRamBitmap(int pozXi, int pozYi, int h, int w, byte color, byte bg, byte bitmap[], int mapSize) {
int pozX = pozXi;
int pozY = pozYi;
for (int x = 0; x < mapSize; x++) {
for (byte y = 0; y < 8; y++) {
byte dummy = bitmap[x] << y;
if (dummy >= 128) {
drawPixel(pozX, pozY, color);
}
else {
drawPixel(pozX, pozY, bg);
}
pozX++;
if (pozX == w + pozXi) {
pozX = pozXi;
pozY++;
}
}
}
}
void Adafruit_GFX::drawRamBitmap(int pozXi, int pozYi, int h, int w, byte color, byte bitmap[], int mapSize) {
int pozX = pozXi;
int pozY = pozYi;
for (int x = 0; x < mapSize; x++) {
for (byte y = 0; y < 8; y++) {
byte dummy = bitmap[x] << y;
if (dummy >= 128) {
drawPixel(pozX, pozY, color);
}
pozX++;
if (pozX == w + pozXi) {
pozX = pozXi;
pozY++;
}
}
}
}
这是Adafruit_GFX.h
drawRamBitmap(int pozXi, int pozYi, int h, int w, byte color, byte bg, byte bitmap[], int mapSize),
drawRamBitmap(int pozXi, int pozYi, int h, int w, byte color, byte bitmap[], int mapSize),
用法:
drawRambitmap(x,y,h,w,color,byte_array_of_img, size_of_array);
要么
drawRambitmap(x,y,h,w,color,background_color,byte_array_of_img, size_of_array);