本帖最后由 kingkits 于 2019-12-19 15:49 编辑
看到很多朋友都困惑如何扫描键盘,这里给出一个简单单排(非矩阵式键盘)扫描的程序,希望能给大家帮助
static unsigned char key;
static unsigned char new_key_pushed_flag;
static unsigned char key_pushed_flag;
static uint16_t key_pushed_time;
static unsigned char key_current;
static unsigned char key_old;
static unsigned char key_cnt;
void init_key_data(void)
{
key = 0;
key_pushed_flag = 0;
key_pushed_time = 0;
key_current = 0;
key_old = 0;
key_cnt = 0;
}
// note: one pushed key only one time
uint8_t get_key(void)
{
uint8_t key_tmp;
if(new_key_pushed_flag)
{
new_key_pushed_flag = 0;
key_tmp = key;
key = 0;
return key_tmp;
}
return 0;
}
// 这里读取按键按下时间,单位是4ms (因为我用4ms中断调用的,你的可能不太一样),可以用于判断长时间按下,最长大概有1秒,如果你需要更长,需要改改
uint16_t get_key_pushed_time(void)
{
return key_pushed_time;
}
// 这里判断是否有按键按下
uint8_t is_key_pushed(void)
{
return key_pushed_flag;
}
// 我用4ms中断调用这个函数,这个函数已经做了去抖动了。正常的按键都能识别。
void check_key(void)
{
uint32_t key_data;
// 这一部分要替换成你的代码
// --->
key_data = GPIOK->IDR;
key_data >>= 4;
key_data = (uint8_t)(key_data & 0xf);
key_data ^= 0xf;
// <----
// 我这里用0 表示没有按键按下,你的可能不一样
if(key_data == 0)
{
key_pushed_flag = 0;
key_pushed_time = 0;
}
else
{
key_pushed_flag = 1;
}
key_current = key_data & (key_data ^ key_cnt);
key_cnt = key_data;
if(key_current == 0)
{
key_old = 0;
key_pushed_time = 0;
return;
}
if(key_current == key_old)
{
// 防止溢出
if(key_pushed_time < 0xfe)
{
key_pushed_time ++;
}
}
else
{
new_key_pushed_flag = 1;
key_old = key_current;
key = key_current;
}
}
|
感谢分享