利用定时器和8位数码管做一个电子时钟,分别显示时分秒,采用24小时制(显示格式如14-30-42)并且可以通过键盘模块修改时,分,秒的代码
时间: 2023-11-20 13:04:37 浏览: 265
电子时钟. 显示时、分、秒。.采用24小时制
以下是基于Arduino的代码实现:
```
#include <Wire.h>
#include <DS1307RTC.h> // 导入RTC库
#include <Keypad.h> // 导入键盘库
// 定义8位数码管引脚
const int digitPins[] = {2, 3, 4, 5};
// 定义数码管显示数字对应的引脚
const int segmentPins[] = {6, 7, 8, 9, 10, 11, 12};
// 定义时钟模块中的时间变量
tmElements_t tm;
// 定义键盘按键布局
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {A0, A1, A2, A3}; // 定义行引脚
byte colPins[COLS] = {4, 5, 6, 7}; // 定义列引脚
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS); // 创建Keypad对象
// 定义初始值为0的时分秒变量
int hour = 0;
int minute = 0;
int second = 0;
void setup() {
for (int i = 0; i < 4; i++) {
pinMode(digitPins[i], OUTPUT); // 数码管引脚设为输出模式
}
for (int i = 0; i < 7; i++) {
pinMode(segmentPins[i], OUTPUT); // 数码管引脚设为输出模式
}
Serial.begin(9600); // 开启串口通信
RTC.begin(); // 开启RTC模块
// 如果RTC模块没有运行,设置RTC时间为编译时间
if (!RTC.isrunning()) {
Serial.println("RTC is NOT running!");
RTC.adjust(DateTime(__DATE__, __TIME__));
}
// 从RTC模块中获取时间
RTC.read(tm);
hour = tm.Hour; // 初始化时变量
minute = tm.Minute; // 初始化分变量
second = tm.Second; // 初始化秒变量
}
void loop() {
char key = keypad.getKey(); // 获取按键值
if (key != NO_KEY) { // 如果有按键被按下
switch (key) {
case 'A':
hour++; // 增加时
if (hour > 23) { // 如果时超过23,重置为0
hour = 0;
}
break;
case 'B':
minute++; // 增加分
if (minute > 59) { // 如果分超过59,重置为0
minute = 0;
}
break;
case 'C':
second++; // 增加秒
if (second > 59) { // 如果秒超过59,重置为0
second = 0;
}
break;
}
}
// 更新RTC时间
RTC.write(tm);
RTC.read(tm);
hour = tm.Hour; // 获取时变量
minute = tm.Minute; // 获取分变量
second = tm.Second; // 获取秒变量
// 显示时分秒
displayTime(hour, minute, second);
}
// 将时分秒显示在数码管上
void displayTime(int h, int m, int s) {
int digits[3] = {h, m, s};
for (int i = 0; i < 3; i++) {
digitalWrite(digitPins[i], LOW); // 打开对应的数码管
displayDigit(digits[i] / 10); // 显示十位数字
delay(5); // 等待5ms
digitalWrite(digitPins[i], HIGH); // 关闭对应的数码管
digitalWrite(digitPins[i + 1], LOW); // 打开下一个数码管
displayDigit(digits[i] % 10); // 显示个位数字
delay(5); // 等待5ms
digitalWrite(digitPins[i + 1], HIGH); // 关闭下一个数码管
}
}
// 根据数字显示对应的数码管
void displayDigit(int digit) {
// 数字0-9用a-g对应的数字段表示
byte segments[] = {
B11111100, // 0: abcdef
B01100000, // 1: bc
B11011010, // 2: abdeg
B11110010, // 3: abcdg
B01100110, // 4: bcfg
B10110110, // 5: acdfg
B10111110, // 6: acdefg
B11100000, // 7: abc
B11111110, // 8: abcdefg
B11110110 // 9: abcdfg
};
for (int i = 0; i < 7; i++) {
digitalWrite(segmentPins[i], bitRead(segments[digit], i)); // 将数码管对应的引脚设置为高电平或低电平
}
}
```
在这个程序中,我们使用了RTC模块来获取当前时间,并通过Keypad库来获取用户输入的修改时间值。我们还使用了定时器来控制数码管的显示,以便每隔一段时间更新一次显示。
阅读全文