找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

关于数码管问题,我会单个数码管显示0到9,如何在这基础上显示0-99或0-999?

查看数: 28753 | 评论数: 32 | 收藏 1
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2016-10-13 20:54

正文摘要:

#include<reg52.h> sbit WEI = P1^6; sbit DU = P1^7; unsigned char code Disp_Tab[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};        //段选 #define uchar unsign ...

回复

ID:307020 发表于 2019-6-28 08:42
非常经典的例程,几乎每一本C51编程的书里都有,感谢楼主给大家增加黑币的机会。
ID:469510 发表于 2019-6-27 10:39
谢谢分享,刚好用到!
ID:271741 发表于 2018-1-5 00:36
感谢楼主分享
ID:271665 发表于 2018-1-4 21:51
楼主怎么让数码管显示某一个数字时,用按键暂停显示,同时要求发光二极管闪烁??
ID:153199 发表于 2016-12-25 18:56
感谢楼主分享,真心不错
ID:150126 发表于 2016-12-23 15:13
把位选改下就行了
ID:156899 发表于 2016-12-22 16:46
原理图Kian起来好乱啊
ID:156793 发表于 2016-12-22 11:02
动态扫描
ID:102056 发表于 2016-12-16 22:23

while(1)//循环部分
{
nuim++;//计数
sum[0]=num/100;//分离百位
sum[1]=num%100/10;;//分离出十位
sum[0]=nuim%10;//分离出个位              应该改成sum[2]=nuim%10;
for(i=0;i<3;i++)
{
//设置位选
//输出sum
}

}
ID:102056 发表于 2016-12-16 22:20
咆哮的阿杰 发表于 2016-11-27 22:36
看楼主的程序,你需要了解动态扫描。需要加入位选。
位选的作用就是选择单片机上的数码管的某一个数码管。 ...

明明我数码管显示先写消影再写位选之后写了段选最后写个延时就是为了使数码管动态显示
ID:155314 发表于 2016-12-16 18:20
  1. while(1)//循环部分
  2. {
  3. nuim++;//计数
  4. sum[0]=num/100;//分离百位
  5. sum[1]=num%100/10;;//分离出十位
  6. sum[0]=nuim%10;//分离出个位
  7. for(i=0;i<3;i++)
  8. {
  9. //设置位选
  10. //输出sum[i]
  11. }

  12. }
复制代码
ID:153199 发表于 2016-12-16 18:02
增加硬件和程序
ID:150658 发表于 2016-11-28 11:11
单纯用这种循环的方法解决不好,建议学习一下定时器中断,那样你就不知是0~99  0~999啦甚至可以更大
ID:150658 发表于 2016-11-28 11:08
参考(郭天祥)那本书
ID:150658 发表于 2016-11-28 11:08
可以用定时器中断写
ID:150661 发表于 2016-11-27 23:49
多个数码管并联,并且需要改程序
ID:150441 发表于 2016-11-27 22:53
除  和求 余
ID:146734 发表于 2016-11-27 22:40
根据经侦,中断计算一显示时间,然后根据时间,终断,进行编程
ID:149853 发表于 2016-11-27 22:36
看楼主的程序,你需要了解动态扫描。需要加入位选。
位选的作用就是选择单片机上的数码管的某一个数码管。
位选有单片机的专门i/o口,楼主查下
ID:55331 发表于 2016-11-26 14:44
两种方法,一种是从0-99,然后这个数字对10取整,将这个数字显示在十位数的数码管,对10取余,将这个数字显示在十位数的数码管,持续刷新,多少次后,数字加1,对100进行取余,保证数字只有0-100。
一种是0-9显示,每次对10取余,取余结果在个位上显示,当取余结果为0时,十位数的数字加1,十位数对10取余,取余结果在十位上显示。
ID:149091 发表于 2016-11-22 21:54
十位对变量求模,个位对变量求余
ID:102056 发表于 2016-11-22 20:09
以实测,满足000-999
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P1^7;
sbit wela=P1^6;
uchar num,count;
uint bai=0,shi=0,ge=0;
void display(uint bai,uint shi,uint ge);
uchar code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,};
void delay1ms(void)   //误差 -0.651041666667us
{
    unsigned char a,b;
    for(b=102;b>0;b--)
        for(a=3;a>0;a--);
}
void main()
{
        TMOD=0x00;
        TH0=(8192-8000)/32;
        TL0=(8192-8000)%32;
        EA=1;
        ET0=1;
        TR0=1;

        while(1)
        {
        display(bai,shi,ge);
        }
        
}
void display(uint bai,uint shi,uint ge)
{   
            bai=num/100;
        shi=(num - (bai*100))/10;
        ge=num%10;


                dula=1;
                P0=0X00;
                dula=0;
                wela=1;
        P0=0x7f;
        wela=0;
        dula=1;
        P0=table[ge];  
        delay1ms();
        
                dula=1;
                P0=0X00;
                dula=0;
                wela=1;
        P0=0xbf;
        wela=0;
        dula=1;
        P0=table[shi];  
        delay1ms();
        
                dula=1;
                P0=0X00;
                dula=0;
                wela=1;
        P0=0xdf;
        wela=0;
        dula=1;
        P0=table[bai];
        delay1ms();


}
void timer0()interrupt 1
{
    TH0=(8192-8000)/32;
    TL0=(8192-8000)%32;
   count++;
   if(count ==125)
   {
        count = 0;
         num++;
        if(num==999)
          num = 0;

   }
}


