原子艺术做的网站怎么样子,g4560做网站服务器,网站策划设计建设,一键生成网站的软件系列文章目录
STM32单片机系列专栏
C语言术语和结构总结专栏 文章目录 1. GPIO模式
2. GPIO输出
2.1 RCC
2.2 GPIO
3. 代码示例
3.1 RCC时钟
3.2 GPIO初始化
3.3 GPIO输出函数
3.4 推挽输出和开漏输出
4. GPIO输入
4.1 输入模式
4.2 数据读取函数
5. C语言语法 1…系列文章目录
STM32单片机系列专栏
C语言术语和结构总结专栏 文章目录 1. GPIO模式
2. GPIO输出
2.1 RCC
2.2 GPIO
3. 代码示例
3.1 RCC时钟
3.2 GPIO初始化
3.3 GPIO输出函数
3.4 推挽输出和开漏输出
4. GPIO输入
4.1 输入模式
4.2 数据读取函数
5. C语言语法 1. GPIO模式
GPIO是微控制器中最基本也是最灵活的功能之一其可以被配置为输入或输出模式以及许多其他特殊功能模式。通过配置GPIO的端口配置寄存器端口可以配置成以下8种模式 模式名称类型描述浮空输入浮空输入引脚没有内部或外部上拉或下拉其电平未定义通常不建议使用上拉输入上拉输入引脚内部上拉至VDD外部信号低于VDD时检测到低电平下拉输入下拉输入引脚内部下拉至VSS外部信号高于VSS时检测到高电平模拟输入模拟输入GPIO未锁定引脚直接连接到内部ADC开漏输出开漏输出引脚以开漏模式工作高电平时为高阻态低电平时连接到VSS推挽输出推挽输出引脚以推挽模式工作高电平时连接到VDD低电平时连接到VSS复用开漏输出复用开漏输出用于复用功能的开漏输出高电平时为高阻态低电平时连接到VSS复用推挽输出复用推挽输出用于复用功能的推挽输出高电平时连接到VDD低电平时连接到VSS
模式分类
输入模式Input引脚被配置为输入用来读取外部信号的状态。输出模式Output引脚被配置为输出可以驱动外部设备或显示设备状态。
类型分类
推挽输出Push-pull可以在两种状态之间切换要么连接到VDD高电平要么连接到VSS低电平。开漏输出Open-drain只能连接到VSS低电平而高电平状态需要外部拉高。
GPIO配置说明
浮空输入Floating input引脚没有内部或外部的上拉或下拉电阻状态由外部电路决定。上拉输入Pull-up input引脚内部连接有上拉电阻如果外部电路没有连接它将读取为高电平。下拉输入Pull-down input引脚内部连接有下拉电阻如果外部电路没有连接它将读取为低电平。模拟输入Analog inputGPIO以模拟方式工作可以直接连接到内部ADC模拟到数字转换器。开漏输出Open-drain output引脚在激活时连接到VSS非激活时不连接悬空。常用于需要外部拉高的应用场合。推挽输出Push-pull output引脚可以输出高电平连接到VDD或低电平连接到VSS。复用开漏输出Alternate function open-drain output开漏输出但是引脚被配置为特殊功能例如I2C通信。复用推挽输出Alternate function push-pull output推挽输出但是引脚被配置为特殊功能例如PWM输出。 2. GPIO输出
操作STM32的GPIO一共有三个步骤
使用RCC开启GPIO的时钟使用GPIO_Init函数初始化GPIO使用输出或者输入函数控制GPIO
2.1 RCC
首先打开一个新建好的工程文件如果不知道怎么建立工程文件可以看下面这篇文章
使用Keil MDK创建STM32标准库工程
之后在Library中找到rcc.h文件这里全程使用vscode去操作如果不知道怎么实现Keil和VSCode协同开发STM32程序可以查看下面这篇教程
Keil和VSCode协同开发STM32程序 在rcc.h文件中拖到最下面这里一般都是所有库函数的声明这里最常用的就是这三个函数
void RCC_AHBPeriphClockCmd外设时钟控制 接着选择函数名右键并选择转到定义这里需要先进行一次编译否则可能无法跳转 之后会来到.c文件的函数定义下面解释一下这个函数
// 函数定义控制特定AHB外设的时钟。
// RCC_AHBPeriph要配置的AHB外设。
// NewState指定外设时钟的新状态ENABLE使能 或 DISABLE失能。
void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState)
{// 确保输入参数RCC_AHBPeriph是预定义的有效外设。assert_param(IS_RCC_AHB_PERIPH(RCC_AHBPeriph));// 确保输入的NewState是有效的功能状态ENABLE 或 DISABLE。assert_param(IS_FUNCTIONAL_STATE(NewState));// 如果NewState不是DISABLE即是ENABLE执行以下代码。if (NewState ! DISABLE){// 通过逻辑或运算将对应的位设置为1来使能开启外设的时钟。RCC-AHBENR | RCC_AHBPeriph;}// 如果NewState是DISABLE执行以下代码。else{// 通过逻辑与运算与对应位的否定值运算将对应的位设置为0来禁能关闭外设的时钟。RCC-AHBENR ~RCC_AHBPeriph;}
}2.2 GPIO
下面看一下GPIO.h的文件在Library中找到GPIO.h文件也是拖到最后这里可以看到常用的函数。
void GPIO_DeInit(GPIO_TypeDef* GPIOx);
void GPIO_AFIODeInit(void);
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
void GPIO_DeInit(GPIO_TypeDef* GPIOx); 功能将指定GPIO端口的所有配置重置为默认值。 参数GPIOx要重置的GPIO端口例如GPIOA、GPIOB等。 说明这个函数通常用于在重新配置复位GPIO端口之前清除端口的当前配置。
void GPIO_AFIODeInit(void); 功能将AFIOAlternate Function IO模块的所有配置重置复位为默认值。 说明这个函数通常用于清除所有GPIO端口的复用功能配置。
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct); 功能用结构体的参数初始化指定GPIO端口的引脚。 参数
GPIOx要初始化的GPIO端口例如GPIOA、GPIOB等。GPIO_InitStruct包含了初始化配置的结构体指针如引脚模式、输出类型、输出速度等。
说明这个函数用于配置GPIO引脚的各种属性例如输入/输出模式、输出类型、输出速度等。
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct); 功能将给定的GPIO_InitTypeDef结构体初始化为默认值。 参数GPIO_InitStruct要初始化的GPIO_InitTypeDef结构体指针。 说明这个函数用于在配置GPIO引脚之前将相关的结构体初始化为默认值。
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx); uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx); 功能读取指定GPIO端口指定引脚的输入状态。 参数
GPIOx要读取的GPIO端口例如GPIOA、GPIOB等。GPIO_Pin要读取的引脚可以是单个引脚或多个引脚的按位或组合。
返回值引脚的输入状态0/1。或者GPIO端口的输入状态每个引脚的状态对应一个位。
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); 功能将指定GPIO端口指定引脚的输出状态设置为高电平。 参数
GPIOx要设置的GPIO端口例如GPIOA、GPIOB等。GPIO_Pin要设置的引脚可以是单个引脚或多个引脚的按位或组合。
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); 功能将指定GPIO端口指定引脚的输出状态设置为低电平。 参数
GPIOx要重置的GPIO端口例如GPIOA、GPIOB等。GPIO_Pin要重置的引脚可以是单个引脚或多个引脚的按位或组合。
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal); 功能将指定GPIO端口指定引脚的输出状态设置为指定的电平。 参数
GPIOx要写入的GPIO端口例如GPIOA、GPIOB等。GPIO_Pin要写入的引脚可以是单个引脚或多个引脚的按位或组合。BitVal要设置的电平可以是Bit_RESET低电平或Bit_SET高电平。
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal); 功能设置指定GPIO端口的输出状态。 参数
GPIOx要写入的GPIO端口例如GPIOA、GPIOB等。PortVal要设置的输出值每个引脚的状态对应一个位0表示低电平1表示高电平。 3. 代码示例
这里使用最基础的led灯来解释代码功能
3.1 RCC时钟
在main.c文件中首先调用RCC中的APB2外设时钟控制函数首先和刚才一样在RCC.h找到函数名, RCC_APB2PeriphClockCmd, 复制到main中接着右键函数转到定义根据注释中的提示因为点亮的是PA0的LED所以选择 RCC_APB2Periph_GPIOA将其放到第一个参数第二个参数选择ENABLE, 这样时钟就开启了。 3.2 GPIO初始化
接着调用GPIO的初始化函数在GPIO.h中找到 GPIO_Init 函数跳转到定义和rcc类似根据注释中的提示第一个参数选择GPIOA, 第二个参数是一个结构体 先把结构体复制到GPIO_Init上面起名为GPIO_InitStructure, 这个结构体相当于一个局部变量然后将结构体的成员都列出来如下所示 GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin ;GPIO_InitStructure.GPIO_Mode ;GPIO_InitStructure.GPIO_Speed ;GPIO_Init()
接下来就是如何根据标准库文件来配置函数以GPIO_Mode为例, 接下来会详细到每一个操作之后这些操作会省略。
首先右键 GPIO_Mode转到定义 根据提示我们选择GPIOMode_TypeDef接着按ctrlf 搜索在下面找到定义方式这里有GPIO的八种工作模式。 GPIO_Mode_AIN (0x0)模拟输入模式Analog Input ModeGPIO_Mode_IN_FLOATING (0x04)浮空输入模式Floating Input ModeGPIO_Mode_IPD (0x28)输入下拉模式Input Pull-Down ModeGPIO_Mode_IPU (0x48)输入上拉模式Input Pull-Up ModeGPIO_Mode_Out_OD (0x14)开漏输出模式Open-Drain Output ModeGPIO_Mode_Out_PP (0x10)推挽输出模式Push-Pull Output ModeGPIO_Mode_AF_OD (0x1C)复用开漏输出模式Alternate Function Open-Drain ModeGPIO_Mode_AF_PP (0x18)复用推挽
因为这里是为了实现LED功能所以使用GPIO_Mode_Out_PP将其复制到GPIO_Mode后面。
接着是GPIO_Pin同样的操作转到定义这里很简单选择GPIO_Pin_0即可。
如果要使用多个A引脚例如多个led灯直接在后面加上即可每个定义之间用 | 隔开。
最后是GPIO_Speed转到定义以后按ctrlf 搜索如图所示下一个就是函数说明这里选择GPIO_Speed_50MHz将其复制到GPIO_Speed后面。
最后将完成配置的结构体的变量名GPIO_InitStructure复制到GPIO_Init中即可完成GPIO的初始化配置。
此时main.c中的代码如下
#include stm32f10x.h // Device headerint main(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOA, GPIO_InitStructure);while (1){}
} 3.3 GPIO输出函数
完成GPIO的初始化之后就可以使用GPIO的输出函数了四个输出函数为前面已经解释
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//将指定GPIO端口指定引脚的输出状态设置为高电平。
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//将指定GPIO端口指定引脚的输出状态设置为低电平。
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
//将指定GPIO端口指定引脚的输出状态设置为指定的电平。
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
//设置指定GPIO端口的输出状态。
GPIO_ResetBits
我们选择低电平输出所以使用 GPIO_ResetBits和前面的操作一样可以转到定义查看注释说明因为led灯使用A0引脚所以代码为 GPIO_ResetBits(GPIOA, GPIO_Pin_0);
此时下载程序到单片机中就可以看到LED灯已经被点亮。注意这里采用的时led长脚连接负极短接连接引脚代表低电平点亮 GPIO_SetBits
如果换成 GPIO_SetBits可以发现LED熄灭因为此时输出为高电平。
GPIO_WriteBit
第三种输出函数GPIO_WriteBit这个函数是指定输出类型比如前面的配置不同改变多了一个BitAction参数转到定义可以发现注释教程中说明了两个方式Bit_RESET和Bit_SET Bit_RESET: 清除端口值置低电平
Bit_SET: 设置端口值置高电平
GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET); 此时led点亮。。GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET); 此时led熄灭。
目前main.c中的代码如下
#include stm32f10x.h // Device headerint main(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOA, GPIO_InitStructure);GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);while (1){}
}这里的GPIO_WriteBit用于LED点亮时可能会发现一个问题Bit_SET可以置为高电平此时LED熄灭那如果想用基本的0和1来代表高低电平直接将Bit_SET改为1会出现警告所以还需要加上强制类型转换把1和0类型转为BitAction的枚举类型
GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)1);
这就是GPIO输出函数的配置之后就是你想实现的功能这些功能就是在后面的while中去实现并且根据不同的模块和功能添加不同的库例如实现led连续闪烁除了修改main.c中的主程序还需要在工程文件在加入delay.c 和 delay.h 文件。但操作都类似在.h文件中找到需要使用的标准库函数转到定义在.c文件中找到函数定义和注释说明。 GPIO_WriteBit
这个函数可以设置指定GPIO端口的输出状态。例如对于多个led的控制。
首先还是转到定义从注释中可以看到第一个参数依然是GPIOA, 第二个参数是指定写到输出数据寄存器的值下面可以看到第二个参数是直接写道GPIO和ODR寄存器里的。 所以可以直接写0x001十六进制对应二进制为0000 0000 0000 0001。这16个二进制分别对应PA0 - PA15 一共16个端口最低位右边对应PA0。
此时如果加入延迟函数就可以实现最基本的led灯流水线
#include stm32f10x.h // Device headerint main(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin GPIO_Pin_All; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOA, GPIO_InitStructure);while (1){GPIO_Write(GPIOA, 0x0001); // Set PA0Delay_ms(1000);GPIO_Write(GPIOA, 0x0002); // Set PA1 Delay_ms(1000);GPIO_Write(GPIOA, 0x0004); // Set PA2Delay_ms(1000);}
}
如果设置为低电平触发可以在参数前加上 ~ 意思是取反。 3.4 推挽输出和开漏输出
对于推挽输出和开漏输出的驱动问题还是用刚才led的例子目前我们使用的是GPIO_Mode_Out_PP (0x10)推挽输出模式。此时将led短脚连接负极长接连接引脚代表高电平点亮这时可以发现程序依然可用说明在推挽模式下高低电平都有驱动能力。
如果把端口的模式改为 GPIO_Mode_Out_OD (0x14)开漏输出模式 GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_OD;
此时led还是保持高电平点亮但程序不起作用只有当led引脚切换以后改为低电平点亮时程序才可以正常运行这说明开漏输出模式的高电平不具有驱动能力。
所以推挽输出高低电平都有驱动能力开漏输出高电平相当于高阻态没有驱动能力只有低电平有驱动能力。 4. GPIO输入
4.1 输入模式
GPIO输入的配置和GPIO输出类似不同的数结构体中 GPIO_InitStructure.GPIO_Mode 不同这里要使用下面的四种输入模式例如按键输入使用上拉输入模式GPIO_Mode_IPU
GPIO_Mode_AIN (0x0)模拟输入模式Analog Input Mode
在这种模式下GPIO引脚被配置为读取模拟信号意味着它可以直接与微控制器内部的模拟-数字转换器ADC相连。GPIO引脚不会被数字输入缓冲器干扰这样可以保证模拟信号的准确性和质量。通常用于传感器信号读取如温度、压力或湿度传感器。
GPIO_Mode_IN_FLOATING (0x04)浮空输入模式Floating Input Mode
GPIO引脚配置为数字输入没有激活内部上拉或下拉电阻其电平状态取决于外部电路。如果外部没有提供确定的电平引脚的状态是未定义的可能会浮动因此称为“浮空”。这种模式适合于外部电路总是会驱动GPIO到一个确定状态或者外部已经提供了必要的上拉或下拉设置。
GPIO_Mode_IPD (0x28)输入下拉模式Input Pull-Down Mode
PIO引脚配置为数字输入并且内部激活了下拉电阻这会将引脚默认拉至低电平接地。如果外部没有提供信号引脚将读取为低电平状态如果外部提供了高电平信号则会被检测到。这种模式适用于按钮或开关其中未激活状态需要确保为低电平。
GPIO_Mode_IPU (0x48)输入上拉模式Input Pull-Up Mode GPIO引脚配置为数字输入并且内部激活了上拉电阻这会将引脚默认拉至高电平接VDD或正电源。如果外部没有提供信号引脚将读取为高电平状态如果外部提供了低电平信号则会被检测到。这同样适用于按钮或开关但在这种情况下未激活状态需要确保为高电平。 4.2 数据读取函数
还有GPIO数据读取的函数例如读取按键输入就要用到 GPIO_ReadInputDataBit
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
功能此函数用于读取STM32的GPIO端口上的单个输入引脚的状态。这对于检测如按钮按下、限位开关触发等简单的二进制输入非常有用。参数 GPIOx指向你想要读取的GPIO端口的指针。STM32微控制器有多个GPIO端口例如GPIOA、GPIOB等每个都对应不同的物理引脚组。GPIO_Pin具体的GPIO引脚编号它是一个16位的值每一位代表一个特定的引脚。例如如果你想读取第0位就会使用GPIO_Pin_0。返回值返回值是一个8位的无符号整数。如果指定的引脚处于高电平状态则返回非零值如果处于低电平则返回零。
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
功能这个函数读取整个GPIO端口的当前输入数据。这在你需要同时检查一个端口上的多个引脚状态时非常有用。参数 GPIOx与GPIO_ReadInputDataBit函数中的GPIOx相同指向要读取的GPIO端口的指针。返回值返回值是一个16位的无符号整数。每个比特位代表该端口上对应引脚的输入状态位值为1表示该引脚处于高电平位值为0表示处于低电平。
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
功能此函数用于读取STM32的GPIO端口上的单个输出引脚的状态。这在你需要确认引脚的当前输出状态例如确保一个LED是否被程序正确控制时非常有用。参数 GPIOx与GPIO_ReadInputDataBit函数中的GPIOx相同指向你想要读取的GPIO端口的指针。GPIO_Pin与GPIO_ReadInputDataBit函数中的GPIO_Pin相同表示特定的GPIO引脚编号。返回值返回值是一个8位的无符号整数。如果指定的引脚正在输出高电平则返回非零值如果正在输出低电平则返回零。
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx); 功能这个函数读取整个GPIO端口的当前输出数据。当你需要审核或调试一个端口上多个引脚的输出配置时这个函数非常有用。参数 GPIOx与GPIO_ReadInputData函数中的GPIOx相同指向要读取的GPIO端口的指针。返回值返回值是一个16位的无符号整数。与GPIO_ReadInputData类似每个比特位代表该端口上对应引脚的输出状态位值为1表示该引脚正在输出高电平位值为0表示正在输出低电平。 5. C语言语法
STM32基于C语言开发对于这部分需要有一些C语言的基础知识例如下面的数据类型如果对这方面不太了解可以看下面的C语言系列讲解。
C语言语法和结构总结系列专栏
数据类型位数表示范围stdint定义ST定义char8-128 ~ 127int8_ts8unsigned char80 ~ 255uint8_tu8short16-32768 ~ 32767int16_ts16unsigned short160 ~ 65535uint16_tu16int32-2147483648 ~ 2147483647int32_ts32unsigned int320 ~ 4294967295uint32_tu32long32-2147483648 ~ 2147483647int32_ts32unsigned long320 ~ 4294967295uint32_tu32long long64-(2^64)/2 ~ (2^64)/2-1int64_tunsigned long long640 ~ (2^64)-1uint64_tfloat32-3.4e38 ~ 3.4e38double64-1.7e308 ~ 1.7e308
接下来对几个关键的语法进行简单说明
宏定义 #define
用途用一个字符串代替一个数字便于理解防止出错提取程序中经常出现的参数便于快速修改。
定义宏定义 #define test 123
引用宏定义 int a test; //等效于int a 123;
typedef
用途将一个比较长的变量类型名换个名字便于使用只能用于变量名。 定义typedef typedef unsigned char uint8_t;
引用typedef
uint8_t a; //等效于unsigned char a;
结构体 struct 用途数据打包不同类型变量的集合 定义结构体变量因为结构体变量类型较长所以通常用typedef更改变量类型名
struct{char x; int y; float z;} StructName;
引用结构体成员
StructName.x T;
StructName.y 123;
StructName.z 55.55;
//或者
pStructName-x T; //pStructName为结构体的地址
pStructName-y 123;
pStructName-z 55.55;
枚举 enum
用途定义一个取值受限制的整型变量用于限制变量取值范围宏定义的集合. 定义枚举变量因为枚举变量类型较长所以通常用typedef更改变量类型名
enum{FALSE 0, TRUE 1} EnumName;
引用枚举成员
EnumName FALSE;
EnumName TRUE;
这里知识简单说明如果想要深入学习可以看下面的C语言系列讲解。
C语言语法和结构总结系列专栏