STC 32位8051单片机开发实例教程 二 I/O工作模式及其配置

2023-10-29

1. I/O工作模式 STC 32G系列单片机最多有64Pin引脚,最多有60个I/O口。如下图示:

STC32G系列单片机的 I/O口都有4种工作模式:准双向口(弱上拉)、推挽输出(强上拉)、高阻输入(电流不能流入也不能流出)、开漏输出。P30、P31上电复位状态为准双向(弱上拉)模式,其余I/O口上电复位状态为高阻输入,这与STC15系列,有所不同。

要使用I/O口需配置 I/O口的工作模式,STC32G系列单片机除有与工作模式配置有关的端口配置寄存器(PxM0、PxM1)、端口数据寄存器外Px,还有端口上拉电阻控制寄存器(enable/disable 内部4.1K上拉电阻)PxPU、端口施密特触发控制寄存器(enable/disable 施密特触发功能)PxNCS、端口电平转换速度控制寄存器(使转换速度可进行快慢切换)、端口驱动电流控制寄存器(使端口驱动能力能在一般驱动能力与增强驱动能力间切换)PxSR、端口数字信号输入使能控制寄存器(enable/disable 数字信号输入)PxIE、端口下拉电阻控制寄存器(enable/disable内部10K下拉电阻)。较STC15系列单片机要复杂得多。

STC32G系列单片机的 I/O口的工作模式通过端口配置寄存器(PxM0、PxM1)来配置,配置方法如下:

2.不同工作模式下的I/O结构图

 STC32G系列单片机的准双向 I/O结构图如下:

  STC32G系列单片机的推挽输出 I/O结构图如下:

STC32G系列单片机的高阻输入 I/O结构图如下: 

 STC32G系列单片机的开漏 I/O结构图如下:

  STC32G系列单片机相对于STC8位8051单片机新增了4.1K上拉电阻于10K下拉电阻,如下:

 4.库函数  STC 官网上提供了STC32G的库函数目前的最新为第4版,发布日期为2022年6月9号。下载解压后,在library文件夹下可看到的文件如下:

其中STC32G_GPIO.h的代码如下:

/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------*/
/* --- Web: www.STCMCUDATA.com  ---------------------------------------*/
/* --- QQ:  800003751 -------------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序            */
/*---------------------------------------------------------------------*/

#ifndef	__STC32G_GPIO_H
#define	__STC32G_GPIO_H

#include "config.h"

//========================================================================
//                            端口模式设置
//========================================================================
//准双向口
#define  P0_MODE_IO_PU(Pin)				{P0M1 &= ~(Pin), P0M0 &= ~(Pin);}
#define  P1_MODE_IO_PU(Pin)				{P1M1 &= ~(Pin), P1M0 &= ~(Pin);}
#define  P2_MODE_IO_PU(Pin)				{P2M1 &= ~(Pin), P2M0 &= ~(Pin);}
#define  P3_MODE_IO_PU(Pin)				{P3M1 &= ~(Pin), P3M0 &= ~(Pin);}
#define  P4_MODE_IO_PU(Pin)				{P4M1 &= ~(Pin), P4M0 &= ~(Pin);}
#define  P5_MODE_IO_PU(Pin)				{P5M1 &= ~(Pin), P5M0 &= ~(Pin);}
#define  P6_MODE_IO_PU(Pin)				{P6M1 &= ~(Pin), P6M0 &= ~(Pin);}
#define  P7_MODE_IO_PU(Pin)				{P7M1 &= ~(Pin), P7M0 &= ~(Pin);}
//高阻输入
#define  P0_MODE_IN_HIZ(Pin)			{P0M1 |= (Pin), P0M0 &= ~(Pin);}
#define  P1_MODE_IN_HIZ(Pin)			{P1M1 |= (Pin), P1M0 &= ~(Pin);}
#define  P2_MODE_IN_HIZ(Pin)			{P2M1 |= (Pin), P2M0 &= ~(Pin);}
#define  P3_MODE_IN_HIZ(Pin)			{P3M1 |= (Pin), P3M0 &= ~(Pin);}
#define  P4_MODE_IN_HIZ(Pin)			{P4M1 |= (Pin), P4M0 &= ~(Pin);}
#define  P5_MODE_IN_HIZ(Pin)			{P5M1 |= (Pin), P5M0 &= ~(Pin);}
#define  P6_MODE_IN_HIZ(Pin)			{P6M1 |= (Pin), P6M0 &= ~(Pin);}
#define  P7_MODE_IN_HIZ(Pin)			{P7M1 |= (Pin), P7M0 &= ~(Pin);}
//漏极开路
#define  P0_MODE_OUT_OD(Pin)			{P0M1 |= (Pin), P0M0 |= (Pin);}
#define  P1_MODE_OUT_OD(Pin)			{P1M1 |= (Pin), P1M0 |= (Pin);}
#define  P2_MODE_OUT_OD(Pin)			{P2M1 |= (Pin), P2M0 |= (Pin);}
#define  P3_MODE_OUT_OD(Pin)			{P3M1 |= (Pin), P3M0 |= (Pin);}
#define  P4_MODE_OUT_OD(Pin)			{P4M1 |= (Pin), P4M0 |= (Pin);}
#define  P5_MODE_OUT_OD(Pin)			{P5M1 |= (Pin), P5M0 |= (Pin);}
#define  P6_MODE_OUT_OD(Pin)			{P6M1 |= (Pin), P6M0 |= (Pin);}
#define  P7_MODE_OUT_OD(Pin)			{P7M1 |= (Pin), P7M0 |= (Pin);}
//推挽输出
#define  P0_MODE_OUT_PP(Pin)			{P0M1 &= ~(Pin), P0M0 |= (Pin);}
#define  P1_MODE_OUT_PP(Pin)			{P1M1 &= ~(Pin), P1M0 |= (Pin);}
#define  P2_MODE_OUT_PP(Pin)			{P2M1 &= ~(Pin), P2M0 |= (Pin);}
#define  P3_MODE_OUT_PP(Pin)			{P3M1 &= ~(Pin), P3M0 |= (Pin);}
#define  P4_MODE_OUT_PP(Pin)			{P4M1 &= ~(Pin), P4M0 |= (Pin);}
#define  P5_MODE_OUT_PP(Pin)			{P5M1 &= ~(Pin), P5M0 |= (Pin);}
#define  P6_MODE_OUT_PP(Pin)			{P6M1 &= ~(Pin), P6M0 |= (Pin);}
#define  P7_MODE_OUT_PP(Pin)			{P7M1 &= ~(Pin), P7M0 |= (Pin);}

