鑋音 2023-06-14 11:15 采纳率: 100%
浏览 54
已结题

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

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

  • 写回答

3条回答 默认 最新

  • 路漫漫其修远. 博客专家认证 2023-06-14 11:43
    关注

    要使用 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 开始显示。为了方便观察滚动效果,程序在每次循环中还加入了一个延时函数,等待一段时间后再进行下一次循环。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 7月13日
  • 已采纳回答 7月5日
  • 创建了问题 6月14日

悬赏问题

  • ¥15 系统2008r2 装机配置推荐一下
  • ¥500 服务器搭建cisco AnyConnect vpn
  • ¥15 用大厂网站防红自己网站
  • ¥15 悬赏Python-playwright部署在centos7上
  • ¥15 psoc creator软件有没有人能远程安装啊
  • ¥15 快速扫描算法求解Eikonal方程咨询
  • ¥20 我的是道格手机,重置后屏幕右上角出现红色字的未写入tee key 和未写入google key请问怎么去掉啊
  • ¥15 校内二手商品转让网站
  • ¥20 高德地图聚合图层MarkerCluster聚合多个点,但是ClusterData只有其中部分数据,原因应该是有经纬度重合的地方点,现在我想让ClusterData显示所有点的信息,如何实现?
  • ¥100 求Web版SPC控制图程序包调式