单片机零基础入门(8

您所在的位置:网站首页 8098单片机在kell中的位置 单片机零基础入门(8

单片机零基础入门(8

2024-07-02 12:35| 来源: 网络整理| 查看: 265

单片机零基础入门(8-3)实战:在数码管任意位置显示一个数字----单片机动态数码管实战 一、上节回顾:1、回顾:2、技术手段: 二、需求描述及分析:1、需求:2、分析: 三、原理图:四、代码实现步骤:1、步骤:2、数码管位置的代码实现:3、数码管段码表:4、数码管段码用数组实现:5、实现:源代码(全部)

一、上节回顾: 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 /* 在数码管任意指定显示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,仅仅起到点亮作用。

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3