首页 > 解决方案 > 如何以更快的速度打印像素阵列?

问题描述

我有一个值数组,它们需要打印在 TFT 屏幕(128*128)上。在下面的代码中,我们可以看到我使用了比例变量(将像素打印到其相邻的单元格),它需要 2 个循环并逐个像素地打印。有没有更快的方法可以做到这一点,如果有,请告诉我......!因为我不是电子背景的,如果用人类语言解释事情会很棒......!

我尝试使用位图再次逐像素打印!

void draw_qr1(uint8_t x, uint8_t y,sFONT* font, uint8_t scale,uint16_t colored)
{
    int *ptr;
    int i, j;
    int p,q;

    ptr=Fontr.table;    //ptr to array 
    for (j = 0; j < font->Height; j++) {    //columns
        for (i = 0; i < font->Width; i++) {     //rows


            if ((*ptr) & (0x80 >> (i % 8))) {
                for(p=0;p<scale;p++)         /*scaling done here*/
                for(q=0;q<scale;q++)
                {
                    drawPixel(x+i*scale+q,y+j*scale+p,BLACK);
                }


            }

            if (i % 8 == 7) {
                ptr++;
            }
        }
        if (font->Width % 8 != 0) {
            ptr++;
        }
    }
}
void drawPixel(int16_t x, int16_t y, uint16_t color) {
    int point_temp=0;
    // Clip
    if((x < 0) || (y < 0) || (x >= TFTWIDTH) || (y >= TFTHEIGHT)) return;

    x = TFTWIDTH - x;
    y = TFTHEIGHT - y;


    setAddrWindow(x, y, TFTWIDTH-1, TFTHEIGHT-1);


    CS_ACTIVE;
    CD_COMMAND;


    WriteComm(ST7735S_MEMORYWRITE);     //0x2C is MEMORYWRITE command


    WriteData(color >> 8);
    WriteData(color);


    CS_IDLE;
}

标签: cqr-codepixel

解决方案


正如其他人已经指出的那样,问题可能是当您使用CS_IDLE控制器结束写入序列时(也许,我没有仔细研究数据表)会更新整个显示。我建议你做这样的事情:

  1. CS_ACTIVE
  2. setAddrWindow(0, 0, TFTWIDTH-1, TFTHEIGHT-1);
  3. CD_COMMAND
  4. WriteComm(ST7735S_MEMORYWRITE)
  5. 写入所有显示像素(一整帧),这意味着您还将“背景”像素写入白色或您定义的任何背景。我查看了 ST7735S 数据表,它可以自动增加 x 和 y 地址。从数据表:

在水平寻址模式 (V=0) 中,X 地址在每个字节后递增,在最后一个 X 地址 (X=XE) 之后,X 环绕到 XS,Y 递增以寻址下一行。在每个最后一个地址(X=XE 和 Y=YE)之后,地址指针环绕到地址(X=XS 和 Y=YS)。

  1. CS_IDLE

这样,您还可以将像素寻址的开销从每个像素一次减少到每帧一次。试一试,看看它是否执行得更快。


推荐阅读