stc12数码管倒计时带锁存器代码
时间: 2023-07-02 18:15:53 浏览: 176
以下是基于STC12系列单片机的数码管倒计时带锁存器的代码示例:
```
#include <STC12C5A60S2.h>
#define uchar unsigned char
#define uint unsigned int
sbit LATCH = P2^0; // 锁存器控制引脚
sbit DIO = P2^1; // 数据引脚
sbit CLK = P2^2; // 时钟引脚
uchar code LED_DuanMa[] = { // 数码管段码表
0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,
0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71
};
void delay(uint t) // 延时函数
{
uint i, j;
for (i = t; i > 0; i--) {
for (j = 110; j > 0; j--);
}
}
void HC595_SendData(uchar dat) // 向74HC595发送数据
{
uchar i;
for (i = 0; i < 8; i++) {
CLK = 0;
DIO = (dat & 0x80) >> 7;
dat <<= 1;
CLK = 1;
}
}
void Display(uchar *p) // 在数码管上显示数字
{
HC595_SendData(0x00); // 先清空
LATCH = 0;
LATCH = 1;
HC595_SendData(LED_DuanMa[*p]); // 显示个位
LATCH = 0;
LATCH = 1;
HC595_SendData(LED_DuanMa[*(p + 1)]); // 显示十位
LATCH = 0;
LATCH = 1;
HC595_SendData(LED_DuanMa[*(p + 2)]); // 显示百位
LATCH = 0;
LATCH = 1;
HC595_SendData(LED_DuanMa[*(p + 3)]); // 显示千位
LATCH = 0;
LATCH = 1;
}
void main()
{
uchar time[4] = {9, 9, 5, 9}; // 初始时间为 99:59
uint count = 0;
while (1) {
Display(time); // 显示当前时间
delay(1000); // 延时1秒
if (++count >= 1000) { // 经过1秒
count = 0;
if (--time[0] == 0xFF) { // 秒数减1
time[0] = 9;
if (--time[1] == 0xFF) { // 分钟数减1
time[1] = 5;
if (--time[2] == 0xFF) { // 小时数减1
time[2] = 9;
if (--time[3] == 0xFF) { // 小时数再减1,归零
time[3] = 9;
}
}
}
}
}
}
}
```
本代码使用74HC595芯片实现了数码管的控制,并且引入了计时器,可以实现倒计时功能。在计时过程中,可以通过 `time` 数组来设置和获取当前时间值。通过修改 `delay` 函数中的参数值可以调整计时器的计时间隔。
阅读全文