单片机零基础入门(8-3)实战:在数码管任意位置显示数字----单片机动态数码管实战---附源代码

一、上节回顾:

1、回顾:

上篇文章写到:单片机零基础入门(8-2)实战:在数码管中实现显示一个数字–在数码管指定位置显示一个数字----单片机数码管实战。实现了在数码管指定的位置显示一个数字,方法是通过找到数码管的位置,点亮数码管的笔段来显示一个数字。


2、技术手段:

这篇文章,将通过函数封装,来实现数码管任意位置显示任意数字。
子函数作用:代码复用、优化程序的结构。



二、需求描述及分析:

1、需求:

通过函数封装,来实现数码管任意位置显示任意数字。为了方便代码维护,后期仅需修改少量代码既可实现需求。


2、分析:

实际此需求就是,只需要后续程序员修改一行代码既可实现数码管上数字变化。比如:原来是第3个位置显示6,我只需要修改一行代码,直接指定第4个位置显示7既可。

这篇文章我需要用到的几个知识点,分别是:数码管段码表、延时函数、子函数封装、138译码器、双向数据缓冲器等等一系列知识,都在单片机零基础入门(8-1)数码管知识大全里面讲解的非常清楚,如果忘记了,可以回头看一看。




三、原理图:

单片机原理图(数码管相关部分):
在这里插入图片描述
上图中,LED8为第一个数码管、LED7为第二个数码管…LED1为第8个数码管(最后一个)。

找到LED8、LED7、LED6…LED1分别在138译码器中的位置在哪里,然后对其赋值既可。
例如:LED8在译码器中为Y7,LED7为Y6…LED1为Y0。分别对A、B、C赋值二进制即为Yx。A、B、C都为1时,即为Y7。A、B、C皆为0时,即为Y0。

注意:这里的A、B、C中,C为高位,A为低位。



四、代码实现步骤:

1、步骤:

首先需要给8个数码管对应的138译码器进行赋值,把Y0~Y7的 A、B、C所有赋值。因为可能性较多,所以我们要用到C语言中的分支语句。
C语言中的分支语句有两种:if语句和switch语句
(1)switch…case()
(2)if()…else
以上两种方法就不详细解释了,不太清楚的,可以去找度娘和谷哥单独搜这两种语句的方法进行学习。
这里我选择了switch语句,通过case来找到对应数码管的位置,故138译码器中赋值的代码如下:


2、数码管位置的代码实现:

/*对数码管的位置进行赋值*/
switch(location)
	{
			//第1个数码管
		case 1: 
			P2_1=1;
			P2_2=1;
			P2_3=1;
		break;
			//第2个数码管
		case 2:
			P2_1=0;
			P2_2=1;
			P2_3=1;
		break;
			//第3个数码管
		case 3:
			P2_1=1;
			P2_2=0;
			P2_3=1;
		break;
		
		case 4:
			P2_1=0;
			P2_2=0;
			P2_3=1;
		break;
		
		case 5:
			P2_1=1;
			P2_2=1;
			P2_3=0;
		break;
		
		case 6:
			P2_1=0;
			P2_2=1;
			P2_3=0;
		break;
		
		case 7:
			P2_1=1;
			P2_2=0;
			P2_3=0;
		break;
		
		case 8:
			P2_1=0;
			P2_2=0;
			P2_3=0;
		break;
	}

注:以上代码对数码管的位置进行了指定,还需要对数码管的段码进行定义。

上篇文章中有写到数码管的段码表,这里我就复制过来既可。


3、数码管段码表:

在这里插入图片描述
定义一个数组,把数码管段码表里面的内容包含到里面既可。


4、数码管段码用数组实现:

这里我定义了一个全局变量。

unsigned int Nixie_tube_number[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};

这里的数组中的数字,根据实际情况进行选择,因为我是共阴极数码管,所以我填充的是第一个。


5、实现:源代码(全部)

结合上面分析的代码,把所有逐个分析的代码整合到一起,即是一个完整的项目,本节在数码管任意位置显示数字到此已经实现了。
源代码整合:

#include <REGX52.H>

/*
	在数码管任意指定显示9
*/

/*数码管段码数组赋值*/
unsigned int Nixie_tube_number[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};


/*指定数码管位置,Y0~Y7的赋值*/
int Nixie_tube(int location,unsigned int number)
{
	switch(location)
	{
			//第1个数码管
		case 1: 
			P2_2=1;
			P2_3=1;
			P2_4=1;
			break;
		
			//第2个数码管
		case 2:
			P2_2=0;
			P2_3=1;
			P2_4=1;
			break;
			//第3个数码管
		case 3:
			P2_2=1;
			P2_3=0;
			P2_4=1;
			break;
		
		case 4:
			P2_2=0;
			P2_3=0;
			P2_4=1;
		break;
		
		case 5:
			P2_2=1;
			P2_3=1;
			P2_4=0;
			break;
		
		case 6:
			P2_2=0;
			P2_3=1;
			P2_4=0;
			break;
		
		case 7:
			P2_2=1;
			P2_3=0;
			P2_4=0;
			break;
		
		case 8:
			P2_2=0;
			P2_3=0;
			P2_4=0;
			break;
	}
	
	P0=Nixie_tube_number[number];
	return 0;
}


int main()
{
	
	/*需要显示什么数字,仅需修改下行代码既可*/
	Nixie_tube(7,3);

	return 0;
}

这里特别注意一下, 代码中:Nixie_tube()函数需要给主函数返回值,retrun 0必须要!!不然就不显示数字了,全部显示出来都是8,仅仅起到点亮作用。


-----------------人生在勤,不索何获!-------------

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

胡先森ia

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

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

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

打赏作者

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

抵扣说明:

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

余额充值