LVGL学习之路——模拟器实现简易计算器

#include "../../lv_examples.h"
#include "test.h"
#include <Windows.h>

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define MAX_NUM 10                 	// 设置文本框显示最大位数

static lv_obj_t* ta;				// 文本框对象
static lv_obj_t* btnm1;				// 按钮对象
static char result[MAX_NUM];		// 缓存结果

static double save_num(char* num)	// 将字符串保存成浮点数
{
    return atof(num);
}

static char judge_num(double num)	// 比较数字尾数有没有超过指定数目
{
    char n[100];
    sprintf(n,"%g", num);
    printf("%d",strlen(n));
    if (strlen(n)<MAX_NUM)
    {
        return 0;
    }
    else
    {
        return 1;
    }
}

static void calculate(double before, double now, char operate, char* num)	// 计算浮点数
{
    double result = now;
    switch (operate)
    {
    case '+':
        result = before + now;
        break;
    case '-':
        result = before - now;
        break;
    case '*':
        result = before * now;
        break;
    case '/':
        result = before / now;
        break;
    default:
        break;
    }
    printf("result:%llf\n",result);
    sprintf(num, "%g", result);
}

static void event_handler(lv_obj_t* obj, lv_event_t event)
{
    if (event == LV_EVENT_VALUE_CHANGED) {
        static char error = 0;
        static double before = 0;
        volatile double now = 0;
        static char operate = '\0';
        static char num[MAX_NUM];
        const char* txt = lv_btnmatrix_get_active_btn_text(obj);	// 获取按键值
        if (error == 0)
        {
            switch (txt[0])
            {
            case '=':
                if (judge_num(before) == 0)
                {
                    now = save_num(num);
                    calculate(before,now,operate,num);
                    operate = '\0';
                    before = save_num(num);
                }
                else
                {
                    error = 1;
                    lv_textarea_set_text(ta, "EOR");
                    printf("error\n");
                }
                break;
            case 'D':
                num[strlen(num) - 1] = '\0';
                break;
            case '+':
                now = save_num(num);
                if (operate != '\0')
                {
                    calculate(before, now, operate, num);
                    before = save_num(num);;
                }
                else
                {
                    before = now;
                }
                operate = '+';
                memset(num, 0, MAX_NUM);
                break;
            case '-':
                now = save_num(num);
                if (operate != '\0')
                {
                    calculate(before, now, operate, num);
                    before = save_num(num);;
                }
                else
                {
                    before = now;
                }
                operate = '-';
                memset(num, 0, MAX_NUM);
                break;
            case '*':
                now = save_num(num);
                if (operate != '\0')
                {
                    calculate(before, now, operate, num);
                    before = save_num(num);;
                }
                else
                {
                    before = now;
                }
                memset(num, 0, MAX_NUM);
                operate = '*';
                break;
            case '/':
                now = save_num(num);
                if (operate != '\0')
                {
                    calculate(before, now, operate, num);
                    before = save_num(num);;
                }
                else
                {
                    before = now;
                }
                memset(num, 0, MAX_NUM);
                operate = '/';
                break;
            case ' ':
                break;
            default:
                if (strlen(num) < MAX_NUM)
                {
                    num[strlen(num)] = txt[0];
                }
                break;
            }
        }
        if (txt[0] == 'C')
        {
            memset(num, 0, MAX_NUM);
            memset(result, 0, MAX_NUM);
            before = 0;
            now = 0;
            error = 0;
            operate = '\0';
        }
        lv_textarea_set_text(ta, num);
        printf("before:%llf,now:%llf\n", before, now);
    }
}

static void ta_event_cb(lv_obj_t* ta, lv_event_t event)
{
    if (event == LV_EVENT_VALUE_CHANGED) {
        const char* txt = lv_textarea_get_text(ta);
        
    }
}


static const char* btnm_map[] = { "C", "D", "/", "\n",
                                  "1", "2", "3", "+", "\n",
                                  "4", "5", "6", "-", "\n",
                                  "7", "8", "9", "*", "\n",
                                  ".", "0","=", "" };

