重新写了一下软件串口的函数库
本帖最后由 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
#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: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
#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);
}
}
能不能提供一下源码 在对 #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");
}
} soma 发表于 2024-6-14 17:50
能不能提供一下源码
放在顶楼了 {:4_165:}{:4_165:}
页:
[1]