MCU-51:静态数码管显示

一、数码管介绍

2.1 介绍

LED数码管:数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成“8”字型的器件
在这里插入图片描述

2.2 数码管引脚定义

单个引脚:
数码管分为共阳极连接和共阴极连接两种:
1,共阴极连接就是说3,8这一头连得是负极,所以在下面的那头给上高电平(即置1)就可以使二极管发光
2,共阳极连接就是说3,8这一头连得是正极,所以在下面的那头给上低电平(即置0)就可以使二极管发光
注意:在实际编写代码的时候这一点一定要搞清楚,或者进行实验后发现亮光的二极管的位置和预想的不对,那么对赋值的I/O口使用取反符号~也行
在这里插入图片描述
在这里插入图片描述
多个引脚管:
在这里插入图片描述

2.3 原理图

在这里插入图片描述

二、要用到的C语言知识

2.1 数组

把相同类型的一系列数据统一编制到某一个组别中,可以通过数组名+索引号简单快捷的操作大量数据

int x[3];			//定义一组变量(3个)
int x[]={1,2,3};	//定义一组变量并初始化
x[0] 		//引用数组的第0个变量
x[1] 		//引用数组的第1个变量
x[2]			//引用数组的第2个变量

2.2 子函数

将完成某一种功能的程序代码单独抽取出来形成一个模块,在其它函数中可随时调用此模块,以达到代码的复用和优化程序结构的目的

void Function(unsigned char x, y)
{
	
}

返回值 函数名(形参)
{
	函数体
}

三、数码管显示

3.1 单个数码管显示

第三个数码管显示6:
结合原理图可以看到要使得第三位显示为6
LED6对应Y5,Y5对应的二进制为101,要让低电平Y5通电
对应由高位到低位得

#include <REGX52.H>
void main()
{
	P2_4=1;
	P2_3=0;
	P2_2=1;
	P0=0x7D;
	while(1)
	{
	}
}

3.2 通过定位函数实现数码管显示

#include <REGX52.H>
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
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];
}
void main()
{
	Nixie(2,3);
	while(1)
	{
	}
}

四、动态数码管显示

学会设计静态数码管的显示后,我们可以在各个静态数码管显示之间加入延时函数,这样就能实现动态数码管的显示。根据以前的内容,我们先写一个简单的代码,来看看效果。

#include <REGX52.H>
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
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];
}
void delay(int i)
{
	while(i--);
}
void main()
{
	
	void delay(int i);
	while(1)
	{
		Nixie(1,2);
		delay(10000);
		Nixie(2,0);
		delay(10000);
		Nixie(3,2);
		delay(10000);
		Nixie(4,2);
		delay(10000);
		Nixie(5,1);
		delay(10000);
		Nixie(6,2);
		delay(10000);
		Nixie(7,2);
		delay(10000);
		Nixie(8,3);
		delay(10000);
		
	}
}

通过以上代码,我们虽然看到了数码管动态显示,但是大家也可以看到数码管有残影现象
我们先来解释一下残影出现的原因。
多个数码管显示时中间如果没有延时,那么单片机执行的操作应该是 位选->段选->位选->段选->位选…… 而单片机执行速度非常快,上一次的段选还没有结束,位选的数据已经传了进去,这样下一个数码管就有可能显示出上一个数码管的数字。
这些内容在数电中被称为“竞争与冒险”
解决这样的问题,我们需要在段选结束之后对数码管清零,在Nixie函数后加上延时和清零的语句即可。清零就是防止段选还没结束,位选的数据就传到了下一个数码管。延时是防止数码管还没显示完就被清零,导致显示的非常暗。

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];
	delay(1);
	P0=0x00;
}

烧录进去 你会发现残影就没了

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Hello xiǎo lěi

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

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

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

打赏作者

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

抵扣说明:

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

余额充值