Qinluoyao 发表于 2024-6-14 17:28:58

重新写了一下软件串口的函数库

本帖最后由 Qinluoyao 于 2024-6-14 17:54 编辑

STC官方的软件函数库每次编译后只能使用一个IO口,在部分情况下不是特别灵活,因此我修改了一下官方的函数库,将IO口以函数的方式调用能够更加灵活实现相关功能。#ifndef __SOFT_PIN_H
#define __SOFT_PIN_H

#include "config.h"

typedef enum{
      PIN_LOW,
      PIN_HIGH,
      PIN_TOGGLE,
      PIN_READ
}sPin_State_t;

typedef sPin_State_t (*sPin_t)(sPin_State_t);

typedef struct
{
      sPin_t sP00, sP01, sP02, sP03, sP04, sP05, sP06, sP07;
      sPin_t sP10, sP11, sP12, sP13, sP14, sP15, sP16, sP17;
      sPin_t sP20, sP21, sP22, sP23, sP24, sP25, sP26, sP27;
      sPin_t sP30, sP31, sP32, sP33, sP34, sP35, sP36, sP37;
      sPin_t sP40, sP41, sP42, sP43, sP44, sP45, sP46, sP47;
      sPin_t sP50, sP51, sP52, sP53, sP54, sP55, sP56, sP57;
      sPin_t sP60, sP61, sP62, sP63, sP64, sP65, sP66, sP67;
      sPin_t sP70, sP71, sP72, sP73, sP74;
}sPin_Group_t;

extern sPin_Group_t xdata sPin;

void sPin_Group_init(void);


#endif // !__SOFT_PIN_H

Qinluoyao 发表于 2024-6-14 17:45:48

#include "STC32G_GPIO.h"
#include "Soft_Pin.h"

sPin_State_t TRANSITIVE_P00(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P00;
                case PIN_TOGGLE: P00 = !P00; return P00;
                default: P00 = value; return P00;
        }
}

sPin_State_t TRANSITIVE_P01(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P01;
                case PIN_TOGGLE: P01 = !P01; return P01;
                default: P01 = value; return P01;
        }
}

sPin_State_t TRANSITIVE_P02(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P02;
                case PIN_TOGGLE: P02 = !P02; return P02;
                default: P02 = value; return P02;
        }
}

sPin_State_t TRANSITIVE_P03(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P03;
                case PIN_TOGGLE: P03 = !P03; return P03;
                default: P03 = value; return P03;
        }
}

sPin_State_t TRANSITIVE_P04(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P04;
                case PIN_TOGGLE: P04 = !P04; return P04;
                default: P04 = value; return P04;
        }
}

sPin_State_t TRANSITIVE_P05(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P05;
                case PIN_TOGGLE: P05 = !P05; return P05;
                default: P05 = value; return P05;
        }
}

sPin_State_t TRANSITIVE_P06(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P06;
                case PIN_TOGGLE: P06 = !P06; return P06;
                default: P06 = value; return P06;
        }
}

sPin_State_t TRANSITIVE_P07(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P07;
                case PIN_TOGGLE: P07 = !P07; return P07;
                default: P07 = value; return P07;
        }
}

sPin_State_t TRANSITIVE_P10(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P10;
                case PIN_TOGGLE: P10 = !P10; return P10;
                default: P10 = value; return P10;
        }
}

sPin_State_t TRANSITIVE_P11(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P11;
                case PIN_TOGGLE: P11 = !P11; return P11;
                default: P11 = value; return P11;
        }
}

sPin_State_t TRANSITIVE_P12(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P12;
                case PIN_TOGGLE: P12 = !P12; return P12;
                default: P12 = value; return P12;
        }
}

sPin_State_t TRANSITIVE_P13(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P13;
                case PIN_TOGGLE: P13 = !P13; return P13;
                default: P13 = value; return P13;
        }
}

sPin_State_t TRANSITIVE_P14(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P14;
                case PIN_TOGGLE: P14 = !P14; return P14;
                default: P14 = value; return P14;
        }
}

