写一个基于STC89C51RC单片机的74HC595驱动四位共阳数码管程序
上代码:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DS = P1^0; // DS: 数据引脚
sbit SHCP = P1^1; // SHCP: 时钟引脚
sbit STCP = P1^2; // STCP: 存储引脚
uchar code segCode[] = { // 共阳数码管的编码表
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 sendByte(uchar dat) { // 发送一个字节
uchar i;
for (i = 0; i < 8; i++) {
DS = dat & 0x80; // 取最高位
SHCP = 0; // 时钟下降沿
dat <<= 1; // 左移一位
SHCP = 1; // 时钟上升沿
}
}
void sendSeg(uchar seg) { // 发送一个数码管的编码
sendByte(segCode[seg]);
}
void main() {
uchar i, j;
uchar segBuf[4] = {0, 0, 0, 0}; // 数码管缓存
while (1) { // 主循环
for (i = 0; i < 4; i++) { // 循环显示四个数码管
STCP = 0; // 存储下降沿
for (j = 0; j < 4; j++) {
sendByte(segBuf[j]); // 发送缓存中的数据
sendByte(0xff); // 发送空数据,用于控制位选
}
sendSeg(segBuf[i]); // 发送当前数码管的数据
STCP = 1; // 存储上升沿
delay(1); // 稍作延时
}
segBuf[0]++; // 数码管的显示值加1
if (segBuf[0] > 9) {
segBuf[0] = 0;
segBuf[1]++;
}
if (segBuf[1] > 9) {
segBuf[1] = 0;
segBuf[2]++;
}
if (segBuf[2] > 9) {
segBuf[2] = 0;
segBuf[3]++;
}
if (segBuf[3] > 9) {
segBuf[3] = 0;
}
}
}
这个程序使用了74HC595芯片来驱动四个共阳数码管的显示。首先定义了数据、时钟和存储引脚的端口,然后定义了共阳数码管的编码表。接着定义了延时函数和发送一个字节和发送一个数码管编码的函数。在主循环中,循环显示四个数码管,并从缓存中发送数据,然后发送当前数码管的数据。最后,程序将数码管的显示值加1,并根据进位情况更新缓存中的数据
原文地址: http://www.cveoy.top/t/topic/hsW2 著作权归作者所有。请勿转载和采集!