数码管动态显示(软件延时)+基于底层显示模块的应用层程序开发+Protues仿真

1 项目要求

(1)数码管开机初始显示----,正常运行时显示2013;

(2)数码管显示任意四位十进制数;

2 仿真测试

3 参考程序

3.1 主函数

#include "DisplaySmg.h"

void main()
{
    //任务1 正常运行时显示2023
    unsigned int i;    //0~65535
    for(i=0;i<5000;i++)        //数码管开机显示
    {
        DisplaySmg();        //for循环i控制显示时间
    }    
    while(1)
    {
        LedBuf[0]=2;    //重新设置LedBuf[](extern),即数据缓存区
        LedBuf[1]=0;
        LedBuf[2]=2;
        LedBuf[3]=3;
        DisplaySmg();    //调用数码管显示函数
    }
    
//    //任务2 数码管显示任意四位十进制数
//    unsigned int i;    //0~65535
//    unsigned int NUM = 1983;    //0~65535
//    for(i=0;i<5000;i++)        //数码管开机显示
//    {
//        DisplaySmg();        //for循环i控制显示时间
//    }    
//    while(1)
//    {
//        LedBuf[0] = NUM/1000;        //取千位
//        LedBuf[1] = NUM/100%10;        //取百位
//        LedBuf[2] = NUM/10%10;      //取十位
//        LedBuf[3] = NUM%10;            //取个位
//        DisplaySmg();    //调用数码管显示函数
//    }
}

 3.2 数码管显示函数(H文件和C文件成对出现)

#ifndef __DisplaySmg_H__
#define __DisplaySmg_H__

#include <REG52.H>
#include "DelayXms.h"

#define GPIO_SEG P0        //段选端
#define GPIO_SEL P2        //位选端
#define SMG_NUM  4        //数码管的个数

extern unsigned char LedBuf[];

void DisplaySmg();

#endif
#include "DisplaySmg.h"

unsigned char code LedData[]={    //共阴型数码管的段码表,字符,序号
                0x3F,  //"0",0
                0x06,  //"1",1
                0x5B,  //"2",2
                0x4F,  //"3",3
                0x66,  //"4",4
                0x6D,  //"5",5
                0x7D,  //"6",6
                0x07,  //"7",7
                0x7F,  //"8",8
                0x6F,  //"9",9
                0x77,  //"A",10
                0x7C,  //"B",11
                0x39,  //"C",12
                0x5E,  //"D",13
                0x79,  //"E",14
                0x71,  //"F",15
                0x76,  //"H",16
                0x38,  //"L",17
                0x37,  //"n",18
                0x3E,  //"u",19
                0x73,  //"P",20
                0x5C,  //"o",21
                0x40,  //"-",22
                0x00,  //熄灭 23
                         };

unsigned char code LedAddr[]={0xfe,0xfd,0xfb,0xf7};    //数码管位选

unsigned char LedBuf[]={22,22,22,22};    //显示缓存区

void DisplaySmg()
{
    unsigned char i;                 //等价于 "static unsigned char i = 0;"
    GPIO_SEG = LedData[LedBuf[i]];    //第一步 送段码
    GPIO_SEL = LedAddr[i];            //第二步 送位选
    DelayXms(1);                    //第三步 延时1ms
    GPIO_SEG = 0x00;                //第四步 消影(共阴形)
    i++;                            
    if(i==SMG_NUM)                    //SMG_NUM为数码管的个数
        i=0;
}

3.3 延时函数

#ifndef __DelayXms_H__
#define __DelayXms_H__

#include <intrins.h>

void DelayXms(unsigned char xms);

#endif
#include "DelayXms.h"

void DelayXms(unsigned char xms)        //@11.0592MHz
{
    unsigned char i, j;
    while(xms--)
    {
        _nop_();
        i = 2;
        j = 199;
        do
        {
        while (--j);
        } while (--i);
    }
}

 4 参考来源

(1)单片机应用 数码管动态显示编程之基于底层显示模块的应用层功能程序_哔哩哔哩_bilibili

posted @ 2023-01-30 20:42  豌豆茶  阅读(529)  评论(0编辑  收藏  举报