找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1968|回复: 7
打印 上一主题 下一主题
收起左侧

求教大神,为什么这个单片机程序千位和百位显示不出来,感觉逻辑上没问题啊!

[复制链接]
跳转到指定楼层
楼主
ID:702446 发表于 2020-3-4 17:53 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>

#define uint unsigned int

#define uchar unsigned char



uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,    //定义编码表数组//

                              0x7d,0x07,0x7f,0x6f,0x77,0x7c,

                              0x39,0x5e,0x79,0x71,0x00     };

sbit dula=P2^6;

sbit wela=P2^7;

uchar wei;

uint temp,t;

uint qian,bai,shi,ge;                                                   //定义变量

void display(uint qian,bai,shi,ge);                                //显示函数声明

void delay(uint);                                                        //延时函数申明

void init();                                                                 //初始化函数申明



void main()

{

        init();

        

        while(1)

        {

               

                if(t==20)

                        {

                         t=0;

                         temp++;

                         if(temp==3600)

                                 temp=0;

                         qian=temp/1000;                                //分离参数

                         bai=temp%1000/100;

                         shi=temp%1000%100/10;

                            ge=temp%10;

                        }

                 

                 display(qian,bai,shi,ge);                               //调用显示函数

                        

                        

        }

}



void delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

         for(y=110;y>0;y--);

}



void display(uint qian,bai,shi,ge)

{

        

        if(temp<10)

                wei='a';

    else if(10<=temp<100)

                wei='b';

        else if(100<=temp<1000)

                wei='c';

        else if(1000<=temp<10000)

                wei='d';

        switch(wei)

        {

         case 'a':              wei=0;

                                                 dula=1;

                                                P0=table[ge];

                                                dula=0;

                                                        P0=0xff;

                                                wela=1;

                                                P0=0x7f;

                                                wela=0;

                                                delay(5);break;

        

         case 'b':          wei=0;

                                                 dula=1;

                                                P0=table[shi];

                                                dula=0;

                                                        P0=0xff;

                                                wela=1;

                                                P0=0xbf;

                                                wela=0;

                                                delay(5);        

                                

        

                                                dula=1;

                                                P0=table[ge];

                                                dula=0;

                                                        P0=0xff;

                                                wela=1;

                                                P0=0x7f;

                                                wela=0;         

                                                delay(5);break;

                                       



          case'c':                wei=0;

                                                  wela=1;

                                                P0=0xdf;

                                                wela=0;

                            dula=1;

                                                P0=table[bai];

                                                dula=0;

                                                        P0=0xff;

                                                delay(5);



                                       

                                                dula=1;

                                                P0=table[shi];

                                                dula=0;

                                                        P0=0xff;

                                                wela=1;

                                                P0=0xbf;

                                                wela=0;

                                                delay(5);



                                       

                                                dula=1;

                                                P0=table[ge];

                                                dula=0;

                                                        P0=0xff;

                                                wela=1;

                                                P0=0x7f;

                                                wela=0;

                                                delay(5);break;

                                          

          case 'd':                wei=0;

                                                  dula=1;

                                                P0=table[qian];

                                                dula=0;

                                                        P0=0xff;

                                                wela=1;

                                                P0=0xef;

                                                wela=0;

                                                delay(5);



                                       

                                                dula=1;

                                                P0=table[bai];

                                                dula=0;

                                                        P0=0xff;

                                                wela=1;

                                                P0=0xdf;

                                                wela=0;

                                                delay(5);



                                       

                                                dula=1;

                                                P0=table[shi];

                                                dula=0;

                                                        P0=0xff;

                                                wela=1;

                                                P0=0xbf;

                                                wela=0;

                                                delay(5);



                                       

                                                dula=1;

                                                P0=table[ge];

                                                dula=0;

                                                        P0=0xff;

                                                wela=1;

                                                P0=0x7f;

                                                wela=0;

                                                delay(5);                          break;

                                       

                                       

        }

}        

        

void init()

{

         t=0;

        dula=0;

        wela=0;

        temp=99;

        TMOD=0x01;

        EA=1;

        ET0=1;

        TH0=(65536-50000)/256;

        TL0=(65536-50000)%256;

        TR0=1;

}



void timer0() interrupt 1

{

         TH0=(65536-50000)/256;

        TL0=(65536-50000)%256;

        t++;

}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:160500 发表于 2020-3-4 21:11 | 只看该作者
没有这种写法的
回复

使用道具 举报

