×

51单片机学习纪实:4.1-控制动态数码管显示0-7_【基础实验1】

一哥 一哥 发表于2021-12-21 17:20:31 浏览1303 评论0

抢沙发发表评论

实验要求:

控制两组4位一体共阴动态数码管显示数字0-7


实验思路:

1、动态数码管段选接P0端口,宏定义P0端口为SMG_A_DP_PORT

#define SMG_A_DP_PORT    P0  //重定义P0端口

2、动态数码管位选通过一个74HC138译码器控制,仅需3个管脚即可控制两组4位一体动态数码管。因此对38译码器的数据输入端口A0,A1,A2进行定义。如下方原理图:A0=A;A1=B;A2=C,因此对A,B,C三个管脚进行定义即可。

sbit LSA=P1^0;
sbit LSB=P1^1;
sbit LSC=P1^2;

202112211641136920417.png

3、重定义系统数据类型

//重定义系统数据类型
typedef unsigned char U8;
typedef unsigned int U16;

4、定义一个数组变量gsmg_code[],用于定义0-7共阴数码管段码表

U8 gsmg_code[9]={
                0x3F, // 0
                0x06, // 1
                0x5B, // 2
                0x4F, // 3
                0x66, // 4
                0x6D, // 5
                0x7D, // 6
                0x07, // 7
                0x00, //消稳
                };

5、定义一个延时函数delay_10us,用于字符显示延时。

6、定义一个动态数码管显示函数smg_display。(模块化代码有利于后期移稙)


完整代码:

/*****************************程序信息*********************************
* 实验名称:控制动态数码管显示0-7
* 文件名称:main.c
* 版    本:V1.00
* 日    期:2021-12-21
* 编    著:gefon
* 说    明:使用普中A7开发版,控制两组4位一体动态数码管显示0-7数字

*******************************声明区*********************************/
#include "reg52.h"

#define SMG_A_DP_PORT    P0  //重定义P0端口

//定义74HC138数据输入管脚
sbit LSA=P1^0;
sbit LSB=P1^1;
sbit LSC=P1^2;

//重定义系统数据类型
typedef unsigned char U8;
typedef unsigned int U16;

//共阴数码管段码表
U8 gsmg_code[9]={
                0x3F, // 0
                0x06, // 1
                0x5B, // 2
                0x4F, // 3
                0x66, // 4
                0x6D, // 5
                0x7D, // 6
                0x07, // 7
                0x00, //消稳
                };

/*******************************子程序*********************************
* 函 数 名   :delay_10us
* 函数功能   :延时函数,当传入变量ten_us=1时,约延时10us
* 输    入   :ten_us
* 输    出   :无
***********************************************************************/
void delay_10us(U16 ten_us)
{
    while(ten_us--);
}

/*******************************子程序*********************************
* 函 数 名   :smg_display
* 函数功能   :动态数码管显示
* 输    入   :无
* 输    出   :无
***********************************************************************/
void smg_display()
{
    U8 i=0;
    for(i=0;i<8;i++)  //动态数码管位选控制
    {
        switch(i)
        {
            case 0:LSC=0;LSB=0;LSA=0;break;
            case 1:LSC=0;LSB=0;LSA=1;break;
            case 2:LSC=0;LSB=1;LSA=0;break;
            case 3:LSC=0;LSB=1;LSA=1;break;
            case 4:LSC=1;LSB=0;LSA=0;break;
            case 5:LSC=1;LSB=0;LSA=1;break;
            case 6:LSC=1;LSB=1;LSA=0;break;
            case 7:LSC=1;LSB=1;LSA=1;break;
        }
        SMG_A_DP_PORT=gsmg_code[i];      //动态数码管传送段选数据
        delay_10us(100);  //延时一定时间,等待显示稳定
        SMG_A_DP_PORT=0x00;  //消隐
    }
}

/*******************************主程序*********************************
* 函 数 名   :main
* 函数功能   :主函数
* 输    入   :无
* 输    出   :无
***********************************************************************/
void main()
{
    while(1)
    {
        smg_display();
    }
}


实验分析:

1、动态数码管熄灭的延时时间在20ms内,人肉眼是无法分辨上一位数码管熄灭,看到的是几个位是同时在显示,因此我们在代码内延时设置成1ms。

2、动态数码管上一位延时显示完关闭,在显示下一位选时,段选发送高电平会干扰到上一位选,会造成上一位选有下一位选数字的重影。因此这里需要给段选置低电平进行清零进行消隐,即SMG_A_DP_PORT置0(十六进制为:0x00)

群贤毕至

访客