【前言】
处理按键是常用的编程基础之一,在官方以及野火、百问网都有按键驱动的示例,但是本篇介绍一个面向对象的驱动库,只需要修改对应的驱动就可以实现按建的多种状态的实现。
【驱动库】
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。
【实验效果】
下载程序到开发板,按下按键就可以打印出即定的效果:

【总结】
移植面向对象的驱动,可以快速的实现驱动,此驱动可以方便的移植到不同的单片机中,实现按建的用户功能!
			
			
			
						
			
 我要赚赏金
