7段数码管组成的电子钟
要求:
(1)用Arduino开发板控制两个7段数码管和两个按键开关。数码管显示当前的时间(24小时制,小时和分钟交替显示),并能够进行正常的时钟计时。
(2)两个按键之中,1号按键按下第一次,进入“小时”调节状态,此时若按下2号键,调整“小时”数字,每按一下2号键“小时”数字就加1;调整完成后第二次按下1号键,进入“分钟”调节状态,此时若按下2号键,调整“分钟”数字,每按一下2号键“分钟”数字就加1;调整完成后第三次按下1号键,回到正常的计时状态。
(3)使用定时器中断进行准确的计时。
注:题目来自HBUE的硬件编程考题,代码电路仅供学习交流使用,转载使用时请注明来处。
电路
效果
/*
SOFTWARE: Proteus 8 Professional
CSDN: 空白之子
公众号:硬核开发(正在建设中)
*/
#include "MsTimer2.h"
void setup()
{
Serial.begin(9600);
for (int i = 0; i < 16; ++i)
pinMode(i, OUTPUT);
pinMode(16, INPUT);
pinMode(17, INPUT);
//绑定定时器
MsTimer2::set(1000, Time);
//启动定时器
MsTimer2::start();
}
int n = 0, flag = 1, fact = 1;
int hour = 0, min1 = 0, second = 0;
int i = 0, j;
int num[10][8] = {{0,1,2,3,4,5,-1},{1,2,-1},{0,1,6,4,3,-1},{0,1,6,2,3,-1},{5,6,1,2,-1},{0,5,6,2,3,-1},{0,5,4,3,2,6,-1},{0,1,2,-1},{0,1,2,3,4,5,6,-1},{0,1,2,3,5,6,-1}};
void loop()
{
Adjust();
}
//计时模块,并调用显示函数
void Time(void)
{
second++;
//时间更正
if (second > 59)
{
min1++;
second = 0;
}
if (min1 > 59)
{
hour++;
min1 = 0;
}
if (hour > 23)
{
hour = 0;
}
//清屏,并调用显示函数显示
for(j = 0; j < 7; ++j)
{
digitalWrite(j + 2, LOW);
digitalWrite(j + 9, LOW);
}
if (second % 2 == 0)
Hour1();
else
Min1();
}
//显示时
void Hour1(void)
{
//七段数码管上显示时
for(j = 0; num[hour / 10][j] >= 0; ++j)
{
digitalWrite(num[hour / 10][j] + 2, HIGH);
}
for(j = 0; num[hour % 10][j] >= 0; ++j)
{
digitalWrite(num[hour % 10][j] + 9, HIGH);
}
//虚拟终端上显示时
Serial.print("H:");
Serial.println(hour);
}
//显示分
void Min1(void)
{
//七段数码管上显示分
for(j = 0; num[min1 / 10][j] >= 0; ++j)
{
digitalWrite(num[min1 / 10][j] + 2, HIGH);
}
for(j = 0; num[min1 % 10][j] >= 0; ++j)
{
digitalWrite(num[min1 % 10][j] + 9, HIGH);
}
//虚拟终端上显示分
Serial.print("M:");
Serial.println(min1);
}
//时间调节函数
void Adjust(void)
{
//计数并判断调节按钮按动的次数
if (digitalRead(16) == HIGH && flag)
{
flag = 0;
}
if (digitalRead(16) ==LOW && !flag)
{
flag = 1;
n++;
n = n % 3;
}
if (digitalRead(17) == HIGH && fact)
{
fact = 0;
}
//调节时
if ( n == 1 && digitalRead(17) == LOW && !fact)
{
hour++;
fact = 1;
}
//调节分
if ( n == 2 && digitalRead(17) == LOW && !fact)
{
min1++;
fact = 1;
}
}