一、事件背景

1.出于操作IO口的需求,在LED操作例程当中我在官方库当中添加了两个gpio函数;详见基于STC15系列库操作LED灯-CSDN博客;在新的例程中察觉到两个函数操作的局限性,于是将两个函数内容进行相应修改,使其能适应更广泛的场景。

二、函数修改部分说明

1.原函数内容,原函数的局限在于单次只能操作一个引脚,而不能批量操作,对于51单片机常用的流水灯,数码管,点阵等外设操作无法起到简化操作的作用;

//添加置位函数定义
u8 GPIO_PIN_Set(u8 GPIO, u8 GPIO_Pin_x)
{
    if(GPIO > GPIO_P5)				return 1;	//空操作
    if(GPIO_Pin_x > GPIO_Pin_7)	    return 2;	//空操作

    if(GPIO == GPIO_P0)
    {
        if(GPIO_Pin_x == GPIO_Pin_0)    P00 = 1;
        if(GPIO_Pin_x == GPIO_Pin_1)    P01 = 1;
        if(GPIO_Pin_x == GPIO_Pin_2)    P02 = 1;
        if(GPIO_Pin_x == GPIO_Pin_3)    P03 = 1;
        if(GPIO_Pin_x == GPIO_Pin_4)    P04 = 1;
        if(GPIO_Pin_x == GPIO_Pin_5)    P05 = 1;
        if(GPIO_Pin_x == GPIO_Pin_6)    P06 = 1;
        if(GPIO_Pin_x == GPIO_Pin_7)    P07 = 1;
    }
    else if(GPIO == GPIO_P1)
    {
        if(GPIO_Pin_x == GPIO_Pin_0)    P10 = 1;
        if(GPIO_Pin_x == GPIO_Pin_1)    P11 = 1;
        if(GPIO_Pin_x == GPIO_Pin_2)    P12 = 1;
        if(GPIO_Pin_x == GPIO_Pin_3)    P13 = 1;
        if(GPIO_Pin_x == GPIO_Pin_4)    P14 = 1;
        if(GPIO_Pin_x == GPIO_Pin_5)    P15 = 1;
        if(GPIO_Pin_x == GPIO_Pin_6)    P16 = 1;
        if(GPIO_Pin_x == GPIO_Pin_7)    P17 = 1;
    }
    else if(GPIO == GPIO_P2)
    {
        if(GPIO_Pin_x == GPIO_Pin_0)    P20 = 1;
        if(GPIO_Pin_x == GPIO_Pin_1)    P21 = 1;
        if(GPIO_Pin_x == GPIO_Pin_2)    P22 = 1;
        if(GPIO_Pin_x == GPIO_Pin_3)    P23 = 1;
        if(GPIO_Pin_x == GPIO_Pin_4)    P24 = 1;
        if(GPIO_Pin_x == GPIO_Pin_5)    P25 = 1;
        if(GPIO_Pin_x == GPIO_Pin_6)    P26 = 1;
        if(GPIO_Pin_x == GPIO_Pin_7)    P27 = 1;
    }
    else if(GPIO == GPIO_P3)
    {
        if(GPIO_Pin_x == GPIO_Pin_0)    P30 = 1;
        if(GPIO_Pin_x == GPIO_Pin_1)    P31 = 1;
        if(GPIO_Pin_x == GPIO_Pin_2)    P32 = 1;
        if(GPIO_Pin_x == GPIO_Pin_3)    P33 = 1;
        if(GPIO_Pin_x == GPIO_Pin_4)    P34 = 1;
        if(GPIO_Pin_x == GPIO_Pin_5)    P35 = 1;
        if(GPIO_Pin_x == GPIO_Pin_6)    P36 = 1;
        if(GPIO_Pin_x == GPIO_Pin_7)    P37 = 1;
    }
    else if(GPIO == GPIO_P4)
    {
        if(GPIO_Pin_x == GPIO_Pin_0)    P40 = 1;
        if(GPIO_Pin_x == GPIO_Pin_1)    P41 = 1;
        if(GPIO_Pin_x == GPIO_Pin_2)    P42 = 1;
        if(GPIO_Pin_x == GPIO_Pin_3)    P43 = 1;
        if(GPIO_Pin_x == GPIO_Pin_4)    P44 = 1;
        if(GPIO_Pin_x == GPIO_Pin_5)    P45 = 1;
        if(GPIO_Pin_x == GPIO_Pin_6)    P46 = 1;
        if(GPIO_Pin_x == GPIO_Pin_7)    P47 = 1;
    }
    else if(GPIO == GPIO_P5)
    {
        if(GPIO_Pin_x == GPIO_Pin_0)    P50 = 1;
        if(GPIO_Pin_x == GPIO_Pin_1)    P51 = 1;
        if(GPIO_Pin_x == GPIO_Pin_2)    P52 = 1;
        if(GPIO_Pin_x == GPIO_Pin_3)    P53 = 1;
        if(GPIO_Pin_x == GPIO_Pin_4)    P54 = 1;
        if(GPIO_Pin_x == GPIO_Pin_5)    P55 = 1;
        if(GPIO_Pin_x == GPIO_Pin_6)    P56 = 1;
        if(GPIO_Pin_x == GPIO_Pin_7)    P57 = 1;
    }

    return 0;
}

