卓泰科技 发表于 2015-1-13 12:16:33

【JoyTag香蕉派学习】8x8 RGB LED 跑马灯

本文基于之前的笑脸的帖子,
详情请参考:
http://forum.godpub.com/thread-60-1-1.html

话说,显示笑脸的程序被二叔鄙视了,说太低级。
于是想着在这个基础上改进一下,显示点啥的,显示个HELLO吧
不过话说这个点阵太小,显示不下HELLO,所以想到跑马灯的方式(姑且这么叫吧)
就是挨个字符显示。

代码

        不废话,上代码,原谅我的渣代码:

#include <stdio.h>
#include <wiringPi.h>
#include <sr595.h>

#define bitRead(value, bit) (((value) >> (bit)) & 0x01)

unsigned char smile = { \
      {0, 0, 1, 1, 1, 1, 0, 0}, \
      {0, 1, 0, 0, 0, 0, 1, 0}, \
      {1, 0, 1, 0, 0, 1, 0, 1}, \
      {1, 0, 0, 0, 0, 0, 0, 1}, \
      {1, 0, 1, 0, 0, 1, 0, 1}, \
      {1, 0, 0, 1, 1, 0, 0, 1}, \
      {0, 1, 0, 0, 0, 0, 1, 0}, \
      {0, 0, 1, 1, 1, 1, 0, 0}\
};

unsigned char H ={ \
    {0, 1, 0, 0, 0, 0, 1, 0}, \
    {0, 1, 0, 0, 0, 0, 1, 0}, \
    {0, 1, 0, 0, 0, 0, 1, 0}, \
    {0, 1, 0, 0, 0, 0, 1, 0}, \
    {0, 1, 1, 1, 1, 1, 1, 0}, \
    {0, 1, 0, 0, 0, 0, 1, 0}, \
    {0, 1, 0, 0, 0, 0, 1, 0}, \
    {0, 1, 0, 0, 0, 0, 1, 0}\
};

unsigned charE = { \
    {0, 1, 1, 1, 1, 1, 1, 0}, \
    {0, 1, 0, 0, 0, 0, 0, 0}, \
    {0, 1, 0, 0, 0, 0, 0, 0}, \
    {0, 1, 1, 1, 1, 1, 1, 0}, \
    {0, 1, 0, 0, 0, 0, 0, 0}, \
    {0, 1, 0, 0, 0, 0, 0, 0}, \
    {0, 1, 0, 0, 0, 0, 0, 0}, \
    {0, 1, 1, 1, 1, 1, 1, 0}\
};

unsigned charL ={ \
    {0, 1, 0, 0, 0, 0, 0, 0}, \
    {0, 1, 0, 0, 0, 0, 0, 0}, \
    {0, 1, 0, 0, 0, 0, 0, 0}, \
    {0, 1, 0, 0, 0, 0, 0, 0}, \
    {0, 1, 0, 0, 0, 0, 0, 0}, \
    {0, 1, 0, 0, 0, 0, 0, 0}, \
    {0, 1, 0, 0, 0, 0, 0, 0}, \
    {0, 1, 1, 1, 1, 1, 1, 0}\
};

unsigned charO ={ \
    {0, 0, 0, 1, 1, 0, 0, 0}, \
    {0, 0, 1, 0, 0, 1, 0, 0}, \
    {0, 1, 0, 0, 0, 0, 1, 0}, \
    {0, 1, 0, 0, 0, 0, 1, 0}, \
    {0, 1, 0, 0, 0, 0, 1, 0}, \
    {0, 1, 0, 0, 0, 0, 1, 0}, \
    {0, 0, 1, 0, 0, 1, 0, 0}, \
    {0, 0, 0, 1, 1, 0, 0, 0}\
};

void * p = {H, E, L, L, O};

void set(int x, int y, unsigned char color)
{
      int c;
      for(c=0; c<=2; c++)
      {
                if(bitRead(color, c))
                        digitalWrite(x + 100 + 8*c, 0);
      }
      digitalWrite(y + 124, 1);

      for(c=2; c>=0; c--)
      {
                if(bitRead(color, c))
                        digitalWrite(x + 100 + 8*c, 1);
      }
      digitalWrite(y + 124, 0);
}


int main(int argc, char *argv[])
{
      int i, j, color;
      wiringPiSetup();
      sr595Setup(100, 32, 12, 14, 10);

      for(i = 0; i < 32; i++)
      {
                pinMode(100 + i, OUTPUT);
      }

#if 1
      for(i =0; i< 24; i++)
      {
                digitalWrite(100 + i, 1);
      }

      for(i =0; i< 8; i++)
      {
                digitalWrite(124 + i, 0);
      }

#endif

      color = 0b010; //green
      if(argc > 1 )
      {
                color = atoi(argv);
      }

      while(1)
      {
                int k;
                for(k=0; k<500; k++)
                {
                        for(i=0; i<8; i++)
                        {
                              for(j=0; j<8; j++)
                              {
                                        if(*(((unsigned char *)p)+j*8+i) == 1)
                                                set(i, j, color);
                                                //set(i, j, random()%7+1);
                              }
                        }

                        if(k%100 == 0)
                              delay(100);
                }
      }
}
代码比对之前的代码做了一些修改,减少了digitalWrite操作次数,这样显示会更稳定一些。
(注:二叔说红灯不能和其它灯一起点亮,属实存在这个问题,所以调色的时候只能靠依次点亮调色了。
这也是为啥上个帖子中,把光公共端的语句放在不同位置会导致调色不可用的缘故)

编译
gcc -lwiringPi rgbled.c -o rgbled
执行
nice -10 ./rgbled 1
执行程序时可加可不加参数,参数0到7代表7种颜色

色彩
f(*(((unsigned char *)p)+j*8+i) == 1)
                                                set(i, j, color);
                                                //set(i, j, random()%7+1);
这处如果改成下边的语句,就会不同的点显示随机颜色。非常漂亮。
小伙伴们可以自己做出不同效果,比如每个字显示随机色等。

效果图:
http://forum.godpub.com/forum.php?mod=image&aid=54&size=300x300&key=1a613f5bb762b369&nocache=yes&type=fixnone

视频拍不出来效果,就不传了。
另外,二叔直接操作SPI的方式貌似更高效,回头再仔细向二叔学习。

错漏难免,欢迎拍砖。
选择不同的彩色方式,执行起来还是很漂亮的
小伙伴们可以试试哦

页: [1]
查看完整版本: 【JoyTag香蕉派学习】8x8 RGB LED 跑马灯