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