sPin_State_t TRANSITIVE_P15(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P15;
                case PIN_TOGGLE: P15 = !P15; return P15;
                default: P15 = value; return P15;
        }
}

sPin_State_t TRANSITIVE_P16(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P16;
                case PIN_TOGGLE: P16 = !P16; return P16;
                default: P16 = value; return P16;
        }
}

sPin_State_t TRANSITIVE_P17(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P17;
                case PIN_TOGGLE: P17 = !P17; return P17;
                default: P17 = value; return P17;
        }
}

sPin_State_t TRANSITIVE_P20(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P20;
                case PIN_TOGGLE: P20 = !P20; return P20;
                default: P20 = value; return P20;
        }
}

sPin_State_t TRANSITIVE_P21(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P21;
                case PIN_TOGGLE: P21 = !P21; return P21;
                default: P21 = value; return P21;
        }
}

sPin_State_t TRANSITIVE_P22(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P22;
                case PIN_TOGGLE: P22 = !P22; return P22;
                default: P22 = value; return P22;
        }
}

sPin_State_t TRANSITIVE_P23(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P23;
                case PIN_TOGGLE: P23 = !P23; return P23;
                default: P23 = value; return P23;
        }
}

sPin_State_t TRANSITIVE_P24(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P24;
                case PIN_TOGGLE: P24 = !P24; return P24;
                default: P24 = value; return P24;
        }
}

sPin_State_t TRANSITIVE_P25(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P25;
                case PIN_TOGGLE: P25 = !P25; return P25;
                default: P25 = value; return P25;
        }
}

sPin_State_t TRANSITIVE_P26(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P26;
                case PIN_TOGGLE: P26 = !P26; return P26;
                default: P26 = value; return P26;
        }
}

sPin_State_t TRANSITIVE_P27(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P27;
                case PIN_TOGGLE: P27 = !P27; return P27;
                default: P27 = value; return P27;
        }
}

sPin_State_t TRANSITIVE_P30(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P30;
                case PIN_TOGGLE: P30 = !P30; return P30;
                default: P30 = value; return P30;
        }
}

sPin_State_t TRANSITIVE_P31(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P31;
                case PIN_TOGGLE: P31 = !P31; return P31;
                default: P31 = value; return P31;
        }
}

sPin_State_t TRANSITIVE_P32(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P32;
                case PIN_TOGGLE: P32 = !P32; return P32;
                default: P32 = value; return P32;
        }
}

sPin_State_t TRANSITIVE_P33(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P33;
                case PIN_TOGGLE: P33 = !P33; return P33;
                default: P33 = value; return P33;
        }
}

sPin_State_t TRANSITIVE_P34(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P34;
                case PIN_TOGGLE: P34 = !P34; return P34;
                default: P34 = value; return P34;
        }
}

sPin_State_t TRANSITIVE_P35(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P35;
                case PIN_TOGGLE: P35 = !P35; return P35;
                default: P35 = value; return P35;
        }
}

sPin_State_t TRANSITIVE_P36(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P36;
                case PIN_TOGGLE: P36 = !P36; return P36;
                default: P36 = value; return P36;
        }
}

sPin_State_t TRANSITIVE_P37(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P37;
                case PIN_TOGGLE: P37 = !P37; return P37;
                default: P37 = value; return P37;
        }
}

sPin_State_t TRANSITIVE_P40(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P40;
                case PIN_TOGGLE: P40 = !P40; return P40;
                default: P40 = value; return P40;
        }
}

sPin_State_t TRANSITIVE_P41(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P41;
                case PIN_TOGGLE: P41 = !P41; return P41;
                default: P41 = value; return P41;
        }
}

sPin_State_t TRANSITIVE_P42(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P42;
                case PIN_TOGGLE: P42 = !P42; return P42;
                default: P42 = value; return P42;
        }
}

sPin_State_t TRANSITIVE_P43(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P43;
                case PIN_TOGGLE: P43 = !P43; return P43;
                default: P43 = value; return P43;
        }
}

