基于Aruduino嵌入式系统的实现数字钟设计与制作(代码篇一)

//硬件:四位共阴极时钟数码管(包括时间冒号和小数点)
//引脚15.16.17对应开关s2.s3.s4

#include "TimerOne.h"
#include "SevSeg.h"//头文件

SevSeg sevseg; //def smg

int hour=0, minute=0, second=0;

int data=0;//最后显示在数码管上面可见的数据

//根据flat变量值来切换显示在数码管上面的数据
int flat=0; //h+m_or_m+s

//根据index的数据确定数字钟停止或者启动
int index=0;//stop-start

byte numDigits = 4; //四位数码管
byte digitPins[4] = {10,11,12,13}; //数码管位对应引脚
byte segmentPins[8] = {2,3,4,5,6,7,8,0}; //数码管段对应引脚
byte hardwareConfig = COMMON_CATHODE ; // 共阴极数码管

void setup() {
  pinMode(15,INPUT_PULLUP);//按键按下为LOW/0
  pinMode(16,INPUT_PULLUP);//按键不按下为HIGH/1
  pinMode(17,INPUT_PULLUP);
  pinMode(9,OUTPUT);//HIGH/1:亮....0/LOW:灭
  sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins); //初始化数码管
  Timer1.initialize(1000000);   //初始化定时器为1s=1000000ms
  Timer1.attachInterrupt(timer_set);  //设置中断回调函数
}

void loop() {
  sevseg.setNumber(data,4); //设置要显示的数据,显示小数点前几位
  sevseg.refreshDisplay(); // 必须重复运行刷新数码管显示
  if ((second&1)==1){ digitalWrite(9,LOW); }//根据秒的奇偶性决定时间冒号的亮灭
  if ((second&1)==0){ digitalWrite(9,HIGH);} 
}

void timer_set()//定时器中断处理函数
{
  if((digitalRead(17) == LOW)) //S4-->切换h_m和m_s
  {flat=!flat; delay(500);}//按下s3取反flat,切换状态
  
  if((digitalRead(16) == LOW)&&(digitalRead(15) == LOW))
   { index =!index; delay(500);} //s2+s3:-->stop_start //延迟防止切换过快
  
  if(flat==1) //显示分和秒
   { 
    //开关修改数据,后面同理,注意时间的进位清零规则
    if((digitalRead(16) == LOW)&&(digitalRead(15) == HIGH))//s3-->second
    { second++; if(second>59)second=0; }
      
    if((digitalRead(15) == LOW)&&(digitalRead(16) == HIGH))//s2-->minute
    { minute++; if(minute>59)minute=0; }
    
    if(index==1)//同时按下s2.s3,停止
    { second=second; }
    
    if(index==0)
    { 
      second++; //set rules of time changing
        if(second>59)
        {
          second=0;
          minute++;
          if(minute>59) 
          {
            minute=0;hour++;
            if(hour>23) hour=0;
          }
        }
    }
    data =(minute*100)+(second)+(0.1);//最后显示数据
  }
  
  if(flat==0) //显示分和时
   { 
    if((digitalRead(15) == LOW)&&(digitalRead(16) == HIGH))//s2-->hour
    { hour++; if(hour>24)hour=0; }
      
    if((digitalRead(16) == LOW)&&(digitalRead(15) == HIGH))//s3-->minute
    { minute++; if(minute>59)minute=0; }
    
    if(index==1)//同时按下s2.s3 ,数字钟停止运行
    { second=second; }
    
    if(index==0)
    { 
        second++; //set rules of time changing
        if(second>59)
        {
          second=0;
          minute++;
          if(minute>59) 
          {
            minute=0;hour++;
            if(hour>23) hour=0;
          }
        }
     }
    data =(hour*100)+(minute)+(0.1); //最后显示数据
  }
}

基于Aruduino嵌入式系统的实现数字钟设计与制作

如有疑问欢迎留言共同探讨!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值