Arduino UNO搭配ST7564显示屏clear()函数失效问题求助
问题分析与解决方案
我仔细看了你的代码和问题描述,找到了几个导致display.clear()无法正确清除屏幕内容的问题,咱们一步步来修复:
1. 字符数量超出显示屏列宽,引发跨页写入干扰
你的显示屏是128列的ST7564控制器,而Font.h里定义的MAX_CHARACTERS_X = 22,结合每个字符6字节的宽度:
#define CHARACTER_WIDTH 6 #define MAX_CHARACTERS_X 22
计算可得:22 * 6 = 132,这个数值已经超过了ST7564单页的128列限制。当写入第22个字符时,超出的字节会被写到下一个page的起始位置,直接干扰其他行的内容,导致旧数据无法被完全覆盖。
修复方法:
把MAX_CHARACTERS_X修改为21,因为21 * 6 = 126,刚好小于128,不会产生跨页写入:
#define MAX_CHARACTERS_X 21
2. init函数中的无效冗余代码
在TextDisplay.cpp的init方法里,有一行完全多余且容易造成混淆的代码:
textBuffer[MAX_CHARACTERS_Y][MAX_CHARACTERS_X];
这行代码只是创建了一个局部二维数组,和类成员变量textBuffer没有任何关系,既起不到初始化作用,还会误导你认为成员变量已被处理。直接删除这行即可。
3. println函数的遍历逻辑缺陷
println里用string++来遍历字符串,虽然当前能勉强工作,但逻辑非常不清晰(定义的position变量完全没发挥作用),后续极易引发其他bug:
while (string[position]) { char character = string[position]; print(character); string++; // 此处逻辑错误 }
修复方法:改用position++来遍历字符串,逻辑更直观健壮:
void TextDisplay::println(const char* string) { int position = 0; while (string[position] != '\0') { char character = string[position]; print(character); position++; } print(13); }
修复后验证
完成以上三个修改后重新上传代码:
display.clear()会正确清空textBuffer,并将全空字符写入显示屏RAM- 字符不会再跨页写入,彻底避免内容叠加干扰
- 字符串遍历逻辑更清晰,减少后续出错概率
此时循环运行后,屏幕会每次只显示当前的ABCD和Dw2: X,不会再出现旧内容叠加的问题。
内容的提问来源于stack exchange,提问作者Azael
相关产品推荐
相关产品推荐

