当前位置: 代码迷 >> 单片机 >> 帮忙看一下一个动态扫描数码管的程序(关于单片机延时的有关问题)
  详细解决方案

帮忙看一下一个动态扫描数码管的程序(关于单片机延时的有关问题)

热度:139   发布时间:2016-04-28 16:22:40.0
帮忙看一下一个动态扫描数码管的程序(关于单片机延时的问题)
在51单片机中,为什么要延时,什么时候要延时,延时多长时间?

我的程序是这样写的,我给出一个四位十进制数,我想用动态扫描数据管的方法显示出这个四位数(硬件电路中有四个数码管,单片机为at89c51)

program:


/*--------------------------------------------------
@pro:led.c
@author:aniu
@brief: 简单的LED测试
--------------------------------------------------*/

//编译预处理指令
#include   <AT89X51.H>  

#define   LEDDATA   P0     //p0口接数码管的7段
#define   LED0   P1_0     //p1.0--p1.3接数码管的选通
#define   LED1   P1_1
#define   LED2   P1_2
#define   LED3   P1_3

//全局变量声明
unsigned   int   displayNum   =   1441;


//定义缓冲区
unsigned   char   buffer[4];

//函数声明
void   ledDecoder(int   inputNum); //字形编码
void   enaControl(int   enaIn); //选通控制
void   ledDisplay(int   numInput); //显示


//主函数 
void   main(void)
{
while(1){ledDisplay(displayNum);}
}

void   ledDecoder(int   inputNum)
{
switch(inputNum)
{
case   0:
LEDDATA   =   0x3f;
break;
case   1:
LEDDATA   =   0x06;
break;
case   2:
LEDDATA   =   0x5b;
break;
case   3:
LEDDATA   =   0x4f;
break;
case   4:
LEDDATA   =   0x66;
break;
case   5:
LEDDATA   =   0x6d;
break;
case   6:
LEDDATA   =   0x7d;
break;
case   7:
LEDDATA   =   0x07;
break;
case   8:
LEDDATA   =   0x7f;
break;
case   9:
LEDDATA   =   0x6f;
break;



}

return;


}


void   enaControl(int   enaIn)
{
switch(enaIn)
{
case   0:
LED0   =   0;
LED1   =   1;
LED2   =   1;
LED3   =   1;
break;

case   1:
LED0   =   1;
LED1   =   0;
LED2   =   1;
LED3   =   1;
break;

case   2:
LED0   =   1;
LED1   =   1;
LED2   =   0;
LED3   =   1;
break;

case   3:
LED0   =   1;
LED1   =   1;
LED2   =   1;
LED3   =   0;
break;
}
}

void   ledDisplay(int   numInput)
{

int   i;
int   a;
buffer[0]   =   numInput/1000;
buffer[1]=(numInput/100)   %10;
buffer[2]=(numInput/10)%10;
buffer[3]=numInput%10;
  for(a=0;a <5000;a++);


for(i   =0;i <4;i++)
{
  //这里要延时吗?延时多少
enaControl(i);

ledDecoder(buffer[i]);
    for(a=0;a <50000;a++);
if(i==3)   i=0;



}


}



------解决方案--------------------
单片机送显速度太快,动态显示的停留时间来不及看清,所以要延时。
在送完字模和选通后延时。
视觉暂留时间约20ms。依此计算延时时间。
显示的方式有所问题,最好要改进下 :)
------解决方案--------------------
代码也不够好啊!
void ledDecoder(int inputNum) 函数可以用一个数组代替
如果有定时器资源的话,使用定时器来显示更好些!
  相关解决方案