//添加重置函数定义
u8 GPIO_PIN_ReSet(u8 GPIO, u8 GPIO_Pin_x)
{
    if(GPIO > GPIO_P5)				return 1;	//空操作
    if(GPIO_Pin_x > GPIO_Pin_7)	    return 2;	//空操作

    if(GPIO == GPIO_P0)
    {
        if(GPIO_Pin_x == GPIO_Pin_0)    P00 = 0;
        if(GPIO_Pin_x == GPIO_Pin_1)    P01 = 0;
        if(GPIO_Pin_x == GPIO_Pin_2)    P02 = 0;
        if(GPIO_Pin_x == GPIO_Pin_3)    P03 = 0;
        if(GPIO_Pin_x == GPIO_Pin_4)    P04 = 0;
        if(GPIO_Pin_x == GPIO_Pin_5)    P05 = 0;
        if(GPIO_Pin_x == GPIO_Pin_6)    P06 = 0;
        if(GPIO_Pin_x == GPIO_Pin_7)    P07 = 0;
    }
    else if(GPIO == GPIO_P1)
    {
        if(GPIO_Pin_x == GPIO_Pin_0)    P10 = 0;
        if(GPIO_Pin_x == GPIO_Pin_1)    P11 = 0;
        if(GPIO_Pin_x == GPIO_Pin_2)    P12 = 0;
        if(GPIO_Pin_x == GPIO_Pin_3)    P13 = 0;
        if(GPIO_Pin_x == GPIO_Pin_4)    P14 = 0;
        if(GPIO_Pin_x == GPIO_Pin_5)    P15 = 0;
        if(GPIO_Pin_x == GPIO_Pin_6)    P16 = 0;
        if(GPIO_Pin_x == GPIO_Pin_7)    P17 = 0;
    }
    else if(GPIO == GPIO_P2)
    {
        if(GPIO_Pin_x == GPIO_Pin_0)    P20 = 0;
        if(GPIO_Pin_x == GPIO_Pin_1)    P21 = 0;
        if(GPIO_Pin_x == GPIO_Pin_2)    P22 = 0;
        if(GPIO_Pin_x == GPIO_Pin_3)    P23 = 0;
        if(GPIO_Pin_x == GPIO_Pin_4)    P24 = 0;
        if(GPIO_Pin_x == GPIO_Pin_5)    P25 = 0;
        if(GPIO_Pin_x == GPIO_Pin_6)    P26 = 0;
        if(GPIO_Pin_x == GPIO_Pin_7)    P27 = 0;
    }
    else if(GPIO == GPIO_P3)
    {
        if(GPIO_Pin_x == GPIO_Pin_0)    P30 = 0;
        if(GPIO_Pin_x == GPIO_Pin_1)    P31 = 0;
        if(GPIO_Pin_x == GPIO_Pin_2)    P32 = 0;
        if(GPIO_Pin_x == GPIO_Pin_3)    P33 = 0;
        if(GPIO_Pin_x == GPIO_Pin_4)    P34 = 0;
        if(GPIO_Pin_x == GPIO_Pin_5)    P35 = 0;
        if(GPIO_Pin_x == GPIO_Pin_6)    P36 = 0;
        if(GPIO_Pin_x == GPIO_Pin_7)    P37 = 0;
    }
    else if(GPIO == GPIO_P4)
    {
        if(GPIO_Pin_x == GPIO_Pin_0)    P40 = 0;
        if(GPIO_Pin_x == GPIO_Pin_1)    P41 = 0;
        if(GPIO_Pin_x == GPIO_Pin_2)    P42 = 0;
        if(GPIO_Pin_x == GPIO_Pin_3)    P43 = 0;
        if(GPIO_Pin_x == GPIO_Pin_4)    P44 = 0;
        if(GPIO_Pin_x == GPIO_Pin_5)    P45 = 0;
        if(GPIO_Pin_x == GPIO_Pin_6)    P46 = 0;
        if(GPIO_Pin_x == GPIO_Pin_7)    P47 = 0;
    }
    else if(GPIO == GPIO_P5)
    {
        if(GPIO_Pin_x == GPIO_Pin_0)    P50 = 0;
        if(GPIO_Pin_x == GPIO_Pin_1)    P51 = 0;
        if(GPIO_Pin_x == GPIO_Pin_2)    P52 = 0;
        if(GPIO_Pin_x == GPIO_Pin_3)    P53 = 0;
        if(GPIO_Pin_x == GPIO_Pin_4)    P54 = 0;
        if(GPIO_Pin_x == GPIO_Pin_5)    P55 = 0;
        if(GPIO_Pin_x == GPIO_Pin_6)    P56 = 0;
        if(GPIO_Pin_x == GPIO_Pin_7)    P57 = 0;
    }

    return 0;
}