//========================================================================
//                         端口内部4.1K上拉设置
//========================================================================
//上拉使能
#define P0_PULL_UP_ENABLE(Pin)		P0PU |= (Pin)
#define P1_PULL_UP_ENABLE(Pin)		P1PU |= (Pin)
#define P2_PULL_UP_ENABLE(Pin)		P2PU |= (Pin)
#define P3_PULL_UP_ENABLE(Pin)		P3PU |= (Pin)
#define P4_PULL_UP_ENABLE(Pin)		P4PU |= (Pin)
#define P5_PULL_UP_ENABLE(Pin)		P5PU |= (Pin)
#define P6_PULL_UP_ENABLE(Pin)		P6PU |= (Pin)
#define P7_PULL_UP_ENABLE(Pin)		P7PU |= (Pin)
//上拉禁止
#define P0_PULL_UP_DISABLE(Pin)		P0PU &= ~(Pin)
#define P1_PULL_UP_DISABLE(Pin)		P1PU &= ~(Pin)
#define P2_PULL_UP_DISABLE(Pin)		P2PU &= ~(Pin)
#define P3_PULL_UP_DISABLE(Pin)		P3PU &= ~(Pin)
#define P4_PULL_UP_DISABLE(Pin)		P4PU &= ~(Pin)
#define P5_PULL_UP_DISABLE(Pin)		P5PU &= ~(Pin)
#define P6_PULL_UP_DISABLE(Pin)		P6PU &= ~(Pin)
#define P7_PULL_UP_DISABLE(Pin)		P7PU &= ~(Pin)

//========================================================================
//                           端口施密特触发设置
//========================================================================
//施密特触发使能
#define P0_ST_ENABLE(Pin)					P0NCS &= ~(Pin)
#define P1_ST_ENABLE(Pin)					P1NCS &= ~(Pin)
#define P2_ST_ENABLE(Pin)					P2NCS &= ~(Pin)
#define P3_ST_ENABLE(Pin)					P3NCS &= ~(Pin)
#define P4_ST_ENABLE(Pin)					P4NCS &= ~(Pin)
#define P5_ST_ENABLE(Pin)					P5NCS &= ~(Pin)
#define P6_ST_ENABLE(Pin)					P6NCS &= ~(Pin)
#define P7_ST_ENABLE(Pin)					P7NCS &= ~(Pin)
//施密特触发禁止
#define P0_ST_DISABLE(Pin)				P0NCS |= (Pin)
#define P1_ST_DISABLE(Pin)				P1NCS |= (Pin)
#define P2_ST_DISABLE(Pin)				P2NCS |= (Pin)
#define P3_ST_DISABLE(Pin)				P3NCS |= (Pin)
#define P4_ST_DISABLE(Pin)				P4NCS |= (Pin)
#define P5_ST_DISABLE(Pin)				P5NCS |= (Pin)
#define P6_ST_DISABLE(Pin)				P6NCS |= (Pin)
#define P7_ST_DISABLE(Pin)				P7NCS |= (Pin)

//========================================================================
//                          端口电平转换速度设置
//========================================================================
//电平转换慢速,相应的上下冲比较小
#define P0_SPEED_LOW(Pin)					P0SR |= (Pin) 
#define P1_SPEED_LOW(Pin)					P1SR |= (Pin) 
#define P2_SPEED_LOW(Pin)					P2SR |= (Pin) 
#define P3_SPEED_LOW(Pin)					P3SR |= (Pin) 
#define P4_SPEED_LOW(Pin)					P4SR |= (Pin) 
#define P5_SPEED_LOW(Pin)					P5SR |= (Pin) 
#define P6_SPEED_LOW(Pin)					P6SR |= (Pin) 
#define P7_SPEED_LOW(Pin)					P7SR |= (Pin) 
//电平转换快速,相应的上下冲比较大
#define P0_SPEED_HIGH(Pin)				P0SR &= ~(Pin) 
#define P1_SPEED_HIGH(Pin)				P1SR &= ~(Pin) 
#define P2_SPEED_HIGH(Pin)				P2SR &= ~(Pin) 
#define P3_SPEED_HIGH(Pin)				P3SR &= ~(Pin) 
#define P4_SPEED_HIGH(Pin)				P4SR &= ~(Pin) 
#define P5_SPEED_HIGH(Pin)				P5SR &= ~(Pin) 
#define P6_SPEED_HIGH(Pin)				P6SR &= ~(Pin) 
#define P7_SPEED_HIGH(Pin)				P7SR &= ~(Pin) 

//========================================================================
//                          端口驱动电流控制设置
//========================================================================
//一般驱动能力
#define P0_DRIVE_MEDIUM(Pin)			P0DR |= (Pin)
#define P1_DRIVE_MEDIUM(Pin)			P1DR |= (Pin)
#define P2_DRIVE_MEDIUM(Pin)			P2DR |= (Pin)
#define P3_DRIVE_MEDIUM(Pin)			P3DR |= (Pin)
#define P4_DRIVE_MEDIUM(Pin)			P4DR |= (Pin)
#define P5_DRIVE_MEDIUM(Pin)			P5DR |= (Pin)
#define P6_DRIVE_MEDIUM(Pin)			P6DR |= (Pin)
#define P7_DRIVE_MEDIUM(Pin)			P7DR |= (Pin)
//增强驱动能力
#define P0_DRIVE_HIGH(Pin)				P0DR &= ~(Pin)
#define P1_DRIVE_HIGH(Pin)				P1DR &= ~(Pin)
#define P2_DRIVE_HIGH(Pin)				P2DR &= ~(Pin)
#define P3_DRIVE_HIGH(Pin)				P3DR &= ~(Pin)
#define P4_DRIVE_HIGH(Pin)				P4DR &= ~(Pin)
#define P5_DRIVE_HIGH(Pin)				P5DR &= ~(Pin)
#define P6_DRIVE_HIGH(Pin)				P6DR &= ~(Pin)
#define P7_DRIVE_HIGH(Pin)				P7DR &= ~(Pin)

//========================================================================
//                          端口数字信号输入使能
//========================================================================
//使能数字信号输入
#define P0_DIGIT_IN_ENABLE(Pin)		P0IE |= (Pin)
#define P1_DIGIT_IN_ENABLE(Pin)		P1IE |= (Pin)
#define P2_DIGIT_IN_ENABLE(Pin)		P2IE |= (Pin)
#define P3_DIGIT_IN_ENABLE(Pin)		P3IE |= (Pin)
#define P4_DIGIT_IN_ENABLE(Pin)		P4IE |= (Pin)
#define P5_DIGIT_IN_ENABLE(Pin)		P5IE |= (Pin)
#define P6_DIGIT_IN_ENABLE(Pin)		P6IE |= (Pin)
#define P7_DIGIT_IN_ENABLE(Pin)		P7IE |= (Pin)
//禁止数字信号输入
#define P0_DIGIT_IN_DISABLE(Pin)	P0IE &= ~(Pin)
#define P1_DIGIT_IN_DISABLE(Pin)	P1IE &= ~(Pin)
#define P2_DIGIT_IN_DISABLE(Pin)	P2IE &= ~(Pin)
#define P3_DIGIT_IN_DISABLE(Pin)	P3IE &= ~(Pin)
#define P4_DIGIT_IN_DISABLE(Pin)	P4IE &= ~(Pin)
#define P5_DIGIT_IN_DISABLE(Pin)	P5IE &= ~(Pin)
#define P6_DIGIT_IN_DISABLE(Pin)	P6IE &= ~(Pin)
#define P7_DIGIT_IN_DISABLE(Pin)	P7IE &= ~(Pin)

