51单片机8x8点阵滚动程序

at89s52单片机怎么不用74HS595芯片在8*8点阵上显示0-9滚动

要使用 AT89S52 单片机和 74HC595 芯片在 8x8 点阵上显示 0-9 滚动,可以按照以下步骤进行操作:

将 AT89S52 单片机和 74HC595 芯片按照电路连接图进行连接,具体可以参考以下电路图:

                      74HC595
                +----------+     
       RCLK  -->|1       16|<-- Vcc
        SER  -->|2       15|<-- SRCLK
        SRCLK-->|3       14|<-- OE (GND)
          Q0  -->|4       13|<-- Q7S
          Q1  -->|5       12|<-- Q6S
          Q2  -->|6       11|<-- Q5S
          Q3  -->|7       10|<-- Q4S
      GND   -->|8        9|<-- Q3S
                +----------+

将 AT89S52 单片机的 P2 口(或其他可用口)连接到 74HC595 的 SER 引脚,P3 口(或其他可用口)连接到 74HC595 的 SRCLK 引脚,P1 口(或其他可用口)连接到 74HC595 的 RCLK 引脚,用于控制 74HC595 的时序。

在程序中使用循环,依次输出 0-9 的数字到 8x8 点阵中,每隔一段时间刷新一次,从而实现数字的滚动显示。

在程序中定义一个数组,存储数字 0-9 的点阵图案,例如:

unsigned char digit_patterns[10][8] = {
    {0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00, 0x00, 0x00}, // 0
    {0x00, 0x42, 0x7F, 0x40, 0x00, 0x00, 0x00, 0x00}, // 1
    {0x42, 0x61, 0x51, 0x49, 0x46, 0x00, 0x00, 0x00}, // 2
    {0x22, 0x41, 0x49, 0x49, 0x36, 0x00, 0x00, 0x00}, // 3
    {0x0F, 0x08, 0x08, 0x7F, 0x08, 0x08, 0x00, 0x00}, // 4
    {0x27, 0x45, 0x45, 0x45, 0x39, 0x00, 0x00, 0x00}, // 5
    {0x3E, 0x49, 0x49, 0x49, 0x32, 0x00, 0x00, 0x00}, // 6
    {0x01, 0x01, 0x71, 0x0D, 0x03, 0x00, 0x00, 0x00}, // 7
    {0x36, 0x49, 0x49, 0x49, 0x36, 0x00, 0x00, 0x00}, // 8
    {0x26, 0x49, 0x49, 0x49, 0x3E, 0x00, 0x00, 0x00}  // 9
};

其中每个数字的点阵图案使用 8 个字节表示,每个字节代表一个行的 LED 灯的状态,0 表示灭,1 表示亮。

在程序中编写函数,将一个字节的数据通过 74HC595 输出到 8x8 点阵中,例如:

void shiftOut(unsigned char data) {
    unsigned char i;
    for (i = 0; i < 8; i++) {
        if (data & 0x80) {
            P2 = 1; // 将数据的最高位输出到 SER 引脚
        } else {
            P2 = 0;
        }
        P3 = 0; // 将 SRCLK 引脚置为 0,准备输出数据
        P3 = 1; // 将 SRCLK 引脚置为 1,输出数据
        data <<= 1; // 将数据左移一位,准备输出下一个位
    }
    P1 = 0; // 将 RCLK 引脚置为 0,准备将数据存入移位寄存器
    P1 = 1; // 将 RCLK 引脚置为 1,将数据存入移位寄存器
}

该函数将一个字节的数据通过循环依次输出到 74HC595 的 SER 引脚上,并通过 SRCLK 引脚进行移位操作,最后通过 RCLK 引脚将数据存入移位寄存器。

在程序中使用循环,依次将每个数字的点阵图案通过 shiftOut 函数输出到 8x8 点阵中,从而实现数字的滚动显示。具体实现方法可以参考以下代码:

unsigned char current_digit = 0; // 当前显示的数字
unsigned char current_row = 0; // 当前显示的行

while (1) {
    unsigned char i;
    for (i = 0; i < 8; i++) {
        shiftOut(digit_patterns[current_digit][i] << current_row); // 输出当前数字的当前行数据
    }
    current_row++; // 切换到下一行
    if (current_row >= 8) {
        current_row = 0; // 如果已经显示完 8 行,则重新从第一行开始显示
        current_digit++; // 切换到下一个数字
        if (current_digit >= 10) {
            current_digit = 0; // 如果已经显示完 0-9 的数字,则重新从 0 开始显示
        }
    }
    delay(100); // 等待一段时间,以便观察滚动效果
}

该代码使用一个无限循环,依次将每个数字的点阵图案通过 shiftOut 函数输出到 8x8 点阵中,从而实现数字的滚动显示。在每次循环中,先输出当前数字的当前行数据,然后将当前行切换到下一行,如果已经显示完 8 行,则重新从第一行开始显示,同时将当前数字切换到下一个数字,如果已经显示完 0-9 的数字,则重新从 0 开始显示。为了方便观察滚动效果,程序在每次循环中还加入了一个延时函数,等待一段时间后再进行下一次循环。

自己用程序代替595实现滚动即可

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^