1.静态数码管显示(单个数码管和四位一体数码管)
·公共端选中给电平 位选端逐个点亮
·根据共阳共阴(箭头对的是阴极,一般51都是共阴)选择
·在同个时刻 只有一个数码管可以被点亮 即使有多个被点亮也只能是一样的数字,若想显示多个不同数字则需要动态显示数码管 根据人眼跳动时间
·1.公共端:译码器LS138 三位输入 八位输出 节约单片机的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)
可通过数组或者选择循环来优化程序,达到便利控制
2.动态数码管:需要消影
·位选 段选 位选 段选 位选 段选(串位)------位选 段选 清零 位选 段选 位选 段选
优化程序 需要延迟 否则数码管会比较暗
·数码管驱动方式:单片机直接扫描(耗费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的时候慢速闪动导致会串位现象很明显,因此需要进行消影
}
}