ID:102056 发表于 2016-11-22 20:04
已解决000-999
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P1^7;
sbit wela=P1^6;
uchar num,count;
uint bai=0,shi=0,ge=0;
void display(uint bai,uint shi,uint ge);
uchar code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,};
void delay1ms(void)   //误差 -0.651041666667us
{
    unsigned char a,b;
    for(b=102;b>0;b--)
        for(a=3;a>0;a--);
}
void main()
{
        TMOD=0x00;
        TH0=(8192-8000)/32;
        TL0=(8192-8000)%32;
        EA=1;
        ET0=1;
        TR0=1;

        while(1)
        {
        display(bai,shi,ge);
        }
        
}
void display(uint bai,uint shi,uint ge)
{   
            bai=num/100;
        shi=(num - (bai*100))/10;
        ge=num%10;


                dula=1;
                P0=0X00;
                dula=0;
                wela=1;
        P0=0x7f;
        wela=0;
        dula=1;
        P0=table[ge];  
        delay1ms();
        
                dula=1;
                P0=0X00;
                dula=0;
                wela=1;
        P0=0xbf;
        wela=0;
        dula=1;
        P0=table[shi];  
        delay1ms();
        
                dula=1;
                P0=0X00;
                dula=0;
                wela=1;
        P0=0xdf;
        wela=0;
        dula=1;
        P0=table[bai];
        delay1ms();


}
void timer0()interrupt 1
{
    TH0=(8192-8000)/32;
    TL0=(8192-8000)%32;
   count++;
   if(count ==125)
   {
        count = 0;
         num++;
        if(num==999)
          num = 0;

   }
}


ID:149245 发表于 2016-11-22 15:24
分离出个位十位百位等,当各位加到10时候十位进一,个位清零
ID:90566 发表于 2016-11-22 12:55
用for语句最好
ID:111634 发表于 2016-11-22 11:48
继续计数。
ID:149388 发表于 2016-11-22 09:19
添加循环嵌套
ID:138155 发表于 2016-11-22 09:00
while(1)
        {
                for(i = 0; i < 10; i++)                //循环10次
                {
                    WEI = 1;
                    P0 = 0x7f;
                    WEI = 0;               
                    DU = 1;
                    P0 =  DISP_smg;
                    delayms(400);              
                    WEI = 1;
                    P0 = 0xbf;
                    WEI = 0;
                    DU = 1;
                    P0        =  DISP_smg[C0];
                   删掉试试看 0-9      
                    
                 
ID:148885 发表于 2016-11-20 21:11
从个十百依次自加,逢九清零前位加一
ID:111634 发表于 2016-10-14 16:21
如果真理解了0~9显示,那么就一定会0~999显示。不会0~999显示,就一定没有真理解了0~9显示。
ID:142647 发表于 2016-10-13 21:30
好的那就等你看见

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

Powered by 单片机教程网

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