51单片机用八个数码管时分秒的显示和走时(初值 23:58:40),并且可通过若干按键改时和分的代码
时间: 2024-02-06 21:11:02 浏览: 54
好的,以下是一个参考代码,该代码使用了常见的51单片机和共阴极的8位数码管:
```
#include <reg52.h>
sbit key1 = P1^0; // 按键1
sbit key2 = P1^1; // 按键2
sbit key3 = P1^2; // 按键3
sbit key4 = P1^3; // 按键4
sbit DIO = P2^0; // 数码管数据线
sbit CLK = P2^1; // 数码管时钟线
unsigned char code table[] = { // 数码管显示表
0x3f, // 0
0x06, // 1
0x5b, // 2
0x4f, // 3
0x66, // 4
0x6d, // 5
0x7d, // 6
0x07, // 7
0x7f, // 8
0x6f // 9
};
unsigned char hour = 23; // 当前小时
unsigned char minute = 58; // 当前分钟
unsigned char second = 40; // 当前秒钟
void delay(unsigned int ms) { // 延时函数,单位毫秒
unsigned int i, j;
for(i = ms; i > 0; i--)
for(j = 114; j > 0; j--);
}
void display(unsigned char *data) { // 数码管显示函数
unsigned char i;
for(i = 0; i < 8; i++) {
DIO = data[i];
CLK = 0;
CLK = 1;
}
}
void update_time() { // 更新时间函数
second++; // 秒钟加1
if(second >= 60) { // 如果秒钟超过60,则分钟加1,秒钟归零
second = 0;
minute++;
if(minute >= 60) { // 如果分钟超过60,则小时加1,分钟归零
minute = 0;
hour++;
if(hour >= 24) // 如果小时超过24,则小时归零
hour = 0;
}
}
}
void main() {
unsigned char data[8] = {0}; // 数码管显示数据
unsigned char i;
while(1) {
data[0] = table[hour / 10]; // 显示小时的十位
data[1] = table[hour % 10]; // 显示小时的个位
data[2] = table[minute / 10]; // 显示分钟的十位
data[3] = table[minute % 10]; // 显示分钟的个位
data[4] = table[second / 10]; // 显示秒钟的十位
data[5] = table[second % 10]; // 显示秒钟的个位
display(data); // 数码管显示
update_time(); // 更新时间
delay(500); // 延时500ms
if(key1 == 0) { // 按键1按下,小时加1
while(!key1);
hour++;
if(hour >= 24)
hour = 0;
}
if(key2 == 0) { // 按键2按下,小时减1
while(!key2);
hour--;
if(hour < 0)
hour = 23;
}
if(key3 == 0) { // 按键3按下,分钟加1
while(!key3);
minute++;
if(minute >= 60)
minute = 0;
}
if(key4 == 0) { // 按键4按下,分钟减1
while(!key4);
minute--;
if(minute < 0)
minute = 59;
}
}
}
```
该代码实现了时分秒的连续显示和走时,并且通过按键可以调整时和分。具体实现方式为:在程序中定义了四个按键,分别对应小时加1、小时减1、分钟加1和分钟减1的功能。每次循环中检测按键是否按下,如果按下则根据按键的功能进行相应的操作。同时,在每次循环中也更新当前的时间,并且通过数码管显示出来。
阅读全文