#include "key.h" #include static bool s_inited; key_module_t *key_module_s; void key_init(key_module_t *key_module) { key_module_s = key_module; s_inited = true; //标志位说明按键初始化完成 for (int i = 0; i < key_module_s->nkey; i++) { key_module_s->keys[i].cur_state = zks_keep; key_module_s->keys[i].last_io_state = key_module_s->keys[i].get_key_state(); key_module_s->keys[i].after_filter_state = key_module_s->keys[i].get_key_state(); } } void key_do_loop_in_each_period() { //如果没初始化则不进行按键扫描 if (!s_inited) { return; } //按键扫描 for (int i = 0; i < key_module_s->nkey; i++) { // printf("key_name:%s\n", key_module_s->keys[i].name); key_process_each(&key_module_s->keys[i]); } } static void prv_zkey_process_each_after_filter(key_t *each, bool now_io_state) { if (now_io_state != each->last_io_state) { if (now_io_state) { each->keep_state_count = 0; each->hasProcessed = false; each->cur_state = zks_rising_edge; key_module_s->onkey(each, each->cur_state); } else { each->cur_state = zks_falling_edge; key_module_s->onkey(each, each->cur_state); each->keep_state_count = 0; } each->last_io_state = now_io_state; } else { each->cur_state = zks_keep; if (now_io_state) { key_module_s->onkey(each, each->cur_state); } } } void key_process_each(key_t *each) { each->keep_state_count++; bool now_io_state = each->get_key_state(); //获取现在的按键io状态 true未按下 false按下 // if (now_io_state != each->last_io_state) { // each->keep_state_count = 0; // } each->after_filter_state = now_io_state; each->last_real_state = now_io_state; prv_zkey_process_each_after_filter(each, each->after_filter_state); }