TA的每日心情 | 开心 2019-6-25 09:54 |
---|
签到天数: 216 天 连续签到: 1 天 [LV.7]常住居民III
|
感谢老邓,给了块RGB点阵。
下面是我用RGB点阵写的表~用来显示时间。当然,这个表不是直接显示数字时钟,而是用莫尔斯电码来显示数字。
参考莫尔斯电码的数字,di【就是·】点亮LED,da【就是—】不点亮LED,然后时分秒分别用2位数字码来表示,第一位表示十位,第二位表示个位,比如11点05分29秒就是:
————时————
●○○○○
●○○○○
————分————
○○○○○
●●●●●
————秒————
●●○○○
○○○○●
效果如图~嘿嘿~
嘛,因为拍的看不清效果,所以用纸巾包住来拍……
整体效果~感觉还是很棒滴~
需要注意的是我的模块是反过来接的,为了能更大程度的使用R1的IO~毕竟用了SPI驱动,其他引脚没用到,那就不要占着它们了~腾出来还能做更多的事情~
程序代码如下:- /***********************************************************
- 程序名:香蕉派 RGB点阵莫尔斯电码时间
- 作 者:PokeBox
- 时 间:2015年1月14日 01:29:29
- 备 注:使用软件SPI驱动595模块带动RGB点阵,
- RGB模块和595模块连接方向相反,若要
- 正着连接请自行修改程序的Reverse标记!
- 反接和正接的小时和秒的红蓝色不一样。
- ***********************************************************/
- #include <time.h>
- #include <wiringPi.h>
- #include <wiringPiSPI.h>
- #include <sr595.h>
- #define Reverse 1 //如果反向接就标记为1
- #if Reverse
- #define VGPIO 107 //电源脚
- #define RGPIO 115 //红
- #define GGPIO 123 //绿
- #define BGPIO 131 //蓝
- #else
- #define VGPIO 131 //电源脚
- #define RGPIO 107 //红
- #define GGPIO 115 //绿
- #define BGPIO 123 //蓝
- #endif
- unsigned char mores[10][8] = { //数字莫尔斯电码数据表
- {0,0,0,0,0,0,0,0}, //0 —————
- {1,0,0,0,0,0,0,0}, //1 ·————
- {1,1,0,0,0,0,0,0}, //2 ··———
- {1,1,1,0,0,0,0,0}, //3 ···——
- {1,1,1,1,0,0,0,0}, //4 ····—
- {1,1,1,1,1,0,0,0}, //5 ·····
- {0,1,1,1,1,0,0,0}, //6 —····
- {0,0,1,1,1,0,0,0}, //7 ——···
- {0,0,0,1,1,0,0,0}, //8 ———··
- {0,0,0,0,1,0,0,0}, //9 ————·
- };
- void set(int x, int y, unsigned char cond)
- {
- if (cond == 1) //只有读取到1的时候才显示
- {
- switch (y) //判断坐标位置来区分颜色
- {
- case 0: //如果是第一行或第二行则是小时数据,显示红色
- case 1:
- digitalWrite(RGPIO - x, 0);
- break;
- case 3: //如果是第三行或第四行则是分钟数据,显示绿色
- case 4:
- digitalWrite(GGPIO - x, 0);
- break;
- case 6: //秒数据显示蓝色
- case 7:
- digitalWrite(BGPIO - x, 0);
- break;
- }
- digitalWrite(VGPIO - y, 1); //阳极控制脚 输出高电平启动
- digitalWrite(RGPIO - x, 1); //红 阴极控制脚 输出高电平关闭
- digitalWrite(GGPIO - x, 1); //绿
- digitalWrite(BGPIO - x, 1); //蓝
- digitalWrite(VGPIO - y, 0); //阳极控制脚 输出低电平关闭
- }
- }
- int main(int argc, char *argv[])
- {
- int x,i,k, hh,mm,ss,ha,hb,ma,mb,sa,sb;
- time_t t; //时间
- struct tm *local; //本地时间
- wiringPiSetup();
- sr595Setup(100, 32, 12, 14, 10); //sr595Setup (pinBase, numPins, dataPin, clockPin, latchPin) ;
-
- for(i = 0; i < 32; i++) //设置为输出模式
- {
- pinMode(100 + i, OUTPUT);
- }
-
- for(i =0; i< 24; i++) //关显示【RGB位,8+8+8=24】
- {
- #if Reverse
- digitalWrite(108 + i, 1);
- #else
- digitalWrite(100 + i, 1);
- #endif
- }
- for(i =0; i< 8; i++) //关显示【VCC位,100-107】
- {
- #if Reverse
- digitalWrite(100 + i, 0);
- #else
- digitalWrite(124 + i, 0);
- #endif
- }
-
- while(1){
- t=time(NULL); //获取时间
- local=localtime(&t); //获取本地时间
- hh=local->tm_hour; //获取小时数据
- mm=local->tm_min; //获取分钟数据
- ss=local->tm_sec; //获取秒数据
- ha=hh/10;hb=hh%10; //拆分小时的十位和个位
- ma=mm/10;mb=mm%10;
- sa=ss/10;sb=ss%10;
-
- for(k=0;k<8;k++){ //延时显示保持稳定
- for(x=0; x<8; x++) //显示小时十位数据
- {
- set(x, 0, mores[ha][x]);
- }
- for(x=0; x<8; x++) //显示小时个位数据
- {
- set(x, 1, mores[hb][x]);
- }
- //隔行显示
- for(x=0; x<8; x++) //分
- {
- set(x, 3, mores[ma][x]);
- }
- for(x=0; x<8; x++)
- {
- set(x, 4, mores[mb][x]);
- }
- //隔行显示
- for(x=0; x<8; x++) //秒
- {
- set(x, 6, mores[sa][x]);
- }
- for(x=0; x<8; x++)
- {
- set(x, 7, mores[sb][x]);
- }
- }
- }
- }
复制代码 编译使用这个命令:- gcc -lwiringPi ./rgbled.c -o rgbled
复制代码 然后运行rgbled就可以看到效果了~
可能会出现爆闪的现象,那么用下面这个命令来运行效果就会好很多: |
|