STM32F1学习-按键实验(寄存器版本)
2016-07-18 13:51
162 查看
支持连续按与不支持连续按的区别:
支持连续按:按下不松开则认为是连续有效。程序实现:就是检测相应的端口,只要是是按下的状态,就执行相应的操作。
不支持连续按:按下不松开则认为是一次有效的。程序实现:就是检测相应的端口,只要按下,先把相应的标志位清零(防止连续有效)。然后在执行相应的操作。
【程序实现区别总结就是】
支持连续按,只要检测相应的端口按下的状态就可以,不支持连续按键,我们执行完一次按键操作以后,必须等待所有按键释放后,下次再次按下的时候才能执行相应的操作。
支持连续按的程序:
只要检测到按键按下,就执行相应的操作。
不支持连续按键的程序:
不支持连续按键,就需要 判断这连续两次按下中间是否有按键释放。如果有释放,则表明是第二次按下则执行相应的操作,如果是没有释放,则表示还是一次按下,则不执行操作。程序段中使用 static 就是保持 key_up的键值。然后判断两次检测中间有没有释放。如果有释放则key_up等于1,执行操作。否则key_up等于0,不执行操作。
可以通过设置标志位,可以把两个程序段合成一个程序:
按键实验完整的功能:
KEY1控制LED1翻转,KEY2同时控制LED0,LED1翻转 ,KEY3控制蜂鸣器。假设:LED灯分别和PB5与PE5相连。KEY分别和PE2与PE3相连。KEY_UP是和PA0相连。
[b]按键实验主要程序段[/b]
在led.c文件中
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState); //使能PB,PE端口时钟
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct); //配置相应的寄存器
第一个参数确实是哪个IO口,第二个参数是结构体变量。分别控制第几位,配置传输速度,输入输出模式。
通过GPIO_SetBits();函数使PE5和PB5输出高电平。
相应的程序段:
在beep.c文件中
同样的方法,使能PB8时钟、配置PB8模式并且初始化PB8为0
在key.c中,我们先配置相应的IO口,然后写扫描函数
由于KEY0与KEY1需要接高电平,因此,PE3和PE4需要配置成强上拉。WK_UP需要低电平,因此,WK_UP需要配置成强下拉。需要在配置IO口的模式中配置。
和上面的程序类似,先初始化时钟,然后配置模式(输入,PE2、PE3强上拉。PA0强下拉模式)
扫描函数
在key.h中
在main函数中
【不足】
程序段很碎,不是一个完整的程序。
支持连续按:按下不松开则认为是连续有效。程序实现:就是检测相应的端口,只要是是按下的状态,就执行相应的操作。
不支持连续按:按下不松开则认为是一次有效的。程序实现:就是检测相应的端口,只要按下,先把相应的标志位清零(防止连续有效)。然后在执行相应的操作。
【程序实现区别总结就是】
支持连续按,只要检测相应的端口按下的状态就可以,不支持连续按键,我们执行完一次按键操作以后,必须等待所有按键释放后,下次再次按下的时候才能执行相应的操作。
支持连续按的程序:
只要检测到按键按下,就执行相应的操作。
不支持连续按键的程序:
不支持连续按键,就需要 判断这连续两次按下中间是否有按键释放。如果有释放,则表明是第二次按下则执行相应的操作,如果是没有释放,则表示还是一次按下,则不执行操作。程序段中使用 static 就是保持 key_up的键值。然后判断两次检测中间有没有释放。如果有释放则key_up等于1,执行操作。否则key_up等于0,不执行操作。
可以通过设置标志位,可以把两个程序段合成一个程序:
按键实验完整的功能:
KEY1控制LED1翻转,KEY2同时控制LED0,LED1翻转 ,KEY3控制蜂鸣器。假设:LED灯分别和PB5与PE5相连。KEY分别和PE2与PE3相连。KEY_UP是和PA0相连。
[b]按键实验主要程序段[/b]
在led.c文件中
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState); //使能PB,PE端口时钟
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct); //配置相应的寄存器
第一个参数确实是哪个IO口,第二个参数是结构体变量。分别控制第几位,配置传输速度,输入输出模式。
通过GPIO_SetBits();函数使PE5和PB5输出高电平。
相应的程序段:
在beep.c文件中
同样的方法,使能PB8时钟、配置PB8模式并且初始化PB8为0
在key.c中,我们先配置相应的IO口,然后写扫描函数
由于KEY0与KEY1需要接高电平,因此,PE3和PE4需要配置成强上拉。WK_UP需要低电平,因此,WK_UP需要配置成强下拉。需要在配置IO口的模式中配置。
和上面的程序类似,先初始化时钟,然后配置模式(输入,PE2、PE3强上拉。PA0强下拉模式)
扫描函数
在key.h中
在main函数中
【不足】
程序段很碎,不是一个完整的程序。
相关文章推荐
- MongoDB数据导出成CSV
- 关于Unity中的简易定时器
- IOS/OSX开发问题杂记
- Android Studio 翻译插件
- IOS-自定义Tabbar与Navigation
- 是Theme还是background
- ACM--OJ判题--HDOJ 1073--Online Judge--字符串
- Android Studio工程导入另一个工程作为lib
- 一个页面如何放多个百度编辑器 Ueditor 1.4.3?PHP如何获取Ueditor 的值?
- 五年26个版本:Linux系统内核全程回顾
- POJ - 3321 Apple Tree
- Open Asset Import Library详解
- 字符
- Linux下查看内核、CPU、内存及各组件版本的命令和方法
- 图片轮播
- Hdu3812-Sea Sky(深搜+剪枝)
- web04-LoginServlet
- Android ListView/GridView 中Adapter的用法(1)
- git之:分支管理策略
- Python中的cls与self的区别