板凳
ID:213173 发表于 2020-3-4 21:18 | 只看该作者
恰恰是因为显示程序逻辑错误才不正常。修改如下:
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit dula=P2^6;
  5. sbit wela=P2^7;
  6. uchar code table[]={
  7. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,//定义编码表数组
  8. 0x7d,0x07,0x7f,0x6f,0x77,0x7c,
  9. 0x39,0x5e,0x79,0x71,0x00};
  10. uchar wei=0;
  11. uint temp,t;
  12. uint qian,bai,shi,ge;     //定义变量
  13. void display();           //显示函数声明
  14. void delay(uint);         //延时函数申明
  15. void init();              //初始化函数申明

  16. void main()
  17. {
  18.         init();
  19.         while(1)
  20.         {
  21.                 if(t==20)
  22.                 {
  23.                         t=0;
  24.                         temp++;
  25.                         if(temp==3600)
  26.                                 temp=0;
  27.                         qian= temp/1000%10;   //分离参数
  28.                         bai = temp/100%10;
  29.                         shi = temp/10%10;
  30.                         ge  = temp%10;
  31.                 }
  32.                 display();//调用显示函数
  33.         }
  34. }
  35. void delay(uint z)
  36. {
  37.         uint x,y;
  38.         for(x=z;x>0;x--)
  39.                 for(y=110;y>0;y--);
  40. }
  41. void display()
  42. {
  43.         P0=0x00;//消隐
  44.         dula=1;
  45.         dula=0;
  46.         switch(wei)
  47.         {
  48.                 case 0:
  49.                         P0=0xf7;
  50.                         wela=1; //送位码
  51.                         wela=0; //锁存
  52.                         P0=table[ge];
  53.                         dula=1; //送段码
  54.                         dula=0;  //锁存
  55.                 break;
  56.                 case 1:
  57.                         P0=0xfb;
  58.                         wela=1;
  59.                         wela=0;
  60.                         P0=table[shi];
  61.                         dula=1;
  62.                         dula=0;
  63.                 break;
  64.                 case 2:
  65.                         P0=0xfd;
  66.                         wela=1;
  67.                         wela=0;
  68.                         P0=table[bai];
  69.                         dula=1;
  70.                         dula=0;
  71.                 break;
  72.                 case 3:
  73.                         P0=0xfe;
  74.                         wela=1;
  75.                         wela=0;
  76.                         P0=table[qian];
  77.                         dula=1;
  78.                         dula=0;
  79.         }
  80.         delay(1);
  81.         wei++;
  82.         wei%=4;
  83. }        
  84. void init()
  85. {
  86.         t=0;
  87.         dula=0;
  88.         wela=0;
  89.         temp=99;
  90.         qian= temp/1000%10;
  91.         bai = temp/100%10;
  92.         shi = temp/10%10;
  93.         ge  = temp%10;
  94.         TMOD=0x01;
  95.         TH0=(65536-50000)/256;
  96.         TL0=(65536-50000)%256;
  97.         TR0=1;
  98.         EA=1;
  99.         ET0=1;
  100. }
  101. void timer0() interrupt 1
  102. {
  103.         TH0=(65536-50000)/256;
  104.         TL0=(65536-50000)%256;
  105.         t++;
  106. }
复制代码
回复

使用道具 举报

地板
ID:644141 发表于 2020-3-4 22:22 | 只看该作者
建议使用插入代码功能,便于查看
回复

使用道具 举报

5#
ID:702446 发表于 2020-3-5 17:19 | 只看该作者
wulin 发表于 2020-3-4 21:18
恰恰是因为显示程序逻辑错误才不正常。修改如下:

感谢,但是我想要的效果是:比如说还没加到千位则千位不亮,现在这种情况与我之前弄的一样,即便还没加到千位,千位也一直显示0
回复

使用道具 举报

6#
ID:702446 发表于 2020-3-5 18:29 | 只看该作者
经过多番求证今天我发现错误了, 程序逻辑上没有问题,主要是switch(  里面表达式分离语法的错误 )
原来的是:        if(temp<10)
                wei='a';
        else if(9<temp<100)
                        wei='b';
             else if(99<temp<1000)
                             wei='c';
                      else if(999<temp<10000)
                                  wei='d';
实际上if语句的括号里不能按照数学的写法去写不等式,他只会判断第一个不等号,所以永远都是执行到99<temp就直接进入case'b',只要把括号里面的判别式用逻辑“与”代替即可。
修改后的程序如下:
        if(temp<10)
                wei='a';
        else if(9<temp&temp<100)
                        wei='b';
             else if(99<temp&temp<1000)
                             wei='c';
                      else if(999<temp&temp<10000)
                                  wei='d';
