CD4051.c 5.41 KB
Newer Older
1 2 3 4 5
/******************************************************************************
  文件名:CD4051B.C
  功能:实现4051通道切换
  编写时间:2021/3/25
 ******************************************************************************/
hu's avatar
hu committed
6 7
#include "CD4051.h"
#include "GPIO.h"
8
#include "dr7f701441.dvf.h"
hu's avatar
hu committed
9

10
CD4051BChannel CD4051B_CurrentChannel;
hu's avatar
hu committed
11

12 13 14
CD4051CtrStruct CD4051CtrStr[COMTotal][MaxChannel];
uint16_t CD4051B_GeneralCOM_Cache[COMTotal][MaxChannel];
uint16_t CD4051B_GeneralCOM_Value[COMTotal][MaxChannel];
hu's avatar
hu committed
15

16
void CD4051B_KL15Init(void)
17
{
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
    uint8_t i, j;
    i = 0u;
    j = 0u;
    // VCCA_EN = 1u;
    for (i = 0u; i < COMTotal; i++)
    {
        for (j = 0u; j < MaxChannel; j++)
        {
            CD4051CtrStr[i][j].time = 0u;
            CD4051CtrStr[i][j].Last = 0u;
            CD4051B_GeneralCOM_Cache[i][j] = 0u;
            CD4051B_GeneralCOM_Value[i][j] = 0u;
        }
    }
    CD4051B_C_MCU = 0u;
    CD4051B_B_MCU = 0u;
    CD4051B_A_MCU = 0u;
hu's avatar
hu committed
35

36
    CD4051B_CurrentChannel = 0u;
hu's avatar
hu committed
37
}
hu's avatar
hu committed
38

39 40 41 42 43 44 45 46 47 48 49 50 51
/****************************************************************************
CD4051B_ChannelSet
CD4051B_C_MCU       CD4051B_B_MCU       CD4051B_A_MCU            Channel ON
      0                   0                   0                       0
      0                   0                   1                       1
      0                   1                   0                       2
      0                   1                   1                       3
      1                   0                   0                       4
      1                   0                   1                       5
      1                   1                   0                       6
      1                   1                   1                       7
******************************************************************************/
void CD4051B_ChannelSet(CD4051BChannel Ch)
52
{
53
    if (Ch < MaxChannel)
54
    {
55 56 57 58
        CD4051B_CurrentChannel = Ch;
        CD4051B_C_MCU = (Ch & 0x04u) >> 2u;
        CD4051B_B_MCU = (Ch & 0x02u) >> 1u;
        CD4051B_A_MCU = Ch & 0x01u;
59 60 61
    }
    else
    {
62
        ;
63
    }
64
}
hu's avatar
hu committed
65

66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
/****************************************************************************
函数名:CD4051B_ChannelGet
形参:无
返回值:CD4051BChannel  当前通道数
功能:获取当前通道数
******************************************************************************/
CD4051BChannel CD4051B_ChannelGet(void)
{
    return CD4051B_CurrentChannel;
}

/****************************************************************************
CD4051B_ReadSignal_Serviece


******************************************************************************/
void CD4051B_ReadSignal_Serviece(void)
{
    uint8_t channel = 0u;

    channel = CD4051B_ChannelGet();

    CD4051B_GeneralCOM_Cache[COM1][channel] = CD4051B_InputGOIO_Com1;
    CD4051B_GeneralCOM_Cache[COM2][channel] = CD4051B_InputGOIO_Com2;
    CD4051B_GeneralCOM_Cache[COM3][channel] = CD4051B_InputGOIO_Com3;
    CD4051B_GeneralCOM_Cache[COM4][channel] = CD4051B_InputGOIO_Com4;
    CD4051B_GeneralCOM_Cache[COM5][channel] = CD4051B_InputGOIO_Com5;
    CD4051B_GeneralCOM_Cache[COM6][channel] = CD4051B_InputGOIO_Com6;
    CD4051B_GeneralCOM_Cache[COM7][channel] = CD4051B_InputGOIO_Com7;

    if (channel < (MaxChannel - 1u))
97
    {
98
        channel++;
hu's avatar
hu committed
99
    }
100 101
    else
    {
102
        channel = Channel0;
hu's avatar
hu committed
103
    }
104 105

    CD4051B_ChannelSet(channel);
hu's avatar
hu committed
106
}
hu's avatar
hu committed
107

108 109
/****************************************************************************
CD4051B_Debounce_Service
hu's avatar
hu committed
110

111 112
******************************************************************************/
void CD4051B_Debounce_Service(void)
113
{
114 115 116 117 118
    uint8_t comcnt;
    uint8_t chcnt;
    comcnt = 0u;
    chcnt = 0u;
    for (comcnt = 0u; comcnt < COMTotal; comcnt++)
119
    {
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
        for (chcnt = 0u; chcnt < MaxChannel; chcnt++)
        {
            if (CD4051B_GeneralCOM_Cache[comcnt][chcnt] == CD4051CtrStr[comcnt][chcnt].Last)
            {
                CD4051CtrStr[comcnt][chcnt].time++;
                if (CD4051B_GeneralCOM_Cache[comcnt][chcnt] == 1u)
                {
                    if (CD4051CtrStr[comcnt][chcnt].time >= CD4051B_DEBOUNCE_High_CNT)
                    {
                        CD4051CtrStr[comcnt][chcnt].time = 0u;
                        CD4051B_GeneralCOM_Value[comcnt][chcnt] = 1u;
                    }
                    else
                    {
                        ;
                    }
                }
                else
                {
                    if (CD4051CtrStr[comcnt][chcnt].time >= CD4051B_DEBOUNCE_Low_CNT)
                    {
                        CD4051CtrStr[comcnt][chcnt].time = 0u;
                        CD4051B_GeneralCOM_Value[comcnt][chcnt] = 0u;
                    }
                    else
                    {
                        ;
                    }
                }
            }
            else
            {
                CD4051CtrStr[comcnt][chcnt].time = 0u;
                CD4051CtrStr[comcnt][chcnt].Last = CD4051B_GeneralCOM_Cache[comcnt][chcnt];
            }
        }
hu's avatar
hu committed
156
    }
157
}
hu's avatar
hu committed
158

159 160 161 162 163 164 165
/****************************************************************************
CD4051B_GetComValue

******************************************************************************/
uint16_t CD4051B_GetComValue(uint8_t num, uint8_t ch)
{
    return CD4051B_GeneralCOM_Value[num][ch];
hu's avatar
hu committed
166
}