//========================================================================
//                              定义声明
//========================================================================

#define	GPIO_PullUp		0	//上拉准双向口
#define	GPIO_HighZ		1	//浮空输入
#define	GPIO_OUT_OD		2	//开漏输出
#define	GPIO_OUT_PP		3	//推挽输出

#define	GPIO_Pin_0		0x01	//IO引脚 Px.0
#define	GPIO_Pin_1		0x02	//IO引脚 Px.1
#define	GPIO_Pin_2		0x04	//IO引脚 Px.2
#define	GPIO_Pin_3		0x08	//IO引脚 Px.3
#define	GPIO_Pin_4		0x10	//IO引脚 Px.4
#define	GPIO_Pin_5		0x20	//IO引脚 Px.5
#define	GPIO_Pin_6		0x40	//IO引脚 Px.6
#define	GPIO_Pin_7		0x80	//IO引脚 Px.7
#define	GPIO_Pin_LOW	0x0F	//IO低4位引脚
#define	GPIO_Pin_HIGH	0xF0	//IO高4位引脚
#define	GPIO_Pin_All	0xFF	//IO所有引脚

#define	GPIO_P0			0		//
#define	GPIO_P1			1
#define	GPIO_P2			2
#define	GPIO_P3			3
#define	GPIO_P4			4
#define	GPIO_P5			5
#define	GPIO_P6			6
#define	GPIO_P7			7


typedef struct
{
	u8	Mode;		//IO模式,  		GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
	u8	Pin;		//要设置的端口	
} GPIO_InitTypeDef;

u8	GPIO_Inilize(u8 GPIO, GPIO_InitTypeDef *GPIOx);

#endif

STC32G_GPIO.c中的代码如下:

/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------*/
/* --- Web: www.STCMCUDATA.com  ---------------------------------------*/
/* --- QQ:  800003751 -------------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序            */
/*---------------------------------------------------------------------*/

#include	"STC32G_GPIO.h"

//========================================================================
// 函数: u8	GPIO_Inilize(u8 GPIO, GPIO_InitTypeDef *GPIOx)
// 描述: 初始化IO口.
// 参数: GPIOx: 结构参数,请参考timer.h里的定义.
// 返回: 成功返回 SUCCESS, 错误返回 FAIL.
// 版本: V1.0, 2012-10-22
//========================================================================
u8	GPIO_Inilize(u8 GPIO, GPIO_InitTypeDef *GPIOx)
{
	if(GPIO > GPIO_P7)				return FAIL;	//错误
	if(GPIOx->Mode > GPIO_OUT_PP)	return FAIL;	//错误
	if(GPIO == GPIO_P0)
	{
		if(GPIOx->Mode == GPIO_PullUp)		P0M1 &= ~GPIOx->Pin,	P0M0 &= ~GPIOx->Pin;	 //上拉准双向口
		if(GPIOx->Mode == GPIO_HighZ)			P0M1 |=  GPIOx->Pin,	P0M0 &= ~GPIOx->Pin;	 //浮空输入
		if(GPIOx->Mode == GPIO_OUT_OD)		P0M1 |=  GPIOx->Pin,	P0M0 |=  GPIOx->Pin;	 //开漏输出
		if(GPIOx->Mode == GPIO_OUT_PP)		P0M1 &= ~GPIOx->Pin,	P0M0 |=  GPIOx->Pin;	 //推挽输出
	}
	if(GPIO == GPIO_P1)
	{
		if(GPIOx->Mode == GPIO_PullUp)		P1M1 &= ~GPIOx->Pin,	P1M0 &= ~GPIOx->Pin;	 //上拉准双向口
		if(GPIOx->Mode == GPIO_HighZ)			P1M1 |=  GPIOx->Pin,	P1M0 &= ~GPIOx->Pin;	 //浮空输入
		if(GPIOx->Mode == GPIO_OUT_OD)		P1M1 |=  GPIOx->Pin,	P1M0 |=  GPIOx->Pin;	 //开漏输出
		if(GPIOx->Mode == GPIO_OUT_PP)		P1M1 &= ~GPIOx->Pin,	P1M0 |=  GPIOx->Pin;	 //推挽输出
	}
	if(GPIO == GPIO_P2)
	{
		if(GPIOx->Mode == GPIO_PullUp)		P2M1 &= ~GPIOx->Pin,	P2M0 &= ~GPIOx->Pin;	 //上拉准双向口
		if(GPIOx->Mode == GPIO_HighZ)			P2M1 |=  GPIOx->Pin,	P2M0 &= ~GPIOx->Pin;	 //浮空输入
		if(GPIOx->Mode == GPIO_OUT_OD)		P2M1 |=  GPIOx->Pin,	P2M0 |=  GPIOx->Pin;	 //开漏输出
		if(GPIOx->Mode == GPIO_OUT_PP)		P2M1 &= ~GPIOx->Pin,	P2M0 |=  GPIOx->Pin;	 //推挽输出
	}
	if(GPIO == GPIO_P3)
	{
		if(GPIOx->Mode == GPIO_PullUp)		P3M1 &= ~GPIOx->Pin,	P3M0 &= ~GPIOx->Pin;	 //上拉准双向口
		if(GPIOx->Mode == GPIO_HighZ)			P3M1 |=  GPIOx->Pin,	P3M0 &= ~GPIOx->Pin;	 //浮空输入
		if(GPIOx->Mode == GPIO_OUT_OD)		P3M1 |=  GPIOx->Pin,	P3M0 |=  GPIOx->Pin;	 //开漏输出
		if(GPIOx->Mode == GPIO_OUT_PP)		P3M1 &= ~GPIOx->Pin,	P3M0 |=  GPIOx->Pin;	 //推挽输出
	}
	if(GPIO == GPIO_P4)
	{
		if(GPIOx->Mode == GPIO_PullUp)		P4M1 &= ~GPIOx->Pin,	P4M0 &= ~GPIOx->Pin;	 //上拉准双向口
		if(GPIOx->Mode == GPIO_HighZ)			P4M1 |=  GPIOx->Pin,	P4M0 &= ~GPIOx->Pin;	 //浮空输入
		if(GPIOx->Mode == GPIO_OUT_OD)		P4M1 |=  GPIOx->Pin,	P4M0 |=  GPIOx->Pin;	 //开漏输出
		if(GPIOx->Mode == GPIO_OUT_PP)		P4M1 &= ~GPIOx->Pin,	P4M0 |=  GPIOx->Pin;	 //推挽输出
	}
	if(GPIO == GPIO_P5)
	{
		if(GPIOx->Mode == GPIO_PullUp)		P5M1 &= ~GPIOx->Pin,	P5M0 &= ~GPIOx->Pin;	 //上拉准双向口
		if(GPIOx->Mode == GPIO_HighZ)			P5M1 |=  GPIOx->Pin,	P5M0 &= ~GPIOx->Pin;	 //浮空输入
		if(GPIOx->Mode == GPIO_OUT_OD)		P5M1 |=  GPIOx->Pin,	P5M0 |=  GPIOx->Pin;	 //开漏输出
		if(GPIOx->Mode == GPIO_OUT_PP)		P5M1 &= ~GPIOx->Pin,	P5M0 |=  GPIOx->Pin;	 //推挽输出
	}
	if(GPIO == GPIO_P6)
	{
		if(GPIOx->Mode == GPIO_PullUp)		P6M1 &= ~GPIOx->Pin,	P6M0 &= ~GPIOx->Pin;	 //上拉准双向口
		if(GPIOx->Mode == GPIO_HighZ)			P6M1 |=  GPIOx->Pin,	P6M0 &= ~GPIOx->Pin;	 //浮空输入
		if(GPIOx->Mode == GPIO_OUT_OD)		P6M1 |=  GPIOx->Pin,	P6M0 |=  GPIOx->Pin;	 //开漏输出
		if(GPIOx->Mode == GPIO_OUT_PP)		P6M1 &= ~GPIOx->Pin,	P6M0 |=  GPIOx->Pin;	 //推挽输出
	}
	if(GPIO == GPIO_P7)
	{
		if(GPIOx->Mode == GPIO_PullUp)		P7M1 &= ~GPIOx->Pin,	P7M0 &= ~GPIOx->Pin;	 //上拉准双向口
		if(GPIOx->Mode == GPIO_HighZ)			P7M1 |=  GPIOx->Pin,	P7M0 &= ~GPIOx->Pin;	 //浮空输入
		if(GPIOx->Mode == GPIO_OUT_OD)		P7M1 |=  GPIOx->Pin,	P7M0 |=  GPIOx->Pin;	 //开漏输出
		if(GPIOx->Mode == GPIO_OUT_PP)		P7M1 &= ~GPIOx->Pin,	P7M0 |=  GPIOx->Pin;	 //推挽输出
	}
	return SUCCESS;	//成功
}

