关于在51单片机中使用四位共阳极数码管时,输出1123正常显示,但输出0123时只显示0083,经验分享!

0123 被解释为八进制常量,等于十进制的83。

解决的一种办法是:你可以直接将其用十进制表示,不需要前导零。八进制的0123等于十进制的83。(一般是因为C语言语法问题)

在C/C++中,如果你使用前导零来表示一个整数,编译器会将其解释为八进制。因此,当你写下0123时,编译器会将其视为一个八进制常量,而不是十进制。

在八进制中,每一位数可以是0到7,而不是0到9(十进制)。因此,0123八进制的每一位都是有效的,它表示的是:

1 * 8^2 + 2 * 8^1 + 3 * 8^0 = 64 + 16 + 3 = 83(十进制)

所以,unsigned int numS = 0123; 实际上将numS 赋值为十进制的83。

当然你是不是以为把其中数值改为超过8就行,很好,恭喜你!学会提出疑惑了!看下图!

编译后很明显,语法不过!

如果你想将0123表示为十进制,你应该直接写成unsigned int numS = 123;,这样就不会有混淆了。

或者这问题通常是由于数字0的显示方式与其他数字不同所引起的。数字0在七段数码管上的显示通常需要点亮所有的段(a到g)。解决这个问题的一种方法是在控制代码中针对数字0添加一个特殊的情况,以确保所有的段都被点亮。你可以检查你的显示控制逻辑,确保数字0的显示方式与其他数字不同。以下是一种可能的解决方法:

// 假设使用 P0~P3 引脚来控制四位数码管,P0~P6 引脚用来控制七段显示

#include <reg51.h>

unsigned char code DisplayDigits[] = {
    // 0    1    2    3    4    5    6    7    8    9
    0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90
};

void main() {
    unsigned char num = 0;  // 要显示的数字,这里以0为例

    // 在这里添加一个特殊情况,如果数字是0,则显示0
    if (num == 0) {
        P0 = 0xFF;  // 点亮所有的段
    } else {
        P0 = DisplayDigits[num];
    }

    // 这里添加代码来切换显示的位数,以显示四位数码管的不同位
}

普通代码,四位有效数字正常显示,当设置输出数值为2023时正常显示:

普通代码,四位数字显示,当设置输出数值为0123时,错误显示:

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

桂北研猛男

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值