Arduino:将ASCII字符打印到LED /指针怪异

时间:2013-04-09 22:37:53

标签: c arduino bit-manipulation led

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

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

所以我使用a link I found

在PROGMEM中存储了一个字体数组
 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.

现在,奇怪的是,一切几乎都有效,但略有转移。 例如,'&gt;'变形为:

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

所以我认为这是一个指针边界问题。也许我一直在看它太久了,但我不知道!

这是相关代码,我在其中硬编码了'&lt;'的值。我做了一个Serial.println,它显示'b'的正确值。 x和y为0和0,将角色放在角落里。注释掉的'b'是我通常所做的,而不是硬编码。 charWidth = 5和charHeight = 7. setRainbowSinkValue(int led,int brightness)已经永远工作了,所以不是那样。

  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&amp; 1 ... b&amp; 2 ... b&amp; 4 ... b&amp; 8 ... b&amp; 16 ... b&amp; 32 ... b&amp; 64 ... b&amp; 128 ...

2 个答案:

答案 0 :(得分:2)

基本上,您从testgt[]中提取的值会进入显示屏上的错误列。提供的代码看起来很好。这是你未展示的东西。也许,您的电路将输入索引与您期望的不同。

答案 1 :(得分:2)

好的我把它弄出来了...... 74hc595和TLC5940的速度之间似乎有微小的时间差异,所以发生的事情就是剩余的闪烁带到下一列,因为TLC不是在74hc595打开新列时清除。所以我切换了Tlc.clear()和openCol(col)并在其间添加了延迟(5),这有所帮助。不完全解决它,但延迟(15)伤害了眼睛,这是一个可接受的妥协。