狗趴(GodPub),开源硬件学习与实践

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 6420|回复: 0
打印 上一主题 下一主题

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

[复制链接]

84

主题

143

帖子

725

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
725
QQ
跳转到指定楼层
楼主
发表于 2015-1-13 12:16:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本文基于之前的笑脸的帖子,
详情请参考:
http://forum.godpub.com/thread-60-1-1.html

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

代码

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

  1. #include <stdio.h>
  2. #include <wiringPi.h>
  3. #include <sr595.h>

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

  5. unsigned char smile[8][8] = { \
  6.         {0, 0, 1, 1, 1, 1, 0, 0}, \
  7.         {0, 1, 0, 0, 0, 0, 1, 0}, \
  8.         {1, 0, 1, 0, 0, 1, 0, 1}, \
  9.         {1, 0, 0, 0, 0, 0, 0, 1}, \
  10.         {1, 0, 1, 0, 0, 1, 0, 1}, \
  11.         {1, 0, 0, 1, 1, 0, 0, 1}, \
  12.         {0, 1, 0, 0, 0, 0, 1, 0}, \
  13.         {0, 0, 1, 1, 1, 1, 0, 0}  \
  14. };

  15. unsigned char H[8][8] ={ \
  16.     {0, 1, 0, 0, 0, 0, 1, 0}, \
  17.     {0, 1, 0, 0, 0, 0, 1, 0}, \
  18.     {0, 1, 0, 0, 0, 0, 1, 0}, \
  19.     {0, 1, 0, 0, 0, 0, 1, 0}, \
  20.     {0, 1, 1, 1, 1, 1, 1, 0}, \
  21.     {0, 1, 0, 0, 0, 0, 1, 0}, \
  22.     {0, 1, 0, 0, 0, 0, 1, 0}, \
  23.     {0, 1, 0, 0, 0, 0, 1, 0}  \
  24. };

  25. unsigned char  E[8][8] = { \
  26.     {0, 1, 1, 1, 1, 1, 1, 0}, \
  27.     {0, 1, 0, 0, 0, 0, 0, 0}, \
  28.     {0, 1, 0, 0, 0, 0, 0, 0}, \
  29.     {0, 1, 1, 1, 1, 1, 1, 0}, \
  30.     {0, 1, 0, 0, 0, 0, 0, 0}, \
  31.     {0, 1, 0, 0, 0, 0, 0, 0}, \
  32.     {0, 1, 0, 0, 0, 0, 0, 0}, \
  33.     {0, 1, 1, 1, 1, 1, 1, 0}  \
  34. };

  35. unsigned char  L[8][8] ={ \
  36.     {0, 1, 0, 0, 0, 0, 0, 0}, \
  37.     {0, 1, 0, 0, 0, 0, 0, 0}, \
  38.     {0, 1, 0, 0, 0, 0, 0, 0}, \
  39.     {0, 1, 0, 0, 0, 0, 0, 0}, \
  40.     {0, 1, 0, 0, 0, 0, 0, 0}, \
  41.     {0, 1, 0, 0, 0, 0, 0, 0}, \
  42.     {0, 1, 0, 0, 0, 0, 0, 0}, \
  43.     {0, 1, 1, 1, 1, 1, 1, 0}  \
  44. };

  45. unsigned char  O[8][8] ={ \
  46.     {0, 0, 0, 1, 1, 0, 0, 0}, \
  47.     {0, 0, 1, 0, 0, 1, 0, 0}, \
  48.     {0, 1, 0, 0, 0, 0, 1, 0}, \
  49.     {0, 1, 0, 0, 0, 0, 1, 0}, \
  50.     {0, 1, 0, 0, 0, 0, 1, 0}, \
  51.     {0, 1, 0, 0, 0, 0, 1, 0}, \
  52.     {0, 0, 1, 0, 0, 1, 0, 0}, \
  53.     {0, 0, 0, 1, 1, 0, 0, 0}  \
  54. };

  55. void * p[5] = {H, E, L, L, O};

  56. void set(int x, int y, unsigned char color)
  57. {
  58.         int c;
  59.         for(c=0; c<=2; c++)
  60.         {
  61.                 if(bitRead(color, c))
  62.                         digitalWrite(x + 100 + 8*c, 0);
  63.         }
  64.         digitalWrite(y + 124, 1);

  65.         for(c=2; c>=0; c--)
  66.         {
  67.                 if(bitRead(color, c))
  68.                         digitalWrite(x + 100 + 8*c, 1);
  69.         }
  70.         digitalWrite(y + 124, 0);
  71. }


  72. int main(int argc, char *argv[])
  73. {
  74.         int i, j, color;
  75.         wiringPiSetup();
  76.         sr595Setup(100, 32, 12, 14, 10);

  77.         for(i = 0; i < 32; i++)
  78.         {
  79.                 pinMode(100 + i, OUTPUT);
  80.         }

  81. #if 1
  82.         for(i =0; i< 24; i++)
  83.         {
  84.                 digitalWrite(100 + i, 1);
  85.         }

  86.         for(i =0; i< 8; i++)
  87.         {
  88.                 digitalWrite(124 + i, 0);
  89.         }

  90. #endif

  91.         color = 0b010; //green
  92.         if(argc > 1 )
  93.         {
  94.                 color = atoi(argv[1]);
  95.         }

  96.         while(1)
  97.         {
  98.                 int k;
  99.                 for(k=0; k<500; k++)
  100.                 {
  101.                         for(i=0; i<8; i++)
  102.                         {
  103.                                 for(j=0; j<8; j++)
  104.                                 {
  105.                                         if(*(((unsigned char *)p[k/100])+j*8+i) == 1)
  106.                                                 set(i, j, color);
  107.                                                 //set(i, j, random()%7+1);
  108.                                 }
  109.                         }

  110.                         if(k%100 == 0)
  111.                                 delay(100);
  112.                 }
  113.         }
  114. }
复制代码

代码比对之前的代码做了一些修改,减少了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的方式貌似更高效,回头再仔细向二叔学习。

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

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
天理路上甚宽,稍游心,胸中便觉广大宏朗;
人欲路上甚窄,才寄迹,眼前俱是荆棘泥涂。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|狗趴(GodPub) Arduino&Raspberry Pi开源硬件学习与实践[QQ群:20085629]  

GMT+8, 2024-4-28 15:15 , Processed in 0.029442 second(s), 33 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表