注意STC32G_GPIO.h中包含了头文件config.h及自定义的数据类型符号,需从Independent_Programme文件夹下的子目录下将下面两个头文件Copy到library文件夹下,否则编译会报错。

下面是我自己写的库函数,头文件如下:

/*STC32G_GPIO.h
  Designed by Bill Liu
  Version 0.0 
  Modified last by Bill Liu on 06/23/2022
*/

#ifndef	__STC32G_GPIO_H
#define	__STC32G_GPIO_H
#include <STC32G.h>
#include "config.h"
#include "mtype.h"

//***************************************
typedef enum
{
  PIN0 = 0x01, 
  PIN1 = 0x02, 
  PIN2 = 0x04, 
  PIN3 = 0x08, 
  PIN4 = 0x10, 
  PIN5 = 0x20, 
  PIN6 = 0x40, 
  PIN7 = 0x80  
}IOPORT_PIN;

//***************************************
typedef enum
{
  SCT_P0 = 0x01, //P0 port
  SCT_P1 = 0x02, //P1 port
  SCT_P2 = 0x04, //P2 port
  SCT_P3 = 0x08, //P3 port
  SCT_P4 = 0x10, //P4 port
  SCT_P5 = 0x20, //P5 port
  SCT_P6 = 0x40, //P6 port
  SCT_P7 = 0x80  //P7 port
}STC32G_IOPORT;

//***************************************
typedef enum
{
  BI_IO = 0, //bidirectional I/O
	PP_OUT,    //push_pull out
	HI_IN,     //high impendence in
	ODR_OUT     //open drain out
}STC32G_IOMODE;

/****************************************
Function: STC32G_P0PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable);
Return value: void
pins: pins to init,
mode: configure work mode
pullUpEnable: 0-pullup disable, 1-pull up enable
pullDownEnable: 0-pull down disable,1-pull down enable
drvEn: 1-drive ability enhance enable, 0-drive ability enhance disable
speedHi; 1- I/O speed high enable, 0- I/O speed high disable
dIEnable: 1- digital singal input enable, 0- digital singal input enable
sTEnable: 1-schmitt trigger enable, 0-schmitt trigger disable
Example:
STC32G_P0PinsInit(PIN0|PIN3, BI_IO, 0, 0,0,1,1,1);
****************************************/
void STC32G_P0PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable);

/****************************************
Function: STC32G_P1PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable);
Return value: void
pins: pins to init,
mode: configure work mode
pullUpEnable: 0-pullup disable, 1-pull up enable
pullDownEnable: 0-pull down disable,1-pull down enable
drvEn: 1-drive ability enhance enable, 0-drive ability enhance disable
speedHi; 1- I/O speed high enable, 0- I/O speed high disable
dIEnable: 1- digital singal input enable, 0- digital singal input enable
sTEnable: 1-schmitt trigger enable, 0-schmitt trigger disable
Example:
STC32G_P1PinsInit(PIN0|PIN3, BI_IO, 0, 0,0,1,1,1);
****************************************/
void STC32G_P1PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable);

/****************************************
Function: STC32G_P2PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable);
Return value: void
pins: pins to init,
mode: configure work mode
pullUpEnable: 0-pullup disable, 1-pull up enable
pullDownEnable: 0-pull down disable,1-pull down enable
drvEn: 1-drive ability enhance enable, 0-drive ability enhance disable
speedHi; 1- I/O speed high enable, 0- I/O speed high disable
dIEnable: 1- digital singal input enable, 0- digital singal input enable
sTEnable: 1-schmitt trigger enable, 0-schmitt trigger disable
Example:
STC32G_P2PinsInit(PIN0|PIN3, BI_IO, 0, 0,0,1,1,1);
****************************************/
void STC32G_P2PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable);

/****************************************
Function: STC32G_P3PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable);
Return value: void
pins: pins to init,
mode: configure work mode
pullUpEnable: 0-pullup disable, 1-pull up enable
pullDownEnable: 0-pull down disable,1-pull down enable
drvEn: 1-drive ability enhance enable, 0-drive ability enhance disable
speedHi; 1- I/O speed high enable, 0- I/O speed high disable
dIEnable: 1- digital singal input enable, 0- digital singal input enable
sTEnable: 1-schmitt trigger enable, 0-schmitt trigger disable
Example:
STC32G_P3PinsInit(PIN0|PIN3, BI_IO, 0, 0,0,1,1,1);
****************************************/
void STC32G_P3PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable);

/****************************************
Function: STC32G_P4PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable);
Return value: void
pins: pins to init,
mode: configure work mode
pullUpEnable: 0-pullup disable, 1-pull up enable
pullDownEnable: 0-pull down disable,1-pull down enable
drvEn: 1-drive ability enhance enable, 0-drive ability enhance disable
speedHi; 1- I/O speed high enable, 0- I/O speed high disable
dIEnable: 1- digital singal input enable, 0- digital singal input enable
sTEnable: 1-schmitt trigger enable, 0-schmitt trigger disable
Example:
STC32G_P4PinsInit(PIN0|PIN3, BI_IO, 0, 0,0,1,1,1);
****************************************/
void STC32G_P4PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable);

