MCU-51:静态数码管显示-创新互联

目录
  • 一、数码管介绍
    • 2.1 介绍
    • 2.2 数码管引脚定义
    • 2.3 原理图
  • 二、要用到的C语言知识
    • 2.1 数组
    • 2.2 子函数
  • 三、数码管显示
    • 3.1 单个数码管显示
    • 3.2 通过定位函数实现数码管显示
  • 四、动态数码管显示

成都创新互联公司服务项目包括大连网站建设、大连网站制作、大连网页制作以及大连网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,大连网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到大连省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!一、数码管介绍 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通电
对应由高位到低位得

#includevoid main()
{P2_4=1;
	P2_3=0;
	P2_2=1;
	P0=0x7D;
	while(1)
	{}
}
3.2 通过定位函数实现数码管显示
#includeunsigned 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)
	{}
}
四、动态数码管显示

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

#includeunsigned 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;
}

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

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


本文标题:MCU-51:静态数码管显示-创新互联
当前URL:http://scyanting.com/article/cegogj.html