wasdylb 发表于 2013-12-23 21:34:48

基于Microduino RTC 数码管时钟

本帖最后由 wasdylb 于 2013-12-23 21:44 编辑

闲来没事,发现以往买了带时钟两点的4位数码管,于是用Microduino RTC做了个时钟显示,感觉挺好的,正符合Microduino小巧的特点。上个图:

这里就不详细介绍四位数码管,因为数码管引脚不确定,每个厂家生产的都不一样。只需测出其引脚,通过更改程序就行。讲讲如何测量:
1.确定四位数码管的位码(哪个引脚点亮哪位数码管);
2.确定数码管的段码(a,b,c,d,e,f,g,dp);

程序:
如果需要调试时间需要把代码 vosettime()取消注释(把//去掉),再在初始化设置时间函数void vosettime()里改时间参数后下载就行;如果要掉电后继续运行,必须把vosettime()注释掉,加上//。如果不注释,掉电后重启,时间是设置的初始值。

#include <Wire.h>
#include <Rtc_Pcf8563.h>

Rtc_Pcf8563 rtc;//初始化实时时钟

#define Duan1 0
#define Duan2 3
#define Duan3 4
#define Duan4 8
#define Colon1 6
#define Colon2 7

int timehourg,timehours,timeming,timemins;
int timeyear1,timeyear2;
int timemouth1,timemouth2;
int timeday1,timeday2;

longdata=
{
0xfc,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6
};

void setup()
{
// Serial.begin(115200);
for(int x=0;x<14;x++)
{
    pinMode(x,OUTPUT);//设置输出引脚
}
//vosettime();
}
void loop()
{
rtc.formatDate();
rtc.formatTime();

timehours=rtc.getHour()/10;
timehourg=rtc.getHour()%10;
timemins=rtc.getMinute()/10;
timeming=rtc.getMinute()%10;

timeyear1=rtc.getYear()/10;
timeyear2=rtc.getYear()%10;

timemouth1=rtc.getMonth()/10;
timemouth2=rtc.getMonth()%10;

timeday1=rtc.getDay()/10;
timeday2=rtc.getDay()%10;

daytime();
/*
for(int i=0;i<500;i++)
    datetime();
for(int i=0;i<500;i++)
    datatime();
*/
/*
Serial.print("TIME:");
   Serial.print("20");
   Serial.print(rtc.getYear());
   Serial.print("/");
   Serial.print(rtc.getMonth());
   Serial.print("/");
   Serial.println(rtc.getDay());
   Serial.print(rtc.getHour());
   Serial.print(":");
   Serial.print(rtc.getMinute());
   Serial.print(":");
   Serial.println(rtc.getSecond());
   delay(1000);
   */
}
//显示时间
void daytime()
{
duanma(1);
leddisplay(data);
delay(3);
duanma(2);
leddisplay(data);
delay(3);
duanma(3);
leddisplay(data);
delay(3);
duanma(4);
leddisplay(data);
delay(3);

if(rtc.getSecond()%2==0)
{
    digitalWrite(Colon1, LOW);
    digitalWrite(Colon2, HIGH);
}
else
{
    digitalWrite(Colon1, HIGH);
    digitalWrite(Colon2, LOW);
}
}
//显示月、日
void datatime()
{
duanma(1);
leddisplay(data);
delay(3);
duanma(2);
leddisplay(data);
delay(3);
duanma(3);
leddisplay(data);
delay(3);
duanma(4);
leddisplay(data);
delay(3);
}
//显示年
void datetime()
{
duanma(1);
leddisplay(data);
delay(3);
duanma(2);
leddisplay(data);
delay(3);
duanma(3);
leddisplay(data);
delay(3);
duanma(4);
leddisplay(data);
delay(3);
}
//=======================初始化设置时间函数===========================//
void vosettime()
{
rtc.initClock();
//day, weekday, month, century(1=1900, 0=2000), year(0-99)
rtc.setDate(21, 6, 12, 0, 13);
//hr, min, sec
rtc.setTime(20, 44, 50);
}

void leddisplay(int num)    // 数组数据移位输出
{
/*=====================================================================
   先将16进制数向右移x位(num>>x),x代表了microduinoI/O口对应16进制的某位,
   0是最低位,7是最高位。再将移的数据与0x01按位与,就可以得到16进制数某位的
   数据(0或1),再将其值赋值给microduino的I/O就行。
   ======================================================================*/
digitalWrite(11, ((num>>0)&0x01));
digitalWrite(9, ((num>>1)&0x01));
digitalWrite(2, ((num>>2)&0x01));
digitalWrite(13, ((num>>3)&0x01));
digitalWrite(12, ((num>>4)&0x01));
digitalWrite(10, ((num>>5)&0x01));
digitalWrite(5, ((num>>6)&0x01));
digitalWrite(1,((num>>7)&0x01));
}
void duanma(int x)
{
switch(x)
{
case 1:
    {
      digitalWrite(Duan1, LOW);
      digitalWrite(Duan2, HIGH);
      digitalWrite(Duan3, HIGH);
      digitalWrite(Duan4, HIGH);
    }
    break;
case 2:
    {
      digitalWrite(Duan1, HIGH);
      digitalWrite(Duan2, LOW);
      digitalWrite(Duan3, HIGH);
      digitalWrite(Duan4, HIGH);
    }
    break;
case 3:
    {
      digitalWrite(Duan1, HIGH);
      digitalWrite(Duan2, HIGH);
      digitalWrite(Duan3, LOW);
      digitalWrite(Duan4, HIGH);
    }
    break;
case 4:
    {
      digitalWrite(Duan1, HIGH);
      digitalWrite(Duan2, HIGH);
      digitalWrite(Duan3, HIGH);
      digitalWrite(Duan4, LOW);
    }
    break;
}
}

huang1234 发表于 2014-3-27 22:57:13

{:soso_e113:}怎么没有调节时间的口呢?

wetnt 发表于 2014-3-28 09:26:28

收藏备用,希望上多点照片,看清楚连接构造
页: [1]
查看完整版本: 基于Microduino RTC 数码管时钟