×

51单片机笔记 51单片机学习纪实

51单片机学习纪实:3.2-控制静态数码管滚动显示0-3_【增强实验1】

一哥 一哥 发表于2021-12-18 19:48:25 浏览1272 评论0

抢沙发发表评论

实验要求:

控制静态数码管滚动显示0-3,显示1s后熄灭约0.5s显示下一数字。


实验思路:

1、数码管接P0端口,宏定义P0端口为SMG_A_DP_PORT

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

2、重定义系统数据类型unsigned char为U8,unsigned int为U16

typedef unsigned char U8;
typedef unsigned int U16;

3、定义一个全局数组变量gsmg_code,用于定义数字“0-3”段码表

//共阳极数码段码表
U8 gsmg_code[5]={
    0xC0, // 0
    0xF9, // 1
    0xA4, // 2
    0xB0, // 3
    0xFF, // 熄灭
}

4、定义一个延时函数delay_1ms,用于显示\熄灭延时


完整代码:

/*****************************程序信息*********************************
* 实验名称:控制静态数码管显示0-3
* 文件名称:main.c
* 版    本:V1.00
* 日    期:2021-12-18
* 编    著:gefon
* 说    明:使用普中A7开发版,控制静态数码管显示0-3,显示约0.5s后,熄灭
            0.5s显示下一数字

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

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

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

//共阳极数码段码表
U8 gsmg_code[5]={
    0xC0, // 0
    0xF9, // 1
    0xA4, // 2
    0xB0, // 3
    0xFF, // 熄灭
};


/*******************************子程序*********************************
* 函 数 名   :delay_10us
* 函数功能   :延时函数,当传入变量ten_us=1时,约延时10us
* 输    入   :ten_us
* 输    出   :无
***********************************************************************/
void delay_1ms(U16 ten_us)
{
    U8 y;
    while(ten_us--)  //延时约1ms
    {
        for(y=0;y<100;y++); //运算一次约10us
    }
}

/*******************************主程序*********************************
* 函 数 名   :main
* 函数功能   :主函数
* 输    入   :无
* 输    出   :无
***********************************************************************/
void main()
{
    U8 i=0;    
    while(1)
    {    
/********************实现方案一********************/        
        SMG_A_DP_PORT=gsmg_code[0]; //显示数字0
        delay_1ms(1000); //延时约1000ms
        SMG_A_DP_PORT=gsmg_code[4]; //熄灭
        delay_1ms(500);  //延时约500ms
        SMG_A_DP_PORT=gsmg_code[1]; //显示数字1
        delay_1ms(1000);
        SMG_A_DP_PORT=gsmg_code[4]; //熄灭
        delay_1ms(500);
        SMG_A_DP_PORT=gsmg_code[2]; //显示数字2
        delay_1ms(1000);
        SMG_A_DP_PORT=gsmg_code[4]; //熄灭
        delay_1ms(500);
        SMG_A_DP_PORT=gsmg_code[3]; //显示数字3
        delay_1ms(1000);
        SMG_A_DP_PORT=gsmg_code[4]; //熄灭
        delay_1ms(500);
/********************实现方案一********************/

/********************实现方案二********************/
        for(i=0;i<5;i++)
        {
            SMG_A_DP_PORT=gsmg_code[i]; //将变量i值赋给gsmg_code,以滚动显示0-3
            delay_1ms(1000); //延时约1000ms
            SMG_A_DP_PORT=0xFF;  //熄灭
            delay_1ms(500); //延时约500ms
        }
/********************实现方案二********************/
    }
}


实验分析:

实现方案二相对于方案一,使用for循环,gsmg_code变量的数组元素通过调用变量i的值来实现0-3的数字滚动。方案一每显示一个数字都需要去编写一段代码,如要滚动显示的数字较多,代码编写量巨大,浪费时间。而方案二的程序代码量、复杂程序相对于方案一要简单很多,可变化性也更强。

少长咸集

群贤毕至

访客