查看: 3298|回复: 3

R1路由+RGB点阵做莫尔斯时间

[复制链接]
  • TA的每日心情
    开心
    2019-6-25 09:54
  • 签到天数: 216 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2015-1-14 13:48:37 | 显示全部楼层 |阅读模式
    分享到:
    感谢老邓,给了块RGB点阵。
    下面是我用RGB点阵写的表~用来显示时间。当然,这个表不是直接显示数字时钟,而是用莫尔斯电码来显示数字。

    参考莫尔斯电码的数字,di【就是·】点亮LED,da【就是—】不点亮LED,然后时分秒分别用2位数字码来表示,第一位表示十位,第二位表示个位,比如11点05分29秒就是:
    ————时————
    ●○○○○
    ●○○○○
    ————分————
    ○○○○○
    ●●●●●
    ————秒————
    ●●○○○
    ○○○○●
    效果如图~嘿嘿~
    QQ图片20150114132049.jpg
    QQ图片20150114132435.jpg
    嘛,因为拍的看不清效果,所以用纸巾包住来拍……
    QQ图片20150114134418.jpg
    整体效果~感觉还是很棒滴~

    QQ图片20150114132933.jpg
    需要注意的是我的模块是反过来接的,为了能更大程度的使用R1的IO~毕竟用了SPI驱动,其他引脚没用到,那就不要占着它们了~腾出来还能做更多的事情~
    程序代码如下:
    1. /***********************************************************
    2.         程序名:香蕉派 RGB点阵莫尔斯电码时间
    3.         作  者:PokeBox
    4.         时  间:2015年1月14日 01:29:29
    5.         备  注:使用软件SPI驱动595模块带动RGB点阵,
    6.                 RGB模块和595模块连接方向相反,若要
    7.                 正着连接请自行修改程序的Reverse标记!
    8.                 反接和正接的小时和秒的红蓝色不一样。

    9. ***********************************************************/

    10. #include <time.h>
    11. #include <wiringPi.h>
    12. #include <wiringPiSPI.h>
    13. #include <sr595.h>

    14. #define Reverse 1        //如果反向接就标记为1

    15. #if Reverse
    16. #define VGPIO 107        //电源脚
    17. #define RGPIO 115        //红
    18. #define GGPIO 123        //绿
    19. #define BGPIO 131        //蓝
    20. #else
    21. #define VGPIO 131        //电源脚
    22. #define RGPIO 107        //红
    23. #define GGPIO 115        //绿
    24. #define BGPIO 123        //蓝
    25. #endif

    26. unsigned char mores[10][8] = {        //数字莫尔斯电码数据表
    27.         {0,0,0,0,0,0,0,0},        //0        —————
    28.         {1,0,0,0,0,0,0,0},        //1        ·————
    29.         {1,1,0,0,0,0,0,0},        //2        ··———
    30.         {1,1,1,0,0,0,0,0},        //3        ···——
    31.         {1,1,1,1,0,0,0,0},        //4        ····—
    32.         {1,1,1,1,1,0,0,0},        //5        ·····
    33.         {0,1,1,1,1,0,0,0},        //6        —····
    34.         {0,0,1,1,1,0,0,0},        //7        ——···
    35.         {0,0,0,1,1,0,0,0},        //8        ———··
    36.         {0,0,0,0,1,0,0,0},        //9        ————·
    37. };

    38. void set(int x, int y, unsigned char cond)
    39. {
    40.         if (cond == 1)        //只有读取到1的时候才显示
    41.         {
    42.                 switch (y)        //判断坐标位置来区分颜色
    43.                 {
    44.                         case 0:        //如果是第一行或第二行则是小时数据,显示红色
    45.                         case 1:
    46.                                 digitalWrite(RGPIO - x, 0);
    47.                         break;
    48.                         case 3:        //如果是第三行或第四行则是分钟数据,显示绿色
    49.                         case 4:
    50.                                 digitalWrite(GGPIO - x, 0);
    51.                         break;
    52.                         case 6:        //秒数据显示蓝色
    53.                         case 7:
    54.                                 digitalWrite(BGPIO - x, 0);
    55.                         break;
    56.                 }
    57.                 digitalWrite(VGPIO - y, 1);       //阳极控制脚        输出高电平启动
    58.                 digitalWrite(RGPIO - x, 1);       //红        阴极控制脚 输出高电平关闭
    59.                 digitalWrite(GGPIO - x, 1);       //绿
    60.                 digitalWrite(BGPIO - x, 1);       //蓝
    61.                 digitalWrite(VGPIO - y, 0);        //阳极控制脚        输出低电平关闭
    62.         }

    63. }

    64. int main(int argc, char *argv[])
    65. {
    66.         int x,i,k, hh,mm,ss,ha,hb,ma,mb,sa,sb;
    67.         time_t t;                //时间
    68.         struct tm *local;        //本地时间

    69.         wiringPiSetup();
    70.         sr595Setup(100, 32, 12, 14, 10);        //sr595Setup (pinBase, numPins, dataPin, clockPin, latchPin) ;
    71.        
    72.         for(i = 0; i < 32; i++)                //设置为输出模式
    73.         {
    74.                 pinMode(100 + i, OUTPUT);
    75.         }
    76.        
    77.         for(i =0; i< 24; i++)                //关显示【RGB位,8+8+8=24】
    78.         {
    79. #if Reverse
    80.                 digitalWrite(108 + i, 1);
    81. #else
    82.                 digitalWrite(100 + i, 1);
    83. #endif
    84.         }
    85.         for(i =0; i< 8; i++)                //关显示【VCC位,100-107】
    86.         {
    87. #if Reverse
    88.                 digitalWrite(100 + i, 0);
    89. #else
    90.                 digitalWrite(124 + i, 0);
    91. #endif
    92.         }
    93.        
    94.         while(1){
    95.                 t=time(NULL);                //获取时间
    96.                 local=localtime(&t);        //获取本地时间
    97.                 hh=local->tm_hour;        //获取小时数据
    98.                 mm=local->tm_min;        //获取分钟数据
    99.                 ss=local->tm_sec;        //获取秒数据
    100.                 ha=hh/10;hb=hh%10;        //拆分小时的十位和个位
    101.                 ma=mm/10;mb=mm%10;
    102.                 sa=ss/10;sb=ss%10;
    103.                
    104.                 for(k=0;k<8;k++){        //延时显示保持稳定
    105.                         for(x=0; x<8; x++)        //显示小时十位数据
    106.                         {
    107.                                 set(x, 0, mores[ha][x]);
    108.                         }
    109.                         for(x=0; x<8; x++)        //显示小时个位数据
    110.                         {
    111.                                 set(x, 1, mores[hb][x]);
    112.                         }
    113.                         //隔行显示
    114.                         for(x=0; x<8; x++)        //分
    115.                         {
    116.                                 set(x, 3, mores[ma][x]);
    117.                         }
    118.                         for(x=0; x<8; x++)
    119.                         {
    120.                                 set(x, 4, mores[mb][x]);
    121.                         }
    122.                         //隔行显示
    123.                         for(x=0; x<8; x++)        //秒
    124.                         {
    125.                                 set(x, 6, mores[sa][x]);
    126.                         }
    127.                         for(x=0; x<8; x++)
    128.                         {
    129.                                 set(x, 7, mores[sb][x]);
    130.                         }
    131.                 }
    132.         }
    133. }
    复制代码
    编译使用这个命令:
    1. gcc -lwiringPi ./rgbled.c -o rgbled
    复制代码
    然后运行rgbled就可以看到效果了~
    可能会出现爆闪的现象,那么用下面这个命令来运行效果就会好很多:
    1. nice -n -10 ./rgbled
    复制代码
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2015-3-6 13:14
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2015-1-14 13:52:10 | 显示全部楼层
    二叔前来膜拜啦~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2020-9-28 10:10
  • 签到天数: 1018 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2015-1-14 14:13:08 | 显示全部楼层
    前排点赞!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2020-2-7 11:49
  • 签到天数: 2193 天

    连续签到: 33 天

    [LV.Master]伴坛终老

    发表于 2015-1-14 16:32:29 | 显示全部楼层
    顶一个!!!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /5 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-12-19 18:53 , Processed in 0.147750 second(s), 22 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.