极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14565|回复: 6

仿苹果风格的二进制时钟

[复制链接]
发表于 2015-3-28 20:06:30 | 显示全部楼层 |阅读模式
本帖最后由 HuaShine2015 于 2015-3-28 20:06 编辑

   用ATmega8做了个仿苹果风格的二进制时钟,现在M8真便宜才2.5元/片。
  先上图:
  
  
  
  
  
  
  
  
  源码如下:
  1. //二进制时钟源代码  Hua.Shine 2015-03-28
  2. //Mega8-16MHZ x 1; 74HC595 x 2; 共阳8x8LED x 1; DS1302 RTC模块
  3. //5v锂电池模块 x 1; 220欧电阻 x 8; 按钮开关 x 1;
  4. //接线方式:
  5. // Mega8 D3 --> 按钮开关 pin1
  6. // Mega GND --> 按钮开关 pin2
  7. // Mega8 D5 --> DS1302 RTC RST_PIN
  8. // Mega8 D6 --> DS1302 RTC DATA_PIN
  9. // Mega8 D7 --> DS1302 RTC CLK_PIN
  10. // Mega8 D8 --> 74HC595 ST_CP
  11. // Mega8 D12 --> 74HC595 SH_CP
  12. // Mega8 D11 --> 74HC595 DS

  13. #include <stdio.h>
  14. #include <string.h>
  15. #include <DS1302.h>

  16. /* Create buffers */
  17. //char buf[50];
  18. //char day[10];
  19. //Pin connected to ST_CP of 74HC595
  20. int latchPin = 8;
  21. //Pin connected to SH_CP of 74HC595
  22. int clockPin = 12;
  23. //Pin connected to DS of 74HC595
  24. int dataPin = 11;
  25. //Pin connected to SRCLR of 74HC595
  26. //int clearPin = 10;

  27. /* Set the appropriate digital I/O pin connections */
  28. uint8_t CE_PIN   = 5;
  29. uint8_t IO_PIN   = 6;
  30. uint8_t SCLK_PIN = 7;
  31. /* Create a DS1302 object */
  32. String inputString = "";
  33. boolean stringComplete = false;

  34. int numdata[7] = {0}, j = 0;
  35. DS1302 rtc(CE_PIN, IO_PIN, SCLK_PIN);

  36. const byte LEDnum[12][9] = {   //定义数字的点阵映射
  37.   
  38.   {B00111100,B00100100,B00100100,B00100100,B00100100,B00100100,B00100100,B00111100},//0
  39.   {B00100000,B00100000,B00100000,B00100000,B00100000,B00100000,B00100000,B00100000},//1
  40.   {B00111100,B00100000,B00100000,B00111100,B00000100,B00000100,B00000100,B00111100},//2
  41.   {B00111100,B00100000,B00100000,B00111100,B00100000,B00100000,B00100000,B00111100},//3
  42.   {B00100100,B00100100,B00100100,B00111100,B00100000,B00100000,B00100000,B00100000},//4
  43.   {B00111100,B00000100,B00000100,B00111100,B00100000,B00100000,B00100000,B00111100},//5
  44.   {B00111100,B00000100,B00000100,B00111100,B00100100,B00100100,B00100100,B00111100},//6
  45.   {B00111100,B00100000,B00100000,B00100000,B00100000,B00100000,B00100000,B00100000},//7
  46.   {B00111100,B00100100,B00100100,B00111100,B00100100,B00100100,B00100100,B00111100},//8
  47.   {B00111100,B00100100,B00100100,B00111100,B00100000,B00100000,B00100000,B00111100},//9
  48.   {B00000000,B00000000,B00011000,B00000000,B00000000,B00011000,B00000000,B00000000} //:
  49.   
  50. };
  51. const byte col[9] = {       //列选择
  52.   
  53.    B01111111,  //col number 1
  54.    B10111111,  //col number 2
  55.    B11011111,  //col number 3
  56.    B11101111,  //col number 4
  57.    B11110111,  //col number 5
  58.    B11111011,  //col number 6
  59.    B11111101,  //col number 7
  60.    B11111110   //col number 8
  61.    
  62. };

  63. const byte bset[11] = {
  64.   
  65.   B00000000,
  66.   B10000000,
  67.   B01000000,
  68.   B11000000,
  69.   B00100000,
  70.   B10100000,
  71.   B01100000,
  72.   B11100000,
  73.   B00010000,
  74.   B10010000,
  75.   
  76. };

  77. boolean bmode = false;

  78. void print_time()             //显示时间到点阵
  79. {
  80.     if(bmode == false){                    ////24小时格式顺序显示
  81.       Time t = rtc.time();
  82.       for(int i=0;i<250;i++){
  83.         numplay((int)(t.hr/10));
  84.       }
  85.       for(int i=0;i<250;i++){
  86.         numplay((int)(t.hr%10));
  87.       }  
  88.       for(int i=0;i<150;i++){
  89.         numplay(10);
  90.       }      
  91.       for(int i=0;i<250;i++){
  92.         numplay((int)(t.min/10));
  93.       }
  94.       for(int i=0;i<250;i++){
  95.         numplay((int)(t.min%10));
  96.       }   
  97.           delay(1200);  
  98.     }else{                                 //二进制格式显示
  99.       Time t = rtc.time();
  100.       for(int i=0;i<1000;i++){
  101.         bitplay((int)(t.hr/10),0);     
  102.         bitplay((int)(t.hr%10),1);
  103.         bitplay((int)(t.min/10),2);
  104.         bitplay((int)(t.min%10),3);
  105.         bitplay((int)(t.sec/10),4);
  106.         bitplay((int)(t.sec%10),5);
  107.         bitplay(0,6);
  108.         bitplay(0,7);        
  109.       }
  110.     }

  111. }

  112. void wake_up(){                                                                //按钮中断函数,切换显示格式
  113.   bmode=(!bmode);
  114. }

  115. void setup() {                                                                //主函数
  116.       
  117.   Serial.begin(9600);
  118.   inputString.reserve(25);
  119.   pinMode(latchPin,OUTPUT);
  120.   pinMode(3,INPUT_PULLUP);
  121.   attachInterrupt(1, wake_up, FALLING);  
  122.   rtc.write_protect(false);
  123.   rtc.halt(false);
  124.   
  125. }

  126. void loop() {
  127.   
  128.   if (stringComplete) {                        //有串口输入事件响应代码块
  129.     Serial.println("You inputed : " + inputString);
  130.         for(int i = 0; i < inputString.length() ; i++){      //此处使用论坛例程处理串口时间数据
  131.             if(inputString[i] == ',' || inputString[i] == 0x10 || inputString[i] == 0x13)
  132.             {
  133.                 j++;
  134.             }
  135.             else
  136.             {
  137.                 numdata[j] = numdata[j] * 10 + (inputString[i] - '0');
  138.             }
  139.         }
  140.         
  141.     Time t(numdata[0], numdata[1], numdata[2], numdata[3], numdata[4], numdata[5], numdata[6]);   //转换成int型的年月日时分秒星期数据在此写入RTC模块
  142.     for(int i = 0; i < 7 ; i++){
  143.       numdata[i]=0;
  144.     }
  145.     rtc.time(t);
  146.     j=0;      
  147.     inputString = "";
  148.     stringComplete = false;
  149.   }

  150.   print_time();

  151. }

  152. void bitplay(int num, int cl){          //预处理二进制格式显示数据
  153.    
  154.     digitalWrite(latchPin, 0);
  155.     shiftOut(dataPin, clockPin, col[cl]);   
  156.     shiftOut(dataPin, clockPin, bset[num]);  
  157.     digitalWrite(latchPin, 1);

  158. }

  159. void numplay(int num){                                        //预处理24小时格式显示数据
  160.   
  161.   for(int i=0;i<9;i++){
  162.     digitalWrite(latchPin, 0);
  163.     shiftOut(dataPin, clockPin, col[i]);   
  164.     shiftOut(dataPin, clockPin, LEDnum[num][i]);  
  165.     digitalWrite(latchPin, 1);
  166.   }  
  167. }

  168. void shiftOut(int myDataPin, int myClockPin, byte myDataOut) {     //此处使用Ariduino官方4HC595移位显示处理方法代码,具体可以参考Arduino官方教程ShiftOut:http://www.arduino.cc/en/Tutorial/ShiftOut

  169.   int i=0;
  170.   int pinState;
  171.   pinMode(myClockPin, OUTPUT);
  172.   pinMode(myDataPin, OUTPUT);

  173.   digitalWrite(myDataPin, 0);
  174.   digitalWrite(myClockPin, 0);
  175.   
  176.   for (i=7; i>=0; i--)  {
  177.     digitalWrite(myClockPin, 0);
  178.     if ( myDataOut & (1<<i) ) {
  179.       pinState= 1;
  180.     }
  181.     else {        
  182.       pinState= 0;
  183.     }

  184.     //Sets the pin to HIGH or LOW depending on pinState
  185.     digitalWrite(myDataPin, pinState);
  186.     //register shifts bits on upstroke of clock pin  
  187.     digitalWrite(myClockPin, 1);
  188.     //zero the data pin after shift to prevent bleed through
  189.     digitalWrite(myDataPin, 0);
  190.   }

  191.   //stop shifting
  192.   digitalWrite(myClockPin, 0);
  193. }

  194. void serialEvent() {                        //串口事件响应代码
  195.   while (Serial.available()) {
  196.     // get the new byte:
  197.     char inChar = (char)Serial.read();
  198.     inputString += inChar;

  199.     if (inChar == '\n') {
  200.       stringComplete = true;
  201.     }
  202.   }
  203. }
