想问一下为什么显示器有问题?
我做一个基于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 延时
}
}

