GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = FAN_CTL_GPIO_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(FAN_CTL_GPIO, &GPIO_InitStruct);
HAL_GPIO_WritePin(FAN_CTL_GPIO, FAN_CTL_GPIO_PIN, (GPIO_PinState)fan_status);
}
void fan_ctl(char is_fan_on)
{
fan_status = is_fan_on;
HAL_GPIO_WritePin(FAN_CTL_GPIO, FAN_CTL_GPIO_PIN, (GPIO_PinState)fan_status);
}
void keys_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = KEY2_GPIO_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(KEY2_GPIO, &GPIO_InitStruct);
GPIO_InitStruct.Pin = KEY3_GPIO_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(KEY3_GPIO, &GPIO_InitStruct);
GPIO_InitStruct.Pin = KEY4_GPIO_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(KEY4_GPIO, &GPIO_InitStruct);
}
volatile char is_key2_down = 0;
volatile char is_key3_down = 0;
volatile char is_key4_down = 0;
char isKey2Pressed(void){
return is_key2_down;
}
char isKey3Pressed(void){
return is_key3_down;
}
char isKey4Pressed(void){
return is_key4_down;
}
void resetKey2(void){
is_key2_down = 0;
}
void resetKey3(void){
is_key3_down = 0;
}
void resetKey4(void){
is_key4_down = 0;
}
#define DEBOUNCE_CNT 2
void scan_keys(void)
{
static char key2_status = KEY_UP, key2_down_cnt = 0, key2_up_cnt = 0;
static char key3_status = KEY_UP, key3_down_cnt = 0, key3_up_cnt = 0;
static char key4_status = KEY_UP, key4_down_cnt = 0, key4_up_cnt = 0;
char new_status;
//KEY2
new_status = HAL_GPIO_ReadPin(KEY2_GPIO, KEY2_GPIO_PIN);
if((key2_status == KEY_UP) && (new_status == KEY_DOWN)) {
key2_down_cnt++;
if(key2_down_cnt >= DEBOUNCE_CNT) {
is_key2_down = 1;
key2_status = KEY_DOWN;
}
} else {
key2_down_cnt = 0;
}
if((key2_status == KEY_DOWN) && (new_status == KEY_UP)) {
key2_up_cnt++;
if(key2_up_cnt >= DEBOUNCE_CNT) {
is_key2_down = 0;
key2_status = KEY_UP;;
}
} else {
key2_up_cnt = 0;
}
//KEY3
new_status = HAL_GPIO_ReadPin(KEY3_GPIO, KEY3_GPIO_PIN);
if((key3_status == KEY_UP) && (new_status == KEY_DOWN)) {
key3_down_cnt++;
if(key3_down_cnt >= DEBOUNCE_CNT) {
is_key3_down = 1;
key3_status = KEY_DOWN;
}
} else {
key3_down_cnt = 0;
}
if((key3_status == KEY_DOWN) && (new_status == KEY_UP)) {
key3_up_cnt++;
if(key3_up_cnt >= DEBOUNCE_CNT) {
is_key3_down = 0;
key3_status = KEY_UP;;
}
} else {
key3_up_cnt = 0;
}
//KEY4
new_status = HAL_GPIO_ReadPin(KEY4_GPIO, KEY4_GPIO_PIN);
if((key4_status == KEY_UP) && (new_status == KEY_DOWN)) {
key4_down_cnt++;
if(key4_down_cnt >= DEBOUNCE_CNT) {
is_key4_down = 1;
key4_status = KEY_DOWN;
}
} else {
key4_down_cnt = 0;
}
if((key4_status == KEY_DOWN) && (new_status == KEY_UP)) {
key4_up_cnt++;
if(key4_up_cnt >= DEBOUNCE_CNT) {
is_key4_down = 0;
key4_status = KEY_UP;;
}
} else {
key4_up_cnt = 0;
}
}
上述.c文件中,已经为我们初始化了相关引脚,并完成了配置工作。我们使用这个库主要是使用在库中的isKey\_Pressed()和resetKey\_()函数。
isKey\_Pressed()是在按键被按下后,对应的is\_key\_down标志位的值发生改变,因此我们读取该标志位的值即可。
resetKey\_()是将其对应的标志位的值重置,这常用在我们已经做完按键的反馈的事件之后进行,以便接受下一次的按键事件。因此,如果我们长时间没有处理按键的事件,标志位反应的仅仅是按过,而并非按下多少次。
### 具体使用:
![](https://img-blog.csdnimg.cn/79da760f360c4c3b81bc4cdfd775e325.png)
以上的含义是读取KEY2是否被按下,如果被按下则LED1亮。如果KEY3被按下,则LED1灭。
int main( void )
{
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!
阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!