static void lv_ex_btnmatrix_1(void)
{
    btnm1 = lv_btnmatrix_create(lv_scr_act(), NULL);                    // 生成矩阵(默认5个)按钮
    lv_btnmatrix_set_map(btnm1, btnm_map);                              // 按照数组生成排列按钮
    lv_btnmatrix_set_btn_width(btnm1, 17, 2);                           // 设置第11个按钮的比重为2(默认为1)这将导致矩阵按键重绘
    lv_btnmatrix_set_btn_width(btnm1, 0, 3);
    lv_btnmatrix_set_btn_width(btnm1, 1, 3);
    lv_btnmatrix_set_btn_width(btnm1, 2, 2);
    lv_btnmatrix_set_btn_ctrl(btnm1, 17, LV_BTNMATRIX_CTRL_CHECK_STATE);// 设置按钮矩阵的按钮属性(变成选中状态)
    lv_obj_set_event_cb(btnm1, event_handler);                          // 设置按钮回调函数
    lv_obj_set_size(btnm1, LV_HOR_RES, LV_VER_RES * 6 / 7);             // 先调整
    lv_obj_align(btnm1, NULL, LV_ALIGN_IN_BOTTOM_LEFT, 0, 0);           // 再移动
}

static void lv_ex_textarea_3(void)
{
    /* Create the text area */
    ta = lv_textarea_create(lv_scr_act(), NULL);                        // 生成文本框控件
    lv_obj_set_event_cb(ta, ta_event_cb);                               // 设置文本框回调函数
    lv_textarea_set_accepted_chars(ta, "0123456789+-.*/EOR");           // 设置文本框允许被输入的数字
    lv_textarea_set_max_length(ta, MAX_NUM);                                 // 设置文本框允许最大储存的数字
    lv_textarea_set_one_line(ta, true);                                 // 设置文本框成单行
    lv_textarea_set_text(ta, "");                                       // 设置文本框文字
    lv_textarea_set_edge_flash(ta, true);                               // 设置溢出提示
    lv_obj_set_size(ta, LV_HOR_RES, LV_VER_RES / 7);                    // 先调整
    lv_obj_align(ta, NULL, LV_ALIGN_IN_TOP_LEFT, 0, 0);                 // 再移动
    static lv_style_t my_style;
    lv_style_init(&my_style);
    lv_style_set_text_color(&my_style, LV_STATE_DEFAULT, LV_COLOR_BLACK);
    lv_style_set_text_font(&my_style, LV_STATE_DEFAULT, &lv_font_montserrat_48);
    lv_obj_add_style(ta, LV_OBJ_PART_MAIN, &my_style);
}

void test(void)
{
    lv_ex_btnmatrix_1();
    lv_ex_textarea_3();
}
首先,您需要了解LVGL(Light and Versatile Graphics Library)是一个用于嵌入式系统的开源图形库,它提供了一套丰富的图形界面组件。要实现一个简易计算器,您可以按照以下步骤进行: 1. 设计界面:使用LVGL提供的组件,如按钮、文本框等,设计一个计算器界面。 2. 处理用户输入:通过按钮点击或键盘输入等方式获取用户输入的数字和操作符。 3. 执行计算:根据用户输入的操作符和数字,进行相应的计算操作,得到结果。 4. 显示结果:将计算结果显示在界面上的文本框或标签中。 下面是一个简单的示例代码,演示了如何使用LVGL实现一个简易计算器: ```c #include "lvgl/lvgl.h" // 计算器界面 void create_calculator(lv_obj_t* parent) { // 创建文本框用于显示输入和结果 lv_obj_t* input_text = lv_ta_create(parent, NULL); lv_obj_t* result_text = lv_label_create(parent, NULL); // 创建数字按钮 for (int i = 0; i <= 9; i++) { char btn_label[2]; sprintf(btn_label, "%d", i); lv_obj_t* btn = lv_btn_create(parent, NULL); lv_obj_t* btn_label = lv_label_create(btn, NULL); lv_label_set_text(btn_label, btn_label); } // 创建操作符按钮(如加、减、乘、除等) // ... // 设置按钮点击事件处理函数,用于获取用户输入并进行计算 // ... } int main(void) { // 初始化LVGL lv_init(); // 创建显示屏(实际情况根据硬件平台不同可能有所差异) lv_disp_drv_t disp_drv; lv_disp_drv_init(&disp_drv); lv_disp_drv_register(&disp_drv); // 创建主界面 lv_obj_t* main_screen = lv_obj_create(NULL, NULL); create_calculator(main_screen); lv_scr_load(main_screen); // 进入LVGL主循环 while (1) { lv_task_handler(); // 其他操作 } return 0; } ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值