//硬件:四位共阴极时钟数码管(包括时间冒号和小数点)
//引脚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嵌入式系统的实现数字钟设计与制作
如有疑问欢迎留言共同探讨!