1.设计思想

  我第一次看到7个IO口控制7*n个灯的时候,我也是很懵,不应该是一个IO对应一个LED灯控制吗,这么多灯,什么控制啊,而且还要显示数字出来。相信很多刚从学校毕业出来的朋友如果遇到这样的问题,一定也会很懵。那么我们就来聊聊这样的一对多的LED控制如何实现。

  

   首先在这里我给出这一种数码管的其中一个原理图,要想控制这一类的数码管显示数据,简单的说就是控制LED灯的亮灭,同时又要让数码管显示均匀,并且不出现闪屏。

   接下来我来说说,像这样的数码管,我们应该如何写程序,才能达到市场使用的要求。我们一定要清楚,像这样的数码管,我们必须要逐个进行扫描式显示,并且时间不能少于1ms。

2.程序设计

Display.h

#ifndef __Display_H__
#define __Display_H__

#include "WS51F0030.h"

#define LED1_OUT_H   P01=1
#define LED1_OUT_L   P01=0
#define LED1_SET_OUT P01F=0x02
#define LED1_SET_IN  P01F=0x01


#define LED2_OUT_H   P00=1
#define LED2_OUT_L   P00=0
#define LED2_SET_OUT P00F=0x02
#define LED2_SET_IN  P00F=0x01

#define LED3_OUT_H   P10=1
#define LED3_OUT_L   P10=0
#define LED3_SET_OUT P10F=0x02
#define LED3_SET_IN  P10F=0x01

#define LED4_OUT_H    P11=1
#define LED4_OUT_L    P11=0
#define LED4_SET_OUT  P11F=0x02
#define LED4_SET_IN   P11F=0x01

#define LED5_OUT_H    P12=1
#define LED5_OUT_L    P12=0
#define LED5_SET_OUT  P12F=0x02
#define LED5_SET_IN   P12F=0x01

typedef    struct {
    unsigned char A:1;
    unsigned char B:1;
    unsigned char C:1;
    unsigned char D:1;
    unsigned char E:1;
    unsigned char F:1;
    unsigned char G:1;
    unsigned char H:1;
} OneBit;

typedef union
{
    OneBit OneBit;
    unsigned char Allbits;
} Disshow;

void Display_PIN(void);

#endif

Display.c

#include "Display.h"

Disshow Dis1,Dis2,Dis3;

unsigned char Dis_ScanCnt=0;

void  Display_PIN(void)
{
    LED1_SET_IN;
    LED2_SET_IN;
    LED3_SET_IN;
    LED4_SET_IN;
    LED5_SET_IN;

    if(Dis_ScanCnt>5)Dis_ScanCnt=0;
    Dis_ScanCnt++;
    switch(Dis_ScanCnt)
    {
    case 1:
        LED1_SET_OUT;
        LED1_OUT_L;
        if(Dis1.OneBit.F == 1)
        {
            LED2_SET_OUT;
            LED2_OUT_H;
        }
        if(Dis1.OneBit.A == 1)
        {
            LED3_SET_OUT;
            LED3_OUT_H;
        }
        if(Dis1.OneBit.B == 1)
        {
            LED4_SET_OUT;
            LED4_OUT_H;
        }
        if(Dis1.OneBit.G == 1)
        {
            LED5_SET_OUT;
            LED5_OUT_H;
        }
        break;

    case 2:
        LED2_SET_OUT;
        LED2_OUT_L;
        if(Dis2.OneBit.F == 1)
        {
            LED1_SET_OUT;
            LED1_OUT_H;
        }
        if(Dis2.OneBit.A == 1)
        {
            LED3_SET_OUT;
            LED3_OUT_H;
        }
        if(Dis2.OneBit.B == 1)
        {
            LED4_SET_OUT;
            LED4_OUT_H;
        }
        if(Dis2.OneBit.G == 1)
        {
            LED5_SET_OUT;
            LED5_OUT_H;
        }
        break;

    case 3:
        LED3_SET_OUT;
        LED3_OUT_L;
        if(Dis1.OneBit.C == 1)
        {
            LED4_SET_OUT;
            LED4_OUT_H;
        }
        if(Dis1.OneBit.D == 1)
        {
            LED2_SET_OUT;
            LED2_OUT_H;
        }
        if(Dis1.OneBit.E == 1)
        {
            LED1_SET_OUT;
            LED1_OUT_H;
        }
        if(Dis2.OneBit.E == 1)
        {
            LED5_SET_OUT;
            LED5_OUT_H;
        }
        break;
    case 4:
        LED4_SET_OUT;
        LED4_OUT_L;
        if(Dis2.OneBit.C == 1)
        {
            LED1_SET_OUT;
            LED1_OUT_H;
        }
        if(Dis2.OneBit.D == 1)
        {
            LED2_SET_OUT;
            LED2_OUT_H;
        }
        if(Dis3.OneBit.A == 1)
        {
            LED3_SET_OUT;
            LED3_OUT_H;
        }
        if(Dis3.OneBit.B == 1)
        {
            LED5_SET_OUT;
            LED5_OUT_H;
        }
        break;
    case 5:
        LED5_SET_OUT;
        LED5_OUT_L;
        if(Dis3.OneBit.C == 1)
        {
            LED1_SET_OUT;
            LED1_OUT_H;
        }
        if(Dis3.OneBit.D == 1)
        {
            LED2_SET_OUT;
            LED2_OUT_H;
        }
        if(Dis3.OneBit.E == 1)
        {
            LED3_SET_OUT;
            LED3_OUT_H;
        }
        if(Dis3.OneBit.F == 1)
        {
            LED4_SET_OUT;
            LED4_OUT_H;
        }
        break;
    }
}

显示数据真值表

unsigned char code Tab[11]= {0x3F,0x06,0x5b,0x4f,0x66,0x6D,0x7d,0x07,0x7f,0x6f,0x79};

显示数据我们可直接对Dis1,Dis2,Dis3的Allbits 赋值即可。

如我想在数码管1上显示5,数码管2上显示2,数码管3上显示0。

Dis1.Allbits = Tab[5];
Dis2
.Allbits = Tab[2];
Dis3
.Allbits = Tab[0];

 

posted on 2021-10-08 16:05  xiao_fei  阅读(510)  评论(0编辑  收藏  举报