支持连续按与不支持连续按的区别:
支持连续按:按下不松开则认为是连续有效。程序实现:就是检测相应的端口,只要是是按下的状态,就执行相应的操作。
不支持连续按:按下不松开则认为是一次有效的。程序实现:就是检测相应的端口,只要按下,先把相应的标志位清零(防止连续有效)。然后在执行相应的操作。
【程序实现区别总结就是】
支持连续按,只要检测相应的端口按下的状态就可以,不支持连续按键,我们执行完一次按键操作以后,必须等待所有按键释放后,下次再次按下的时候才能执行相应的操作。
支持连续按的程序:
只要检测到按键按下,就执行相应的操作。
不支持连续按键的程序:
不支持连续按键,就需要 判断这连续两次按下中间是否有按键释放。如果有释放,则表明是第二次按下则执行相应的操作,如果是没有释放,则表示还是一次按下,则不执行操作。程序段中使用 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函数中
【不足】
程序段很碎,不是一个完整的程序。