静态数码管显示
数码管有两种一种的负电压促发,一种是正电压促发,上图是单数码管的引脚
上图是数码管模组的引脚,采用了引脚复用技术
咱们这个单片机由8个单数码管,所以要用上38译码器,如下图
74138使能端,单片机上电直接就默认接通了
74HC245的作用是稳定输入输出,数据缓冲作用,DIR表示方向默认给了正电压,就是左边流向右边,后面是电阻,COM表示线路公共
静态代码如下
#include <REGX52.H>
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //亮数字几
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()
{
Nixie(6,3);
while(1)
{
}
}
0X3F = 0011 1111b,从dp,g,f,e,d,c,b,a
动态数码管显示
有较强重影,主要是因为选模块和选数码管的代码不同步,然后数据就会串
所以需要delay函数来延迟
#include <REGX52.H>
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
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);
P0=0x00; //每次选完模块,就把模块里面的数码管清零
}
void main()
{
while(1)
{
Nixie(1,1);
Nixie(2,2);
Nixie(3,3);
}
}