正反推驱动数码管伪代码

00 分钟阅读
嵌入式开发
u8 DispBuf[] = {0x00, 0x00};

unsigned char segment[] = {
    0x3F,
    0x06,
    0x5B,
    0x4F,
    0x66, // 0-4
    0x6D,
    0x7D,
    0x07,
    0x7F,
    0x6F, // 5-9
    0x40,
    0x71,
    0x74, // '-', F, H
};

void f_digitalTubeScan()
{
    static unsigned char state = 0;

    // 重置引脚状态
    TUBE_1 = 0;
    TUBE_2 = 0;
    TUBE_3 = 0;
    TUBE_4 = 0;
    TUBE_5 = 0;
    PCM0 &= 0x04;
    PBM1 &= 0x04;
    PBM2 = 0;
    PBM3 &= 0x30;

    // 将数码管分成一个一个的led灯去扫描
    switch (state)
    {
    case 0:
        PBM2 = 0x44;
        if (DispBuf[0] & 0x01)
        {
            TUBE_3 = 1;
            TUBE_5 = 0;
        }
        break;
    case 1:
        PCM0 |= 0x40;
        PBM2 |= 0x04;
        if (DispBuf[0] & 0x02)
        {
            TUBE_1 = 1;
            TUBE_5 = 0;
        }
        break;
    case 2:
        PBM3 |= 0x04;
        PBM2 |= 0x04;
        if (DispBuf[0] & 0x04)
        {
            TUBE_2 = 1;
            TUBE_5 = 0;
        }
        break;
    case 3:
        PBM1 |= 0x40;
        PBM2 |= 0x04;
        if (DispBuf[0] & 0x08)
        {
            TUBE_4 = 1;
            TUBE_5 = 0;
        }
        break;
    case 4:
        PBM3 |= 0x04;
        PBM2 |= 0x04;
        if (DispBuf[0] & 0x10)
        {
            TUBE_2 = 0;
            TUBE_5 = 1;
        }
        break;
    case 5:
        PCM0 |= 0x40;
        PBM2 |= 0x04;
        if (DispBuf[0] & 0x20)
        {
            TUBE_1 = 0;
            TUBE_5 = 1;
        }
        break;
    case 6:
        PBM1 |= 0x40;
        PBM2 |= 0x04;
        if (DispBuf[0] & 0x40)
        {
            TUBE_4 = 0;
            TUBE_5 = 1;
        }
        break;
    case 7:
        PBM2 = 0x44;
        if (DispBuf[1] & 0x01)
        {
            TUBE_3 = 0;
            TUBE_5 = 1;
        }
        break;
    case 8:
        PCM0 |= 0x40;
        PBM2 |= 0x40;
        if (DispBuf[1] & 0x02)
        {
            TUBE_3 = 1;
            TUBE_1 = 0;
        }
        break;
    case 9:
        PBM3 |= 0x04;
        PBM2 |= 0x40;
        if (DispBuf[1] & 0x04)
        {
            TUBE_3 = 1;
            TUBE_2 = 0;
        }
        break;
    case 10:
        PBM1 |= 0x40;
        PBM2 |= 0x40;
        if (DispBuf[1] & 0x08)
        {
            TUBE_3 = 1;
            TUBE_4 = 0;
        }
        break;
    case 11:
        PBM1 |= 0x40;
        PBM2 |= 0x40;
        if (DispBuf[1] & 0x10)
        {
            TUBE_3 = 0;
            TUBE_4 = 1;
        }
        break;
    case 12:
        PCM0 |= 0x40;
        PBM2 |= 0x40;
        if (DispBuf[1] & 0x20)
        {
            TUBE_3 = 0;
            TUBE_1 = 1;
        }
        break;
    case 13:
        PBM3 |= 0x04;
        PBM2 |= 0x40;
        if (DispBuf[1] & 0x40)
        {
            TUBE_3 = 0;
            TUBE_2 = 1;
        }
        break;
    }

    state = (state + 1) % 14;
}
// 显示 12
DispBuf[0] = segment[1];
DispBuf[1] = segment[2];