蓝桥杯单片机学习(五):共阳数码管的动态显示

文章详细介绍了如何使用HC573和特定段码在P0口的单片机上实现动态显示数字,包括定义段码、选择HC573、按位显示和延时函数的运用,以及在主函数中控制月份变化时的延时策略。
摘要由CSDN通过智能技术生成


在这里插入图片描述

1、基础知识

在这里插入图片描述

左上:共用一个P0口,想要显示2024没有办法
左下:可以显示2024但是占用了太多的IO资源
右边:动态显示
在这里插入图片描述

每次只点亮一个,但是看起来像是一直都亮着
一开始 com1=1 com2=0 com3=0 com4=0 P0都显示2
然后1ms后 com1=0 com2=1 com3=0 com4=0 P0都显示0
2虽然熄灭了但是还有亮的感觉

2、代码实现

(1)定义段码

unsigned char code SMG_duanma[18]={0xc0,0xf9,0xa4,0xb0,0x99,0x82,0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};

(2)HC573选择

void SelectHC573(unsigned char channel)
{
            switch(channel)
    {
        case 4:
            P2 = (P2 & 0x1f)|0x80;
            break;
        case 5:
            P2 = (P2 & 0x1f)|0xa0;
            break;
        case 6:
            P2 = (P2 & 0x1f)|0xc0;
            break;
        case 7:
            P2 = (P2 & 0x1f)|0xe0;
            break;  
       }
}

(3)动态显示

本质是按位显示,熄灭时间短,处在循环当中

按位显示
void DisplaySMG_Bit(unsigned char value,unsigned char pos)
{
        SelectHC573(6);
        P0=0x01 << pos;  //显示的位置
        SelectHC573(7);
        P0=value;  //显示的内容
}
动态显示
void Display_Dynamic()
{
        DisplaySMG_Bit(SMG_duanma[2],0);
        DelaySMG(500);
        DisplaySMG_Bit(SMG_duanma[0],1);
        DelaySMG(500);
        DisplaySMG_Bit(SMG_duanma[2],2);
        DelaySMG(500);
        DisplaySMG_Bit(SMG_duanma[4],3);
        DelaySMG(500);
        
        DisplaySMG_Bit(SMG_duanma[16],4);
        DelaySMG(500);
        DisplaySMG_Bit(SMG_duanma[16],5);
        DelaySMG(500);
        
        DisplaySMG_Bit(SMG_duanma[yu/10],6);
        DelaySMG(500);
        DisplaySMG_Bit(SMG_duanma[yu%10],7);
        DelaySMG(500);
}

(4)延时函数

数码管延时

只需要控制时间即可

void DelaySMG(unsigned int t)
{
        while(t--);
}
月份变化延时
void Delay(unsigned char t)
{
        while(t--)
        {
                Display_Dynamic();
        }
}

问:为什么在月份变化延时函数里还有一个动态显示的函数?
答:数字一直能亮,是靠的循环,动态显示的函数里面没有循环,循环在主函数。主函数的循环,一方面让数字一直亮,另一方面让 yu(月份)++,但是循环太快,所以在最后加上了月份延时函数,一延时,就不能循环了,而且延时的时间超过了眼睛能感觉数字一直亮的时间,所以为了能在月份变化的时间里一直让年份亮,所以就在延时函数这个循环函数里面加上显示函数。

(5)主函数

void main()
{
        while(1)
        {
                
                Display_Dynamic();
                yu++;
                if(yu>12)
                {
                        yu=1;
                }
                Delay(100);
        }
}

(6)整体代码

#include "reg52.h"
unsigned char code SMG_duanma[18]={0xc0,0xf9,0xa4,0xb0,0x99,0x82,0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};

unsigned char yu = 1;

void SelectHC573(unsigned char channel)
{
            switch(channel)
    {
        case 4:
            P2 = (P2 & 0x1f)|0x80;
            break;
        case 5:
            P2 = (P2 & 0x1f)|0xa0;
            break;
        case 6:
            P2 = (P2 & 0x1f)|0xc0;
            break;
        case 7:
            P2 = (P2 & 0x1f)|0xe0;
            break;  
       }
}



void DelaySMG(unsigned int t)
{
        while(t--);
}

void DisplaySMG_Bit(unsigned char value,unsigned char pos)
{
        SelectHC573(6);
        P0=0x01 << pos;  //ÏÔʾµÄλÖÃ
        SelectHC573(7);
        P0=value;  //ÏÔʾµÄÄÚÈÝ
}


void Display_Dynamic()
{
        DisplaySMG_Bit(SMG_duanma[2],0);
        DelaySMG(500);
        DisplaySMG_Bit(SMG_duanma[0],1);
        DelaySMG(500);
        DisplaySMG_Bit(SMG_duanma[2],2);
        DelaySMG(500);
        DisplaySMG_Bit(SMG_duanma[4],3);
        DelaySMG(500);
        
        DisplaySMG_Bit(SMG_duanma[16],4);
        DelaySMG(500);
        DisplaySMG_Bit(SMG_duanma[16],5);
        DelaySMG(500);
        
        DisplaySMG_Bit(SMG_duanma[yu/10],6);
        DelaySMG(500);
        DisplaySMG_Bit(SMG_duanma[yu%10],7);
        DelaySMG(500);
}
        
void Delay(unsigned char t)
{
        while(t--)
        {
                Display_Dynamic();
        }
}


void main()
{
        while(1)
        {
                
                Display_Dynamic();
                yu++;
                if(yu>12)
                {
                        yu=1;
                }
                Delay(100);
        }
}
  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值