/****************************************
Function: STC32G_P5PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable);
Return value: void
pins: pins to init,
mode: configure work mode
pullUpEnable: 0-pullup disable, 1-pull up enable
pullDownEnable: 0-pull down disable,1-pull down enable
drvEn: 1-drive ability enhance enable, 0-drive ability enhance disable
speedHi; 1- I/O speed high enable, 0- I/O speed high disable
dIEnable: 1- digital singal input enable, 0- digital singal input enable
sTEnable: 1-schmitt trigger enable, 0-schmitt trigger disable
Example:
STC32G_P5PinsInit(PIN0|PIN3, BI_IO, 0, 0,0,1,1,1);
****************************************/
void STC32G_P5PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable);

/****************************************
Function: STC32G_P6PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable);
Return value: void
pins: pins to init,
mode: configure work mode
pullUpEnable: 0-pullup disable, 1-pull up enable
pullDownEnable: 0-pull down disable,1-pull down enable
drvEn: 1-drive ability enhance enable, 0-drive ability enhance disable
speedHi; 1- I/O speed high enable, 0- I/O speed high disable
dIEnable: 1- digital singal input enable, 0- digital singal input enable
sTEnable: 1-schmitt trigger enable, 0-schmitt trigger disable
Example:
STC32G_P6PinsInit(PIN0|PIN3, BI_IO, 0, 0,0,1,1,1);
****************************************/
void STC32G_P6PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable);

/****************************************
Function: STC32G_P7PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable);
Return value: void
pins: pins to init,
mode: configure work mode
pullUpEnable: 0-pullup disable, 1-pull up enable
pullDownEnable: 0-pull down disable,1-pull down enable
drvEn: 1-drive ability enhance enable, 0-drive ability enhance disable
speedHi; 1- I/O speed high enable, 0- I/O speed high disable
dIEnable: 1- digital singal input enable, 0- digital singal input enable
sTEnable: 1-schmitt trigger enable, 0-schmitt trigger disable
Example:
STC32G_P7PinsInit(PIN0|PIN3, BI_IO, 0, 0,0,1,1,1);
****************************************/
void STC32G_P7PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable);

/****************************************
Function: STC32G_PortsPinsInit(ui8 ports,ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable);
Return value: void
ports: ports to init
pins: pins to init,
mode: configure work mode
pullUpEnable: 0-pullup disable, 1-pull up enable
pullDownEnable: 0-pull down disable,1-pull down enable
drvEn: 1-drive ability enhance enable, 0-drive ability enhance disable
speedHi; 1- I/O speed high enable, 0- I/O speed high disable
dIEnable: 1- digital singal input enable, 0- digital singal input enable
sTEnable: 1-schmitt trigger enable, 0-schmitt trigger disable
Example:
STC32G_PortsPinsInit(SCT_P0|SCT_P1|SCT_P6,PIN0|PIN3, BI_IO, 0, 0,0,1,1,1);
****************************************/
void STC32G_PortsPinsInit(ui8 ports,ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable);

#endif

库函数源代码如下:

/*STC32G_GPIO.h
  Designed by Bill Liu
  Version 0.0 
  Modified last by Bill Liu on 06/23/2022
*/

#include	"STC32G_GPIO.h"

//*********************************************************************************************************************************************/
void STC32G_P0PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable)
{
	SysInit();
	switch(mode)
	{
		case BI_IO:
			P0M1 &= ~pins;
			P0M0 &= ~pins;
			break;
		case PP_OUT:
			P0M1 &= ~pins;
			P0M0 |= pins;
			break;
		case HI_IN:
			P0M1 |= pins;
			P0M0 &= pins;
			break;
		case ODR_OUT:
			P0M1 |= pins;
			P0M0 |= pins;
			break;
	}
	if(pullUpEnable)
		P0PU |= pins;
	else
		P0PU &= ~pins;
	if(pullDownEnable)
		P0DR |= pins;
	else
		P0DR &= ~pins;
	if(drvEn)
		P0DR &= ~pins;
	else
		P0DR |= pins;
	if(speedHi)
		P0SR &= ~pins;
	else
		P0SR |= pins;
	if(dIEnable)
		P0IE |= pins;
	else
		P0IE &= ~pins;
	if(sTEnable)
		P0NCS &= ~pins;
	else
		P0NCS |= pins;
}
//End of STC32G_P0PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable)

//*********************************************************************************************************************************************/
void STC32G_P1PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable)
{
	SysInit();
	switch(mode)
	{
		case BI_IO:
			P1M1 &= ~pins;
			P1M0 &= ~pins;
			break;
		case PP_OUT:
			P1M1 &= ~pins;
			P1M0 |= pins;
			break;
		case HI_IN:
			P1M1 |= pins;
			P1M0 &= pins;
			break;
		case ODR_OUT:
			P1M1 |= pins;
			P1M0 |= pins;
			break;
	}
	if(pullUpEnable)
		P1PU |= pins;
	else
		P1PU &= ~pins;
	if(pullDownEnable)
		P1DR |= pins;
	else
		P1DR &= ~pins;
	if(drvEn)
		P1DR &= ~pins;
	else
		P1DR |= pins;
	if(speedHi)
		P1SR &= ~pins;
	else
		P1SR |= pins;
	if(dIEnable)
		P1IE |= pins;
	else
		P1IE &= ~pins;
	if(sTEnable)
		P1NCS &= ~pins;
	else
		P1NCS |= pins;
}
//End of STC32G_P1PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable)

//**********************************************************************************************************************************************/
void STC32G_P2PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable)
{
	SysInit();
	switch(mode)
	{
		case BI_IO:
			P2M1 &= ~pins;
			P2M0 &= ~pins;
			break;
		case PP_OUT:
			P2M1 &= ~pins;
			P2M0 |= pins;
			break;
		case HI_IN:
			P2M1 |= pins;
			P2M0 &= pins;
			break;
		case ODR_OUT:
			P2M1 |= pins;
			P2M0 |= pins;
			break;
	}
	if(pullUpEnable)
		P2PU |= pins;
	else
		P2PU &= ~pins;
	if(pullDownEnable)
		P2DR |= pins;
	else
		P2DR &= ~pins;
	if(drvEn)
		P2DR &= ~pins;
	else
		P2DR |= pins;
	if(speedHi)
		P2SR &= ~pins;
	else
		P2SR |= pins;
	if(dIEnable)
		P2IE |= pins;
	else
		P2IE &= ~pins;
	if(sTEnable)
		P2NCS &= ~pins;
	else
		P2NCS |= pins;
}
//End of STC32G_P2PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable)