sPin_State_t TRANSITIVE_P44(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P44;
                case PIN_TOGGLE: P44 = !P44; return P44;
                default: P44 = value; return P44;
        }
}

sPin_State_t TRANSITIVE_P45(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P45;
                case PIN_TOGGLE: P45 = !P45; return P45;
                default: P45 = value; return P45;
        }
}

sPin_State_t TRANSITIVE_P46(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P46;
                case PIN_TOGGLE: P46 = !P46; return P46;
                default: P46 = value; return P46;
        }
}

sPin_State_t TRANSITIVE_P47(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P47;
                case PIN_TOGGLE: P47 = !P47; return P47;
                default: P47 = value; return P47;
        }
}

sPin_State_t TRANSITIVE_P50(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P50;
                case PIN_TOGGLE: P50 = !P50; return P50;
                default: P50 = value; return P50;
        }
}

sPin_State_t TRANSITIVE_P51(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P51;
                case PIN_TOGGLE: P51 = !P51; return P51;
                default: P51 = value; return P51;
        }
}

sPin_State_t TRANSITIVE_P52(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P52;
                case PIN_TOGGLE: P52 = !P52; return P52;
                default: P52 = value; return P52;
        }
}

sPin_State_t TRANSITIVE_P53(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P53;
                case PIN_TOGGLE: P53 = !P53; return P53;
                default: P53 = value; return P53;
        }
}

sPin_State_t TRANSITIVE_P54(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P54;
                case PIN_TOGGLE: P54 = !P54; return P54;
                default: P54 = value; return P54;
        }
}

sPin_State_t TRANSITIVE_P55(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P55;
                case PIN_TOGGLE: P55 = !P55; return P55;
                default: P55 = value; return P55;
        }
}

sPin_State_t TRANSITIVE_P56(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P56;
                case PIN_TOGGLE: P56 = !P56; return P56;
                default: P56 = value; return P56;
        }
}

sPin_State_t TRANSITIVE_P57(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P57;
                case PIN_TOGGLE: P57 = !P57; return P57;
                default: P57 = value; return P57;
        }
}

sPin_State_t TRANSITIVE_P60(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P60;
                case PIN_TOGGLE: P60 = !P60; return P60;
                default: P60 = value; return P60;
        }
}

sPin_State_t TRANSITIVE_P61(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P61;
                case PIN_TOGGLE: P61 = !P61; return P61;
                default: P61 = value; return P61;
        }
}

sPin_State_t TRANSITIVE_P62(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P62;
                case PIN_TOGGLE: P62 = !P62; return P62;
                default: P62 = value; return P62;
        }
}

sPin_State_t TRANSITIVE_P63(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P63;
                case PIN_TOGGLE: P63 = !P63; return P63;
                default: P63 = value; return P63;
        }
}

sPin_State_t TRANSITIVE_P64(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P64;
                case PIN_TOGGLE: P64 = !P64; return P64;
                default: P64 = value; return P64;
        }
}

sPin_State_t TRANSITIVE_P65(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P65;
                case PIN_TOGGLE: P65 = !P65; return P65;
                default: P65 = value; return P65;
        }
}

sPin_State_t TRANSITIVE_P66(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P66;
                case PIN_TOGGLE: P66 = !P66; return P66;
                default: P66 = value; return P66;
        }
}

sPin_State_t TRANSITIVE_P67(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P67;
                case PIN_TOGGLE: P67 = !P67; return P67;
                default: P67 = value; return P67;
        }
}

sPin_State_t TRANSITIVE_P70(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P70;
                case PIN_TOGGLE: P70 = !P70; return P70;
                default: P70 = value; return P70;
        }
}

sPin_State_t TRANSITIVE_P71(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P71;
                case PIN_TOGGLE: P71 = !P71; return P71;
                default: P71 = value; return P71;
        }
}

sPin_State_t TRANSITIVE_P72(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P72;
                case PIN_TOGGLE: P72 = !P72; return P72;
                default: P72 = value; return P72;
        }
}

