【前言】
处理按键是常用的编程基础之一,在官方以及野火、百问网都有按键驱动的示例,但是本篇介绍一个面向对象的驱动库,只需要修改对应的驱动就可以实现按建的多种状态的实现。
【驱动库】
issac wan/以面向对象思想编写的按键管理框架 - 码云 - 开源中国
【移植步骤】
1、将驱动的key_manage.h/c添加到工程的src目录下面。
2、编写基于RA6M5的按键驱动。我们先找到开发板的原理图,按建的原理图如下:
从原理图上,按键分别接到了P005、P004上面,并且有上拉输入,因些我们进入RSCA进行配置,将PIN配置为input即可。
4、编译key_driver.h如下:
#ifndef __KEY_DRIVER_H__ #define __KEY_DRIVER_H__ #ifdef __cplusplus extern "C" { #endif #include "hal_data.h" #define KEY1_SW2_PIN BSP_IO_PORT_00_PIN_04 #define KEY2_SW3_PIN BSP_IO_PORT_00_PIN_05 /* 可以为单个引脚设置电平和读取电平 */ uint8_t key_sw1_read_pin(void); uint8_t key_sw2_read_pin(void); #ifdef __cplusplus } #endif #endif /* __KEY_DRIVER_H */
key_driver.c如下:
#include "key_driver.h" uint8_t key_sw1_read_pin(void) { bsp_io_level_t p_port_value_port_004; R_IOPORT_PinRead(&g_ioport_ctrl, BSP_IO_PORT_00_PIN_04, &p_port_value_port_004); if(p_port_value_port_004) return 1; else return 0; } uint8_t key_sw2_read_pin(void) { bsp_io_level_t p_port_value_port_005; R_IOPORT_PinRead(&g_ioport_ctrl, BSP_IO_PORT_00_PIN_05, &p_port_value_port_005); if(p_port_value_port_005) return 1; else return 0; }
在驱动中,我们只输要读取两个IO的电平,并返回即可。
【按键的初始化与注册】
这里我只做了一个按键的驱动注册,在hal_enty.c中编写测试代码如下:
static struct key_handle _key1_sw2; static struct key_handle _key2_sw3; static void key1_sw2_callback(key_handle_t key) { switch (key->event) { case Press_Down: APP_PRINT("SW Press Down\r\n"); break; case Press_Up: APP_PRINT("SW Press UP\r\n"); break; } } key_init(&_key1_sw2, key_sw1_read_pin, 0); key_event_callback_register(&_key1_sw2, Press_Down, key1_sw2_callback); key_event_callback_register(&_key1_sw2, Press_Up, key1_sw2_callback); key_handle_register(&_key1_sw2);
同时在while循环里调用key_tick。
【实验效果】
下载程序到开发板,按下按键就可以打印出即定的效果:
【总结】
移植面向对象的驱动,可以快速的实现驱动,此驱动可以方便的移植到不同的单片机中,实现按建的用户功能!