数码管动态显示是我们做单片机项目中经常用到的一种显示方式,下面我根据我个人对数码管动态显示的理解给大家做分享。
一、电路原理图
图中数码管采用共阴极数码管,这里因为弥补单片机的IO口驱动能力的不足,电路中采用74LS04是作为驱动器使用,用于提高单片机的驱动能力。原理为当1A~6A接收到IO口的高电平时,1Y~6Y对应会输出低电平,从而驱动对应的数码管使能。
二、相关知识
1、数码管动态显示工作原理
数码管动态显示的原理主要基于两个视觉现象:视觉暂留和余晖效应。视觉暂留是指人眼在观察景物时,光信号传入大脑神经需要一段时间,光的作用结束后,视觉影像并不立即消失,这种残留的视觉称为“后像”,视觉的这一现象则被称为“视觉暂留”。余晖效应是指当停止向发光二极管供电时,发光二极管亮度仍能维持一段时间。
动态显示方式是指无论在任何时刻只有一个LED数码管处于显示状态,即单片机采用“扫描”方式控制各个数码管轮流显示。在动态显示驱动中,所有数码管的8个显示笔划的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制。当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示。
在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感。
简而言之数码管动态显示的工作原理就是,快速地在每个数码管上显示不同地数,由于扫描速度快看起来就是同时显示不同地数值。
由此我们可以借用流水灯程序和数码管静态显示程序修改得到动态显示程序。
2、流水灯程序
j=0x01;
for(i=0;i<8;i++) //for循环8次
{
P1=~j; //P1等于j位取反
j=j<<1; //j左移1位
delay_ms(1000); //等待1秒
}
3、静态显示程序
P0=table_K[i];
三、例程
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar table_K[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴段码表
uchar display_num[]={0,1,2,3,4,5};//显示缓存区
/*--------微秒延时--------*/
void delay_us(uint z)
{
uint x;
for(x=z;x>0;x--);
}
/*--------毫秒延时--------*/
void delay_ms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*----------主函数-----------*/
void main()
{
uchar i,j; //创建变量
P0=0x00;P1=0xff;P2=0x00;P3=0x00; //端口状态初始化
while(1)
{
j=0x01; //设定j地的初始值
for(i=0;i<6;i++) //循环6次
{
P0=table_K[display_num[i]];//P0口送段码
P2=j; //把j的值给P2口
j=j<<1; //j左移1位
delay_ms(2); //延时2ms
}
}
}
四、视频讲解
项目4、数码管动态显示
B站链接:https://www.bilibili.com/video/BV18J4m1s7Kz/?vd_source=963ae9aae236be73cd4b5b480953fe48