CD4051.c 6.71 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
        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)
                {
hu's avatar
hu committed
127 128
                    /*特殊*/
                    if ((comcnt == COM3) && (chcnt == Channel5))
129
                    {
hu's avatar
hu committed
130 131 132 133 134 135 136 137 138 139
                        if (CD4051CtrStr[comcnt][chcnt].time >= 2)
                        {

                            CD4051CtrStr[comcnt][chcnt].time = 0u;
                            CD4051B_GeneralCOM_Value[comcnt][chcnt] = 1u;
                        }
                        else
                        {
                            ;
                        }
140
                    }
hu's avatar
hu committed
141
                    /*一般*/
142 143
                    else
                    {
hu's avatar
hu committed
144 145 146 147 148 149 150 151 152 153
                        if (CD4051CtrStr[comcnt][chcnt].time >= CD4051B_DEBOUNCE_High_CNT)
                        {

                            CD4051CtrStr[comcnt][chcnt].time = 0u;
                            CD4051B_GeneralCOM_Value[comcnt][chcnt] = 1u;
                        }
                        else
                        {
                            ;
                        }
154 155 156 157
                    }
                }
                else
                {
hu's avatar
hu committed
158 159
                    /*特殊*/
                    if ((comcnt == COM3) && (chcnt == Channel5))
160
                    {
hu's avatar
hu committed
161 162 163 164 165 166 167 168 169
                        if (CD4051CtrStr[comcnt][chcnt].time >= 2)
                        {
                            CD4051CtrStr[comcnt][chcnt].time = 0u;
                            CD4051B_GeneralCOM_Value[comcnt][chcnt] = 0u;
                        }
                        else
                        {
                            ;
                        }
170
                    }
hu's avatar
hu committed
171
                    /*一般*/
172 173
                    else
                    {
hu's avatar
hu committed
174 175 176 177 178 179 180 181 182
                        if (CD4051CtrStr[comcnt][chcnt].time >= CD4051B_DEBOUNCE_Low_CNT)
                        {
                            CD4051CtrStr[comcnt][chcnt].time = 0u;
                            CD4051B_GeneralCOM_Value[comcnt][chcnt] = 0u;
                        }
                        else
                        {
                            ;
                        }
183 184 185 186 187 188 189 190 191
                    }
                }
            }
            else
            {
                CD4051CtrStr[comcnt][chcnt].time = 0u;
                CD4051CtrStr[comcnt][chcnt].Last = CD4051B_GeneralCOM_Cache[comcnt][chcnt];
            }
        }
hu's avatar
hu committed
192
    }
193
}
hu's avatar
hu committed
194

195 196 197 198 199 200 201
/****************************************************************************
CD4051B_GetComValue

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