狗趴(GodPub),开源硬件学习与实践
标题:
【JoyTag香蕉派学习】8x8 RGB LED 跑马灯
[打印本页]
作者:
卓泰科技
时间:
2015-1-13 12:16
标题:
【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[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的方式貌似更高效,回头再仔细向二叔学习。
错漏难免,欢迎拍砖。
选择不同的彩色方式,执行起来还是很漂亮的
小伙伴们可以试试哦
欢迎光临 狗趴(GodPub),开源硬件学习与实践 (http://forum.godpub.com/)
Powered by Discuz! X3.2