STM32_typedef enum 用法

1 例子

typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;// FunctionalState是 enum +被省略的项 的别名 实质也是一种枚举类型(比如int类型)   给枚举变量

  FunctionalState ADC_ScanConvMode;

 ADC_ScanConvMode为FunctionalState类型的变量

 

C语言详解 - 枚举类型

注:以下全部代码的执行环境为VC++ 6.0

在程序中,可能需要为某些整数定义一个别名,我们可以利用预处理指令#define来完成这项工作,您的代码可能是:

#define MON 1

#define TUE 2

#define WED 3

#define THU 4

#define FRI 5

#define SAT 6

#define SUN 7

在此,我们定义一种新的数据类型,希望它能完成同样的工作。这种新的数据类型叫枚举型。

1. 定义一种新的数据类型 - 枚举型

以下代码定义了这种新的数据类型 - 枚举型

enum DAY

{

    MON=1, TUE, WED, THU, FRI, SAT, SUN

};

(1) 枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,元素之间用逗号,隔开。

(2) DAY是一个标识符,可以看成这个集合的名字,是一个可选项,即是可有可无的项。

(3) 第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加1。

(4) 可以人为设定枚举成员的值,从而自定义某个范围内的整数。

(5) 枚举型是预处理指令#define的替代。

(6) 类型定义以分号;结束。

C语言深度解剖:

一般的定义方式如下:
enum enum_type_name
{
   ENUM_CONST_1,
   ENUM_CONST_2,
   ...
   ENUM_CONST_n
} enum_variable_name;

注意:enum_type_name 是自定义的一种数据数据类型名,而enum_variable_name 为enum_type_name类型的一个变量,也就是我们平时常说的枚举变量。实际上enum_type_name类型是对一个变量取值范围的限定,而花括号内是它的取值范围,即enum_type_name 类型的变量enum_variable_name 只能取值为花括号内的任何一个值,如果赋给该类型变量的值不在列表中,则会报错或者警告。ENUM_CONST_1、ENUM_CONST_2、...、ENUM_CONST_n,这些成员都是常量,也就是我们平时所说的枚举常量(常量一般用大写)。

 

2. 使用枚举类型对变量进行声明

新的数据类型定义完成后,它就可以使用了。我们已经见过最基本的数据类型,如:整型int, 单精度浮点型float, 双精度浮点型double, 字符型char, 短整型short等等。用这些基本数据类型声明变量通常是这样:

char a; //变量a的类型均为字符型char

char letter;

int x, y, z; //变量x,y和z的类型均为整型int

int number;

double m, n;

double result; //变量result的类型为双精度浮点型double

既然枚举也是一种数据类型,那么它和基本数据类型一样也可以对变量进行声明。

方法一:枚举类型的定义和变量的声明分开

enum DAY

{

    MON=1, TUE, WED, THU, FRI, SAT, SUN

};

enum DAY yesterday;

enum DAY today;

enum DAY tomorrow; //变量tomorrow的类型为枚举型enum DAY

enum DAY good_day, bad_day; //变量good_day和bad_day的类型均为枚举型enum DAY

方法二:类型定义与变量声明同时进行:

enum //跟第一个定义不同的是,此处的标号DAY省略,这是允许的。这种方式相当于定义了

{                                                                                                                                 一个枚举变量,参考

    saturday,                                                                                                          上面 C语言深度解剖 定义

    sunday = 0,

    monday,

    tuesday,

    wednesday,

    thursday,

    friday

} workday; //变量workday的类型为枚举型enum DAY

workday=friday;

sizeof(workday)=4;

enum week { Mon=1, Tue, Wed, Thu, Fri Sat, Sun} days; //变量days的类型为枚举型enum week

enum BOOLEAN { false, true } end_flag, match_flag; //定义枚举类型并声明了两个枚举型变量

 

方法三:用typedef关键字将枚举类型定义成别名,并利用该别名进行变量声明:

typedef enum workday  //此处的workday可以省略,或者改成其他,不会影响后面

{

    saturday,

    sunday = 0,

    monday,

    tuesday,

    wednesday,

    thursday,

    friday

} workday; //此处的workday为枚举型enum workday的别名,类似于int

