这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 开源硬件 » 【JoyTag香蕉派学习:五】8x8 RGB LED 跑马灯 (C, 香蕉派)

共1条 1/1 1 跳转至

【JoyTag香蕉派学习:五】8x8 RGB LED 跑马灯 (C, 香蕉派)

专家
2015-01-13 12:02:40     打赏
本文基于之前的笑脸的帖子,
详情请参考:
http://www.52pi.net/forum.php?mod=viewthread&tid=1322

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

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

#include <stdio.h>
#include <wiringPi.h>
#include <sr595.h>
 
#define bitRead(value, bit) (((value) >> (bit)) & 0x01)
 
unsigned char smile[8][8] = { \
        {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[8][8] ={ \
    {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 char  E[8][8] = { \
    {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 char  L[8][8] ={ \
    {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 char  O[8][8] ={ \
    {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[5] = {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[1]);
        }
 
        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[k/100])+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[k/100])+j*8+i) == 1)
                                                set(i, j, color);
                                                //set(i, j, random()%7+1);
这处如果改成下边的语句,就会不同的点显示随机颜色。非常漂亮。
小伙伴们可以自己做出不同效果,比如每个字显示随机色等。

效果图:

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

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


共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]