找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3080|回复: 9
收起左侧

求助单片机数码管的问题,需要实现当数字为一位数时不显示前面的三个0

[复制链接]
ID:399408 发表于 2018-9-19 11:30 | 显示全部楼层 |阅读模式
IMG_20180919_112603.jpg
请教各位大佬,这是显示0·9999的代码,如图所示,请问怎么修改才能实现“当数字为一位数时不显示前面的三个0,当数字为两位数时不显示前面的三个0”以此类推!!!

单片机源程序如下:
  1. /***************************************************************************
  2. 标题:        数码管的显示
  3. 实验板:LY51-L2B开发板
  4. 作者:        林洋电子-单片机
  5. 客服QQ:52927029
  6. 邮箱:        52927029@qq.com
  7. 说明:        显示00-99,动态显示+变化显示
  8. ******************************************************************************/

  9. //头文件:
  10. #include <reg52.h>

  11. //引脚定义:               
  12. sbit SMG_q = P0^0;        //定义数码管阳级控制脚(千位)
  13. sbit SMG_b = P0^1;        //定义数码管阳级控制脚(百位)
  14. sbit SMG_s = P0^2;        //定义数码管阳级控制脚(十位)
  15. sbit SMG_g = P0^3;        //定义数码管阳级控制脚(个位)

  16. //变量定义:
  17. unsigned char table[]=
  18.                         {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  19.                                         //表:共阳数码管 0-9

  20. //函数声明:
  21. void display(unsigned char da);//定义显示函数,参数为显示内容,只显示两位数
  22. void delay(void);

  23. //主函数,C语言的入口函数:                       
  24. void main(void)  
  25. {
  26.         unsigned char i=0;                //作为查表的索引号
  27.         unsigned char ldata;        //变量用作0~99计数
  28.         unsigned int j;                                //此变量作为计数跳变刷新时间
  29.         while(1)
  30.         {      
  31.                 j=500;                       
  32.                 while(j--){               
  33.                         display(ldata);        //刷新5000次,约1秒,注:在C语言里是没有周期可计算的哦~~~
  34.                 }                                               
  35.                 if(ldata<99)
  36.                         ldata++;                                //刷新完成约1秒,变量做加计数
  37.                 else
  38.                         ldata=0;
  39.         }
  40. }

  41. //显示函数,参数为显示内容,只显示两位数
  42. void display(unsigned char da)
  43. {
  44.         SMG_q=0;                        //选择千位数码管
  45.         P2=table[da/1000%100];        //获取个位值,查表输出定义好的数码管段值与P2口,显示相应的0-9
  46.         delay();                        //延时
  47.         P2=0XFF;                        //清除数码管显示,因是共阳型,所以不是0
  48.         SMG_q=1;                        //关闭千位数码管

  49.         SMG_b=0;                        //选择百位数码管
  50.         P2=table[da/100%10];        //获取个位值,查表输出定义好的数码管段值与P2口,显示相应的0-9
  51.         delay();                        //延时
  52.         P2=0XFF;                        //清除数码管显示,因是共阳型,所以不是0
  53.         SMG_b=1;                        //关闭百位数码管

  54.         SMG_s=0;                        //选择十位数码管
  55.         P2=table[da/10];        //获取十位值,查表输出定义好的数码管段值与P2口,显示相应的0-9
  56.         delay();                        //延时
  57.         P2=0XFF;                        //清除数码管显示,因是共阳型,所以不是0
  58.         SMG_s=1;                        //关闭十位数码管

  59.         SMG_g=0;                        //选择个位数码管
  60.         P2=table[da%10];        //获取个位值,查表输出定义好的数码管段值与P2口,显示相应的0-9
  61.         delay();                        //延时
  62.         P2=0XFF;                        //清除数码管显示,因是共阳型,所以不是0
  63.         SMG_g=1;                        //关闭个位数码管
  64. }

  65. //延时子函数,短暂延时
  66. void delay(void){               
  67.         unsigned char i=10;
  68.         while(i--);
  69. }
复制代码



回复

使用道具 举报

ID:84765 发表于 2018-9-19 16:05 | 显示全部楼层
加判断语句就行了

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:7485 发表于 2018-9-19 16:12 | 显示全部楼层
可以将“p2=table[da/1000%100]; ”改为“x=table[da/1000%100]; ”,然后判断是否x=0, 若=0,则“p2=0xff”,不等于0 则 p2=x,其余位同样。

编程还是自己多钻研,对提高有好处。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:135253 发表于 2018-9-19 16:46 | 显示全部楼层
拿去吧,显示函数这样改一下就行了!
//显示函数,参数为显示内容,只显示两位数
void display(unsigned char da)
{
        if(da<1000)
                SMG_q=1;
        else
        {
        SMG_q=0;                        //选择千位数码管
        P2=table[da/1000%100];        //获取个位值,查表输出定义好的数码管段值与P2口,显示相应的0-9
        delay();                        //延时
        P2=0XFF;                        //清除数码管显示,因是共阳型,所以不是0
        SMG_q=1;                                                 //关闭千位数码管
        }                 

        if(da<100)
                SMG_b=1;
        else
        {
        SMG_b=0;                        //选择百位数码管
        P2=table[da/100%10];        //获取个位值,查表输出定义好的数码管段值与P2口,显示相应的0-9
        delay();                        //延时
        P2=0XFF;                        //清除数码管显示,因是共阳型,所以不是0
        SMG_b=1;                        //关闭百位数码管
        }
       
        if(da<10)
                SMG_s=1;
        else
        {
        SMG_s=0;                        //选择十位数码管
        P2=table[da/10];        //获取十位值,查表输出定义好的数码管段值与P2口,显示相应的0-9
        delay();                        //延时
        P2=0XFF;                        //清除数码管显示,因是共阳型,所以不是0
        SMG_s=1;                        //关闭十位数码管
        }
        SMG_g=0;                        //选择个位数码管
        P2=table[da%10];        //获取个位值,查表输出定义好的数码管段值与P2口,显示相应的0-9
        delay();                        //延时
        P2=0XFF;                        //清除数码管显示,因是共阳型,所以不是0
        SMG_g=1;                        //关闭个位数码管
}

//延时子函数,短暂延时
void delay(void){               
        unsigned char i=10;
        while(i--);
}

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:399408 发表于 2018-9-19 20:21 | 显示全部楼层
xzf586 发表于 2018-9-19 16:46
拿去吧,显示函数这样改一下就行了!
//显示函数,参数为显示内容,只显示两位数
void display(unsigned  ...

谢谢啊,如果我要显示到9999该改哪儿啊[img][/img]
回复

使用道具 举报

ID:399408 发表于 2018-9-19 20:24 | 显示全部楼层
ahshmj 发表于 2018-9-19 16:12
可以将“p2=table[da/1000%100]; ”改为“x=table[da/1000%100]; ”,然后判断是否x=0, 若=0,则“p2=0xff ...

谢谢回答,已经用二楼的方法解决了,请问我要显示到9999怎么定义“unsigned char ldata;”这句
回复

使用道具 举报

ID:399408 发表于 2018-9-20 16:42 | 显示全部楼层
13976778401 发表于 2018-9-19 16:05
加判断语句就行了

嗯,谢谢回复
回复

使用道具 举报

ID:409293 发表于 2018-10-14 23:29 来自手机 | 显示全部楼层
楼主帮我试试我的这个位与方法,P2=P2|0xff;我记得以前我做这个的时候就是没有前面的0的

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表