极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 27759|回复: 14

做了一个最简单的4位LED数码管时钟,求改进建议

[复制链接]
发表于 2013-4-4 11:23:49 | 显示全部楼层 |阅读模式
本帖最后由 tompush 于 2013-4-4 11:39 编辑

第一次接触 单片机和电子电路,第一个小作品,求改进建议....... 正在研究怎么设置时间.....

如果电路或者程序有什么不足之处,希望指出 ,谢谢



程序如下:
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <DS1302.h>
  4. //74HC595 数码管的A-G
  5. int latchPin = 2;
  6. int clockPin = 3;
  7. int dataPin = 1;
  8. //数字,d1,d2,d3,d4
  9. int d1 = 13;
  10. int d2 = 12;
  11. int d3 = 11;
  12. int d4 = 10;
  13. //DS1302
  14. uint8_t CE_PIN   = 5;
  15. uint8_t IO_PIN   = 6;
  16. uint8_t SCLK_PIN = 7;
  17. DS1302 rtc(CE_PIN, IO_PIN, SCLK_PIN);

  18. void setup()
  19. {
  20.   pinMode(d1, OUTPUT);
  21.   pinMode(d2, OUTPUT);
  22.   pinMode(d3, OUTPUT);
  23.   pinMode(d4, OUTPUT);
  24.   pinMode(latchPin, OUTPUT);
  25.   pinMode(clockPin, OUTPUT);
  26.   pinMode(dataPin, OUTPUT);
  27.   rtc.write_protect(false);
  28.   rtc.halt(false);
  29. }

  30. void loop()
  31. {
  32.     Time t = rtc.time();


  33.   //显示第一位数字
  34.   cls();
  35.   dig(1);
  36.   num(t.hr/10);

  37.   //显示第二位数字
  38.   cls();
  39.   dig(2);
  40.   num(t.hr%10);

  41.   //显示第三位数字
  42.   cls();
  43.   dig(3);
  44.   num(t.min/10);

  45.   //显示第四位数字
  46.   cls();
  47.   dig(4);
  48.   num(t.min%10);
  49. }

  50. void dig(int x)  //dig(x),开启d(x)端口
  51. {
  52.   digitalWrite(d1, 0);
  53.   digitalWrite(d2, 0);
  54.   digitalWrite(d3, 0);
  55.   digitalWrite(d4, 0);

  56.   switch(x)
  57.   {
  58.   case 1:
  59.     digitalWrite(d1, 1);
  60.     break;
  61.   case 2:
  62.     digitalWrite(d2, 1);
  63.     break;
  64.   case 3:
  65.     digitalWrite(d3, 1);
  66.     break;
  67.   default:
  68.     digitalWrite(d4, 1);
  69.     break;
  70.   }
  71. }

  72. void num(int x)   //num(x),显示数字x
  73. {
  74.   switch(x)
  75.   {
  76.   default: //0
  77.     digitalWrite(latchPin,0);
  78.     shiftOut(dataPin,clockPin,MSBFIRST,3);
  79.     digitalWrite(latchPin,1);
  80.     break;
  81.   case 1: //1
  82.     digitalWrite(latchPin,0);
  83.     shiftOut(dataPin,clockPin,MSBFIRST,159);
  84.     digitalWrite(latchPin,1);
  85.     break;
  86.   case 2: //2
  87.     digitalWrite(latchPin,0);
  88.     shiftOut(dataPin,clockPin,MSBFIRST,37);
  89.     digitalWrite(latchPin,1);
  90.     break;
  91.   case 3: //3
  92.     digitalWrite(latchPin,0);
  93.     shiftOut(dataPin,clockPin,MSBFIRST,13);
  94.     digitalWrite(latchPin,1);
  95.     break;
  96.   case 4: //4
  97.     digitalWrite(latchPin,0);
  98.     shiftOut(dataPin,clockPin,MSBFIRST,153);
  99.     digitalWrite(latchPin,1);
  100.     break;
  101.   case 5: //5
  102.     digitalWrite(latchPin,0);
  103.     shiftOut(dataPin,clockPin,MSBFIRST,73);
  104.     digitalWrite(latchPin,1);
  105.     break;
  106.   case 6: //6
  107.     digitalWrite(latchPin,0);
  108.     shiftOut(dataPin,clockPin,MSBFIRST,65);
  109.     digitalWrite(latchPin,1);
  110.     break;
  111.   case 7: //7
  112.     digitalWrite(latchPin,0);
  113.     shiftOut(dataPin,clockPin,MSBFIRST,27);
  114.     digitalWrite(latchPin,1);
  115.     break;
  116.   case 8: //8
  117.     digitalWrite(latchPin,0);
  118.     shiftOut(dataPin,clockPin,MSBFIRST,1);
  119.     digitalWrite(latchPin,1);
  120.     break;
  121.   case 9: //9
  122.     digitalWrite(latchPin,0);
  123.     shiftOut(dataPin,clockPin,MSBFIRST,9);
  124.     digitalWrite(latchPin,1);
  125.     break;
  126.   }
  127. }

  128. void cls()  //清屏
  129. {
  130.     digitalWrite(latchPin,LOW);
  131.     shiftOut(dataPin,clockPin,MSBFIRST,255);
  132.     digitalWrite(latchPin,HIGH);
  133. }
