关于数码管动态显示的问题,请大神解答一下疑惑。

2019-07-15 08:15发布

程序1:

#include<reg51.h>
#define GPIO_DIG P0      //定义字形接口

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;         //74LS138定义字位

unsigned char code DIG_NUM[8]={0x3f,0x06,0x5b,0x4f,
                               0x66,0x6d,0x7d,0x07,
                               };//字形库

void main()
{
unsigned char i,j;
while(1)                         //为什么这个while循环一定要加,不然显示不正常,具体现象为最高位的所有数码管都微亮,而且显示出7的亮度    很大。其他位值数码管显示正确数字,但亮度为微亮,

{
for(i=0;i<8;i++)
{
  switch(i)
  {
   case 0:LSA=0;LSB=0;LSC=0;break;
   case 1:LSA=1;LSB=0;LSC=0;break;
   case 2:LSA=0;LSB=1;LSC=0;break;
   case 3:LSA=1;LSB=1;LSC=0;break;
   case 4:LSA=0;LSB=0;LSC=1;break;
   case 5:LSA=1;LSB=0;LSC=1;break;
   case 6:LSA=0;LSB=1;LSC=1;break;
   case 7:LSA=1;LSB=1;LSC=1;break;
  }
  GPIO_DIG=DIG_NUM;
  j=100;                                                 //扫描间隔
  while(j--);
  GPIO_DIG=0x00;                                 //消隐
}
}
}



程序2:

#include<reg51.h>
#define GPIO_DIG P0          //定义字形接口
#define GPIO_KEY P1          //定义4x4矩阵按键接口

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;                 //74LS138定义字位

unsigned char keystate;                  //按键是否按下判断值
unsigned char keyvalue;                  //按键值
unsigned char DIG_DATA[8];          //字形临时数据

unsigned char code DIG_NUM[17]={0x3f,0x06,0x5b,0x4f,
                                                          0x66,0x6d,0x7d,0x07,
                                                           0x7f,0x6f,0x77,0x7c,
                                                           0x39,0x5e,0x79,0x71,0x00
                                                         }; //字形库
                        
void delay10ms();                //延时10ms
void keydown();                //按键判断
void DIG_display();            //显示

void delay10ms()                 //延时子程序10ms
{
unsigned char a,b,c;
for(c=1;c>0;c--)
    for(b=38;b>0;b--)
           for(a=130;a>0;a--);
}                                                         

void keydown()                          //按键判断子程序
{
unsigned int n=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)
{
  delay10ms();
    if(GPIO_KEY!=0x0f)
        {
         keystate=1;
         GPIO_KEY=0x0f;
         switch(GPIO_KEY)
         {
          case 0x07:keyvalue=0;break;
          case 0x0b:keyvalue=1;break;
          case 0x0d:keyvalue=2;break;
          case 0x0e:keyvalue=3;break;
          default:keyvalue=17;
         }
         GPIO_KEY=0xf0;
         switch(GPIO_KEY)
         {
          case 0x70:keyvalue=keyvalue;break;
          case 0xb0:keyvalue=keyvalue+4;break;
          case 0xd0:keyvalue=keyvalue+8;break;
          case 0xe0:keyvalue=keyvalue+12;break;
          default:keyvalue=17;
         }
         while((n<1000)&&(GPIO_KEY!=0xf0))
         {
          delay10ms();
          n++;
         }
         n=0;
        }
}
}

void DIG_display()                           //显示子程序
{
unsigned char i,j;
// while(1)                                                //为什么这里不用while???
// {
for(i=0;i<8;i++)
{
  switch(i)
  {
   case 0:LSA=0;LSB=0;LSC=0;break;
   case 1:LSA=1;LSB=0;LSC=0;break;
   case 2:LSA=0;LSB=1;LSC=0;break;
   case 3:LSA=1;LSB=1;LSC=0;break;
   case 4:LSA=0;LSB=0;LSC=1;break;
   case 5:LSA=1;LSB=0;LSC=1;break;
   case 6:LSA=0;LSB=1;LSC=1;break;
   case 7:LSA=1;LSB=1;LSC=1;break;
//   default: i=17;break;
  }
  GPIO_DIG=DIG_DATA;
  j=100;
  while(j--);
  GPIO_DIG=0x00;
}
}
//}


void main()
{
keystate=0;
while(1)
{
  keydown();
  if(keystate==1)                                  //左移
  {
   DIG_DATA[7]=DIG_DATA[6];
   DIG_DATA[6]=DIG_DATA[5];
   DIG_DATA[5]=DIG_DATA[4];
   DIG_DATA[4]=DIG_DATA[3];
   DIG_DATA[3]=DIG_DATA[2];
   DIG_DATA[2]=DIG_DATA[1];
   DIG_DATA[1]=DIG_DATA[0];
   DIG_DATA[0]=DIG_NUM[keyvalue];
   keystate=0;
  }
  DIG_display();
}

}

两个程序,程序1是8个数码管从低位到高位,依次显示0到7;程序2是显示按键的值,并且之前按下的值会左移。
问题是程序1显示的程序需要加while才能显示正常,而程序2里面显示子程序不能加while,否则不显示,有大神能解释一下疑惑么?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
JCARSON
1楼-- · 2019-07-15 15:49
人中狼 发表于 2018-6-20 15:53
其实这两个程序是一样的,只不过第二个程序是把显示部分做成了子程序,主体main里的while(1)还是都一样的。这只是你还没理解动态显示的原理。
如果把显示部分放在定时器里,那你是不是就更迷糊了

如果你是来数落新手的,就不要来了。
JCARSON
2楼-- · 2019-07-15 20:49
zf88995 发表于 2018-6-20 14:02
同样很想知道这个问题该如何解决

我百度了下,程序1的while(1)这个死循环是为了保证程序的正常运行,虽然没有这个死循环,该程序还是会重复运行,但是会因编译器不同而有差异,具体你可以百度一下。
程序2,主程序里面有while(1),也是同样的道理,显示子程序里面不能有这个死循环,不然你还没按键,程序就跑到显示子程序里面的while(1)死循环里面出不来了,不管你按不按键,它不会运行到键盘识别子程序的。
liujinyi016
3楼-- · 2019-07-16 02:07
 精彩回答 2  元偷偷看……

一周热门 更多>