sPin_State_t TRANSITIVE_P73(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P73;
                case PIN_TOGGLE: P73 = !P73; return P73;
                default: P73 = value; return P73;
        }
}

sPin_State_t TRANSITIVE_P74(sPin_State_t value)
{
        switch (value)
        {
                case PIN_READ: return P74;
                case PIN_TOGGLE: P74 = !P74; return P74;
                default: P74 = value; return P74;
        }
}


sPin_Group_t xdata sPin;

void sPin_Group_init(void)
{
        sPin.sP00 = TRANSITIVE_P00;
        sPin.sP01 = TRANSITIVE_P01;
        sPin.sP02 = TRANSITIVE_P02;
        sPin.sP03 = TRANSITIVE_P03;
        sPin.sP04 = TRANSITIVE_P04;
        sPin.sP05 = TRANSITIVE_P05;
        sPin.sP06 = TRANSITIVE_P06;
        sPin.sP07 = TRANSITIVE_P07;
        sPin.sP10 = TRANSITIVE_P10;
        sPin.sP11 = TRANSITIVE_P11;
        sPin.sP12 = TRANSITIVE_P12;
        sPin.sP13 = TRANSITIVE_P13;
        sPin.sP14 = TRANSITIVE_P14;
        sPin.sP15 = TRANSITIVE_P15;
        sPin.sP16 = TRANSITIVE_P16;
        sPin.sP17 = TRANSITIVE_P17;
        sPin.sP20 = TRANSITIVE_P20;
        sPin.sP21 = TRANSITIVE_P21;
        sPin.sP22 = TRANSITIVE_P22;
        sPin.sP23 = TRANSITIVE_P23;
        sPin.sP24 = TRANSITIVE_P24;
        sPin.sP25 = TRANSITIVE_P25;
        sPin.sP26 = TRANSITIVE_P26;
        sPin.sP27 = TRANSITIVE_P27;
        sPin.sP30 = TRANSITIVE_P30;
        sPin.sP31 = TRANSITIVE_P31;
        sPin.sP32 = TRANSITIVE_P32;
        sPin.sP33 = TRANSITIVE_P33;
        sPin.sP34 = TRANSITIVE_P34;
        sPin.sP35 = TRANSITIVE_P35;
        sPin.sP36 = TRANSITIVE_P36;
        sPin.sP37 = TRANSITIVE_P37;
        sPin.sP40 = TRANSITIVE_P40;
        sPin.sP41 = TRANSITIVE_P41;
        sPin.sP42 = TRANSITIVE_P42;
        sPin.sP43 = TRANSITIVE_P43;
        sPin.sP44 = TRANSITIVE_P44;
        sPin.sP45 = TRANSITIVE_P45;
        sPin.sP46 = TRANSITIVE_P46;
        sPin.sP47 = TRANSITIVE_P47;
        sPin.sP50 = TRANSITIVE_P50;
        sPin.sP51 = TRANSITIVE_P51;
        sPin.sP52 = TRANSITIVE_P52;
        sPin.sP53 = TRANSITIVE_P53;
        sPin.sP54 = TRANSITIVE_P54;
        sPin.sP55 = TRANSITIVE_P55;
        sPin.sP56 = TRANSITIVE_P56;
        sPin.sP57 = TRANSITIVE_P57;
        sPin.sP60 = TRANSITIVE_P60;
        sPin.sP61 = TRANSITIVE_P61;
        sPin.sP62 = TRANSITIVE_P62;
        sPin.sP63 = TRANSITIVE_P63;
        sPin.sP64 = TRANSITIVE_P64;
        sPin.sP65 = TRANSITIVE_P65;
        sPin.sP66 = TRANSITIVE_P66;
        sPin.sP67 = TRANSITIVE_P67;
        sPin.sP70 = TRANSITIVE_P70;
        sPin.sP71 = TRANSITIVE_P71;
        sPin.sP72 = TRANSITIVE_P72;
        sPin.sP73 = TRANSITIVE_P73;
        sPin.sP74 = TRANSITIVE_P74;
}





