单片机---HLK-W801图形框架LVGL下开发(二)

前文回顾

《单片机—HLK-W801并口驱动ST7789》
《单片机—HLK-W801驱动触摸屏》
《单片机—HLK-W801图形框架LVGL移植》
《单片机—HLK-W801图形框架LVGL下开发(一)》

2022.2.21日的效果如下

W801上移植lvgl,并增加APP模拟

本章重点

框架移植好了之后,就打算开发一些软件应用,目前做出了桌面和菜单,能够进行软件打开关闭,准备把这个打造成一个微型的计算机系统,那么必然是需要应用软件的。
谁……谁在喊扫雷……
单片机---HLK-W801图形框架LVGL下开发(二)_第1张图片
今天开发一下计算器这个功能。

界面绘制

显示部分,这里主要是绘制了一个textarea和一个软键盘,这个键盘是一个矩阵键盘,在官方的表述中这种还是很节省资源的。
绘制键盘上增加我们要输入的数字键,运算符。模拟windows上的计算器即可
单片机---HLK-W801图形框架LVGL下开发(二)_第2张图片
这不会被微软起诉吧,
单片机---HLK-W801图形框架LVGL下开发(二)_第3张图片

下面是绘制界面部分代码。绘制了一个textarea,用来显示算式。然后绘制了一个键盘,用来输入运算符和操作符。

    lv_obj_t * ta = lv_textarea_create(cont);
    lv_textarea_set_one_line(ta, true);
    lv_obj_align(ta, LV_ALIGN_TOP_MID, 0, -5);
    lv_obj_add_event_cb(ta, textarea_event_handler, LV_EVENT_READY, ta);
    lv_obj_add_state(ta, LV_STATE_FOCUSED); /*To be sure the cursor is visible*/

    static const char * btnm_map[] = {
	"(", 		")", 		"%", 		"*",	"\n",
	"9", 		"8", 		"7",		"/", 	"\n",
	"6", 		"5", 		"4",		"-",	"\n",
	"3", 		"2", 		"1", 		"+",	"\n",
	LV_SYMBOL_BACKSPACE, 		"0", 		"CE", 		"="		""
	};

    lv_obj_t * btnm = lv_btnmatrix_create(cont);
    lv_obj_align(btnm, LV_ALIGN_TOP_MID, 0, 25);
    lv_obj_set_size(btnm, 260, 160);
    lv_obj_add_event_cb(btnm, btnm_event_handler, LV_EVENT_VALUE_CHANGED, ta);
    lv_obj_clear_flag(btnm, LV_OBJ_FLAG_CLICK_FOCUSABLE); /*To keep the text area focused on button clicks*/
    lv_btnmatrix_set_map(btnm, btnm_map);

回调函数,这里用来即时的响应键盘,将键盘的数字发送到textarea中,并且个别处理一下操作字符。例如回退,清空,等号等。

static void btnm_event_handler(lv_event_t * e)
{
    lv_obj_t * obj = lv_event_get_target(e);
    lv_obj_t * ta = lv_event_get_user_data(e);
    const char * txt = lv_btnmatrix_get_btn_text(obj, lv_btnmatrix_get_selected_btn(obj));

    if(strcmp(txt, LV_SYMBOL_BACKSPACE) == 0) 
	{
		lv_textarea_del_char(ta);
	}
	
    else if(strcmp(txt, "CE") == 0)
	{
		lv_textarea_set_text(ta,"");
	}
    else if(strcmp(txt, "=") == 0)
	{
		//lv_event_send(ta, LV_EVENT_READY, NULL);
		char result[32]={0};
		calc_main(lv_textarea_get_text(ta),result);
		lv_textarea_set_text(ta,result);
		
	}
    else
    {
		lv_textarea_add_text(ta, txt);
    }

}

绘制代码和回调比较简单,也不是核心所在
单片机---HLK-W801图形框架LVGL下开发(二)_第4张图片

计算器C语言实现

这里我们要做到的就是将一个运算式,直接计算出结果。这里要用的知识点,就是前缀,中缀和后缀表达式。具体可以参考一下这篇文章 chensongxian的《前缀、中缀、后缀表达式(逆波兰表达式)》

这里提炼一下。
我们常见的手写算式,属于中缀表达式,例如(3+2)*8-2,简单来说就是符合人类阅读习惯的表达式。

单片机---HLK-W801图形框架LVGL下开发(二)_第5张图片

不过计算机能处理的,不是这种,常处理的就是后缀表达式。

后缀表达式就是运算符在数字之后,例如 3 2 + 5 -,表达的就是3和2相加,然后-5。
计算方法,下面介绍常用的堆栈法:
从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次顶元素 op 栈顶元素),并将结果入栈;重复上述过程直到表达式最右端,最后运算得出的值即为表达式的结果。

代码可以参考 肖志峰 《利用栈实现计算表达式字符串的值(C语言)》
这里的代码是只能计算到整数。

还可以参考Java3L《C语言中缀表达式求值(综合)》
这里取了浮点数作为中间结果,可以计算出小数。

整体效果

w801上lvgl实现计算器

还算比较流畅啊。

结束语

这两天大事太多了,借用朋友的一张图,暖一下场吧。
单片机---HLK-W801图形框架LVGL下开发(二)_第6张图片

周末老家里一位亲人也心脏病突发故去,正赶上疫情严重,人也就很快入土为安了。
单片机---HLK-W801图形框架LVGL下开发(二)_第7张图片
还是那句简单的话,珍惜当下。

你可能感兴趣的:(单片机,IOT,C语言典型代码,w801,单片机,lvgl,计算器,app)