微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 一个循环函数的困惑

一个循环函数的困惑

时间:10-02 整理:3721RD 点击:
  while(1)
  {
  if(t==10)     //定时器
          {
        t=0;
        temp++;
        if(temp==9999)
          temp=0;
    }
   display(temp)        ;  //显示任意4位数
  }
这个程序中display函数写在if循环外面,能够正常执行,
但是如果下载if里面,就会出错,它将显示个位从1-9,
然后高位一直闪烁。不能像写在外面那样定住,非常疑惑,
因为,其他程序根本没有变化,但是这一句变化却会有这样的改变,不知道为什么。
希望有人解惑,谢谢。

不要只贴出有问题的部分,应该将你所想要设计的程序思路写出来,做什么(实现什么功能)、用什么做(硬件电路简述)、怎么做(程序大概思路)、遇到什么问题、程序,就这么一点信息,相帮你都帮不到

好吧 下面贴程序,我只是想知道把显示函数写在判断定时器函数里面和外面有什么区别,我知道正确的为什么正确,却不知道错误的为什么错误

下面是完整的程序
//显示任意4位数,1-9999动态显示,定时器0设置0.5s一走,
//延时程序设置让其一直显示
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit duan=P2^6;
sbit wei=P2^7;
uchar code tableduan[]=
{
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0xff ,0x6f
};
uchar code tablewei[]=
{
0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f
};
void yanshi(uint);
void display(uint);
  uchar qian,bai,shi,ge;
  uint t=0,temp;
void main()
{
  TMOD=1;
  TH0=15536/256;
  TL0=15536%256;
  EA=1;
  ET0=1;
  TR0=1;
  while(1)
  {
  if(t==1)
          {
        t=0;
        temp++;
        if(temp==9999)
          temp=0;
    }
  display(temp)        ;  //显示任意4位数
  }
}
void yanshi(uint z)
{
   uint a,b;
  for (a=z;a>0;a--)
      for(b=120;b>0;b--);
}
void display(uint z)                 //任意4位
{
  uint tms;
  tms=5;
  qian=z/1000;
  bai=z%1000/100;
  shi=z%1000%100/10;
  ge=z%10;
  wei=1;
  P0=tablewei[0];
  wei=0;
  duan=1;
  P0=tableduan[qian];
  duan=0;
  yanshi(tms);
    wei=1;
  P0=tablewei[1];
  wei=0;
  duan=1;
  P0=tableduan[bai];
  duan=0;
  yanshi(tms);
    wei=1;
  P0=tablewei[2];
  wei=0;
  duan=1;
  P0=tableduan[shi];
  duan=0;
   yanshi(tms);
    wei=1;
  P0=tablewei[3];
  wei=0;
  duan=1;
  P0=tableduan[ge];
  duan=0;
   yanshi(tms);
}
void time0() interrupt 1
{
   
  TH0=15536/256;
  TL0=15536%256;
  t++;
}

因为单纯从你这个循环来看是没有问题的,所以必须从整体的程序来分析,才能判断的出来

嗯好的 程序贴出来了,请帮我看看

加QQ764672150,我告诉你原因,在论坛上讲不清楚

首先你可以看你的主循环里面的if语句,按照你的程序应该是1s进入次对吧,然后你在看看你的显示程序display;你是通过放在主循环里面让display不停的内循环来扫描你的四位数码管(这种做法本来就有问题),其实你这种做法能显示出来都是靠你的delay函数延时你才能勉强显示出来的,如果我估计的没错的话,你所谓能够正常显示,估计高位会比较亮低三位会比较亮的多好回过头来,假如把display放到if语句里面去是不是就等于1s钟我再来扫描一次显示呢,那我们肉眼看到是不是就是会看到你的数码是1s钟闪烁一次

动态显示利用的是人的视觉暂留现象及发光二极管的余辉效应,扫描速度要足够快,你如果放在if里面那就是0.5s才扫描一次,这样的速度远达不到要求,就变成了闪烁,放在if外面就是一直在扫描显示

谢谢,楼上给我讲的很详细,我已经懂了

数码管输入信号加上锁存器就不会出现这个问题了。

数码管输入信号加上锁存器就不会出现这个问题了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top