LVGL 8.3.1
#define LVGL_VERSION_MAJOR 8
#define LVGL_VERSION_MINOR 3
#define LVGL_VERSION_PATCH 1
#define LVGL_VERSION_INFO ""
LVGL常用的是触摸屏,这次有限定需要使用外置按键,调试过程做个记录:
调试环境 arduino,使用vscode进行代码编译,arduino 只负责下载。
测试代码示例 lvgl\examples\arduino\LVGL_Arduino\LVGL_Arduino.ino
参考示例 lvgl\examples\porting\lv_port_indev_template.c
首先,setup():
改动前
/*Initialize the (dummy) input device driver*/
static lv_indev_drv_t indev_drv;
lv_indev_drv_init( &indev_drv );
indev_drv.type = LV_INDEV_TYPE_POINTER;
indev_drv.read_cb = my_touchpad_read;
lv_indev_drv_register( &indev_drv );
改动后
在后边可以通过其他示例增加控件,举例 按键组合:lvgl\examples\widgets\btnmatrix\lv_example_btnmatrix_1.c
/*Initialize the (dummy) input device driver*/
static lv_indev_drv_t indev_drv;
/*------------------
* Keypad
* -----------------*/
/*Initialize your keypad or keyboard if you have*/
keypad_init();
/*Register a keypad input device*/
lv_indev_drv_init(&indev_drv);
indev_drv.type = LV_INDEV_TYPE_KEYPAD;
indev_drv.read_cb = keypad_read;
indev_keypad = lv_indev_drv_register(&indev_drv);
lv_obj_t * btnm1 = lv_btnmatrix_create(lv_scr_act());
lv_btnmatrix_set_map(btnm1, btnm_map);
lv_btnmatrix_set_btn_width(btnm1, 10, 2); /*Make "Action1" twice as wide as "Action2"*/
lv_btnmatrix_set_btn_ctrl(btnm1, 10, LV_BTNMATRIX_CTRL_CHECKABLE);
lv_btnmatrix_set_btn_ctrl(btnm1, 11, LV_BTNMATRIX_CTRL_CHECKED);
lv_obj_align(btnm1, LV_ALIGN_CENTER, 0, 0);
lv_obj_add_event_cb(btnm1, event_handler, LV_EVENT_ALL, NULL);
按键组合的事件回调函数和按键名称
static void event_handler(lv_event_t * e)
{
lv_event_code_t code = lv_event_get_code(e);
lv_obj_t * obj = lv_event_get_target(e);
if(code == LV_EVENT_VALUE_CHANGED) {
uint32_t id = lv_btnmatrix_get_selected_btn(obj);
const char * txt = lv_btnmatrix_get_btn_text(obj, id);
LV_LOG_USER("%s was pressed\n", txt);
}
}
static const char * btnm_map[] = {"1", "2", "3", "4", "5", "\n",
"6", "7", "8", "9", "0", "\n",
"Action1", "Action2", ""
};
按键的读取和回调函数
/*------------------
* Keypad
* -----------------*/
/*Initialize your keypad*/
static void keypad_init(void)
{
/*Your code comes here*/
pinMode(25, INPUT); //左
pinMode(36, INPUT); //上
pinMode(39, INPUT); //右
pinMode(34, INPUT); //下
pinMode(35, INPUT); //返回
pinMode(21, INPUT); //确定
}
/*Will be called by the library to read the mouse*/
static void keypad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
{
static uint32_t last_key = 0;
/*Get the current x and y coordinates*/
mouse_get_xy(&data->point.x, &data->point.y);
/*Get whether the a key is pressed and save the pressed key*/
uint32_t act_key = keypad_get_key();
if(act_key != 0) {
data->state = LV_INDEV_STATE_PR;
/*Translate the keys to LVGL control characters according to your key definitions*/
switch(act_key) {
case 1:
act_key = LV_KEY_LEFT;
break;
case 2:
act_key = LV_KEY_PREV;
break;
case 3:
act_key = LV_KEY_RIGHT;
break;
case 4:
act_key = LV_KEY_NEXT;
break;
case 5:
act_key = LV_KEY_HOME;
break;
case 6:
act_key = LV_KEY_ENTER;
break;
}
last_key = act_key;
}
else {
data->state = LV_INDEV_STATE_REL;
}
// Serial.println( last_key );
data->key = last_key;
}
/*Get the currently being pressed key. 0 if no key is pressed*/
static uint32_t keypad_get_key(void)
{
/*Your code comes here*/
if(digitalRead(25) == 0){
return 1;
}else if(digitalRead(36) == 0){
return 2;
}else if(digitalRead(39) == 0){
return 3;
}else if(digitalRead(34) == 0){
return 4;
}else if(digitalRead(35) == 0){
return 5;
}else if(digitalRead(21) == 0){
return 6;
}
return 0;
}
只是按照示例的内容是如上边所示,按键按下去还是没啥翻译,查看LVGL官方文档
在setup()内增加以下几句:
lv_group_t *group = lv_group_create();
lv_indev_set_group(indev_keypad, group);
lv_group_add_obj(group ,btnm1);
OK,按钮有反应了