七段数码管——时钟

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;
	}
}
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值