nyanyanyanyanyanya 2025-12-08 02:22 采纳率: 66.7%
浏览 4
已结题

proteus 数码管显示问题

想问一下为什么显示器有问题?
我做一个基于51单片机的HX711电子秤,可以基本称重,但是我测试显示屏的时候只有0000和8888,可以正常报警和计重,只是显示屏一直有问题,于是我用AI做个简单的测试代码,去除了HX711和定时影响,然后自己测试了硬件连接,显示屏单独运行时正常,一旦接入整个电路就显示0000(无重量)和8888(有重量),测量功能KEY功能和报警正确。
用的是proteus和keil4.
这是电路图和代码,请问问题出在哪里?

#include <reg51.h>

#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long

//=================== 引脚定义 ===================
// 位选:通过 PNP 三极管,高电平关,低电平开
sbit WE1 = P3^4;
sbit WE2 = P3^5;
sbit WE3 = P3^6;
sbit WE4 = P3^7;

// 按键:一端 IO,一端 GND,按下为 0
sbit KEY1 = P3^0;   // 清零
sbit KEY2 = P3^1;   // +100
sbit KEY3 = P3^2;   // -100

// 蜂鸣器:PNP 高边,P2.3=0 时响
sbit BEEP = P2^3;

// LED:P3.3,高电平亮
sbit LED  = P3^3;

//=================== 全局变量 ===================
ulong Weight = 0;          // 当前“重量”(纯软件模拟)
#define ALARM_WEIGHT 500   // 超重阈值:500

// 共阳数码管段码:低电平点亮(0~9)
uchar code SegCode[10] = {
    0xC0,  // 0
    0xF9,  // 1
    0xA4,  // 2
    0xB0,  // 3
    0x99,  // 4
    0x92,  // 5
    0x82,  // 6
    0xF8,  // 7
    0x80   // 8
};

//=================== 简单延时 ===================
void DelayMs(uint ms)
{
    uint i,j;
    for(i = 0; i < ms; i++)
        for(j = 0; j < 120; j++);
}

//=================== 显示一位数字 ===================
void ShowOneDigit(uchar pos, uchar num)
{
    // 关所有位选
    WE1 = 1;
    WE2 = 1;
    WE3 = 1;
    WE4 = 1;

    // 段码
    P1 = SegCode[num];

    // 选通某一位(低电平开)
    switch(pos)
    {
        case 0: WE1 = 0; break;   // 第一位(左)
        case 1: WE2 = 0; break;
        case 2: WE3 = 0; break;
        case 3: WE4 = 0; break;   // 最右
    }

    // 给这位一点点点亮时间
    DelayMs(2);
}

//=================== 显示当前 Weight 的 4 位数字 ===================
void DisplayWeightOnce(void)
{
    ulong v = Weight;
    uchar d0,d1,d2,d3;

    if(v > 9999) v = 9999;

    d0 = v / 1000;
    d1 = (v / 100) % 10;
    d2 = (v / 10)  % 10;
    d3 = v % 10;

    // 按 segtest 的方式,依次扫 4 位
    ShowOneDigit(0, d0);
    ShowOneDigit(1, d1);
    ShowOneDigit(2, d2);
    ShowOneDigit(3, d3);
}

//=================== 按键扫描:完全软件控制 Weight ===================
void KeyScan(void)
{
    // KEY1:清零
    if(KEY1 == 0) {
        DelayMs(10);          // 消抖
        if(KEY1 == 0) {
            Weight = 0;
            // 短提示音
            BEEP = 0; LED = 1;
            DelayMs(50);
            BEEP = 1; LED = 0;
            while(KEY1 == 0); // 等待松手
        }
    }

    // KEY2:+100
    if(KEY2 == 0) {
        DelayMs(10);
        if(KEY2 == 0) {
            if(Weight <= 9900) Weight += 100;
            BEEP = 0; LED = 1;
            DelayMs(50);
            BEEP = 1; LED = 0;
            while(KEY2 == 0);
        }
    }

    // KEY3:-100
    if(KEY3 == 0) {
        DelayMs(10);
        if(KEY3 == 0) {
            if(Weight >= 100) Weight -= 100;
            else Weight = 0;
            BEEP = 0; LED = 1;
            DelayMs(50);
            BEEP = 1; LED = 0;
            while(KEY3 == 0);
        }
    }
}

//=================== 超重报警 ===================
void CheckAlarm(void)
{
    static uchar cnt = 0;
    if(Weight > ALARM_WEIGHT) {
        //200ms 翻转一次蜂鸣器和 LED
        if(++cnt >= 20) {
            cnt = 0;
            if(BEEP == 1) {
                BEEP = 0;
                LED  = 1;
            } else {
                BEEP = 1;
                LED  = 0;
            }
        }
    } else {
        // 不超重时关闭报警
        cnt  = 0;
        BEEP = 1;
        LED  = 0;
    }
}

//=================== 初始化 ===================
void InitSystem(void)
{
    P0 = 0xFF;
    P1 = 0xFF;
    P2 = 0xFF;
    P3 = 0xFF;

    WE1 = 1;
    WE2 = 1;
    WE3 = 1;
    WE4 = 1;

    BEEP = 1;
    LED  = 0;
}

//=================== 主函数 ===================
void main(void)
{
    InitSystem();

    // 开机提示:滴 3 次
    {
        uchar i;
        for(i = 0; i < 3; i++) {
            BEEP = 0; LED = 1;
            DelayMs(100);
            BEEP = 1; LED = 0;
            DelayMs(100);
        }
    }

    while(1)
    {
        // 按键处理(修改 Weight)
        KeyScan();

        // 报警逻辑
        CheckAlarm();

        // 显示当前 Weight(刷新 4 位)
        DisplayWeightOnce();
        // 不需要额外延时,DisplayWeightOnce 里的 ShowOneDigit 已经有 4×2ms 延时
    }
}

img

  • 写回答

3条回答 默认 最新

  • nyanyanyanyanyanya 2025-12-08 11:37
    关注

    解决了,给WE1-4接口接入了高电阻,然后接地引流就正常了,接线如下

    img

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

报告相同问题?

问题事件

  • 系统已结题 12月16日
  • 已采纳回答 12月8日
  • 创建了问题 12月8日