1.原理图
74HC245是用来增大高电平的驱动能力;74HC138是一个38译码器。
2.如何显示数字
写代码前定要先判断数码管是共阴极还是共阳极(用万用表蜂鸣档测,万用表的正负极连接正确后数码管的一段会亮)
我的是共阴极,片选段连在一起,由38译码器输出的八个低电平引脚,拉低来进行片选
因此数码管显示数字 0 1 2 3 4 5 6 7 8 9 a b c d e f 对应
0x3f 0x06 0x5b 0x4f 0x66 0x6d 0x7d 0x07 0x7f 0x6f 0x77 0x7c 0x39 0x5e 0x79 0x71
3.代码
#include <REGX52.H>
#include <INTRINS.H>
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//数码管显示数字0~9对应的段选 就是p0的八个管脚
void Delayms(int ms){ //@11.0592MHz
while(ms--){
unsigned char i, j;
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
//……段选清零 片选 段选……
void Nixie(unsigned char Chip,Number)
{
P0=0x00; //段码清0,消影
switch(Chip) //位码输出
{
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]; //段码输出
Delayms(1);//稳定显示
}
void main()
{
while(1)
{
Nixie(1,1); //在数码管的第1位置显示1
Nixie(2,2); //在数码管的第2位置显示2
Nixie(3,3); //在数码管的第3位置显示3
}
}
注意:
1.第21行不可以去掉,虽然去掉显示效果没任何区别。
…… 片选 段选 片选 段选……如果不清除的话,前一次段选的数字会出现在第二次片选上,残影会随着延时时间加长而会不明显。但延时时间过长的话就是动态显示了。(可以通过修改34行,Delayms(1);为若干个_nop_();指令,从而延时不同时间进行试验)。
2.第34行去掉值显示正常,但是显示亮度会偏低。原理应该类似pwm波,四个数码管快速切换着亮肯定没有只亮一个数码管亮,因为四个切换亮,通电时常占总时长的1/4。因此要延迟一段时间保持一段时间亮度,再切换。
3.编程时变量用之前,注意提前清理