typedef struct{
bool press;
uint8_t state;
uint16_t long_time;//按下按键的时间
}Btn;
在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据。结构体的定义形式为:
struct 结构体名{结构体所包含的变量或数组};typedef
关键字用于为已有的数据类型定义一个新的名称(别名)。
这里的Btn
是定义的新名称(别名),它代表了一个特定的结构体类型。这个结构体包含了三个成员:
press
:一个布尔值(bool
),用于表示按键是否被按下。state
:一个8位无符号整数(uint8_t
),用于表示按键的某种状态(例如,是否正在被按下、释放、单次点击、长按、双击等等)。long_time
:一个16位无符号整数(uint16_t
),可能用于表示按下按键的时间(可能是以某种单位,如毫秒),也可能用于判断是否达到了长按的阈值。
通过定义这个Btn
别名,可以更方便地声明这个结构体的变量,而不需要每次都写出完整的struct
定义。例如:
Btn myButton;
而不是:
struct {
bool press;
uint8_t state;
uint16_t long_time;
} myButton;
所以在STM32中用typedef
关键字为已有的数据类型定义一个新的名称后就可以直接用”新名称+一个数组={ }“的方式声明并初始化该数组,并将数组中的所有元素进行初始化。例如:
Btn key[4] = {0}; //声明并初始化一个包含4个Btn类型元素的数组key,并将数组中的所有元素初始化为0
在这里,Btn
是一个之前通过typedef
定义的结构体类型别名。key
是这个类型的数组,它有4个元素。初始化{0}
意味着数组中的每个元素都会被初始化为0
。对于结构体来说,如果它没有明确的初始化,那么它的所有成员都会根据其类型进行默认初始化。对于基本数据类型(如bool
、uint8_t
、uint16_t
),默认初始化通常意味着将它们设置为0
。
所以,Btn key[4] = {0};
将创建一个Btn
类型的数组key
,数组中的每个Btn
元素都将被初始化为它的所有成员都是0
的状态。这种初始化方式是一种简便的写法,用于确保结构体数组中的所有元素都被正确地初始化,而不需要为数组中的每个元素单独编写初始化代码。本条语句将确保key[0]
、key[1]
、key[2]
和key[3]
这四个Btn
结构体实例的press
成员被初始化为false
(因为在C语言中,bool
类型的0
通常表示false
),state
成员被初始化为0
,long_time
成员也被初始化为0。Btn
使得代码更加清晰,也提高了代码的可读性和可维护性。
当需要在多个地方使用这种结构体时,使用 typedef
定义的别名会非常方便。此外,如果之后需要修改这个结构体的定义,只需要在一个地方(即 typedef
的声明处)进行修改,而不需要在代码中搜索并替换所有使用这个结构体的地方。