//*********************************************************************************************************************************************/
void STC32G_P3PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable)
{
	SysInit();
	switch(mode)
	{
		case BI_IO:
			P3M1 &= ~pins;
			P3M0 &= ~pins;
			break;
		case PP_OUT:
			P3M1 &= ~pins;
			P3M0 |= pins;
			break;
		case HI_IN:
			P3M1 |= pins;
			P3M0 &= pins;
			break;
		case ODR_OUT:
			P3M1 |= pins;
			P3M0 |= pins;
			break;
	}
	if(pullUpEnable)
		P3PU |= pins;
	else
		P3PU &= ~pins;
	if(pullDownEnable)
		P3DR |= pins;
	else
		P3DR &= ~pins;
	if(drvEn)
		P3DR &= ~pins;
	else
		P3DR |= pins;
	if(speedHi)
		P3SR &= ~pins;
	else
		P3SR |= pins;
	if(dIEnable)
		P3IE |= pins;
	else
		P3IE &= ~pins;
	if(sTEnable)
		P3NCS &= ~pins;
	else
		P3NCS |= pins;
}
//End of STC32G_P3PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable)

//**********************************************************************************************************************************************/
void STC32G_P4PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable)
{
	SysInit();
	switch(mode)
	{
		case BI_IO:
			P4M1 &= ~pins;
			P4M0 &= ~pins;
			break;
		case PP_OUT:
			P4M1 &= ~pins;
			P4M0 |= pins;
			break;
		case HI_IN:
			P4M1 |= pins;
			P4M0 &= pins;
			break;
		case ODR_OUT:
			P4M1 |= pins;
			P4M0 |= pins;
			break;
	}
	if(pullUpEnable)
		P4PU |= pins;
	else
		P4PU &= ~pins;
	if(pullDownEnable)
		P4DR |= pins;
	else
		P4DR &= ~pins;
	if(drvEn)
		P4DR &= ~pins;
	else
		P4DR |= pins;
	if(speedHi)
		P4SR &= ~pins;
	else
		P4SR |= pins;
	if(dIEnable)
		P4IE |= pins;
	else
		P4IE &= ~pins;
	if(sTEnable)
		P4NCS &= ~pins;
	else
		P4NCS |= pins;
}
//End of STC32G_P4PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable)

//**********************************************************************************************************************************************/
void STC32G_P5PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable)
{
	SysInit();
	switch(mode)
	{
		case BI_IO:
			P5M1 &= ~pins;
			P5M0 &= ~pins;
			break;
		case PP_OUT:
			P5M1 &= ~pins;
			P5M0 |= pins;
			break;
		case HI_IN:
			P5M1 |= pins;
			P5M0 &= pins;
			break;
		case ODR_OUT:
			P5M1 |= pins;
			P5M0 |= pins;
			break;
	}
	if(pullUpEnable)
		P5PU |= pins;
	else
		P5PU &= ~pins;
	if(pullDownEnable)
		P5DR |= pins;
	else
		P5DR &= ~pins;
	if(drvEn)
		P5DR &= ~pins;
	else
		P5DR |= pins;
	if(speedHi)
		P5SR &= ~pins;
	else
		P5SR |= pins;
	if(dIEnable)
		P5IE |= pins;
	else
		P5IE &= ~pins;
	if(sTEnable)
		P5NCS &= ~pins;
	else
		P5NCS |= pins;
}
//End of STC32G_P5PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable)

//**********************************************************************************************************************************************/
void STC32G_P6PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable)
{
	SysInit();
	switch(mode)
	{
		case BI_IO:
			P6M1 &= ~pins;
			P6M0 &= ~pins;
			break;
		case PP_OUT:
			P6M1 &= ~pins;
			P6M0 |= pins;
			break;
		case HI_IN:
			P6M1 |= pins;
			P6M0 &= pins;
			break;
		case ODR_OUT:
			P6M1 |= pins;
			P6M0 |= pins;
			break;
	}
	if(pullUpEnable)
		P6PU |= pins;
	else
		P6PU &= ~pins;
	if(pullDownEnable)
		P6DR |= pins;
	else
		P6DR &= ~pins;
	if(drvEn)
		P6DR &= ~pins;
	else
		P6DR |= pins;
	if(speedHi)
		P6SR &= ~pins;
	else
		P6SR |= pins;
	if(dIEnable)
		P6IE |= pins;
	else
		P6IE &= ~pins;
	if(sTEnable)
		P6NCS &= ~pins;
	else
		P6NCS |= pins;
}
//End of STC32G_P6PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable)

//**********************************************************************************************************************************************/
void STC32G_P7PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable)
{
	SysInit();
	switch(mode)
	{
		case BI_IO:
			P7M1 &= ~pins;
			P7M0 &= ~pins;
			break;
		case PP_OUT:
			P7M1 &= ~pins;
			P7M0 |= pins;
			break;
		case HI_IN:
			P7M1 |= pins;
			P7M0 &= pins;
			break;
		case ODR_OUT:
			P7M1 |= pins;
			P7M0 |= pins;
			break;
	}
	if(pullUpEnable)
		P7PU |= pins;
	else
		P7PU &= ~pins;
	if(pullDownEnable)
		P7DR |= pins;
	else
		P7DR &= ~pins;
	if(drvEn)
		P7DR &= ~pins;
	else
		P7DR |= pins;
	if(speedHi)
		P7SR &= ~pins;
	else
		P7SR |= pins;
	if(dIEnable)
		P7IE |= pins;
	else
		P7IE &= ~pins;
	if(sTEnable)
		P7NCS &= ~pins;
	else
		P7NCS |= pins;
}
//End of STC32G_P7PinsInit(ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable)

/***************************************************************************************************************************************************/
void STC32G_PortsPinsInit(ui8 ports,ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable)
{
	ui8 i;
	for(i = 0; i < 8; i++)
	{
		if(ports & (1 << i))
		{
			switch(i)
			{
				case 0:
					STC32G_P0PinsInit(pins, mode, pullUpEnable, pullDownEnable,drvEn,speedHi,dIEnable, sTEnable);
					break;
				case 1:
					STC32G_P1PinsInit(pins, mode, pullUpEnable, pullDownEnable,drvEn,speedHi,dIEnable, sTEnable);
					break;
				case 2:
					STC32G_P2PinsInit(pins, mode, pullUpEnable, pullDownEnable,drvEn,speedHi,dIEnable, sTEnable);
					break;
				case 3:
					STC32G_P3PinsInit(pins, mode, pullUpEnable, pullDownEnable,drvEn,speedHi,dIEnable, sTEnable);
					break;
				case 4:
					STC32G_P4PinsInit(pins, mode, pullUpEnable, pullDownEnable,drvEn,speedHi,dIEnable, sTEnable);
					break;
				case 5:
					STC32G_P5PinsInit(pins, mode, pullUpEnable, pullDownEnable,drvEn,speedHi,dIEnable, sTEnable);
					break;
				case 6:
					STC32G_P6PinsInit(pins, mode, pullUpEnable, pullDownEnable,drvEn,speedHi,dIEnable, sTEnable);
					break;
				case 7:
					STC32G_P7PinsInit(pins, mode, pullUpEnable, pullDownEnable,drvEn,speedHi,dIEnable, sTEnable);
					break;
			}
		}
	}
}
//End of STC32G_PortsPinsInit(ui8 ports,ui8 pins, STC32G_IOMODE mode, BOOL pullUpEnable, BOOL pullDownEnable,BOOL drvEn,BOOL speedHi,BOOL dIEnable, BOOL sTEnable)

