STM32F1学习-按键实验(寄存器版本)

来源:互联网 发布:淘宝特价商品 编辑:程序博客网 时间:2024/04/29 16:02

支持连续按与不支持连续按的区别:

支持连续按:按下不松开则认为是连续有效。程序实现:就是检测相应的端口,只要是是按下的状态,就执行相应的操作。

不支持连续按:按下不松开则认为是一次有效的。程序实现:就是检测相应的端口,只要按下,先把相应的标志位清零(防止连续有效)。然后在执行相应的操作。

【程序实现区别总结就是】

支持连续按,只要检测相应的端口按下的状态就可以,不支持连续按键,我们执行完一次按键操作以后,必须等待所有按键释放后,下次再次按下的时候才能执行相应的操作。


支持连续按的程序:


只要检测到按键按下,就执行相应的操作。


不支持连续按键的程序:


不支持连续按键,就需要 判断这连续两次按下中间是否有按键释放。如果有释放,则表明是第二次按下则执行相应的操作,如果是没有释放,则表示还是一次按下,则不执行操作。程序段中使用 static 就是保持 key_up的键值。然后判断两次检测中间有没有释放。如果有释放则key_up等于1,执行操作。否则key_up等于0,不执行操作。


可以通过设置标志位,可以把两个程序段合成一个程序:



按键实验完整的功能:

KEY1控制LED1翻转,KEY2同时控制LED0,LED1翻转 ,KEY3控制蜂鸣器。假设:LED灯分别和PB5与PE5相连。KEY分别和PE2与PE3相连。KEY_UP是和PA0相连。

按键实验主要程序段

在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函数中


【不足】

程序段很碎,不是一个完整的程序。


















0 0
原创粉丝点击