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         7typedef struct
{u8 Mode;       //IO模式,         GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PPu8    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.hDesigned by Bill LiuVersion 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 portSCT_P1 = 0x02, //P1 portSCT_P2 = 0x04, //P2 portSCT_P3 = 0x08, //P3 portSCT_P4 = 0x10, //P4 portSCT_P5 = 0x20, //P5 portSCT_P6 = 0x40, //P6 portSCT_P7 = 0x80  //P7 port
}STC32G_IOPORT;//***************************************
typedef enum
{BI_IO = 0, //bidirectional I/OPP_OUT,    //push_pull outHI_IN,     //high impendence inODR_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.hDesigned by Bill LiuVersion 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;elseP0PU &= ~pins;if(pullDownEnable)P0DR |= pins;elseP0DR &= ~pins;if(drvEn)P0DR &= ~pins;elseP0DR |= pins;if(speedHi)P0SR &= ~pins;elseP0SR |= pins;if(dIEnable)P0IE |= pins;elseP0IE &= ~pins;if(sTEnable)P0NCS &= ~pins;elseP0NCS |= 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;elseP1PU &= ~pins;if(pullDownEnable)P1DR |= pins;elseP1DR &= ~pins;if(drvEn)P1DR &= ~pins;elseP1DR |= pins;if(speedHi)P1SR &= ~pins;elseP1SR |= pins;if(dIEnable)P1IE |= pins;elseP1IE &= ~pins;if(sTEnable)P1NCS &= ~pins;elseP1NCS |= 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;elseP2PU &= ~pins;if(pullDownEnable)P2DR |= pins;elseP2DR &= ~pins;if(drvEn)P2DR &= ~pins;elseP2DR |= pins;if(speedHi)P2SR &= ~pins;elseP2SR |= pins;if(dIEnable)P2IE |= pins;elseP2IE &= ~pins;if(sTEnable)P2NCS &= ~pins;elseP2NCS |= 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;elseP3PU &= ~pins;if(pullDownEnable)P3DR |= pins;elseP3DR &= ~pins;if(drvEn)P3DR &= ~pins;elseP3DR |= pins;if(speedHi)P3SR &= ~pins;elseP3SR |= pins;if(dIEnable)P3IE |= pins;elseP3IE &= ~pins;if(sTEnable)P3NCS &= ~pins;elseP3NCS |= 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;elseP4PU &= ~pins;if(pullDownEnable)P4DR |= pins;elseP4DR &= ~pins;if(drvEn)P4DR &= ~pins;elseP4DR |= pins;if(speedHi)P4SR &= ~pins;elseP4SR |= pins;if(dIEnable)P4IE |= pins;elseP4IE &= ~pins;if(sTEnable)P4NCS &= ~pins;elseP4NCS |= 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;elseP5PU &= ~pins;if(pullDownEnable)P5DR |= pins;elseP5DR &= ~pins;if(drvEn)P5DR &= ~pins;elseP5DR |= pins;if(speedHi)P5SR &= ~pins;elseP5SR |= pins;if(dIEnable)P5IE |= pins;elseP5IE &= ~pins;if(sTEnable)P5NCS &= ~pins;elseP5NCS |= 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;elseP6PU &= ~pins;if(pullDownEnable)P6DR |= pins;elseP6DR &= ~pins;if(drvEn)P6DR &= ~pins;elseP6DR |= pins;if(speedHi)P6SR &= ~pins;elseP6SR |= pins;if(dIEnable)P6IE |= pins;elseP6IE &= ~pins;if(sTEnable)P6NCS &= ~pins;elseP6NCS |= 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;elseP7PU &= ~pins;if(pullDownEnable)P7DR |= pins;elseP7DR &= ~pins;if(drvEn)P7DR &= ~pins;elseP7DR |= pins;if(speedHi)P7SR &= ~pins;elseP7SR |= pins;if(dIEnable)P7IE |= pins;elseP7IE &= ~pins;if(sTEnable)P7NCS &= ~pins;elseP7NCS |= 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.hDesigned by Bill LiuVersion 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.cDesigned by Bill LiuVersion 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 enableCKCON = 0x00; //set outer data bus speed fastestWTST = 0x00;  //CPU wait 0 to run program
}
//End of SysInit()

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

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

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