我也将config.h 做了修改,修改后的代码如下:

/*STC32G_GPIO.h
  Designed by Bill Liu
  Version 0.0 
  Modified last by Bill Liu on 06/23/2022
*/
#ifndef __CONFIG_H__
#define __CONFIG_H__

#define FOSC                    35000000UL
//#define FOSC                    24000000UL
//#define FOSC                    27000000UL
//#define FOSC                    30000000UL
//#define FOSC                    33177600UL



//********************************************************
void SysInit(); //init System speed  fastest


#endif

config.c的源代码如下:

/*config.c
  Designed by Bill Liu
  Version 0.0 
  Modified last by Bill Liu on 06/22/2022
*/

#include <STC32G.h>
#include "config.h"

//********************************************************
void SysInit() //init System speed  fastest
{
	EAXFR = 1;		//visit XFR enable
	CKCON = 0x00; //set outer data bus speed fastest
	WTST = 0x00;  //CPU wait 0 to run program
}
//End of SysInit()

5. I/O配置实例 下面将用我自己写的库函数来演示验证I/O配置。我将以下面这块板来做验证

 这块板用白线隔开将板分成了三个区域,左边为电源区,中间为模拟采样及MCU区域,右边为逻辑输入输出区。再看一下单片机的型号:

 先编译下面的空程序,将其下载到单片机中,看能否下在成功。

/*main.c
  Designed by Bill Liu
  Version 0.0 
  Modified last by Bill Liu on 06/22/2022
*/

#include "main.h"
#include "config.h"

void main()
{
	
}
//End of main()

 下载成功,如下:

 测一下I/O口的输出电压,随意选一个I/O口测试(实际测试的是P73),测试结果如下。

视乎输出了低电平,应该是既不输出高电平也不输出低电平(没电流流入,也没电流流出), 看它能否驱动Led,下面是一个能够正常点亮的LED:

先将接电源端不变,另一端将其 接在与P73连接的排针上,看LED是否任被点亮,结果如下:

LED未被点亮 说明确实没有电流输入。SCT32G上电复位时I/O口处于高阻输入状态,一方面可以增强抗干扰能力,另一方面可以避免该单片机控制的电路载单片机上电复位时误动作。

在main()函数中插入如下代码:

void main()
{
	STC32G_P7PinsInit(PIN3, BI_IO, 0, 0, 0, 0, 0, 0);
	P73 = 0;
	while(1);
}
//End of main()

编译下载,如果库函数没有问题,LED应该亮起,结果如下:

说明库函数没有错误。将main()函数中的代码修改如下:

void main()
{
	STC32G_P7PinsInit(PIN3, BI_IO, 0, 0, 0, 0, 0, 0);
	P73 = 1;
	while(1);
}
//End of main()

 编译下载到单片机,先来测试下双向I/O弱上拉的正向驱动能力。结果如下:

LED仅发出微弱的亮光,说明I/O正向驱动能力弱。现将上拉电阻使能,即库函数的第三个参数设为1,修改main()函数中的代码如下:

void main()
{
	STC32G_P7PinsInit(PIN3, BI_IO, 1, 0, 0, 0, 0, 0);
	P73 = 1;
	while(1);
}
//End of main()

编译下载后的结果如下:

 LED变亮,说明正向驱动能力有所增强。现将驱动电流增大,将下面红框中的变量设为1,看下结果如和变化:

void main()
{
	STC32G_P7PinsInit(PIN3, BI_IO, 0, 0, 1, 0, 0, 0);
	P73 = 1;
	while(1);
}
//End of main()

 编译下载,结果如下:

感觉与双向I/O弱上拉的正向驱动能力差不多。再看一下,打开下拉电阻时双向I/O弱上拉的正向驱动能力。修改main()函数代码如下:

void main()
{
	STC32G_P7PinsInit(PIN3, BI_IO, 0, 1, 0, 0, 0, 0);
	P73 = 1;
	while(1);
}
//End of main()

编译下载到单片机的结果如下:

 感觉LED亮度变化并不明显。

STC32G的 I/O 较STC15  的I/O新增新的功能与寄存器,从上面的测试可以看出,I/O的负向驱动能力较强(可承受较大的灌电流),正向驱动能力弱,如果要使I/O口有较大的正向驱动能力,需将其设置为推挽模式,如果设置为双向I/O,需使能上拉电阻才能使其正向驱动能力有所提升,使能PxDR对提供双向I/O的正向驱动能力并不明显,可能仅是对提高I/O的电平转换速度有用。

下面再测试一下I/O的读写,将main()函数的代码修改如下:

void main()
{
	STC32G_P7PinsInit(PIN3, BI_IO, 1, 0, 1, 0, 1, 0);
	P73 = 1;
	STC32G_P0PinsInit(0xFF, BI_IO, 0, 0, 0, 0, 1, 1); //init to bidirectional I/O, pull up disable, pull down disable , dive ability enhance disable, 
	//high speed disable, digital singal input enable, schmitt trigger enable
	STC32G_P2PinsInit(0xFF, BI_IO, 0, 0, 0, 0, 1, 1);
    P0 = 0xA0;
    P2 = 0xFF;
	while(1)
	{
		
		if(P2==P0)
			P73 = 1;
		else
			P73 = 0;
	}
}
//End of main()

编译下载后的结果如下:

 LED为P73正向驱动,LED亮,说明P2、P0正常读取数据。现将将main()函数的代码修改如下:

void main()
{
	STC32G_P7PinsInit(PIN3, BI_IO, 1, 0, 1, 0, 1, 0);
	P73 = 1;
	STC32G_P0PinsInit(0xFF, BI_IO, 0, 0, 0, 0, 1, 1); //init to bidirectional I/O, pull up disable, pull down disable , dive ability enhance disable, 
	//high speed disable, digital singal input enable, schmitt trigger enable
	STC32G_P2PinsInit(0xFF, BI_IO, 0, 0, 0, 0, 1, 0);
    P0 = 0xA0;
    P2 = 0xFF;
	while(1)
	{
		
		if(P2==P0)
			P73 = 1;
		else
			P73 = 0;
	}
}
//End of main()

 编译下载结果如下:

 说明即使不使能施密特触发器,依然可以读取数据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STC 32位8051单片机开发实例教程 二 I/O工作模式及其配置 的相关文章

  • Andy‘s First Dictionary C++ STL set应用

    目录 题目描述 思路分析 代码 题目描述 原文 Andy 8 has a dream he wants to produce his very own dictionary This is not an easy task for him
  • vue实现动态锚点

    div class dialog header item item div 需要点击的目标增加click事件 并且把索引传下去 没有索引也没有关系 想传什么传什么 锚点 getActiveClass index let jump docum
  • 「网页开发|前端开发|Vue」05 Vue实战:从零到一实现一个网站导航栏

    本文主要介绍如何从最开始的草图 通过确定基本结构 修改元素布局 美化外观来实现一个网站导航栏 从而熟悉网页开发的基本流程 同时 我们会把性能 规范性 可维护性方面的代码优化也考虑其中 文章目录 本系列前文传送门 一 场景说明 设计目标 二
  • 几种常用激活函数的简介

    1 sigmod函数 函数公式和图表如下图 在sigmod函数中我们可以看到 其输出是在 0 1 这个开区间内 这点很有意思 可以联想到概率 但是严格意义上讲 不要当成概率 sigmod函数曾经是比较流行的 它可以想象成一个神经元的放电率
  • Python正则表达式学习(3)——re.compile()

    re compile pattern flags 0 将正则表达式 pattern 编译为正则表达式对象 可用于使用其 match 和search 方法进行匹配 顺序 prog re compile pattern result prog

