RT1064学习KEY——基于逐飞科技开源库
前言
- 逐飞科技主控板上有两个拨码开关及四个按键接口
- 拨码开关1:使用引脚为D4
- 拨码开关2:使用引脚为D27
- 按键1:使用引脚为C31
- 按键2:使用引脚为C27
- 按键3:使用引脚为C26
- 按键4:使用引脚为C4
- 逐飞科技封装了按键的扫描、读取函数,使用了类似状态机的扫描方式,原理如下:
扫描函数不断的轮询四个按键的状态,将按键状态分为:松手、消抖、短按、长按。
当处于松手状态时: 判断当前电平是否不为默认电平,是则拿时间变量与设定的消抖时长对比,大于消抖时长则置为短按状态,反之为消抖状态;否的话无事发生;
当为消抖状态时: 判断当前电平是否不为默认电平,是则拿时间变量与设定的消抖时长对比,大于消抖时长则置为短按状态;否的话重置为松手状态;
当为短按状态时: 对比时间变量与最小长按时间,时间变量大于最小长按时间的话将状态置长按;同时判断当前电平是否为默认电平,是则重置为松手状态;
当处于长按状态时: 判断当前电平是否为默认电平,是则重置为松手状态;
扫描函数于主循环或是定时器中不断执行,需要的时候调用读取按键状态的函数即可。
API接口
void key_scanner (void);
功能:按键扫描,实现方法见前言
key_state_enum key_get_state (key_index_enum key_n);
功能:获取按键状态
参数1:按键号(KEY_1。。。)
返回值:按键状态
void key_init (uint32 period);
功能:按键初始化
参数1:按键扫面周期,及扫描几次算一次时间
gpio_level_enum switch_get_state(gpio_pin_enum pin);
功能:获取开关状态
参数1:开关引脚
返回值:开关状态(电平)
测试示例
拨码开关负责模式选择(0为模块选择,冲突情况为禁止)
模式1:
按键有效,按键1对应LED亮,按键2对应LED灭,按键3对应蜂鸣器响,按键4对应蜂鸣器停
模式2:
按键无效,LED与蜂鸣器以1S间隔闪烁(响停)在这里插入代码片
#include "zf_common_headfile.h"
#define BUZZER B11
#define LED B9
int main(void)
{
clock_init(SYSTEM_CLOCK_600M); // 不可删除
debug_init(); // 调试端口初始化
system_delay_ms(300);
// 此处编写用户代码 例如外设初始化代码等
gpio_init(B9,GPO,1,GPO_PUSH_PULL); //设置PB9为100HZ推挽输出,默认电平为0
gpio_init(B11,GPO,0,GPO_PUSH_PULL); //设置PB11为100HZ推挽输出,默认电平为0
key_init(1);
while(1)
{
// 此处编写需要循环执行的代码
key_scanner();
if(switch_get_state(SWITCH1_PIN) == 0 && switch_get_state(SWITCH2_PIN) == 1) //如果开关1为低电平,开关2为高电平
{
if(key_get_state(KEY_1) == KEY_SHORT_PRESS) //如果按键1短按
{
gpio_set_level(LED,0); //LED点亮
}
else if(key_get_state(KEY_2) == KEY_SHORT_PRESS) //如果按键2短按
{
gpio_set_level(LED,1); //LED熄灭
}
else if(key_get_state(KEY_3) == KEY_SHORT_PRESS) //如果按键3短按
{
gpio_set_level(BUZZER,1); //蜂鸣器响
}
else if(key_get_state(KEY_4) == KEY_SHORT_PRESS) //如果按键4短按
{
gpio_set_level(BUZZER,0); //蜂鸣器停
}
}
else if(switch_get_state(SWITCH2_PIN) == 0 && switch_get_state(SWITCH1_PIN) == 1) //如果开关1为高电平,开关2为低电平
{
gpio_toggle_level(B9); //反转LED状态
gpio_toggle_level(B11); //反装蜂鸣器状态
system_delay_ms(1000); //延时一秒
}
else
{
gpio_set_level(LED,1);
gpio_set_level(BUZZER,0);
}
}
}