大明狐 发表于 6 天前

从截图看,错乱的原因大概是数据的 取模顺序 的问题。


为了方便对照,在你的 PCtoLCD 的截图里,随便取一组不是全0或者全1的像素点,
比如第20组,从上向下依次是7个亮点1个黑点,对应的数据是 0x7F,用二进制表示是 0111 1111 ,
说明取模的顺序是 从上向下 读取像素点,从低位到高位保存,数据位的顺序是高位在前(左)(这一点后面说)。
这个顺序是符合OLED显存的赋值顺序的,所以显示正常。


而STC的图片取模工具里,第20个数据是 0xFC, 二进制数是 1111 1100 (不同取模软件对图片的识别略有偏差属于正常)
说明取模的顺序是 从上向下读取像素点,从低位到高位保存,数据位的顺序是低位在前(左)。

把这种顺序的数据发给OLED,就会导致每一页的图像都是上下镜像的,也就是你形容的支离破碎的感觉了。



================================================================

这个问题很多人在习惯使用PCtoLCD之后改用STC的取模工具的时候都提到过,原因就在被 低位在前 的选项迷惑了

PCtoLCD 中的 低位在前是 【取模走向】
而 STC 中的 低位在前 是 【存储顺序】


比如上面选取的八个像素点,按照两个软件中选择的共同的顺序,从上向下读取的时候,依次是 1,1,1,1,1,1,1,0。

PCtoLCD的 低位在前 的 走向,意思就是 从“先低位向高位读取”,严谨一些的话,其实应该叫做 低位在先
PCtoLCD 默认的存储顺序,是 先读到的是低位,后读到的是高位,也就是 0111 1111(0x7F)

通过读取像素点的走向,来决定字模数据位的顺序.



在 STC 中, 取模走向 已经在【扫描模式】的下拉列表中就定下了,
所以按照 先读到的是低位,后读到的是高位 的原则,

如果选择 低位在前 的 存储顺序,保存成的数据就是 11111100 了。

因此,为了符合OLED的赋值规则,这里应该选择 高位在前 ,也就是 00111111 。
另外,如果使用的是画点的方式进行显示,如果是低位在前的数据,也可以在读取顺序的代码中进行修改,把 dat & (x01<<n) 改成 dat & (0x80>>n)


================================================================


关于 STC 的 低位在前 的存储顺序,比较适合 以像素点为单位的取模方式 。
比如常见的单色LED点阵屏(74HC595 或者 MAX7219 等等)、带灰度的OLED(4位灰度)、TFT彩屏(16位RGB)、WS2812(24位RGB)、HUB75彩屏(24位RGB)等等,
因为发送数据是以每个像素点为最小单元,而不像单色OLED那样以八个像素点为最小显示单元,
所以,数据位的顺序是 低位在前 还是 高位在前 ,主要取决于程序代码里的读取顺序。

同理,PCtoLCD 里的 高位在前 的走向,也是为了迎合不同种类的单色屏幕的读取顺序。
比如常见的单色LED点阵屏(74HC595 或者 MAX7219 等等),数据是一位一位发送的,
所以对于不同读取顺序的驱动程序,也可以在 PCtoLCD 中选择不同走向进行取模。

陈家乐 发表于 6 天前

大明狐 发表于 2025-10-11 12:33
从截图看,错乱的原因大概是数据的 取模顺序 的问题。




果然还得是大佬
页: 1 [2]
查看完整版本: 【图片取模求助】STC-ISP的图片取模工具顺序问题