51单片机入门之五:数码管显示(动态)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhenxing2000/article/details/50726140

本文旨在介绍单片机入门的基础知识,为初接触或即将接触单片的新手提供一个入门指导。本文章会陆续推出,隔几天一个章节。所使用单片机为ATMEL公司的AT89C52,软件为PROTEUS和KEIL;只提供原理图和KEIL环境下的注释,希望对广大即将接触单片机的人有所帮助,如果有错误欢迎回帖指出或加入QQ143586739. 微信公众号:micropoint8.

单片机轻松入门之五数码管的动态显示

上次说了数码管的静态显示,这次介绍动态显示。动态显示是每隔一段很小的时间依次点亮一个数码管,再利用人视觉的暂留效应,从而看起来数码管显示是连续的。相对而言,动态显示的电路、程序稍微复杂,但是可以节约单片机的接口资源。动态显示涉及位选和段选。位选就是选通显示的数码管,段选就是控制该片数码管所要显示的内容。

本次实验让4片数码管显示“1234”,实验中用到了74LS373锁存器。

实验原理图如下:


实验程序如下:

#include<reg52.h>
#define uchar unsigned char;
#define uint unsigned int;
sbit du=P2^0; //位定义段选端
sbit we=P2^1; //位定义位选端


uchar code tabledu[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71}; //段选数据表

uchar code tablewe[]={0xfe,0xfd,0xfb,0xf7}; //位选数据表

uchar i,j,z;
uint numd,numw;

void delay(z)   //延时子函数
{

   for(j=z;j>0;j--)
      for(i=110;i>0;i--);
}
void display() //显示子程序
{
     P0=tabledu[numd]; //控制段显示
    delay(10);
    du=1; //打开段选信号
    du=0; //锁存信号
    P0=tablewe[numw]; //控制位选
    delay(10);
    we=1; //打开位选信号
    we=0; //锁存信号
    numd++; //段选自加
    if(numd==5)
    numd=1;
    numw++; //位选自加
    if(numw==4)
    numw=0;
}

void main()
{
      numd=1;
   numw=0;
   while(1)
   {
    
    display(); //调用显示子程序
    delay(30);

   }

}

试验结果图:

仿真软件在截图时,老显示不全,所以图片上无法看出连续显示。但是在实验板上效果很好。


更多电子知识请关注微信公众号:


猜你喜欢

转载自blog.csdn.net/zhenxing2000/article/details/50726140