【问题标题】:Arduino: Printing ASCII characters to LEDs / pointer weirdnessArduino:将 ASCII 字符打印到 LED/指针怪异
【发布时间】:2013-04-09 22:37:53
【问题描述】:

我使用 TLC5940 和移位寄存器制作了一个 24 x 15 LED 矩阵,在 Arduino Due 上运行。

首先,我想打印一个 ASCII 字符,例如。 'A' 直接显示。

所以我在 PROGMEM 中存储了一个字体数组,使用 a link I found

 PROGMEM prog_uchar font[][5] = {
    {0x00,0x00,0x00,0x00,0x00},   //   0x20 32
    {0x00,0x00,0x6f,0x00,0x00},   // ! 0x21 33
                ...
    {0x08,0x14,0x22,0x41,0x00},   // < 0x3c 60
    {0x14,0x14,0x14,0x14,0x14},   // = 0x3d 61
    {0x00,0x41,0x22,0x14,0x08},   // > 0x3e 62
    {0x02,0x01,0x51,0x09,0x06},   // ? 0x3f 63
                etc.

现在,奇怪的是,一切几乎都可以正常工作,但略有变化。 例如,'>' 变成这样:

00000000      -->     00001000    
01000001      -->     00000000
00100010      -->     01000001
00010100      -->     00100010
00001000      -->     00010100

所以我认为这是一个指针边界问题。可能是我看了太久,不知道!

这是相关代码,我在其中硬编码了“

  unsigned char testgt[]   = {0x00,0x41,0x22,0x14,0x08};

  for (int iterations = 0; iterations < time; iterations++)
  {

    unsigned char indexOfWidth = 0;
    unsigned char indexOfHeight = 0;

    for (int col = x; col < x + charWidth; col++) 
    {
        openCol(col);      
        Tlc.clear(); 
        unsigned char b = testgt[indexOfWidth];//pgm_read_byte_near(font[ch] + indexOfWidth );

          //Serial.println(b);

        indexOfHeight = 0;
        for (int ledNum = y; ledNum < y + charHeight; ledNum++)
        {
          if (b & (1 << indexOfHeight))
          {
            setRainbowSinkValue(ledNum, 100);
          }
          indexOfHeight++;
        }

        indexOfWidth++;
        Tlc.update(); 
    }
  }

你能看出什么不对吗?最可能的问题是位操作,但这是有道理的...... b&1... b&2... b&4... b&8... b&16... b & 32... b&64... b & 128...

【问题讨论】:

    标签: c arduino bit-manipulation led


    【解决方案1】:

    基本上,您从testgt[] 提取的值进入了错误的显示列。呈现的代码看起来不错。这是你没有展示的东西。也许,您的电路对输入的索引与您的预期不同。

    【讨论】:

    • 谢谢,我只是想让有人确认我的代码看起来没问题。我怀疑这与我的移位寄存器启动时加载了垃圾数据有关,因此即使我的列掩码是正确的,但实际上它们引用了错误的列。这似乎是最可能的原因。今晚会调查一下。
    【解决方案2】:

    好的,我解决了... 74hc595 和 TLC5940s 的速度之间似乎存在细微的时序差异,所以发生的情况是,由于 TLC 不存在,所以存在残留闪烁到下一列在 74hc595 打开新列时清除。所以我切换了 Tlc.clear() 和 openCol(col) 并在两者之间添加了一个 delay(5) ,这很有帮助。不能完全解决问题,但延迟(15) 会伤害眼睛,这是可以接受的折衷方案。

    【讨论】:

    • 太棒了!我也怀疑时机。
    猜你喜欢
    • 2019-06-08
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多