51单片机点阵屏倒计时程序
时间: 2023-08-13 08:06:40 浏览: 96
以下是51单片机点阵屏倒计时程序的代码:
```
#include <reg51.h>
#include <intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
#define CLK 6 // 时钟线
#define DATA 7 // 数据线
#define LATCH 5 // 锁存线
sbit CLK_PIN = P2^CLK;
sbit DATA_PIN = P2^DATA;
sbit LATCH_PIN = P2^LATCH;
uchar code LED_DuanMa[17] = { // 共阴极数码管的段码
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00
};
uchar code LED_WeiMa[8] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f}; // 共阴极数码管的位码
uchar code TimeSet[8] = {0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00}; // 倒计时时间,从1秒开始
void delay(uint t) { // 延时函数
uint i, j;
for (i = t; i > 0; i--)
for (j = 110; j > 0; j--);
}
void Display() { // 显示函数
uchar i, j, k;
for (i = 0; i < 8; i++) { // 逐位扫描
k = LED_WeiMa[i]; // 获取当前位码
LATCH_PIN = 0; // 锁存线拉低
for (j = 0; j < 8; j++) { // 逐段输出
DATA_PIN = (LED_DuanMa[TimeSet[j]] & (0x01 << i)) ? 1 : 0; // 获取当前段码
CLK_PIN = 0;
_nop_();
CLK_PIN = 1;
}
DATA_PIN = (k & 0x01) ? 1 : 0; // 输出位码
CLK_PIN = 0;
_nop_();
CLK_PIN = 1;
LATCH_PIN = 1; // 锁存线拉高
}
}
void main() {
uchar i, j;
while (1) {
for (i = 0; i < 8; i++) { // 倒计时循环
TimeSet[i]--;
if (TimeSet[i] == 0xff) { // 溢出处理
TimeSet[i] = 9;
if (i == 7) { // 倒计时结束
delay(1000);
for (j = 0; j < 8; j++)
TimeSet[j] = 0;
}
else
TimeSet[i+1]--;
}
}
Display(); // 显示倒计时
delay(5); // 每个数码管显示5ms
}
}
```
本程序使用共阴极的4位数码管,通过逐位扫描和逐段输出的方式实现倒计时的显示。其中,TimeSet数组存储倒计时时间,每个元素表示一个数码管的值,从左到右依次为秒(十位)、秒(个位)、分(十位)、分(个位)、时(十位)、时(个位)、天(十位)、天(个位)。每隔5ms刷新一次数码管,倒计时结束后延时1秒并清零。