/*main.cDesigned by Bill LiuVersion 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 enableSTC32G_P2PinsInit(0xFF, BI_IO, 0, 0, 0, 0, 1, 1);P0 = 0xA0;P2 = 0xFF;while(1){if(P2==P0)P73 = 1;elseP73 = 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 enableSTC32G_P2PinsInit(0xFF, BI_IO, 0, 0, 0, 0, 1, 0);P0 = 0xA0;P2 = 0xFF;while(1){if(P2==P0)P73 = 1;elseP73 = 0;}
}
//End of main()

编译下载结果如下:

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

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

  1. STC 32位8051单片机来了

    STC 32位8051单片机,第一代暂命名为 STC32G12K128-36I-LQFP64/48/32,PDIP40, 128K FLASH, 12K SRAM, 1.9V - 5.5V, 2路独立 ...

  2. shell教程(二) 四种工作模式

    标准 根据 POSIX 标准,Shell 分为登录(login).非登录(non-login)和交互(interactive).非交互(non- interactive)两个维度的处理.因此 bash ...

  3. 试用STC 32位单片机 老梁开源示波器

    看到网友都在申请试用STC的32位8051芯片,由于某些众所周知的因素影响,工作闲暇时光比较多,我也就凑热闹申请了样片试用,由于还没把样片应用于实际项目,在此先记录一下赠送的老梁开源示波器的烧录和试用 ...

  4. c++程序设计_基于proteus的51单片机开发实例30-模块化程序设计

    1. 基于proteus的51单片机开发实例30-模块化程序设计 1.1. 实验目的 模块化程序设计 不知不觉我们的51单片机开发实例已经进行到第三十篇了,是时候进行一个总结和反思了,总结什么?反思什 ...

  5. 32位单片机应用场合_全球首款基于 RISC-V 的 32 位通用单片机出现

    近日半导体供应商兆易创新推出了一款基于开源指令集架构 RISC-V 的通用单片机(Single Chip Microcomputer,单片微型计算机,MCU,微控制单元,Microcontroller ...

  6. hc05与单片机连接图_基于proteus的51单片机开发实例37-DAC0832

    学习手记 1. 基于proteus的51单片机开发实例37-DAC0832 1.1. 实验目的 之前我们学习了数模转换芯片DAC0808,今天我们继续学习另一种D/A转换芯片DAC0832. 1.2. ...

  7. php实训ppt,PHP动态网站开发实例教程教学全套课件(刘万辉)配套资料 任务3:运用目录与文件实现投票统计.ppt...

    PHP动态网站开发实例教程教学全套课件(刘万辉)配套资料 任务3:运用目录与文件实现投票统计.ppt (18页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! ...

  8. hc05与单片机连接图_基于proteus的51单片机开发实例(13)-LED指示那个按键被按下

    1. 基于proteus的51单片机开发实例(13)-LED指示那个按键被按下 1.1. 实验目的 本实例将实现两路外部中断的检测和识别,让我们能够更好地理解51单片机的外部中断以及中断优先级的概念. ...

  9. c51中断优先级c语言,基于proteus的51单片机开发实例(14)中断嵌套和中断优先级...

    1. 基于proteus的51单片机开发实例(14)中断嵌套和中断优先级 1.1. 实验目的 在前面实例中我们已经学习了51单片机的定时器/计数器中断,外部中断,通过这些实例,知道了中断电路的设计,中 ...

  10. 32位合泰单片机实现串口通信

    文章目录 一.需要有的硬件实物和软件 二.需要了解的有关串口通信的知识 三.HT32实现串口通信代码 一.需要有的硬件实物和软件 HT32(32位合泰单片机,以下简称HT32) 数据线(一定要是可以传 ...

最新文章

  1. OpenCV学习笔记(一) 环境配置
  2. 征信上显示保险代偿记录,那你的信用基本就黑了
  3. 制作巴士电台彩蛋一枚
  4. Skywalking部署常见问题以及注意事项
  5. 复制一个5G文件只需要两秒,全网最牛方法!
  6. 差分pid模块_基于数字PID切换控制的Buck变换器研究
  7. C语言之指针本身地址与指针向的地址(四十四)
  8. LINUX SHELL自定义函数及参数范例
  9. lufylegend引擎制作接水果小游戏
  10. 统信操作系统UOS上手操作与初体验、功能测试
  11. 【足迹C++primer】51、面向对象编程概述
  12. QT多线程之:moveToThread
  13. 【java】根据当前时区获取时间
  14. 神器Android键值数据库MMKV——基于 mmap 的高性能通用 key-value 组件
  15. 以世界杯为主题的营销活动|运营策略
  16. UltraEdit--用法--快捷键/配置/背景色/字体大小
  17. [如何在VS code中使用mysql](使用sqltools插件)
  18. Hive复杂类型的导入
  19. DA14580软件开发平台参考(五)
  20. goland navigate back and forward

热门文章

  1. 电机计算机仿真,电机调速系统的计算机仿真
  2. 利用selenium下载图片,不使用requests和urllib等其他工具
  3. STM32WB55开发板(一)单板设计-硬件介绍
  4. knockoutjs的某些坑总结
  5. ascii码值大小顺序排序c语言,ascii码值的大小顺序是怎样的?
  6. 【Webex】加入会议是无法正常加入!提示“下载会议组件时无法获取正确的参数。 请联系技术支持以获取帮助。...
  7. 贼心不死安cuda记录-双显卡笔记本Ubuntu安装cuda9.0
  8. 百度搜索风云榜Rss
  9. 爱了爱了!阿米洛熊猫VA108机械键盘cherry樱桃粉轴白灯,写代码神器!免费包邮送到家!...
  10. 亚马逊云科技顾凡:持续创新的关键是企业已构建起现代化应用