weixin_56890487 2025-11-04 09:33 采纳率: 25%
浏览 9
已结题

51单片机数码管显示位置和代码对不上

img

位选P2 = 0x06,不该是从左到右第二个灯吗

img



#include <REGX52.H>

// 数码管段码表 0-9
unsigned char code segTable[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

unsigned int Num = 0;  // 计数器变量

void Delay_ms(unsigned char ms);
void Key_Scan();
void NiXie();

void main()
{
    while(1)
    {
        Key_Scan();  // 修正:使用英文分号
        NiXie();     // 修正:使用英文分号
    }
}

void Key_Scan()
{
    if(P3_1 == 0)  // 加按键
    {
        Delay_ms(20);
        while(P3_1 == 0);  // 等待按键释放
        if(Num < 9) Num++; // 防止超过9
    }
    if(P3_0 == 0)  // 减按键
    {
        Delay_ms(20);
        while(P3_0 == 0);  // 等待按键释放
        if(Num > 0) Num--; // 防止小于0
    }
}

void NiXie()
{
    P2 = 0x06;     // 位选,选择数码管
    P0 = segTable[Num];  // 段选,显示数字
}

void Delay_ms(unsigned char ms)
{
    unsigned char i, j;
    for(i=0; i<ms; i++)
        for(j=0; j<123; j++);
}
  • 写回答

5条回答 默认 最新

  • 老皮芽子 2025-11-04 16:29
    关注

    注意看这个译码器,接的是 P22,P23,P24
    你的代码中是 P2 = 0x06;//0110
    按你的代码,P20 = 0;P20 = 0;P21=1;P22=1;P23=0;P24=0;
    结合图中的译码器 P22 = 1;P23=0;P24=0; 译码器选中的是 LED2 ,对应是右边第2个数码灯。
    你把代码这么改一下 P2 = 0x06 >> 2; // 译码器的最低位是 P22 ,这里就右移 2 位。
    这样,就是你想的数码灯亮的位置(从左到右第二个灯)

    img

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

报告相同问题?

问题事件

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