上代码:

#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 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录