两个hc595驱动8位数码管定时器
时间: 2023-07-26 20:25:50 浏览: 104
03-HC595驱动8个数码管_hc595_HC595驱动8个数码管_
5星 · 资源好评率100%
好的,这是一个很常见的应用场景。下面是一个简单的代码示例,使用两个 HC595 芯片驱动共 8 个数码管,并配合定时器进行定时刷新显示。
```c
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DS = P1^0; // 74HC595 数据输入引脚
sbit SHCP = P1^1; // 74HC595 时钟输入引脚
sbit STCP = P1^2; // 74HC595 输出锁存引脚
sbit DS2 = P1^3; // 第二个 74HC595 数据输入引脚
sbit SHCP2 = P1^4; // 第二个 74HC595 时钟输入引脚
sbit STCP2 = P1^5; // 第二个 74HC595 输出锁存引脚
uchar code Number[10] = { // 数码管显示数字的编码
0x3f, // 0
0x06, // 1
0x5b, // 2
0x4f, // 3
0x66, // 4
0x6d, // 5
0x7d, // 6
0x07, // 7
0x7f, // 8
0x6f // 9
};
uchar code Digit[8] = { // 数码管位选的编码
0xfe, // 第0位选通
0xfd, // 第1位选通
0xfb, // 第2位选通
0xf7, // 第3位选通
0xef, // 第4位选通
0xdf, // 第5位选通
0xbf, // 第6位选通
0x7f // 第7位选通
};
uchar DisplayBuffer[8] = { // 显示缓存
0, 0, 0, 0, 0, 0, 0, 0
};
uchar DisplayDigit = 0; // 当前显示的数码管位
void HC595SendByte(uchar dat) // 发送一个字节到 HC595
{
uchar i;
for (i = 0; i < 8; i++) {
SHCP = 0;
DS = (dat & 0x80) ? 1 : 0;
dat <<= 1;
SHCP = 1;
}
}
void HC595SendTwoBytes(uchar dat1, uchar dat2) // 发送两个字节到两个 HC595
{
HC595SendByte(dat2);
HC595SendByte(dat1);
STCP = 0;
_nop_(); // 稍微延时一下,确保数据稳定
STCP = 1;
}
void DisplayDigitDriver() // 数码管位选驱动
{
HC595SendTwoBytes(Digit[DisplayDigit], 0xff);
DisplayDigit = (DisplayDigit + 1) % 8;
}
void DisplayBufferDriver() // 数码管段选驱动
{
HC595SendTwoBytes(Number[DisplayBuffer[DisplayDigit]], Number[DisplayBuffer[DisplayDigit]]); // 使用同一个数字编码,实现数码管共阴
}
void DisplayInit() // 数码管初始化
{
DisplayDigit = 0;
HC595SendTwoBytes(0xff, 0xff); // 先全部关闭
}
void Timer0Init() // 定时器初始化
{
TMOD = 0x01; // 定时器0工作在模式1
TH0 = 0x3c; // 定时器初值,定时1ms
TL0 = 0xb0;
ET0 = 1; // 允许定时器0中断
TR0 = 1; // 启动定时器0
EA = 1; // 打开总中断开关
}
void Timer0Isr() interrupt 1 // 定时器0中断服务程序
{
DisplayDigitDriver();
DisplayBufferDriver();
}
void main()
{
Timer0Init();
DisplayInit();
while (1) {
// 在这里更新 DisplayBuffer 数组,每次更新后数码管会自动显示最新的数据
}
}
```
在上面的代码中,`DisplayBuffer` 数组用于保存需要显示的数字,例如 `DisplayBuffer[0]` 表示第一个数码管需要显示的数字。定时器中断服务程序会定时驱动数码管进行显示,使用了两个 74HC595 芯片进行驱动,其中一个负责位选,另一个负责段选,并且通过 `DisplayDigit` 变量控制当前显示的数码管位。在 `DisplayBufferDriver` 函数中,我们使用了共阴数码管的方式进行驱动,如果使用共阳数码管需要将两个 `Number` 数组的元素调换一下顺序。
阅读全文