这里以四位共阴极数码管为例
原理:
四位共阴极数码管就是把四个一位共阴数码管的阳极并联,阴极作为开关控制哪一个数码管亮灭。
想要让他们全部亮起来就需要用到一个原理:余晖效应(视觉暂留效应)
简单来说就是让四个数码管依次亮起,只要他闪的够快,在我们人眼看来他就是一起亮的。
这里还需要注意一点,如果第一个数码管在亮完后没有复位,继续显示第二个数码管,那么就会导致第一个数码管有残影,出现乱码的感觉
原理图如下:
代码实现
//数码管动态显示关键在于延时和消影
//采用低延时可以利用视觉暂留效应做到多位数码管显示
//同时低延时会导致数码管显示窜位
//所以需要在显示完数字之后将其归零,避免重影、窜位
#include <REGX52.H>
#include <REGX52.H>
#define uint unsigned int
#define uchar unsigned char
//利用数组Arraynum[]存放0~9
uchar Arraynum[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//延时函数
void delay(uint t)
{
uint x,y;
for(x=0;x<t;x++)
{
for(y=110;y>0;y--);
}
}
//封装Nixie
//函数参数一:第一到四个数码管(1-4)
//函数参数二:显示数字0-9
//将译码器数码管位控制使用switch函数进行简化,同时加上Number参数
//利用Arraynum[]显示数字0~9
//注意:有使用编码器才需要该函数,单片机直连不需要
void Nixie(uchar Location,Number)
{
switch(Location)//利用switch循环标号选择数码管位数
{
//P3口负责控制位选
case 1:P3_3=1;P3_2=1;P3_1=1;P3_0=0;break;
case 2:P3_3=1;P3_2=1;P3_1=0;P3_0=1;break;
case 3:P3_3=1;P3_2=0;P3_1=1;P3_0=1;break;
case 4:P3_3=0;P3_2=1;P3_1=1;P3_0=1;break;
default:break;
}
//P2口控制段码,显示0-9
P2=Arraynum[Number];
delay(1);//延时
P2=0x00;//消影,将数码管清零,避免串位
}
void main()
{
while(1)
{
while(1)
{
//调用函数显示
Nixie(1,6);
Nixie(2,6);
Nixie(3,6);
Nixie(4,7);
}
}
}