回复

使用道具 举报

7#
ID:702446 发表于 2020-3-5 18:32 | 只看该作者
wulin 发表于 2020-3-4 21:18
恰恰是因为显示程序逻辑错误才不正常。修改如下:

问题找到了,回去翻了一下C的相关资料发现错误了, 程序逻辑上没有问题,主要是switch(  里面表达式分离语法的错误 )
原来的是:        if(temp<10)
                wei='a';
        else if(9<temp<100)
                        wei='b';
             else if(99<temp<1000)
                             wei='c';
                      else if(999<temp<10000)
                                  wei='d';
实际上if语句的括号里不能按照数学的写法去写不等式,他只会判断第一个不等号,所以永远都是执行到99<temp就直接进入case'b',只要把括号里面的判别式用逻辑“与”代替即可。
修改后的程序如下:
        if(temp<10)
                wei='a';
        else if(9<temp&temp<100)
                        wei='b';
             else if(99<temp&temp<1000)
                             wei='c';
                      else if(999<temp&temp<10000)
                                  wei='d';
回复

使用道具 举报

8#
ID:213173 发表于 2020-3-5 23:17 | 只看该作者
Amlee 发表于 2020-3-5 17:19
感谢,但是我想要的效果是:比如说还没加到千位则千位不亮,现在这种情况与我之前弄的一样,即便还没加到 ...

没加到千位则千位不亮,没加到百位则百位不亮,没加到十位则十位不亮。
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit dula=P2^6;
  5. sbit wela=P2^7;
  6. uchar code table[]={
  7. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,//定义编码表数组
  8. 0x7d,0x07,0x7f,0x6f,0x77,0x7c,
  9. 0x39,0x5e,0x79,0x71,0x00};
  10. uchar code weia[]={0xf7,0xfb,0xfd,0xfe};
  11. uchar data dis_buf[6];
  12. uchar wei=0;
  13. uint temp,t;
  14. //uint qian,bai,shi,ge;     //定义变量
  15. void display();           //显示函数声明
  16. void delay(uint);         //延时函数申明
  17. void init();              //初始化函数申明

  18. void main()
  19. {
  20.         init();
  21.         while(1)
  22.         {
  23.                 if(t==500)
  24.                 {
  25.                         t=0;
  26.                         temp++;
  27.                         if(temp==3600)
  28.                                 temp=0;
  29.                         dis_buf[0] = table[temp%10];
  30.                         if(temp<10)dis_buf[1]=0x00;                       
  31.                         else dis_buf[1] = table[temp/10%10];
  32.                         if(temp<100)dis_buf[2]=0x00;                       
  33.                         else dis_buf[2] = table[temp/100%10];
  34.                         if(temp<1000)dis_buf[3]=0x00;
  35.                         else dis_buf[3] = table[temp/1000%10];
  36.                 }
  37.         }
  38. }
  39. /*
  40. void delay(uint z)
  41. {
  42.         uint x,y;
  43.         for(x=z;x>0;x--)
  44.                 for(y=110;y>0;y--);
  45. }*/

  46. void display()//显示函数
  47. {
  48.         P0=0x00;dula=1;dula=0;        //消隐
  49.         P0=weia[wei];wela=1;wela=0;   //送位码锁存
  50.         P0=dis_buf[wei];dula=1;dula=0;//送段码锁存
  51.         wei++; wei%=4;
  52. }        
  53. void init()
  54. {
  55.         t=0;
  56.         dula=0;
  57.         wela=0;
  58.         temp=99;
  59.         dis_buf[0] = table[temp%10];
  60.         if(temp<10)dis_buf[1]=0x00;                       
  61.         else dis_buf[1] = table[temp/10%10];
  62.         if(temp<100)dis_buf[2]=0x00;                       
  63.         else dis_buf[2] = table[temp/100%10];
  64.         if(temp<1000)dis_buf[3]=0x00;
  65.         else dis_buf[3] = table[temp/1000%10];
  66.         TMOD=0x01;
  67.         TH0=(65536-2000)/256;
  68.         TL0=(65536-2000)%256;
  69.         TR0=1;
  70.         EA=1;
  71.         ET0=1;
  72. }
  73. void timer0() interrupt 1
  74. {
  75.         TH0=(65536-2000)/256;
  76.         TL0=(65536-2000)%256;
  77.         t++;
  78.         display();//调用显示函数
  79. }
复制代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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