2.新函数内容,新胡函数内容将可以同时操作多个引脚,引脚控制方法,保留了和库操作相同的方式,优化了操作效率,详细代码如下:


//========================================================================
// 函数: u8 GPIO_PIN_Set(u8 GPIO, u8 GPIO_Pin_x)
// 描述: 将指定的IO口输出状态改为1
// 参数: GPIO_Pin_x: 支持异或操作   GPIO_Pin_1 | GPIO_Pin_2
// 返回: 成功返回0, 空操作返回1,错误返回2.
// 版本: V1.1,  2024年4月19日20:24:36
//========================================================================
u8 GPIO_PIN_Set(u8 GPIO, u8 GPIO_Pin_x)
{
    if(GPIO > GPIO_P5)				return 1;	//空操作
    if(GPIO_Pin_x > GPIO_Pin_All)	    return 2;	//空操作

    if(GPIO == GPIO_P0)
    {
        P0 |= GPIO_Pin_x;
    }
    else if(GPIO == GPIO_P1)
    {
        P1 |= GPIO_Pin_x;
    }
    else if(GPIO == GPIO_P2)
    {
        P2 |= GPIO_Pin_x;
    }
    else if(GPIO == GPIO_P3)
    {
        P3 |= GPIO_Pin_x;
    }
    else if(GPIO == GPIO_P4)
    {
        P4 |= GPIO_Pin_x;
    }
    else if(GPIO == GPIO_P5)
    {
        P5 |= GPIO_Pin_x;
    }

    return 0;
}

//========================================================================
// 函数: u8 GPIO_PIN_ReSet(u8 GPIO, u8 GPIO_Pin_x)
// 描述: 将指定的IO口输出状态改为0
// 参数: GPIO_Pin_x: 支持异或操作   GPIO_Pin_1 | GPIO_Pin_2
// 返回: 成功返回0, 空操作返回1,错误返回2.
// 版本: V1.1,  2024年4月19日20:24:01
//========================================================================
u8 GPIO_PIN_ReSet(u8 GPIO, u8 GPIO_Pin_x)
{
    if(GPIO > GPIO_P5)				return 1;	//空操作
    if(GPIO_Pin_x > GPIO_Pin_7)	    return 2;	//空操作

    if(GPIO == GPIO_P0)
    {
        P0 &= (~ GPIO_Pin_x);
    }
    else if(GPIO == GPIO_P1)
    {
        P1 &= (~ GPIO_Pin_x);
    }
    else if(GPIO == GPIO_P2)
    {
        P2 &= (~ GPIO_Pin_x);
    }
    else if(GPIO == GPIO_P3)
    {
        P3 &= (~ GPIO_Pin_x);
    }
    else if(GPIO == GPIO_P4)
    {
        P4 &= (~ GPIO_Pin_x);
    }
    else if(GPIO == GPIO_P5)
    {
        P5 &= (~ GPIO_Pin_x);
    }

    return 0;
}

三、总结

新的函数内容无论从内容,还是操作效率上都比原结构要简洁高效;各位朋友是否还有更高效的实现方式,欢迎留言

04-20 04:22