【求助】关于使用 arduino制作LED数字时钟的几个问题
额,本人新手小白,从没接触过电子电路,最近计划研究一下 arduino,打算用四位共阳数码管DIY一个小时钟据说, 需要DS1302,但是再加上4位数码管IO就不够了,所以打算用74HC595x2来做
已经成功的点亮数码管,可是看了不少关于 DS1302的帖子,还没有理解程序应该怎么设计
比如DS1302怎么把返回的例如 12-59-59 这个时间交给数码管呢? MCU又怎么把12-59-59这个数字直接换成驱动LED的电压信号呢?(一个一个定义貌似很麻烦,有没有简单的方法呢?)
目前已经做到用74HC595成功的让4位数码管同时显示不同的数字,接下来求指导.......
不包含DS1302的设计图如下:
你看的教程太少了。。。。 MCU就是要从很底层做起的。。。 多看些教程熟悉下吧。DS1302的库把时间返回给你已经是省事很多了。 你要自己拆开小时和分的个位和十位,再把数字拆成数码管的横与竖。。。然后对应595的针脚。。。 自己继续思考吧。 最关键的还是数码管是共阳极,需要一位一位的扫描。 lyili 发表于 2013-4-3 16:57 static/image/common/back.gif
最关键的还是数码管是共阳极,需要一位一位的扫描。
原理已经知道了,就是程序有点儿摸不到头脑,不知该怎么弄好......
看来要Google一下了 lyili 发表于 2013-4-3 16:55 static/image/common/back.gif
你看的教程太少了。。。。 MCU就是要从很底层做起的。。。 多看些教程熟悉下吧。DS1302的库把时间返回给你 ...
而且中文资料不多,大多数资料都是英语的,这也就忍了,更让人无法忍受的是,不少网站是被墙住的..... 本帖最后由 lyili 于 2013-4-3 18:09 编辑
这里的就有,还舍近求远?好好看下精华贴和wiki。。。 这个玩意我就做了,程序也没多少。。。 不需要DS1302,直接设置循环点亮程序,个位数每秒0-9循环,十位数每分钟0-5循环等等。 #include <DS1302.h>
uint8_t CE_PIN = 14;
uint8_t IO_PIN = 15;
uint8_t SCLK_PIN = 16;
DS1302 rtc(CE_PIN, IO_PIN, SCLK_PIN);
//设置数码管阴极接口
int a = 1;
int b = 2;
int c = 3;
int d = 4;
int e = 5;
int f = 6;
int g = 7;
//设置各位数码管位选通引脚COM引脚
int com1 = 8;
int com2 = 9;
int com3 = 10;
int com4 = 11;
int com5 = 12;
int com6 = 13;
void digital_0() //显示数字0
{
digitalWrite(a,LOW);
digitalWrite(b,LOW);
digitalWrite(c,LOW);
digitalWrite(d,LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
}
void digital_1() //显示数字1
{
digitalWrite(a,HIGH);
digitalWrite(b,LOW);
digitalWrite(c,LOW);
digitalWrite(e,HIGH);
digitalWrite(d,HIGH);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
}
void digital_2() //显示数字2
{
digitalWrite(a,LOW);
digitalWrite(b,LOW);
digitalWrite(c,HIGH);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
digitalWrite(f,HIGH);
digitalWrite(g,LOW);
}
void digital_3() //显示数字3
{
digitalWrite(a,LOW);
digitalWrite(b,LOW);
digitalWrite(c,LOW);
digitalWrite(d,LOW);
digitalWrite(e,HIGH);
digitalWrite(f,HIGH);
digitalWrite(g,LOW);
}
void digital_4() //显示数字4
{
digitalWrite(a,HIGH);
digitalWrite(b,LOW);
digitalWrite(c,LOW);
digitalWrite(d,HIGH);
digitalWrite(e,HIGH);
digitalWrite(f,LOW);
digitalWrite(g,LOW);
}
void digital_5( ) //显示数字5
{
digitalWrite(a,LOW);
digitalWrite(b,HIGH);
digitalWrite(c,LOW);
digitalWrite(d,LOW);
digitalWrite(e,HIGH);
digitalWrite(f,LOW);
digitalWrite(g,LOW);
}
void digital_6() //显示数字6
{
digitalWrite(a, HIGH );
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
digitalWrite(f,LOW);
digitalWrite(g, LOW);
}
void digital_7 () //显示数字7
{
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c,LOW);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}
void digital_8( ) //显示数字8
{
digitalWrite(a,LOW);
digitalWrite(b,LOW);
digitalWrite(c,LOW);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
digitalWrite(f,LOW);
digitalWrite(g,LOW);
}
void digital_9( ) //显示数字9
{
digitalWrite(a, LOW );
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d,LOW);
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
}
void digital_off( )//全灭
{
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(e,HIGH);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
}
void pickDcom(int x)//导通指定COM阳极引脚
{
digitalWrite(com1, LOW);
digitalWrite(com2, LOW);
digitalWrite(com3, LOW);
digitalWrite(com4, LOW);
digitalWrite(com4, LOW);
digitalWrite(com6, LOW);
switch(x)
{
case 1:
digitalWrite(com1, HIGH); //导通第一位数码管的位选通引脚
break;
case 2:
digitalWrite(com2, HIGH); //导通第二位数码管的位选通引脚
break;
case 3:
digitalWrite(com3, HIGH); //导通第三位数码管的位选通引脚
break;
default:
digitalWrite(com4, HIGH); //导通第四位数码管的位选通引脚
break;
}
}
void setup()
{for(int i=1;i<16;i++)
{pinMode(i, OUTPUT); }
rtc.write_protect(false);//解除1302芯片写保护
rtc.halt(false);//关闭涓流充电
Time t(2009, 5, 19, 21, 16, 37, 3);//设置芯片时间:Tuesday, May 19, 2009 at 21:16:37.
rtc.time(t);//将时间写入芯片
}
void loop()
{digital_off( );
Time t = rtc.time(); /* 从 DS1302 获取当前时间 */
pickDcom(1);//选通第一位数码管的COM脚,显示小时的第一位
switch (t.hr/10)
{
case 1: digital_1(); break;
case 2: digital_2(); break;
}
digital_off( );
switch (t.hr%10)
{
case 1: digital_1(); break;
case 2: digital_2(); break;
case 3: digital_3(); break;
case 4: digital_4; break;
}
delay(1000);
}
不知道这样可以不?
页:
[1]