目录
原理图
段选部分
位选部分
显示原理
先位选,再段选
先对P2^2,P2^3,P2^4赋值,进行位选,选择显示的数码管位置
//二进制101对应的是十进制5,在原理图图上Y0对应的是LED1
//所以101说明Y5有效,选择的是第6个数码管,允许LED6显示,而其他位不允许显示
P2^2 = 1
P2^3 = 0
P2^4 = 1
普中51开发版数码管使用的是共阴极数码管,给数字1点亮,给数字0不亮
开发板上是逆序为1,也就是说LED8是我们说的第一个数码管(从左往右数)
显示数字
#include <REGX52.H>
unsigned char NixieTable[]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f,0x6f};
0 1 2 3 4 5 6 7 8 9
void Nixie(unsigned char Location, Number)
{
switch(Location)
{
case 1:P2_4 = 1; P2_3 = 1; P2_2 = 1;break; //位码
case 2:P2_4 = 1; P2_3 = 1; P2_2 = 0;break;
case 3:P2_4 = 1; P2_3 = 0; P2_2 = 1;break;
case 4:P2_4 = 1; P2_3 = 0; P2_2 = 0;break;
case 5:P2_4 = 0; P2_3 = 1; P2_2 = 1;break;
case 6:P2_4 = 0; P2_3 = 1; P2_2 = 0;break;
case 7:P2_4 = 0; P2_3 = 0; P2_2 = 1;break;
case 8:P2_4 = 0; P2_3 = 0; P2_2 = 0;break;
}
P0 = NixieTable[Number]; //段码
}
void main()
{
// P2_2 = 1; //二进制101 十进制5 对应LED6
// P2_3 = 0;
// P2_4 = 1; //位选,选中LED6
// P0 = 0x7d; //段选
Nixie(7,2);
while(1);
}
显示不同位置上的不同数字
那么在这里解释下数码管的消影就是比方说:
当我们要显示数码管的时候首先要:位选 段选、还要显示的话就还要 位选、段选,循环。
那么这样就会出现问题:首先是选择"位选端"给上低电平,然后是段选给上数据,然后给上下一位位选的数据。但是:由于我们单片机的速度是很快的,在段选到下一个位选之间就会出现问题。我们选中下一位这个时刻很短的时间内,上一个数据就会串到下一个数据。因为它们是挨着一起的,我在选中下一位之后 上一位的数据自然是会直接过来的。这样就会显示出数据的串位的问题了!
那么我们应该怎么避免这个问题?那我们就需要在上一个段选端给清零这样即使到下一位它也不会对上一位产生影响!因为以及清零了。所以在子函数上需要优化下,显示玩之后我们首先要延迟1ms这个是为了能让程序更加稳定显示 并且 进行清零!
#include <REGX52.H>
unsigned char NixieTable[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x6f};
void Delay(unsigned char ms) //@12.000MHz
{
unsigned char i, j;
while(ms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
ms--;
}
}
void Nixie(unsigned char Location, Number)
{
switch(Location)
{
case 1:P2_4 = 1; P2_3 = 1; P2_2 = 1;break; //位码
case 2:P2_4 = 1; P2_3 = 1; P2_2 = 0;break;
case 3:P2_4 = 1; P2_3 = 0; P2_2 = 1;break;
case 4:P2_4 = 1; P2_3 = 0; P2_2 = 0;break;
case 5:P2_4 = 0; P2_3 = 1; P2_2 = 1;break;
case 6:P2_4 = 0; P2_3 = 1; P2_2 = 0;break;
case 7:P2_4 = 0; P2_3 = 0; P2_2 = 1;break;
case 8:P2_4 = 0; P2_3 = 0; P2_2 = 0;break;
}
P0 = NixieTable[Number]; //段码
Delay(1); //软件消隐
P2 = 0x00; //清零
}
void main()
{
while(1)
{
Nixie(1,1);
Nixie(2,2);
Nixie(3,3);
}
}