workday today, tomorrow; //此处的workday颜色对应,变量today和tomorrow的类型为枚举型workday,也即enum workday

enum workday中的workday可以省略:

参考:https://www.cnblogs.com/yaowen/p/4785342.html

以下是一个基于状态机的 STM32 按键检测程序,能够实现稳定可靠的按键检测: ```c /* 定义按键状态 */ typedef enum { KEY_RELEASED = 0, // 按键松开状态 KEY_PRESSED, // 按键按下状态 KEY_WAITING, // 等待确认状态 KEY_CONFIRMED // 确认按键状态 } KEY_STATE; /* 定义按键检测结构体 */ typedef struct { GPIO_TypeDef* GPIOx; // 按键所在的 GPIO 端口 uint16_t GPIO_Pin; // 按键所在的 GPIO 引脚 KEY_STATE state; // 按键状态 uint16_t confirmCnt; // 确认计数器 } KEY_TypeDef; /* 定义按键检测函数 */ void KEY_Detect(KEY_TypeDef* key) { /* 检测按键状态 */ switch (key->state) { case KEY_RELEASED: // 松开状态 if (HAL_GPIO_ReadPin(key->GPIOx, key->GPIO_Pin) == GPIO_PIN_RESET) { key->state = KEY_PRESSED; // 检测到按下,状态切换到按下状态 } break; case KEY_PRESSED: // 按下状态 if (HAL_GPIO_ReadPin(key->GPIOx, key->GPIO_Pin) == GPIO_PIN_SET) { key->state = KEY_WAITING; // 检测到松开,状态切换到等待确认状态 key->confirmCnt = 0; // 确认计数器清零 } break; case KEY_WAITING: // 等待确认状态 if (HAL_GPIO_ReadPin(key->GPIOx, key->GPIO_Pin) == GPIO_PIN_RESET) { if (++key->confirmCnt >= 10) { // 按键确认计数器达到 10,则认为按键已经确认 key->state = KEY_CONFIRMED; // 状态切换到确认状态 } } else { key->state = KEY_RELEASED; // 按键被松开,状态切换到松开状态 } break; case KEY_CONFIRMED: // 确认状态 if (HAL_GPIO_ReadPin(key->GPIOx, key->GPIO_Pin) == GPIO_PIN_SET) { key->state = KEY_RELEASED; // 状态切换到松开状态 } break; default: break; } } ``` 使用方法: 1. 在主程序中定义按键结构体数组以及按键引脚、端口等信息: ```c KEY_TypeDef key1 = {GPIOA, GPIO_PIN_0, KEY_RELEASED, 0}; KEY_TypeDef key2 = {GPIOA, GPIO_PIN_1, KEY_RELEASED, 0}; KEY_TypeDef key3 = {GPIOA, GPIO_PIN_2, KEY_RELEASED, 0}; KEY_TypeDef key4 = {GPIOA, GPIO_PIN_3, KEY_RELEASED, 0}; KEY_TypeDef keys[] = {key1, key2, key3, key4}; ``` 2. 在主程序的 while 循环中调用按键检测函数: ```c while (1) { /* 检测按键状态 */ for (int i = 0; i < sizeof(keys) / sizeof(KEY_TypeDef); i++) { KEY_Detect(&keys[i]); if (keys[i].state == KEY_CONFIRMED) { /* 按键确认,执行相应操作 */ switch (i) { case 0: /* do something for key1 */ break; case 1: /* do something for key2 */ break; case 2: /* do something for key3 */ break; case 3: /* do something for key4 */ break; default: break; } } } } ``` 注释说明: 1. 定义了一个枚举类型 `KEY_STATE` 表示按键状态,包括松开、按下、等待确认和确认状态。 2. 定义了一个结构体 `KEY_TypeDef` 表示按键,包括按键所在的 GPIO 端口、引脚号、状态以及确认计数器。 3. 在按键检测函数中,使用 switch-case 语句检测按键状态,根据不同的状态进行相应的操作。 4. 在主程序中定义按键结构体数组,并在 while 循环中循环调用按键检测函数,根据每个按键的确认状态执行相应的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值