找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 127|回复: 8
收起左侧

求助数码管显示问题

[复制链接]
ID:1156030 发表于 2025-7-5 14:30 | 显示全部楼层 |阅读模式
用51单片机实现篮球计分器,有加1/2分、减1/2分、清零功能,分数范围为00-99。实物已经连接出来并实现功能,但是仿真不知道为何两个一位数码管一直显示88,按键按下可以正常加减数,但是松开按键又是88

4.png
#include <REGX52.H>
// 共阴数码管段码表(0-9)
unsigned char code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned int count = 0; // 用unsigned int避免负数问题

// 延时消抖函数
void delay_ms(unsigned int ms) {
    unsigned int i, j;
    for(i=0; i<ms; i++)
        for(j=0; j<112; j++); // 12MHz晶振,约1ms
}

// 动态显示函数
void display() {
    unsigned char shi, ge;
    shi = count / 10;    // 十位
    ge = count % 10;     // 个位
    // 十位显示(P2口)
    P2 = table[shi];
    delay_ms(1);
    // 个位显示(P0口)
    P0 = table[ge];
    delay_ms(1);
}

void main() {
    P0 = 0x00;
    P2 = 0x00;
    while(1) {
        display();

        // 加1(P1.0)
        if(P1_0 == 0) {
            delay_ms(10); // 消抖
            if(P1_0 == 0) {
                if(count < 99) count++;
                while(P1_0 == 0) display(); // 等待释放时刷新显示
            }
        }

        // 加2(P1.1)
        if(P1_1 == 0) {
            delay_ms(10);
            if(P1_1 == 0) {
                if(count <= 97) count += 2;
                                                                else if(count == 98) count = 99; // 兼容count=98时加2到99
                while(P1_1 == 0) display();
            }
        }

        // 减1(P1.2)
        if(P1_2 == 0) {
            delay_ms(10);
            if(P1_2 == 0) {
                if(count > 0) count--;
                while(P1_2 == 0) display();
            }
        }

        // 减2(P1.3)
        if(P1_3 == 0) {
            delay_ms(10);
            if(P1_3 == 0) {
                if(count >= 2) count -= 2;
                else if(count == 1) count = 0; // 兼容count=1时减2到0
                while(P1_3 == 0) display();
            }
        }

        // 清零(P1.4)
        if(P1_4 == 0) {
            delay_ms(10);
            if(P1_4 == 0) {
                count = 0;
                while(P1_4 == 0) display();
            }
        }
                                
    }
}

回复

使用道具 举报

ID:332444 发表于 2025-7-5 16:59 | 显示全部楼层
这种情况通常是数码管无消隐处理代码导致。
回复

使用道具 举报

ID:1089588 发表于 2025-7-5 17:24 | 显示全部楼层
display() 里面先清0再赋值试试
回复

使用道具 举报

ID:1133081 发表于 2025-7-5 21:25 | 显示全部楼层

程序写的不算好,但显示没有问题。
无标题.jpg

回复

使用道具 举报

ID:1137639 发表于 2025-7-6 00:22 | 显示全部楼层
### 问题分析   篮球计分器在按键操作时能正常计数,但松开后数码管显示固定为“88”,这是动态显示刷新机制不足导致的典型问题。在仿真环境中,由于缺乏实际硬件的电荷保持特性(如电容滤波、余晖效应),若动态扫描频率不足,数码管会因无法持续获取正确数据而显示异常。当前代码中`display()`函数仅在按键处理时被调用,主循环未实现高频扫描,导致非按键状态下数码管输出默认异常值。  ### 解决方案   修改后的代码通过优化动态显示逻辑与按键处理流程,确保数码管高频刷新:   在动态显示部分,增加静态变量`position`实现十位与个位的交替扫描,通过`P0=0x00; P2=0x00;`进行消隐处理以避免残影,并缩短单次显示延时来提升扫描频率。按键处理上,将检测逻辑封装为独立函数`key_scan()`,通过`key_pressed`标志位标记按键状态,在按键释放循环中持续调用`display()`以实时同步计数变化。主循环采用“先显示后按键”的结构,确保每轮循环都强制刷新数码管,避免因按键处理阻塞显示更新。  ### 关键改进说明   优化后的显示机制通过`position`变量实现分时扫描,配合消隐操作消除鬼影,使十位(P2口)与个位(P0口)的段码输出更稳定。针对仿真环境无硬件保持特性的特点,通过软件高频刷新确保`count`变量的实时值同步到数码管。若数码管仍显示异常,需检查仿真配置(如数码管是否为共阴类型、端口连接是否正确),或降低仿真速度以匹配软件扫描频率。该方案通过动态扫描频率优化,有效解决了仿真环境下的显示同步问题。
回复

使用道具 举报

ID:1137639 发表于 2025-7-6 00:23 | 显示全部楼层
### 问题分析   篮球计分器在按键操作时能正常计数,但松开后数码管显示固定为“88”,这是动态显示刷新机制不足导致的典型问题。在仿真环境中,由于缺乏实际硬件的电荷保持特性(如电容滤波、余晖效应),若动态扫描频率不足,数码管会因无法持续获取正确数据而显示异常。当前代码中`display()`函数仅在按键处理时被调用,主循环未实现高频扫描,导致非按键状态下数码管输出默认异常值。  ### 解决方案   修改后的代码通过优化动态显示逻辑与按键处理流程,确保数码管高频刷新:   在动态显示部分,增加静态变量`position`实现十位与个位的交替扫描,通过`P0=0x00; P2=0x00;`进行消隐处理以避免残影,并缩短单次显示延时来提升扫描频率。按键处理上,将检测逻辑封装为独立函数`key_scan()`,通过`key_pressed`标志位标记按键状态,在按键释放循环中持续调用`display()`以实时同步计数变化。主循环采用“先显示后按键”的结构,确保每轮循环都强制刷新数码管,避免因按键处理阻塞显示更新。  ### 关键改进说明   优化后的显示机制通过`position`变量实现分时扫描,配合消隐操作消除鬼影,使十位(P2口)与个位(P0口)的段码输出更稳定。针对仿真环境无硬件保持特性的特点,通过软件高频刷新确保`count`变量的实时值同步到数码管。若数码管仍显示异常,需检查仿真配置(如数码管是否为共阴类型、端口连接是否正确),或降低仿真速度以匹配软件扫描频率。该方案通过动态扫描频率优化,有效解决了仿真环境下的显示同步问题。
回复

使用道具 举报

ID:1156030 发表于 2025-7-6 12:31 | 显示全部楼层
xianfajushi 发表于 2025-7-5 16:59
这种情况通常是数码管无消隐处理代码导致。

好像是的,谢谢大佬
回复

使用道具 举报

ID:1156030 发表于 2025-7-6 12:33 | 显示全部楼层
WL0123 发表于 2025-7-5 21:25
程序写的不算好,但显示没有问题。

可能是我别的地方有问题,你这个为什么不用搭最小系统吗
回复

使用道具 举报

ID:1133081 发表于 2025-7-6 15:51 | 显示全部楼层
多情不自作 发表于 2025-7-6 12:33
可能是我别的地方有问题,你这个为什么不用搭最小系统吗

只要在MCU属性里设置晶振频率即可,VCC和RST都是系统默认的,不需要画出来。
回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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