找回密码
 立即注册
查看: 53|回复: 3

为啥不显示预置的数字?

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:212
  • 最近打卡:2025-08-01 06:21:20

141

主题

181

回帖

339

积分

中级会员

积分
339
发表于 4 天前 | 显示全部楼层 |阅读模式
用STC8051U做实验,要求控制三个HC595,分别驱动三个共阳数码管,显示预置的数字“123”,一直显示不正常,是哪里的原因?

以下是完整代码:

#include "AI8051U.H"
// 定义HC595控制引脚
sbit SDI = P2^0;  // 对应HC595的14脚(DS)
sbit SCLK = P2^1; // 对应HC595的11脚(SH_CP)
sbit LOAD = P2^2; // 对应HC595的12脚(ST_CP)

// 共阳数码管段码表(0-9)
code unsigned char segTable[] = {
    0xC0, // 0
    0xF9, // 1
    0xA4, // 2
    0xB0, // 3
    0x99, // 4
    0x92, // 5
    0x82, // 6
    0xF8, // 7
    0x80, // 8
    0x90  // 9
};

// 要显示的数字
unsigned int count = 123;

// 延时函数(用于动态扫描)
void Delay(unsigned int ms)
        {
    unsigned int i, j;
    for(i = 0; i < ms; i++)
        for(j = 0; j < 120; j++); // 根据晶振调整
}

// 向HC595发送一个字节数据
void SendTo595(unsigned char dat)
        {
    unsigned char i;

    for(i = 0; i < 8; i++)
                {
        SDI = dat & 0x80;    // 发送最高位
        SCLK = 0;            // 上升沿移位
        SCLK = 1;
        dat <<= 1;           // 左移一位
    }
}

// 更新数码管显示
void UpdateDisplay()
{
    unsigned char hundreds, tens, ones;

    // 分解数字为百位、十位和个位
    hundreds = count / 100;
    tens = (count % 100) / 10;
    ones = count % 10;

    // 关闭LOAD,准备移位
    LOAD = 0;

    // 依次发送个位、十位、百位数据(低位在前)
    SendTo595(segTable[ones]);
    SendTo595(segTable[tens]);
    SendTo595(segTable[hundreds]);

    // 锁存数据到输出寄存器
    LOAD = 1;
    LOAD = 0;
}

void main()
{
    // 配置P2口为推挽输出模式
    P2M0 = 0x07;  // P2.0-P2.2为推挽输出
    P2M1 = 0x00;

    // 初始化端口
    P2 = 0xFF;  // 默认高电平

    while(1)
                        {
        // 持续更新显示
        UpdateDisplay();

        // 添加短暂延时(可选)
        Delay(1);
      }
}


回复

使用道具 举报 送花

3

主题

2105

回帖

1058

积分

等待验证会员

积分
1058
发表于 4 天前 | 显示全部楼层
根据您提供的代码和描述,使用STC8051U控制三个HC595驱动三个共阳数码管显示“123”时出现显示不正常的问题,可能的原因如下:

1. 代码未完成:您提供的代码在SendTo595函数中被截断,缺少了关键的循环体和数据位的处理逻辑。正确的SendTo595函数应完整实现串行移位寄存器的数据发送流程。

2. 段码表错误:共阳数码管的段码与共阴数码管相反,您提供的段码表是针对共阴数码管设计的,应进行翻转处理(即对每个字节取反)。

3. 数码管控制逻辑缺失:您仅实现了向HC595发送数据,但未涉及数码管的动态扫描或选择控制。若未正确控制数码管的位选信号,可能导致所有数码管同时亮起或无法正确显示。

4. 延时或刷新频率不足:如果未对数码管进行动态扫描或刷新,可能导致显示不稳定或模糊。

综上所述,建议您检查并完善代码逻辑,确保段码正确、数据发送完整,并合理控制数码管的位选信号。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:145
  • 最近打卡:2025-08-01 10:06:57

762

主题

1万

回帖

1万

积分

管理员

积分
18316
发表于 4 天前 | 显示全部楼层
原理图的 PDF 发上来
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:212
  • 最近打卡:2025-08-01 06:21:20

141

主题

181

回帖

339

积分

中级会员

积分
339
发表于 4 天前 | 显示全部楼层
没啥原理图,STC8051U单片机最小系统,外加5V、GND和下面三根线。
sbit SDI = P2^0;  // 对应HC595的14脚(DS)
sbit SCLK = P2^1; // 对应HC595的11脚(SH_CP)
sbit LOAD = P2^2; // 对应HC595的12脚(ST_CP)



显示部分是网上买的三位共阳LED数码管模块。三个74HC595分别驱动对应的数码管,LOAD端并联,数据输入端级联。
微信图片_20250728170505.jpg
微信图片_20250728170516.jpg
微信图片_20250728170722.jpg
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-8-1 19:43 , Processed in 0.113403 second(s), 65 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表