数码管静态显示
第一步永远是分析电路图:
这个是38译码器,Y0-Y7分别对应下面的LED1-LED8叫做位选,即选择一个位置的灯亮(输出低电平)
下面那个245不用管,作用就是联通A与B,a-g是数码管的八个LED段,控制亮暗以显示对应数字。(高电平有效)
思路:P2-P4输入位选,P0,输入字符段选就行
#include <REGX52.H>
void main()
{
P2_2 = 0;P2_3 = 0;P2_4 = 0;//选择第一个数码管
P0 = 0x7D;//显示数字6,就是b为0,dp为0,其他都为1,P0_7-P0_0就是0111 1101,转换为十六进制就是7D
}
数码管动态显示
思路:利用人眼视觉看不出,在要显示的各个位置快速显示,就可以达到同时显示的结果,唯一注意的是消影。
这边先建立一个全局数组,把段选数字分别存进去,下标0显示0,1显示1,以此类推。
unsigned char NixieTable[]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
然后写一个函数,参数就是位置和要显示的数字
void Nixie(unsigned char Location,unsigned char Num)
{
P0 = 0x00;//消影
switch(Location)//选择显示位置
{
case 1:P2_4=0;P2_3=0;P2_2=0;break;
case 2:P2_4=0;P2_3=0;P2_2=1;break;
case 3:P2_4=0;P2_3=1;P2_2=0;break;
case 4:P2_4=0;P2_3=1;P2_2=1;break;
case 5:P2_4=1;P2_3=0;P2_2=0;break;
case 6:P2_4=1;P2_3=0;P2_2=1;break;
case 7:P2_4=1;P2_3=1;P2_2=0;break;
case 8:P2_4=1;P2_3=1;P2_2=1;break;
}
P0 = NixieTable[Num];//选择显示数字
Delay(1);
}
解释一下消影:为什么会有影子,在位选-段选-位选-段选过程中中间的数据可能会相互影响,下一个段选还没读进来,时显示的就是上一个的数据。所以我们在每一个显示后面,加一个延时1ms,让他显示完全,否则会很暗,再调用下一次时P0 = 0x00会消除段选数据不会有影子。
最终代码:
#include <REGX52.H>
unsigned char NixieTable[]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
void Delay(unsigned int xms) //@11.0592MHz,改进的Delay函数,根据输入参数能时相应时间ms
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
void Nixie(
unsigned char Location,unsigned char Num)
{
P0 = 0x00;//消影
switch(Location)//选择显示位置
{
case 1:P2_4=0;P2_3=0;P2_2=0;break;
case 2:P2_4=0;P2_3=0;P2_2=1;break;
case 3:P2_4=0;P2_3=1;P2_2=0;break;
case 4:P2_4=0;P2_3=1;P2_2=1;break;
case 5:P2_4=1;P2_3=0;P2_2=0;break;
case 6:P2_4=1;P2_3=0;P2_2=1;break;
case 7:P2_4=1;P2_3=1;P2_2=0;break;
case 8:P2_4=1;P2_3=1;P2_2=1;break;
}
P0 = NixieTable[Num];//选择显示数字
Delay(1);
}
void main()
{
while(1)
{
Nixie(1,1);
Nixie(2,2);
Nixie(3,3);
}
}