单片机零基础入门(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,仅仅起到点亮作用。
-----------------人生在勤,不索何获!-------------