复制代码


有不足之处希望大家指正,谢谢!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

 楼主| 发表于 2013-4-4 15:13:52 | 显示全部楼层
求帮助,求高手看看,这个电路和程序有没有问题, 要直接焊成板子了.......
回复 支持 反对

使用道具 举报

发表于 2013-4-4 17:33:11 | 显示全部楼层
{:soso_e103:}木看出来啥问题。。。直接焊吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-4-4 21:06:30 | 显示全部楼层
弘毅 发表于 2013-4-4 17:33
木看出来啥问题。。。直接焊吧

OK非常感谢~

正在筹备之中了,还是没弄懂怎么给DS1302设置时间,索性设计了一个按钮,接到0上面了,按下之后将时间设定为 12:00:00,到时候改一下时间,按一下按钮,就OK了,懒人 呵呵
回复 支持 反对

使用道具 举报

发表于 2013-6-6 23:36:38 | 显示全部楼层
G:\6}_X0X0H(%5BII{NZ%MAJ_25N.jpg
回复 支持 反对

使用道具 举报

发表于 2013-6-6 23:37:06 | 显示全部楼层
此程序好像问题
回复 支持 反对

使用道具 举报

发表于 2013-6-9 20:07:54 | 显示全部楼层
表示不错,如果换成DS1307,然后写DS1307的ROM让那玩意的7脚输出1Hz信号,就可以加一个冒号了
回复 支持 反对

使用道具 举报

发表于 2013-7-24 23:51:22 | 显示全部楼层
不错啊,一直想做呢,找不到例子,终于看到你的了,有问题要请教一下我QQ:834790
回复 支持 反对

使用道具 举报

发表于 2013-8-15 11:45:57 | 显示全部楼层
这个很精简,不知道焊成板子后结果怎么样。。
回复 支持 反对

使用道具 举报

发表于 2013-12-24 21:55:35 | 显示全部楼层
楼主,Proteus 软件哪个版本的,破解的吗?
我win7系统 用 Proteus 8 Demonstration ,破解不了不能模拟(mixed model AVR2.DLL failed to authorize- Bad Product Key.);
安装破解版的一直都闪退(PDS.EXE停止工作),求助
回复 支持 反对

使用道具 举报

发表于 2013-12-24 22:16:12 | 显示全部楼层
绿林网页 发表于 2013-12-24 21:55
楼主,Proteus 软件哪个版本的,破解的吗?
我win7系统 用 Proteus 8 Demonstration ,破解不了不能模拟( ...

7.7 SP2 一切使用正常。
回复 支持 反对

使用道具 举报

发表于 2013-12-24 22:34:16 | 显示全部楼层
pathletboy 发表于 2013-12-24 22:16
7.7 SP2 一切使用正常。

7.7自带元件库全么,还是需要自己安装原件库呀?
回复 支持 反对

使用道具 举报

发表于 2013-12-25 14:07:34 | 显示全部楼层
绿林网页 发表于 2013-12-24 22:34
7.7自带元件库全么,还是需要自己安装原件库呀?

你说的全不全什么概念不知道,反正简单搞搞实验没问题,Altium Designer 13的库都做不全,你就别指望proteus做全了。
回复 支持 反对

使用道具 举报

发表于 2016-4-14 18:14:00 | 显示全部楼层
楼主最后成功了吗?
回复 支持 反对

使用道具 举报

发表于 2016-4-25 11:02:06 | 显示全部楼层
建议把它封装成一个类,直接输入数字就可以显示出来
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-15 05:22 , Processed in 0.044685 second(s), 28 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表