You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:20:59