Qinluoyao 发表于 2024-6-14 17:46:19

Qinluoyao 发表于 2024-6-14 17:45


#ifndef __SOFT_UART_H
#define __SOFT_UART_H

#include "config.h"
#include "Soft_Pin.h"

void sTxSendAbyte(sPin_t sTXD,uint32_t BaudRate, u8 dat);
void sPrintString(sPin_t sTXD,uint32_t BaudRate, u8 *str);

#endif // !__SOFT_UART_H

Qinluoyao 发表于 2024-6-14 17:46:41

Qinluoyao 发表于 2024-6-14 17:46


#include "Soft_Uart.h"

extern void delayMicro(uint32_t micros);
//========================================================================
// 函数: sBitTime_Delay(value)
// 描述: 位时间函数。
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2013-4-1
// 备注:
//========================================================================
#define sBitTime_Delay(value)   delayMicro(value)        //请使用微秒延时函数

//-------------------------------------------------------------------------------------------------------------------
// 函数简介: 模拟串口发送一个字节
// 输入参数: sTXD:发送端口        参照Soft_Pin.h文件中的sPin_t定义
//             BaudRate:波特率
//             dat:要发送的数据字节
// 输出参数: 无
// 返回值    : 无
//-------------------------------------------------------------------------------------------------------------------
void sTxSendAbyte(sPin_t sTXD,uint32_t BaudRate, u8 dat)
{
        u8        i;
        BaudRate = (1000000.0 / BaudRate);
        EA = 0;
        sTXD(PIN_LOW);
        sBitTime_Delay(BaudRate);
        for(i=0; i<8; i++)
        {
                if(dat & 1)                sTXD(PIN_HIGH);
                else                        sTXD(PIN_LOW);
                dat >>= 1;
                sBitTime_Delay(BaudRate);
        }
        sTXD(PIN_HIGH);
        EA = 1;
        sBitTime_Delay(BaudRate);
        sBitTime_Delay(BaudRate);
}


//========================================================================
// 函数: void sPrintString(sPin_t sTXD,uint32_t BaudRate, u8 *str)
// 描述: 模拟串口发送一个字符串
// 参数: sTXD:发送端口        参照Soft_Pin.h文件中的sPin_t定义
//       BaudRate:波特率
//       str:要发送的字符串
// 返回: none.
// 备注:
//========================================================================
void sPrintString(sPin_t sTXD,uint32_t BaudRate, u8 *str)
{
        u8        i, dat;
        BaudRate = (1000000.0 / BaudRate);
    for (; *str != '\0'; str++)
        {
                dat = *str;
                EA = 0;
                sTXD(PIN_LOW);
                sBitTime_Delay(BaudRate);
                for(i=0; i<8; i++)
                {
                        if(dat & 1)                sTXD(PIN_HIGH);
                        else                        sTXD(PIN_LOW);
                        dat >>= 1;
                        sBitTime_Delay(BaudRate);
                }
                sTXD(PIN_HIGH);
                EA = 1;
                sBitTime_Delay(BaudRate);
                sBitTime_Delay(BaudRate);
        }
}



soma 发表于 2024-6-14 17:50:41

能不能提供一下源码

Qinluoyao 发表于 2024-6-14 17:52:15

在对 #define sBitTime_Delay(value) 进行微秒定向后初
调用sPin_Group_init(); 对软件IO口进行初始化
void main(void)
{
        Clock_init();
        sPin_Group_init();
        while (1)
        {
                sPrintString(sPin.sP31, 115200, "P31\n");
                sPrintString(sPin.sP01, 115200, "P01\n");
        }
}

Qinluoyao 发表于 2024-6-14 17:55:19

soma 发表于 2024-6-14 17:50
能不能提供一下源码

放在顶楼了

giveyou 发表于 2024-11-11 15:03:45

{:4_165:}{:4_165:}
页: [1]
查看完整版本: 重新写了一下软件串口的函数库