·选择公共端给电平 位选端逐一点亮
·选择共阳共阴(箭头对阴极,一般51为共阴)
·在同个时刻 只能点亮一个数码管 即使有多个被点亮,也只能是同一个数字。如果要显示多个不同的数字,则需要动态显示数字管 根据人眼跳动时间
·1.公共端: 三位输入 八位输出 节省单片机L口
GN是使能端 表示能正常工作
CBA从高到低 从二进制到十进制转换为输出
C |
B |
A |
Y |
0 |
0 |
0 |
Y0-(01111111) |
1 |
0 |
0 |
Y4-(11110111) |
0 |
1 |
1 |
Y3-(11101111) |
此时注意译码器输出低电平
2.位选端:用于提高驱动能力 P根据芯片的电源,口变成了控制信号而不是驱动器
LE是高电平 将左侧数据发送到右侧 否则,读取右边的数据
高电平驱动能力弱 低电平能力更强
·滤波电容 104=10 0000pf稳定电源 确保电路稳定
·限流电阻
总结:首先确定数字管灯的第一位Y0-,然后通过译码器确定输入CBA电平,然后选择位选端呈现数字(数据高到端口高 由于数码管位选端g是高位 故对P0_7)
优化程序可以通过数组或选择循环来实现方便的控制
·位选 段选 位选 段选 位选 段选(串位)-位选 段选 清零 位选 段选 位选 段选
优化程序 需要延迟 否则数码管会比较暗
·数字管驱动方式:直接扫描单片机(成本)CPU时间) 专用驱动芯片(TM1640)
#include <REGX52.H> unsigned char NixieTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; void Delay(unsigned int xms) //@12.000MHz { unsigned char i, j; while(xms--) { i = 2; j = 239; do { while (--j); }while (--i);
}
}
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];//调用子程序,如果数字是0,刚好是第0个变量
Delay(1);//延迟1ms再清零,否则数码管会变暗
P0=0x00;//进行清零
}
void main()
{
while(1)
{
Nixie(1,1);
// Delay(20);
Nixie(2,2);
// Delay(20);
Nixie(3,3);//不断扫描 是个循环过程
// Delay(20);延时200ms的时候会快速闪动,延迟20ms的时候慢速闪动导致会串位现象很明显,因此需要进行消影
}
}