【51单片机】数码管显示(样例展示以及异常分析)

🎊专栏【51单片机

🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。

🎆音乐分享【如愿

大一同学小吉,欢迎并且感谢大家指出我的问题🥰

⭐数码管

比如要显示“6”,那么下面图片中,AFEDCG=1,B=0

 af618363c54641149ad2137376c0247e.png

 对应到数码管上,就是

8a73deb0c0fd403fad5e55271d28c038.png

⭐原理 

 3e1bf859a54f4d8397ef3b0bf4b221db.png

🎊P22~P24控制LED1~LED8显示

P24 为高位   P23为中位  P22为低位

例如:P24 P23 P22

输入: 1      1      1   二进制转十进制为:7,表示Y7显示,Y7与LED8连通(就是第8个数码管)

即LED1  LED2 LED3 LED4 LED5 LED6 LED7 LED8对应的电平为

     1          1        1       1      1         1         1         0

可以理解为:P24~P22输入3位二进制数可表示LED1~LED8的显示

🍔正确现象 

3f187830ea314efa857f2843139a1879.jpeg

 🍔代码

#include <REGX52.H>
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};
//  0     1   2    3     4    5   6     7    8    9   A    B     C    D    E    F    空
void Delay(unsigned int xms)		
{
	unsigned char i, j;
	while (xms--)
	{
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
 
	}
}

void Nixie(unsigned char Location,unsigned int 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);
//	Delay(20);
		Nixie(2,2);
//	Delay(20);
		Nixie(3,3);
//	Delay(20);
	}
	
}

🍔错误现象——会发生频闪

静态数码管频闪

🍔代码

#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)		//@11.0592MHz   //延时函数
{
	unsigned char i, j;
	while (xms--)
	{
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
 
	}
}

void Nixie(unsigned char Location,unsigned int 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);
		Delay(20);
		Nixie(2,2);
		Delay(20);
		Nixie(3,3);
		Delay(20);
	}
	
}

9027159b8d6a48a9a3e099b79c018172.png

 加上延迟时间,会频闪 

因为设置的是数码管亮一下后就清零(P0=0x00),在Delay(20)之间,还没有完全清零就进入下一个了,所以会频闪

🥰如果大家有不明白的地方,或者文章有问题,欢迎大家在评论区讨论,指正🥰

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在下小吉.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值