【转】R1+RGB点阵模块莫尔斯显示时间

[table=98%]
[tr][td]首先感谢老邓,得到了一个RGB点阵模块。然后是卓泰和二叔等各位老前辈们~
一开始还有点无从下手,没有在香蕉派上编译过GPIO类的程序。参考了卓泰的程序和二叔的程序,算是大概弄懂了驱动的模式。
昨晚11点多回到家,就写了个表~用来显示时间。当然,这个表不是直接显示数字时钟,而是用莫尔斯电码来显示数字。


参考莫尔斯电码的数字,di【就是·】点亮LED,da【就是—】不点亮LED,然后时分秒分别用2位数字码来表示,第一位表示十位,第二位表示个位,比如11点05分29秒就是:
————时————
●○○○○
●○○○○
————分————
○○○○○
●●●●●
————秒————
●●○○○
○○○○●



效果如图~嘿嘿,试着读一下上面的时间是几点?欢迎回帖哦~
下面是代码,参考了一下卓泰的源码,所以结构上略有点像~很多注释,方便初学者学习~
/***********************************************************
程序名:香蕉派 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]);
        }
    }
}

}

本帖转自树莓派创客社区
[td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][td]
[/td][/td][/tr]
[/table]