随机推荐

  • Pinctrl子系统之一了解基础概念

    1 Linux Pinctrl子系统简介 在许多soc内部都包含有pin控制器 通过pin控制器的寄存器 我们可以配置一个或者一组引脚的功能和特性 在软件方面 Linux内核提供了pinctrl子系统 目的是为了统一各soc厂商的pin脚管
  • TreeView —WPF—MVVM—HierarchicalDataTemplate

    摘要 采用HierarchicalDataTemplate数据模板和treeview在MVVM模式下实现行政区划树 支持勾选 勾选父节点 子节点回全部自动勾选 子节点部分勾选时 父节点半勾选 子节点全部勾选时 父节点勾选 反之亦然 Hier
  • 吴恩达9.3 反向传播的直观理解

    为了更好地理解反向传播算法 我们再来仔细研究一下前向传播的原理 前向传播算法 反向传播算法做的是
  • Qt基础——UI文件.h文件说明

    首先 需要使用Qt Designer设计你的UI界面 Qt号称是跨平台应用程序和UI开发框架 所以其自带的UI设计器 即Qt Designer 功能也非常强大 除了通常用的如Button List等组件外面 使用Qt Designer做UI
  • mac出现wifi没有ip地址无法接入互联网

    问题 情况 wifi已经输入密码正确 但是中间出现灰色的wifi图标 还有一个叹号 说是没有IP地址 解决方法 1 试过重启 2 试过删掉该网络再重新输入密码 3 试过删掉WiFi一栏 来自百度 最佳答案 1 首先打开偏好设置 点击网络选项
  • 用Python赚钱的方法有哪些?

    很多人想知道用Python赚钱的方法有哪些 Python很容易使用 应用性较强 可以通过使用Python开发小程序 抓取数据 游戏开发 兼职编程老师 发展副业的方式来赚钱 文末有福利 用Python赚钱的方法 1 某宝搜python程序 可
  • java多线程设计模式

    1 I O处理比较花费时间 故把执行I O处理和非IO处理的线程分开 CPU执行速度很快 而内存的写入 读取很慢 所以有关CPU和内存交互会降低指令的速度 2 start方法运行有2个步骤 启动新的线程 运行new对象的run方法 3 所有
  • AD19 PCB设计导入元件库、导出pdf、定义板子形状、生成元件库、铺铜基本操作总结

    导入元件库 1 点击右侧components 2 右键 然后选择 Add or Remove Libraries 3 点击从文件安装 4 选择库文件 导出PDF 导出原理图或者pcb等信息pdf操作 文件 gt 智能pdf 定义板子形状 使
  • 慕课第四周第7题 出租车计价

    出租车计价 4分 题目内容 已知某城市普通出租车收费标准为 起步里程为3公里 起步费为8元 10公里以内超过起步里程的部分 每公里加收2元 超过10公里以上的部分加收50 的回空补贴费 即每公里3元 出租车营运过程中 因堵车和乘客要求临时停
  • eigen 教程和指南

    转自 http eigen tuxfamily org dox 2 0 TutorialCore html https blog csdn net xuezhisdc article details 54619853 固定大小的矩阵和向量
  • 两个多项式的相加操作 C语言(链式存储结构)

    内容 完成两个多项式的相加操作 已知有两个多项式P x Q x 设计算法实现P x Q x 运算 而且对加法运算不重新开辟存储空间 要求用链式存储结构 例如 P x 5x 3 2x 1 Q x 3x 3 x 2 2x 3 其计算输出结果为
  • RHEL8、CentOS8配置本地YUM源

    1 挂载光盘镜像到一个指定的目录 2 创建一个仓库配置文件 3 编辑 etc fstab配置文件 让光盘开机自动挂载 4 使用yum dnf命令来安装软件 仓库名称 具有唯一性的标识名称 不应与其他软件仓库发生冲突 描述信息 name 可以
  • 如何将JSON字符串转化成对象

    在这里只能使用ObjiectMapper这个类才能将Json字符串转成对象的格式进行输出 话不多说 直接上代码 实体类 实体类 Setter Getter public class UserInfo implements Serializa
  • 搭建个人备忘录中心服务memos、轻量级笔记服务

    目录 一 源码 二 官网 三 搭建 四 使用 一 源码 GitHub usememos memos A privacy first lightweight note taking service Easily capture and sha
  • 计算机网络 第四章网络层(6)网络地址转换 NAT多协议标记交换 MPLS MPLS 协议的基本原理

    关注公众号凡花花的小窝 收获更多的考研计算机专业编程相关的资料 4 8 2 网络地址转换 NAT 问题 在专用网上使用专用地址的主机如何与互联网上的主机通信 并不需要加密 解决 再申请一些全球 IP 地址 但这在很多情况下是不容易做到的 采
  • 机器学习 :训练集、验证集、测试集分配比例

    根据 统计学习方法 中的观点 如果给定的样本数据充足 进行模型选择的一种简单方法是随机地将数据集切分成三部分 分别为训练集 training set 验证集 validation set 和测试集 test set 训练集用来训练模型 验证
  • JS解析详细分析

    1 确定js的位置 1 1 观察按钮的绑定js事件 通过点击按钮 然后点击Event Listener 部分网站可以找到绑定的事件 对应的 只需要点击即可跳转到js的位置 1 2 通过search all file 来搜索 部分网站的按钮可
  • 如何检查 Linux 中的程序和监听的端口

    在 Linux 或者类 Unix 中 我该如何检查某个端口是否被占用 我又该如何验证 Linux 服务器中有哪些端口处于监听状态 验证哪些端口在服务器的网络接口上处于监听状态是非常重要的 你需要注意那些开放端口来检测网络入侵 除了网络入侵
  • LRU Cache的数据结构选择以及实现

    LRU LRU是Least Recently Used的缩写 意思是最近最少使用 它是一种Cache替换算法 什么是Cache 狭义的Cache指的是位于CPU和主存间的快速RAM 通常它不像系统主存那样使用DRAM技术 而使用昂贵但较快速
  • STC 32位8051单片机开发实例教程 二 I/O工作模式及其配置

    1 I O工作模式 STC 32G系列单片机最多有64Pin引脚 最多有60个I O口 如下图示 STC32G系列单片机的 I O口都有4种工作模式 准双向口 弱上拉 推挽输出 强上拉 高阻输入 电流不能流入也不能流出 开漏输出 P30 P