嵌入式系统学习——STM32之按键输入
2017-05-19 14:52
344 查看
之前写了两篇关于STM32 GPIO的介绍和运用,跑马灯用到了GPIO的推挽输出,但是对于输入还是没有用到,这次就运用一下GPIO的上拉输入。实验还是和以前51做的实验一样,就是判断按键的输入,然后控制LED灯。这次没有直接配置寄存器,而是调用库函数和位操作结合。
注:每一块开发板对应电路都不相同,编写代码需要对应自己的板子,本人两个LED灯对应的GPIO为:GPIOD13和GPIOD14,并且是共阴极。两个按键对应的GPIO为:GPIOC13和GPIOE0,并且共阴极。
首先,LED初始化和上一篇博客中的跑马灯初始化一样,只需拷贝就可以了。
LED初始化函数:
按键输入最关键的是对按键的初始化和输入判断。这里按键的初始化与LED的初始化不同的是GPIO的模式不一样了,LED是推挽输出,按键则相反,是输入,这个时候要考虑是哪一种输入方式,这里我的板子上按键是共阴极的,所以当按键按下的时候IO口输入的低电平,所以我需要在IO口接上拉电阻,使用上拉输入模式。
按键初始化函数:
对于按键输入来说,怎么判断是连续按,还是不连续按,这是一个重点。以前是将两种情况分开考虑,写成了两个函数,然后判断,其实,这个可以写成一个函数,只需添加一个选择形参,然后对形参进行判断操作即可。
按键输入函数:
主函数:
按键输入keil工程分享
参考:开源电子网
注:每一块开发板对应电路都不相同,编写代码需要对应自己的板子,本人两个LED灯对应的GPIO为:GPIOD13和GPIOD14,并且是共阴极。两个按键对应的GPIO为:GPIOC13和GPIOE0,并且共阴极。
首先,LED初始化和上一篇博客中的跑马灯初始化一样,只需拷贝就可以了。
LED初始化函数:
#include "sys.h" #define LED1 PDout(13)// PB13 #define LED2 PDout(14)// PB14 void LED_Init(void) { GPIO_InitTypeDef GPIOINIT; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); GPIOINIT.GPIO_Mode = GPIO_Mode_Out_PP; GPIOINIT.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14; GPIOINIT.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOD, &GPIOINIT); GPIO_ResetBits(GPIOD, GPIO_Pin_13 | GPIO_Pin_14); }
按键输入最关键的是对按键的初始化和输入判断。这里按键的初始化与LED的初始化不同的是GPIO的模式不一样了,LED是推挽输出,按键则相反,是输入,这个时候要考虑是哪一种输入方式,这里我的板子上按键是共阴极的,所以当按键按下的时候IO口输入的低电平,所以我需要在IO口接上拉电阻,使用上拉输入模式。
按键初始化函数:
#include "stm32f10x.h" #define KEY0 GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) //读取GPIOC13的输入 #define KEY1 GPIO_ReadInputDataBit(GPIOE, GPIO_Pin bd66 _0) //读取GPIOE0的输入 #define KEY0_PRESS 1 #define KEY1_PRESS 2 void KEY_Init(void) { GPIO_InitTypeDef GPIOInit; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOE, ENABLE); GPIOInit.GPIO_Mode = GPIO_Mode_IPU; GPIOInit.GPIO_Pin = GPIO_Pin_13; GPIOInit.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIOInit); GPIOInit.GPIO_Mode = GPIO_Mode_IPU; //上拉输入 GPIOInit.GPIO_Pin = GPIO_Pin_0; GPIOInit.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOE, &GPIOInit); }
对于按键输入来说,怎么判断是连续按,还是不连续按,这是一个重点。以前是将两种情况分开考虑,写成了两个函数,然后判断,其实,这个可以写成一个函数,只需添加一个选择形参,然后对形参进行判断操作即可。
按键输入函数:
//按键处理函数 //返回按键值 //mode:0不支持连续按;1支持连续按 //0,没有按键按下 //1,key0按下 //2,key1按下 unsigned char KEY_Scan(unsigned char mode) { static unsigned char key_up = 1; //按键松开标志 if(mode) { key_up = 1; //支持连续按 } if(key_up && (KEY0 == 0 || KEY1 == 0)) { delay_ms(10); //去抖 key_up = 0; if(KEY0 == 0) return KEY0_PRESS; else if(KEY1 == 0) return KEY1_PRESS; } else if(KEY0 == 1 && KEY1 == 1) { key_up = 1; } return 0; //无按键按下 }
主函数:
#include "led.h" #include "key.h" #include "stm32f10x.h" #include "delay.h" int main(void) { u8 key; LED_Init(); delay_init(); KEY_Init(); LED1=1; while(1) { key = KEY_Scan(0); if(key == 1) { LED1=!LED1; } else if(key == 2) { LED3=!LED3; } delay_ms(10); } }
按键输入keil工程分享
参考:开源电子网
相关文章推荐
- cortex_m3_stm32嵌入式学习笔记(二):独立按键实验(IO输入)
- STM32学习笔记——按键输入
- STM32按键输入、所需要的C语言复习、时钟系统框图
- 如何学STM32—十年经验教你如何学习嵌入式系统
- 嵌入式系统学习——STM32之FATFS文件系统
- 单片机入门学习七 STM32单片机学习四 按键输入
- STM32:STM32学习记录3:按键输入
- 嵌入式系统学习——STM32之UCOS-III中断和时间管理及软件定时器
- 嵌入式系统学习——STM32之通用定时器
- 嵌入式系统学习——STM32之UCOS-III任务管理
- cortex_m3_stm32嵌入式学习笔记(二十三):红外遥控实验(输入捕捉+解码)
- 嵌入式系统学习——STM32之SD卡(下)
- 【嵌入式系统学习记录】习题:输入一个字符串,同时输入帧头和帧尾(可以是多个字符),将该字符串中合法的帧识别出来。比如:帧头和帧尾分别是head和tail 字符串”asdheadhauboiso
- 嵌入式系统学习——STM32之TFT汉字显示
- 嵌入式系统学习——STM32之UCOS-III任务基础API、时间片轮转调度和系统任务
- 嵌入式系统学习——STM32之串口通信UART
- 嵌入式系统学习——STM32之跑马灯
- STM32学习笔记--按键输入实验
- 【嵌入式系统学习记录】练习:把句子中的单词倒序;(输入"i am from shanghai",输出"shanghai from am i")
- STM32-按键输入实验学习笔记