本文基于之前的笑脸的帖子,
详情请参考:
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的方式貌似更高效,回头再仔细向二叔学习。
错漏难免,欢迎拍砖。
选择不同的彩色方式,执行起来还是很漂亮的
小伙伴们可以试试哦
|