51单片机多位数码管动态显示方法
1.数码管显示原理
相比学习单片机的同学一定对显示器,屏幕如OLED,LCD并不陌生,而在这些显示器之前呢,最常见的就是数码管了,其实它就是由多个LED灯组合而成,没有什么神秘,如图所见a,b,c,d,e,f,g,dp和公共端COM,排列成8字。例如当我们需要显示数字 “1” 时,只点亮b和c即可,其他数字或符号同理。
一般分为共阳极和共阴极,如下图。
2.多位数码管动态显示
由于在实际使用中,我们发现想要显示的数字可能不止一个,且一位数码管显示就需要占用单片机端口I/O资源8个(不显示小数点 7个)要同时显示多位数字就要占用非常多的I/O资源,所以就有人想出了一种办法,那就是动态显示。也就是利用余辉效应 以很快的速度挨个显示每一位数字来欺骗人眼,看上去就像静态一样。前面我们知道了一位数码管的基本显示原理,那么多位也就不难了。下图为6位八段数码管,其6个公共端 在这里被称为位选端,其他八位(图中只用到7位,没小数点)共用一组I/O端口。当共用端有数据时,那一个位选接通则那个数码管显示对应数字。
3.示例程序
知道原理,那么代码是非常简单的了,这里举个小例子,。
这里采用模块化编程思想,将其和主函数分开写,以提高代码可读性,主程和延时不再赘述,文末会提供资料,限于积分不能下载的 可向我要。直接在主程序中调用函数即可,
#include "delay.h"
void delay_ms(uint i)
{
uint j;
while(i--)
for(j=120;j>0;j--);
}
/* 这里给出两中 参考码,方便取用
unsigned char shu1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //没有dp小数点
//数字0-9的共阴极码表 0 - 9 -(下标10)
unsigned char shu0[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
//数字0-9的共阳极码表 0 - 9 -(下标10)
*/
uchar Code[10]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//显示段码 数码管字型 共阳极0-9
uchar wei[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
//6个 位选端
/************************************************
* 函数名: void Led_Code(Lint date)
* 功 能: 数码管显示函数
* 参 数: 无符号长整型,要显示的数字
* 返回值: 无
***********************************************/
void Led_Code(Lint date) //显示函数
{
uint a,b,c,d,e,f;
a=date/1000/100; //十万位
b=date%100000/10000; //求万位
c=date%10000/1000; //求千位
d=date%1000/100; //求百位
e=date%100/10; //求十位
f=date%10; //求个位
//计算好后,逐个显示 依次循环,如果对性能有要求可在初始化时计算,此处不再重复计算
P2=0XFF; //清除上次显示
P1=Code[a]; //十万位
P2=wei[0];
delay_ms(5);
P2=0XFF;
P1=Code[b];//万 位
P2=wei[1];
delay_ms(5);
P2=0XFF;
P1=Code[c];//千
P2=wei[2];
delay_ms(5);
P2=0XFF;
P1=Code[d];//百
P2=wei[3];
delay_ms(5);
P2=0XFF;
P1=Code[e];//十
P2=wei[4];
delay_ms(5);
P2=0XFF;
P1=Code[f];//个
P2=wei[5];
delay_ms(5);
}
3.结语
STC51 数码管动态显示 包含proteus仿真源文件。源码文件仅供学习,如有错误还望指正。