复制代码


线路原理图


下面是来源于网络的对74HC595的应用示范

本帖子中包含更多资源

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

x

评分

参与人数 1 +1 +2 +2 收起 理由
lawrencedon + 1 + 2 + 2 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2015-3-29 07:04:59 来自手机 | 显示全部楼层
感谢分享源码
回复 支持 反对

使用道具 举报

发表于 2015-3-29 07:12:52 来自手机 | 显示全部楼层
pinMode(3,INPUT_PULLUP);
  attachInterrupt(1, wake_up, FALLING);     Pullup是启用内部上拉电阻吗?
attachlnterrupt。是什么意思,内部执行的是什么
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-29 09:51:40 | 显示全部楼层
li23108 发表于 2015-3-29 07:12
pinMode(3,INPUT_PULLUP);
  attachInterrupt(1, wake_up, FALLING);     Pullup是启用内部上拉电阻吗?
...

给上拉,只是为了开关在常态时稳定
回复 支持 反对

使用道具 举报

发表于 2015-3-29 16:40:25 | 显示全部楼层
不用74hc595可以吗?
回复 支持 反对

使用道具 举报

发表于 2015-3-30 18:56:27 | 显示全部楼层
漂亮的作品···
顶一个
回复 支持 反对

使用道具 举报

发表于 2015-4-15 01:38:37 | 显示全部楼层
赞一个  说得很详细               
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 17:01 , Processed in 0.056115 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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