嵌入式开发常用C语言代码(持续更新)

·35 字·1 分钟阅读
嵌入式开发

按键扫描

u8 last_key;

void Key_Scan(u8 keyIndex)
{
    // 有按键按下
    if (keyIndex && (last_key != keyIndex))
    {
        switch (keyIndex)
        {
        case 0x01: // 移动
            break;
        case 0x02: // 定时
            break;
        case 0x03: // 开关
            app.power_flag = !app.power_flag;
            break;
        case 0x04: // 挡位
            break;

        default:
            break;
        }
    }
    
    last_key = keyIndex;
}

数码管正反推扫描

将数码管的led每一个看成一个独立的个体,进行扫描

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];