帮我STC89C52R和两片74HC595驱动8个数码管的程序
时间: 2024-02-16 18:03:29 浏览: 70
基于stc89c52读取hdc1080温湿度传感器,用74hc595.启动数码管显示,希望对你有参考价值 .rar
5星 · 资源好评率100%
好的,以下是使用STC89C52R和74HC595驱动8个共阴数码管的程序。程序中使用了定时器中断和位移寄存器来实现数码管的动态扫描,具体注释已在代码中标出。
```c
#include <reg52.h>
// 数码管引脚定义
sbit DIG1 = P2^0;
sbit DIG2 = P2^1;
sbit DIG3 = P2^2;
sbit DIG4 = P2^3;
// 74HC595引脚定义
sbit DS = P1^0; // 数据引脚
sbit SHCP = P1^1; // 时钟引脚
sbit STCP = P1^2; // 存储引脚
// 数码管显示字符定义
unsigned char code DIGITS[] = {
0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90
};
// 数码管缓存
unsigned char DispBuf[8] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
// 数码管动态扫描计数器
unsigned char DispCnt = 0;
// 定时器1中断服务程序
void Timer1_ISR() interrupt 3
{
// 关闭所有数码管
DIG1 = 1;
DIG2 = 1;
DIG3 = 1;
DIG4 = 1;
// 74HC595输出数据
for (unsigned char i = 0; i < 8; i++)
{
// 依次输出8位数据,最高位先输出
unsigned char data = DispBuf[i];
for (unsigned char j = 0; j < 8; j++)
{
DS = data & 0x80; // 取最高位
data <<= 1; // 左移一位
SHCP = 0; // 时钟下降沿
SHCP = 1; // 时钟上升沿
}
}
// 打开数码管
switch (DispCnt)
{
case 0:
DIG1 = 0;
break;
case 1:
DIG2 = 0;
break;
case 2:
DIG3 = 0;
break;
case 3:
DIG4 = 0;
break;
}
// 更新计数器
DispCnt++;
if (DispCnt >= 4)
{
DispCnt = 0;
}
}
// 主函数
void main()
{
// 定时器1初始化,设置为10ms中断一次
TMOD |= 0x10;
TH1 = 0xd8;
TL1 = 0xef;
ET1 = 1;
EA = 1;
TR1 = 1;
// 主循环
while (1)
{
// 更新数码管缓存
DispBuf[0] = DIGITS[0];
DispBuf[1] = DIGITS[1];
DispBuf[2] = DIGITS[2];
DispBuf[3] = DIGITS[3];
DispBuf[4] = DIGITS[4];
DispBuf[5] = DIGITS[5];
DispBuf[6] = DIGITS[6];
DispBuf[7] = DIGITS[7];
}
}
```
这个程序可以实现8个共阴数码管的动态扫描显示,每个数码管都可以显示0~9的数字。如果您需要显示其他字符或符号,可以修改`DIGITS`数组中的定义。另外,程序中使用的是定时器1中断,每10ms更新一次数码管显示内容,您可以根据实际需要进行调整。
阅读全文