u_ni_que 2023-03-26 21:23 采纳率: 33.3%
浏览 28
已结题

51单片机的数码管动态显示

下面输入是display(236)时,单片机上的数码管就正常从左至右显示236。但是当我改成display(263)时,单片机上的数码管就显示007。
我感觉是26/28/30的数学计算的公式有问题,但是核查了一下,好像没问题,上面这种情况就不太理解了,有没有了解其中所以然的小伙伴解答一下,感谢!

#include <reg52.h>//包含51头文件
#include <intrins.h>//包含移位标准库函数头文件

#define uint unsigned int//宏定义unsigned int简称为uint
#define uchar unsigned char//宏定义unsigned char简称为uchar
    
sbit DU = P2^6;//数码管段选
sbit WE = P2^7;//数码管段选

//共阴数码管段选表0-9
uchar  code tabel[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};

//毫秒级延时函数定义
void delay(uint z)
{
    uint x,y;
    for(x = z; x > 0; x--)
        for(y = 114; y > 0 ; y--);         
} 

void display(uchar i)
{
    uchar bai,shi,ge;
    
    //直接舍去余数,得到百位数值
    bai = i / 100;        
    //先求余,得到个位和十位组成的数,再除10舍去个位,得到十位数值
    shi = i % 100 / 10;    
    //直接得到个位的余数
    ge = i % 10;            
    
    //第一位数码管
    P0 = 0XFF;
    WE = 1;
    P0 = 0XFE;//1111 1110
    WE = 0;
    
    DU = 1;
    P0 = tabel[bai];
    DU = 0;
    delay(5);
    
    
    //第二位数码管
    P0 = 0XFF;
    WE = 1;
    P0 = 0XFD;//1111 1101
    WE = 0;
    
    DU = 1;
    P0 = tabel[shi];//显示十位
    DU = 0;
    delay(5);
    
    //第三位数码管
    P0 = 0XFF;
    WE = 1;
    P0 = 0XFB;//1111 1011
    WE = 0;
    
    DU = 1;
    P0 = tabel[ge];//显示个位
    DU = 0;
    delay(5);
}

void main()//main函数自身会循环
{    
    while(1)
    {
        display(263); //数码管显示函数
    }    
} 

  • 写回答

3条回答 默认 最新

  • 智者知已应修善业 2023-03-26 22:09
    关注

    uchar变量最大值255已经越界就不会是263改为使用uint试看

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • IT_service_mesh 2023-03-26 21:30
    关注

    参考GPT和自己的思路:根据你提供的代码,问题可能在于计算百位数值的方法。在函数中,百位数值是通过直接舍去余数得到的。但是当输入为263时,余数为63,直接舍去得到的百位数值为0,而不是2。因此,需要修改计算百位数值的方法。可以采用整除和模运算的方式,先得到百位数值,然后得到余下的数值进行十位和个位的计算。修改后的代码如下:

    void display(uchar i)
    {
        uchar bai,shi,ge;
        
        //先得到百位数值,然后得到余下数值进行十位和个位的计算
        bai = i / 100;         
        shi = i % 100 / 10;    
        ge = i % 10;            
        
        //第一位数码管
        P0 = 0XFF;
        WE = 1;
        P0 = 0XFE;//1111 1110
        WE = 0;
        
        DU = 1;
        P0 = tabel[bai];
        DU = 0;
        delay(5);
        
        
        //第二位数码管
        P0 = 0XFF;
        WE = 1;
        P0 = 0XFD;//1111 1101
        WE = 0;
        
        DU = 1;
        P0 = tabel[shi];//显示十位
        DU = 0;
        delay(5);
        
        //第三位数码管
        P0 = 0XFF;
        WE = 1;
        P0 = 0XFB;//1111 1011
        WE = 0;
        
        DU = 1;
        P0 = tabel[ge];//显示个位
        DU = 0;
        delay(5);
    }
    
    评论
  • CSDN-Ada助手 CSDN-AI 官方账号 2023-03-28 07:47
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月10日
  • 已采纳回答 4月2日
  • 修改了问题 3月26日
  • 创建了问题 3月26日

悬赏问题

  • ¥15 gitee无效的源路径/URL
  • ¥15 问题描述:给定一个算术表达式,通过程序求出最后的结果
  • ¥15 spyder运行重复
  • ¥15 我用C语言easyx图形库绘制了一个3d游戏方框透视,但进入游戏时候鼠标准星对准方框边缘 鼠标光标就会弹出来这是啥情况怎样让光标对准绘制的方框点击鼠标不弹出光标好烦这样
  • ¥20 用Power Query整合的问题
  • ¥20 基于python进行多背包问题的多值编码
  • ¥15 相同型号电脑与配置,发现主板有一台貌似缺少了好多元器件似的,会影响稳定性和使用寿命吗?
  • ¥15 C语言:数据子序列基础版
  • ¥20 powerbulider 导入excel文件,显示不完整
  • ¥15 paddle训练自己的数据loss降不下去