单片机  :STM32F407
开发板:DMF407电机开发板
平台:keil   V5.31

HSE 为8MHZ
HSI为16MHZ

一、二维码

主函数

void lv_mainstart(void)
{
    /* 创建一个标签 */
    lv_obj_t *label_time = lv_label_create(lv_scr_act());
    /* 设置标签的文本 */
    lv_label_set_text(label_time,"ALIENTEK_QR");
    /* 设置标签的文本字体颜色 */
    lv_obj_set_style_text_color(label_time,lv_palette_main(LV_PALETTE_RED),LV_STATE_DEFAULT);
    /* 设置标签的文本字体 */
    lv_obj_set_style_text_font(label_time,&lv_font_montserrat_32,LV_STATE_DEFAULT);
    /* 设置标签的顶部中间对齐 */
    lv_obj_align(label_time,LV_ALIGN_TOP_MID,0,0);
    /* 创建一个lcddev.width/2的二维码 */
    lv_obj_t * qr = lv_qrcode_create(lv_scr_act(), lv_obj_get_width(lv_scr_act())/2, lv_color_hex3(0x33f), lv_color_hex3(0xeef));
    /* 设置数据 */
    lv_qrcode_update(qr, data, strlen(data));
    /* 二维码中间对齐 */
    lv_obj_align(qr,LV_ALIGN_CENTER,0,0);
}

测试结果:

二、计算器

主函数

void calc_fmt_show(int x2,const char * buf,uint8_t fmt)
{
    x2 = atof((const char *)buf); /* 转换为数字 */
    char *fmtstr="";
    char outbuf[17];
    char fmt_chx_buf[100];
    memset(fmt_chx_buf, 0, sizeof(fmt_chx_buf));
    fmtstr="HEX";
    sprintf((char*)outbuf,"%X",x2); /* 输出结果到outbuf里面 */
    lv_textarea_set_text(phone_ta,(const char *)outbuf);
    strcat((char *)fmt_chx_buf, fmtstr);
    lv_label_set_text(label_dec,fmt_chx_buf);
}

/**
  * @brief  获取计算加减乘除标志
  * @param  ctype:计算的类型
  * @retval 返回计算类型
  */
uint8_t lv_math_calc_label(uint8_t ctype)
{
    char *chx;
    memset(lv_chx_buf, 0, sizeof(lv_chx_buf));
  
    switch(ctype)
    {
        case 0:/* 加法计算 */
          chx = "+";
          break;
       case 1:/* 减法计算 */
          chx = "-";
          break;
       case 2:/* 乘法计算 */
          chx = "*";
          break;
       case 3:/* 除法计算 */
          chx = "/";
          break;
       case 4:/* x^y次方计算 */
          chx = "x ^ y";
          break;
    }

    strcat((char *)lv_chx_buf, chx);
    strcat((char *)lv_chx_buf, " DEG");
    lv_label_set_text(label_dec,lv_chx_buf);
    return  ctype;
}

/**
  * @brief  等于=按键计算
  * @param  x1:获取第一个数值
  * @param  x2:获取第二个数值
  * @param  ctype:计算的类型
  * @retval 返回计算数值
  */
double lv_math_calc(double x1,double x2,uint8_t ctype)
{
    switch(ctype)
    {
        case 0:/* 加法 */
          x1=x1+x2;
          break;
        case 1:/* 减法 */
          x1=x1-x2;
          break;
        case 2:/* 乘法 */
          x1=x1*(x2);
          break;
        case 3:/* 除法 */
          x1=x1/(x2);
          break;
        case 4:/* x^y次方 */
          x1=pow(x1,x2);
          break;
        case 5:/* 没有任何运算符 */
          x1=x2;
          break;
    }
    
    return x1;
}

/**
  * @brief  计算特殊的类型
  * @param  x1:获取第一个数值
  * @param  x2:无
  * @param  buf:获取的字符串
  * @param  ctype:计算的类型
  * @retval 无
  */
void lv_calc_exe(double *x1,double *x2,const char * buf,uint8_t ctype)
{
    *x1 = atof((const char *)buf); /* 转换为数字 */
    char *chx;
    memset(lv_chx_buf, 0, sizeof(lv_chx_buf));
    
    switch(ctype)
    {
        case 0:/* sin计算 */
          *x1 = sin((*x1*CALC_PI)/180);/* 转换为角度计算结果 */
          chx = "sin";
          break;
        case 1:/* cos计算 */
          *x1 = cos((*x1*CALC_PI)/180);/* 转换为角度计算结果 */
          chx = "cos";
          break;
        case 2:/* tan计算 */
          *x1 = tan((*x1*CALC_PI)/180);/* 转换为角度计算结果 */
          chx = "tan";
          break;
        case 3:/* log计算 */
          *x1 = log10(*x1);
          chx = "log";
          break;
        case 4:/* ln计算 */
          *x1 = log(*x1);
          chx = "ln";
          break;
        case 5:/* x^2计算 */
          *x1 = *x1*(*x1);
          chx = "x^2";
          break;
        case 6:/* 开方计算 */
          *x1=sqrt(*x1);
          chx = "^";
          break;
        case 7:/* 倒数计算 */
          *x1=1/(*x1);
          chx = "1/x";
          break;
    }
    
    strcat((char *)lv_chx_buf, chx);
    strcat((char *)lv_chx_buf, " DEG");
    lv_label_set_text(label_dec,lv_chx_buf);
}

/**
  * @brief  回调函数
  * @param  obj  :对象
  * @param  event:事件
  * @retval 无
  */
static void lv_event_handler(lv_event_t *event)
{
    char str[25];
    char chx_buf[100];
    memset(chx_buf, 0, sizeof(chx_buf));
    lv_event_code_t code = lv_event_get_code(event);
    lv_obj_t * obj = lv_event_get_target(event);

    if (code == LV_EVENT_DRAW_PART_BEGIN)
    {
        lv_obj_draw_part_dsc_t* dsc = lv_event_get_param(event);
        
        if (dsc->id == 0)
        {
            dsc->rect_dsc->radius = 0;
            dsc->rect_dsc->border_width = 2;
            dsc->rect_dsc->bg_color = lv_color_make(1, 27, 54);
            dsc->rect_dsc->border_color = lv_color_white();
        }
        else
        {
            dsc->rect_dsc->border_width = 2;
            dsc->rect_dsc->radius = 0;
            dsc->rect_dsc->bg_color = lv_color_make(1, 27, 54);
            dsc->rect_dsc->border_color = lv_color_white();
            dsc->label_dsc->color = lv_color_white();
        }
    }
    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);
        uint32_t cur = lv_textarea_get_cursor_pos(phone_ta);

        if (atof(lv_textarea_get_text(phone_ta)) == 0&&lv_calc_pos == 0&&lv_cbp_and_negative ==0&&lv_calc_math == 0)
        {
            lv_textarea_set_text(phone_ta, "");
        }

        if (txt == kb_map_num[0])  /* sin */
        {
            memset(str, 0, sizeof(str));
            calc_ec = 1;
            lv_calc_exe(&calc_x1,0,lv_textarea_get_text(phone_ta),0);
            sprintf(str,"%g",calc_x1);
            lv_textarea_set_text(phone_ta,(const char *)str);
        }
        else if (txt == kb_map_num[1])/* cos */
        {
            memset(str, 0, sizeof(str));
            calc_ec = 1;
            lv_calc_exe(&calc_x1,0,lv_textarea_get_text(phone_ta),1);
            sprintf(str,"%g",calc_x1);
            lv_textarea_set_text(phone_ta,(const char *)str);
        }
        else if (txt == kb_map_num[2]) /* tan */
        {
            memset(str, 0, sizeof(str));
            calc_ec = 1;
            lv_calc_exe(&calc_x1,0,lv_textarea_get_text(phone_ta),2);
            sprintf(str,"%g",calc_x1);
            lv_textarea_set_text(phone_ta,(const char *)str);
        }
        else if (txt == kb_map_num[3]) /* log */
        {
            memset(str, 0, sizeof(str));
            calc_ec = 1;
            lv_calc_exe(&calc_x1,0,lv_textarea_get_text(phone_ta),3);
            sprintf(str,"%g",calc_x1);
            lv_textarea_set_text(phone_ta,(const char *)str);
        }
        else if (txt == kb_map_num[4]) /* ln */
        {
            memset(str, 0, sizeof(str));
            calc_ec = 1;
            lv_calc_exe(&calc_x1,0,lv_textarea_get_text(phone_ta),4);
            sprintf(str,"%g",calc_x1);
            lv_textarea_set_text(phone_ta,(const char *)str);
        }
        else if (txt == kb_map_num[6]) /* x^2 */
        {
            memset(str, 0, sizeof(str));
            calc_ec = 1;
            lv_calc_exe(&calc_x1,0,lv_textarea_get_text(phone_ta),5);
            sprintf(str,"%g",calc_x1);
            lv_textarea_set_text(phone_ta,(const char *)str);
        }
        else if (txt == kb_map_num[8]) /* sqrt */
        {
            memset(str, 0, sizeof(str));
            calc_ec = 1;
            lv_calc_exe(&calc_x1,0,lv_textarea_get_text(phone_ta),6);
            sprintf(str,"%g",calc_x1);
            lv_textarea_set_text(phone_ta,(const char *)str);
        }
        else if (txt == kb_map_num[9])/* 1/x */
        {
            memset(str, 0, sizeof(str));
            calc_ec = 1;
            lv_calc_exe(&calc_x1,0,lv_textarea_get_text(phone_ta),7);
            sprintf(str,"%g",calc_x1);
            lv_textarea_set_text(phone_ta,(const char *)str);
        }
        else if (txt == kb_map_num[16]) /* AC */
        {
            lv_textarea_set_text(phone_ta, "0");
            lv_label_set_text(label_dec,"DEG");
            lv_calc_pos = 0;
            lv_cbp_and_negativee = 0;
            lv_cbp_and_negative = 0;
        }
        else if(txt == kb_map_num[15]) /* 删除一个字符 */
        {
            if (calc_ec == 0)
            {
                lv_textarea_del_char(phone_ta);

                if (atof(lv_textarea_get_text(phone_ta)) == 0)
                {
                    lv_textarea_set_text(phone_ta, "0");
                }
            }
            else
            {
                lv_textarea_set_text(phone_ta, "0");
                lv_calc_math = 0;
                lv_calc_pos = 0;
                lv_cbp_and_negativee = 0;
                lv_cbp_and_negative = 0;
            }
        }
        else if (txt == kb_map_num[12]||txt == kb_map_num[13]||txt == kb_map_num[14]
                 ||txt == kb_map_num[18]||txt == kb_map_num[19]||txt == kb_map_num[20]
                 ||txt == kb_map_num[24]||txt == kb_map_num[25]||txt == kb_map_num[26]
                 ||txt == kb_map_num[30]||txt == kb_map_num[32])
        {
            if (calc_ec == 1)
            {
                lv_textarea_set_text(phone_ta, "");
                lv_label_set_text(label_dec,"DEG");
                calc_ec = 0; 
                lv_calc_num = 0;
                lv_calc_pos = 0;
                lv_cbp_and_negativee = 0;
                lv_cbp_and_negative = 0;
            }
            
            if (lv_math_x1!=0&&atof(lv_textarea_get_text(phone_ta)) == 0&&!strstr(lv_textarea_get_text(phone_ta), ".")&&!strstr(lv_textarea_get_text(phone_ta), "-"))
            {
                lv_textarea_set_text(phone_ta, "");
            }
            
            if (lv_cbp_and_negative == 1&&strstr(lv_textarea_get_text(phone_ta), "-")&&lv_cbp_and_negativee == 0)
            {
                lv_textarea_del_char(phone_ta);
                lv_cbp_and_negative = 0;
                lv_cbp_and_negativee = 1;
            }

            lv_textarea_set_cursor_pos(phone_ta, (int32_t)cur);

            if (atof(lv_textarea_get_text(phone_ta)) == 0&&txt == kb_map_num[32]&&lv_calc_pos != 1)
            {
                lv_calc_pos = 1;
                strcat((char *)chx_buf, "0.");
                lv_textarea_add_text(phone_ta,chx_buf);
            }
            else
            {
                if (txt == kb_map_num[32]&&strstr(lv_textarea_get_text(phone_ta), "."))
                {
                    
                }
                else
                {
                    lv_textarea_add_text(phone_ta,txt);
                }
            }

        }
        else if (txt == kb_map_num[10]) /* FMT */
        {
            lv_calc_num ++;
            if (lv_calc_num == 1)
            {
                calc_ec = 1;
                calc_fmt_show(lv_calc_x1,lv_textarea_get_text(phone_ta),lv_calc_num);
            }

            if (lv_calc_num > 1)
            {
                lv_cbp_and_negative = 0;
                lv_cbp_and_negativee = 0;
                lv_calc_num = 0;
                lv_calc_pos = 0;
                lv_label_set_text(label_dec,"DEG");
                lv_textarea_set_text(phone_ta, "0");
            }
       }
       else if (txt == kb_map_num[31]) /* +/- */
       {
           cbp_and_negative = atof((const char *)lv_textarea_get_text(phone_ta)); /* 转换为数字 */
           cbp_and_negative = - cbp_and_negative;
           memset(str, 0, sizeof(str));
           sprintf(str,"%g",cbp_and_negative);
           lv_textarea_set_text(phone_ta,(const char *)str);
           lv_cbp_and_negative = 1;
       }
       else if (txt == kb_map_num[21]) /* + */
       {
            lv_calc_math = 1;
            if (lv_math_x1 == 0)
            {
                lv_math_x1 = atof((const char *)lv_textarea_get_text(phone_ta));
                lv_textarea_set_text(phone_ta, "0");
            }
            else
            {
                lv_calc_math = 0;
            }
            lv_math_flag = lv_math_calc_label(0);

       }
       else if (txt == kb_map_num[22]) /* - */
       {
            lv_calc_math = 1;
            if (lv_math_x1 == 0)
            {
                lv_math_x1 = atof((const char *)lv_textarea_get_text(phone_ta));
                lv_textarea_set_text(phone_ta, "0");
            }
            else
            {
                lv_calc_math = 0;
            }
            lv_math_flag = lv_math_calc_label(1);
       }
       else if (txt == kb_map_num[27]) /* X */
       {
            lv_calc_math = 1;
            if (lv_math_x1 == 0)
            {
                lv_math_x1 = atof((const char *)lv_textarea_get_text(phone_ta));
                lv_textarea_set_text(phone_ta, "0");
            }
            else
            {
                lv_calc_math = 0;
            }
            lv_math_flag = lv_math_calc_label(2);
       }
       else if (txt == kb_map_num[28]) /* / */
       {
            lv_calc_math = 1;
            if (lv_math_x1 == 0)
            {
                lv_math_x1 = atof((const char *)lv_textarea_get_text(phone_ta));
                lv_textarea_set_text(phone_ta, "0");
            }
            else
            {
                lv_calc_math = 0;
            }
            lv_math_flag = lv_math_calc_label(3);
       }
       else if (txt == kb_map_num[7]) /* x^y */
       {
            lv_calc_math = 1;
            if (lv_math_x1 == 0)
            {
                lv_math_x1 = atof((const char *)lv_textarea_get_text(phone_ta));
                lv_textarea_set_text(phone_ta, "0");
            }
            else
            {
                lv_calc_math = 0;
            }
            lv_math_flag = lv_math_calc_label(4);
       }
       else if (txt == kb_map_num[33]) /* = */
       {
         
            lv_math_x2 = atof((const char *)lv_textarea_get_text(phone_ta));
            lv_math_result = lv_math_calc(lv_math_x1,lv_math_x2,lv_math_flag);
            lv_label_set_text(label_dec,"DEG");
            memset(str, 0, sizeof(str));
            calc_ec = 1;
            lv_math_x1 = 0;
            sprintf(str,"%g",lv_math_result);
            lv_textarea_set_text(phone_ta,(const char *)str);
       }
    }
}

/**
  * @brief  测试
  * @param  无
  * @retval 无
  */
void lv_mainstart(void)
{

    lv_calculator_cont = lv_obj_create(lv_scr_act());
    lv_obj_set_size(lv_calculator_cont,lv_obj_get_width(lv_scr_act()),lv_obj_get_height(lv_scr_act()));
    lv_obj_set_style_radius(lv_calculator_cont, 0, LV_PART_MAIN);
    lv_obj_clear_flag(lv_calculator_cont, LV_OBJ_FLAG_SCROLLABLE);
    lv_obj_set_style_bg_color(lv_calculator_cont, lv_color_make(1, 27, 54), LV_STATE_DEFAULT);
  
    lv_obj_t *label_title = lv_label_create(lv_calculator_cont);
    lv_label_set_text(label_title,"scientific calculator");
    lv_obj_set_style_text_color(label_title, lv_color_make(255, 255, 255), LV_STATE_DEFAULT);
    lv_obj_set_style_text_font(label_title,&lv_font_montserrat_14,0);
    lv_obj_align(label_title,LV_ALIGN_TOP_MID,0,10);
  
    lv_obj_t * btnm1 = lv_btnmatrix_create(lv_calculator_cont);
    lv_btnmatrix_set_map(btnm1, kb_map_num);
    lv_btnmatrix_set_btn_width(btnm1, 0, 5);                                /* 设置第一行按钮宽度 */
    lv_btnmatrix_set_btn_width(btnm1, 1, 5);
    lv_btnmatrix_set_btn_width(btnm1, 2, 5);
    lv_btnmatrix_set_btn_width(btnm1, 3, 5);
    lv_btnmatrix_set_btn_width(btnm1, 4, 5);

    lv_btnmatrix_set_btn_width(btnm1, 5, 5);
    lv_btnmatrix_set_btn_width(btnm1, 6, 5);                                /* 设置第二行按钮宽度 */
    lv_btnmatrix_set_btn_width(btnm1, 7, 5);
    lv_btnmatrix_set_btn_width(btnm1, 8, 5);
    lv_btnmatrix_set_btn_width(btnm1, 9, 5);

    lv_btnmatrix_set_btn_width(btnm1, 10, 1);
    lv_btnmatrix_set_btn_width(btnm1, 11, 1);                               /* 设置第三行按钮宽度 */
    lv_btnmatrix_set_btn_width(btnm1, 12, 1);
    lv_btnmatrix_set_btn_width(btnm1, 13, 7);
    lv_btnmatrix_set_btn_width(btnm1, 14, 7);

    lv_btnmatrix_set_btn_width(btnm1, 15, 1);
    lv_btnmatrix_set_btn_width(btnm1, 16, 1);
    lv_btnmatrix_set_btn_width(btnm1, 17, 1);                                /* 设置第四行按钮宽度 */
    lv_btnmatrix_set_btn_width(btnm1, 18, 7);
    lv_btnmatrix_set_btn_width(btnm1, 19, 7);

    lv_btnmatrix_set_btn_width(btnm1, 20, 1);
    lv_btnmatrix_set_btn_width(btnm1, 21, 1);
    lv_btnmatrix_set_btn_width(btnm1, 22, 1);                                /* 设置第五行按钮宽度 */
    lv_btnmatrix_set_btn_width(btnm1, 23, 7);
    lv_btnmatrix_set_btn_width(btnm1, 24, 7);

    lv_btnmatrix_set_btn_width(btnm1, 25, 1);
    lv_btnmatrix_set_btn_width(btnm1, 26, 5);
    lv_btnmatrix_set_btn_width(btnm1, 27, 5);                                /* 设置第六行按钮宽度 */
    lv_btnmatrix_set_btn_width(btnm1, 28, 5);
    lv_btnmatrix_set_btn_width(btnm1, 29, 5);


    lv_obj_set_size(btnm1,lv_obj_get_width(lv_scr_act()), lv_obj_get_height(lv_scr_act())/2);
    lv_obj_align(btnm1, LV_ALIGN_BOTTOM_MID, 0, 0);
    lv_obj_add_event_cb(btnm1, lv_event_handler, LV_EVENT_ALL, NULL);
//    lv_obj_set_style_text_font(btnm1,&myFont18,0);

    /* 创建输入框 */
    phone_ta = lv_textarea_create(lv_calculator_cont);
    lv_textarea_set_text(phone_ta, "0");
    lv_textarea_set_one_line(phone_ta, true);           /* 将文本区域配置为一行或恢复正常 */
    lv_textarea_set_cursor_click_pos(phone_ta,false);   /* 隐藏光标 */
    lv_obj_set_size(phone_ta, lv_obj_get_width(lv_scr_act()) - 20,lv_font_montserrat_14.line_height * 4 + 20);
    lv_obj_clear_flag(phone_ta, LV_OBJ_FLAG_SCROLLABLE);
    lv_obj_align_to(phone_ta, btnm1, LV_ALIGN_OUT_TOP_MID, 0, -50);
    lv_obj_set_style_text_font(phone_ta,&lv_font_montserrat_14,0);


    label_dec = lv_label_create(lv_calculator_cont);
    lv_label_set_text(label_dec,"DEG");
    lv_obj_set_style_text_font(label_dec,&lv_font_montserrat_14,0);
    lv_obj_align_to(label_dec,phone_ta,LV_ALIGN_BOTTOM_RIGHT,-50,-10);
}

测试结果

三、二维码生成器

主函数

void lv_keyboard_cb(lv_event_t *event)
{
    lv_obj_t* obj = lv_event_get_target(event);
    lv_event_code_t code = lv_event_get_code(event);
    
    if(code == LV_EVENT_CLICKED)
    {
        if (lv_keyboard_get_selected_btn ((lv_obj_t *)event->user_data) == 39)
        {
            lv_obj_del((lv_obj_t *)event->user_data); /* 删除键盘 */
        }
    }
}

/**
 * @brief  例
 * @param  无
 * @return 无
 */
static void lv_example_keyboard(void)
{
    lv_obj_t* keyboard = lv_keyboard_create(lv_scr_act());                      /* 定义并创建键盘 */
    lv_keyboard_set_textarea(keyboard, ta);
    lv_obj_add_event_cb(keyboard, lv_keyboard_cb, LV_EVENT_ALL, keyboard);   /* 设置文本框事件回调 */
}

/**
 * @brief  文本区域回调
 * @param  event:事件
 * @return 无
 */
void lv_ta_action_click(lv_event_t *event)
{
    lv_obj_t* obj = lv_event_get_target(event);
    lv_event_code_t code = lv_event_get_code(event);
    
    if(code == LV_EVENT_CLICKED)    /* 文本区域点击 */
    {
        lv_example_keyboard();
    }
}

/**
 * @brief  LVGL演示
 * @param  无
 * @return 无
 */
void lv_mainstart(void)
{
    lv_qr_windowm();
}

/**
 * @brief 退出回调函数
 * @param  event:事件
 * @return 无
 */
static void lv_qr_event_handler(lv_event_t * event)
{
    lv_obj_t* obj = lv_event_get_target(event);
    lv_event_code_t code = lv_event_get_code(event);
    
    if(code == LV_EVENT_CLICKED)    /*点击 */
    {
        lv_obj_del(lv_qr_win);
        lv_mainstart();
    }
}

/**
 * @brief 二维码生成回调函数
 * @param  event:事件
 * @return 无
 */
static void lv_btn_create_cb(lv_event_t *event)
{
    lv_event_code_t code = lv_event_get_code(event);
    lv_obj_t * obj = lv_event_get_target(event);
    
    if (code == LV_EVENT_CLICKED)
    {
        lv_label_set_text(lv_qr_label,"Generated QR code successfully!");
        
        data = lv_textarea_get_text(ta);
        /* 创建一个lcddev.width/2的二维码 */
        lv_obj_t * qr = lv_qrcode_create(lv_qr_btn_win, lv_obj_get_width(lv_qr_btn_win) - 10, lv_color_hex3(0x33f), lv_color_hex3(0xeef));
        /* 设置数据 */
        lv_qrcode_update(qr, data, strlen(data));
        /* 二维码中间对齐 */
        lv_obj_center(qr);
        lv_obj_invalidate(qr);
    }
}

/**
 * @brief  二维码界面
 * @param  无
 * @return 无
 */
void lv_qr_windowm(void)
{
    
    lv_qr_win = lv_win_create(lv_scr_act(),lv_font_montserrat_14.line_height * 2);
    lv_obj_set_size(lv_qr_win,lv_obj_get_width(lv_scr_act()),lv_obj_get_height(lv_scr_act()));
    lv_obj_set_style_text_font(lv_qr_win,&lv_font_montserrat_14,LV_STATE_DEFAULT);
    lv_win_add_title(lv_qr_win, "QR V1.0");
    lv_obj_t * btn = lv_win_add_btn(lv_qr_win, LV_SYMBOL_CLOSE, 50);
    lv_obj_add_event_cb(btn, lv_qr_event_handler, LV_EVENT_CLICKED, NULL);
    
    lv_qr_cont = lv_win_get_content(lv_qr_win);
    
    ta = lv_textarea_create(lv_qr_cont);                           /* 创建文本区域控件 */
    lv_obj_set_style_radius(ta, 0, LV_PART_MAIN);
    lv_obj_set_style_text_font(ta,&lv_font_montserrat_14,LV_STATE_DEFAULT);     /* 设置文本字体 */
    lv_obj_set_style_border_color(ta,lv_color_make(0,0,0),LV_STATE_DEFAULT);
    lv_obj_set_size(ta, lv_obj_get_width(lv_scr_act())/2, lv_obj_get_height(lv_scr_act())/2);    /* 文本区域的大小 */
    lv_obj_align_to(ta, lv_qr_cont, LV_ALIGN_TOP_LEFT, 0, 30);     /* 对齐 */
    lv_textarea_set_cursor_click_pos(ta, true);                    /* 单击文本区域上的文本启用/禁用光标定位 */
    lv_obj_add_event_cb(ta, lv_ta_action_click,LV_EVENT_ALL,NULL); /* 设置回调函数 */
    lv_textarea_set_text(ta, " ");                                 /* 设置初始状态的文本为空 */
    
    lv_qr_btn_win = lv_obj_create(lv_qr_cont);
    lv_obj_set_style_border_color(lv_qr_btn_win,lv_color_make(0,0,0),LV_STATE_DEFAULT);
    lv_obj_set_style_radius(lv_qr_btn_win, 0, LV_PART_MAIN);
    lv_obj_set_size(lv_qr_btn_win,lv_obj_get_width(ta)/2 + 40,lv_obj_get_width(ta)/2 + 40);
    lv_obj_invalidate(lv_qr_btn_win);
    lv_obj_align_to(lv_qr_btn_win, ta, LV_ALIGN_OUT_RIGHT_MID, lv_obj_get_width(ta)/4, 0);     /* 对齐 */
    
    lv_obj_t *lv_qr_btn = lv_btn_create(lv_qr_cont);
    lv_obj_set_style_bg_color(lv_qr_btn,lv_palette_main(LV_PALETTE_GREY),LV_STATE_DEFAULT);
    lv_obj_align_to(lv_qr_btn, lv_qr_btn_win, LV_ALIGN_OUT_BOTTOM_LEFT, 0, lv_obj_get_height(lv_qr_btn_win)/6);     /* 对齐 */
    lv_obj_set_size(lv_qr_btn,lv_obj_get_width(lv_qr_btn_win),lv_obj_get_height(lv_qr_btn_win)/3);
    lv_obj_add_event_cb(lv_qr_btn,lv_btn_create_cb,LV_EVENT_ALL,NULL);
    
    lv_obj_t *lv_qr_btn_label = lv_label_create(lv_qr_btn);
    lv_obj_set_style_text_color(lv_qr_btn_label,lv_color_make(255,255,255),LV_STATE_DEFAULT);
    lv_obj_set_style_text_font(lv_qr_btn_label,&lv_font_montserrat_14,LV_STATE_DEFAULT);     /* 设置文本字体 */
    lv_obj_clear_flag(lv_qr_btn_win,LV_OBJ_FLAG_SCROLLABLE);
    lv_label_set_text(lv_qr_btn_label,"Create Qr");
    lv_obj_center(lv_qr_btn_label);
    
    lv_qr_label = lv_label_create(lv_qr_cont);
    lv_obj_set_style_text_color(lv_qr_label,lv_palette_main(LV_PALETTE_BLUE),LV_STATE_DEFAULT);
    lv_label_set_text(lv_qr_label,"");
    lv_obj_align_to(lv_qr_label, ta, LV_ALIGN_OUT_BOTTOM_LEFT, 0, lv_obj_get_height(ta)/6);            /* 对齐 */
    
    lv_qr_c_label = lv_label_create(lv_qr_cont);
    lv_obj_set_style_text_color(lv_qr_c_label,lv_palette_main(LV_PALETTE_GREY),LV_STATE_DEFAULT);
    lv_label_set_text(lv_qr_c_label,"Alientek:http://www.openedv.com/");
    lv_obj_align_to(lv_qr_c_label, lv_qr_label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, lv_obj_get_height(ta)/6); /* 对齐 */
}

测试结果

四、绘画系统

主函数

static void lv_rst_event(lv_event_t *event)
{
    lv_event_code_t code = lv_event_get_code(event);
    lv_obj_t * obj = lv_event_get_target(event);

    if(code == LV_EVENT_CLICKED)
    {
        lv_obj_set_style_bg_color(lv_touch_cont, lv_color_make(255,255,255),LV_STATE_DEFAULT);
    }
}

/**
 * @brief       画粗线
 * @param       x1,y1: 起点坐标
 * @param       x2,y2: 终点坐标
 * @param       size : 线条粗细程度
 * @param       color: 线的颜色
 * @retval      无
 */
void lcd_draw_bline(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint8_t size, uint16_t color)
{
    uint16_t t;
    int xerr = 0, yerr = 0, delta_x, delta_y, distance;
    int incx, incy, row, col;

    if (x1 < size || x2 < size || y1 < size || y2 < size)return;

    delta_x = x2 - x1;  /* 计算坐标增量 */
    delta_y = y2 - y1;
    row = x1;
    col = y1;

    if (delta_x > 0)incx = 1;       /* 设置单步方向 */
    else if (delta_x == 0)incx = 0; /* 垂直线 */
    else
    {
        incx = -1;
        delta_x = -delta_x;
    }

    if (delta_y > 0)
    {
        incy = 1;
    }
    else if (delta_y == 0)
    {
        incy = 0;   /* 水平线 */
    }
    else
    {
        incy = -1;
        delta_y = -delta_y;
    }

    if ( delta_x > delta_y)distance = delta_x; /* 选取基本增量坐标轴 */
    else distance = delta_y;

    for (t = 0; t <= distance + 1; t++ )    /* 画线输出 */
    {
        lcd_fill_circle(row, col, size, color); /* 画点 */
        xerr += delta_x ;
        yerr += delta_y ;

        if (xerr > distance)
        {
            xerr -= distance;
            row += incx;
        }

        if (yerr > distance)
        {
            yerr -= distance;
            col += incy;
        }
    }
}

static lv_point_t line_points1[] = { {0, 0}, {0, 70}, {0, 120}, {0, 180}, {0, 240}, {0, 480} };

lv_obj_t *lv_pen_size_2;
lv_obj_t *lv_pen_size_5;
lv_obj_t *lv_pen_size_10;
lv_obj_t *lv_pen_size_15;
    
lv_obj_t *lv_pen_color_red;
lv_obj_t *lv_pen_color_green;
lv_obj_t *lv_pen_color_blue;
lv_obj_t *lv_pen_color_grey;

/**
 * @brief       画笔大小回调函数
 * @param       event: 事件
 * @retval      无
 */
static void lv_pen_size_event(lv_event_t *event)
{
    lv_event_code_t code = lv_event_get_code(event);
    lv_obj_t * obj = lv_event_get_target(event);

    if(code == LV_EVENT_CLICKED)
    {
        if (obj == lv_pen_size_2)
        {
            lv_pensise = 2;
            lv_obj_set_style_bg_color(lv_pen_size_5,lv_color_make(255,255,255),LV_STATE_DEFAULT);
            lv_obj_set_style_bg_color(lv_pen_size_10,lv_color_make(255,255,255),LV_STATE_DEFAULT);
            lv_obj_set_style_bg_color(lv_pen_size_15,lv_color_make(255,255,255),LV_STATE_DEFAULT);
            lv_obj_set_style_bg_color(lv_pen_size_2,lv_palette_main(LV_PALETTE_RED),LV_STATE_DEFAULT);
        }
        else if (obj == lv_pen_size_5)
        {
            lv_pensise = 5;
            lv_obj_set_style_bg_color(lv_pen_size_2,lv_color_make(255,255,255),LV_STATE_DEFAULT);
            lv_obj_set_style_bg_color(lv_pen_size_10,lv_color_make(255,255,255),LV_STATE_DEFAULT);
            lv_obj_set_style_bg_color(lv_pen_size_15,lv_color_make(255,255,255),LV_STATE_DEFAULT);
            lv_obj_set_style_bg_color(lv_pen_size_5,lv_palette_main(LV_PALETTE_RED),LV_STATE_DEFAULT);
        }
        else if (obj == lv_pen_size_10)
        {
            lv_pensise = 10;
            lv_obj_set_style_bg_color(lv_pen_size_5,lv_color_make(255,255,255),LV_STATE_DEFAULT);
            lv_obj_set_style_bg_color(lv_pen_size_2,lv_color_make(255,255,255),LV_STATE_DEFAULT);
            lv_obj_set_style_bg_color(lv_pen_size_15,lv_color_make(255,255,255),LV_STATE_DEFAULT);
            lv_obj_set_style_bg_color(lv_pen_size_10,lv_palette_main(LV_PALETTE_RED),LV_STATE_DEFAULT);
        }
        else if (obj == lv_pen_size_15)
        {
            lv_pensise = 15;
            lv_obj_set_style_bg_color(lv_pen_size_5,lv_color_make(255,255,255),LV_STATE_DEFAULT);
            lv_obj_set_style_bg_color(lv_pen_size_10,lv_color_make(255,255,255),LV_STATE_DEFAULT);
            lv_obj_set_style_bg_color(lv_pen_size_2,lv_color_make(255,255,255),LV_STATE_DEFAULT);
            lv_obj_set_style_bg_color(lv_pen_size_15,lv_palette_main(LV_PALETTE_RED),LV_STATE_DEFAULT);
        }
        
    }
}

/**
 * @brief       颜色设置回调函数
 * @param       event: 事件
 * @retval      无
 */
static void lv_pen_color_event(lv_event_t *event)
{
    lv_event_code_t code = lv_event_get_code(event);
    lv_obj_t * obj = lv_event_get_target(event);
    
    if(code == LV_EVENT_CLICKED)
    {
        if (obj == lv_pen_color_red)
        {
            lv_obj_set_style_border_color(lv_pen_color_green,lv_palette_main(LV_PALETTE_GREEN),LV_STATE_DEFAULT);
            lv_obj_set_style_border_width(lv_pen_color_green,0,LV_STATE_DEFAULT);
            lv_obj_set_style_border_color(lv_pen_color_blue,lv_palette_main(LV_PALETTE_BLUE),LV_STATE_DEFAULT);
            lv_obj_set_style_border_width(lv_pen_color_blue,0,LV_STATE_DEFAULT);
            lv_obj_set_style_border_color(lv_pen_color_grey,lv_palette_main(LV_PALETTE_GREY),LV_STATE_DEFAULT);
            lv_obj_set_style_border_width(lv_pen_color_grey,0,LV_STATE_DEFAULT);
            lv_obj_set_style_border_color(lv_pen_color_red,lv_color_make(0,0,0),LV_STATE_DEFAULT);
            lv_obj_set_style_border_width(lv_pen_color_red,2,LV_STATE_DEFAULT);
            lv_pencolor = 0;
        }
        else if (obj == lv_pen_color_green)
        {
            lv_obj_set_style_border_color(lv_pen_color_red,lv_palette_main(LV_PALETTE_RED),LV_STATE_DEFAULT);
            lv_obj_set_style_border_width(lv_pen_color_red,0,LV_STATE_DEFAULT);
            lv_obj_set_style_border_color(lv_pen_color_blue,lv_palette_main(LV_PALETTE_BLUE),LV_STATE_DEFAULT);
            lv_obj_set_style_border_width(lv_pen_color_blue,0,LV_STATE_DEFAULT);
            lv_obj_set_style_border_color(lv_pen_color_grey,lv_palette_main(LV_PALETTE_GREY),LV_STATE_DEFAULT);
            lv_obj_set_style_border_width(lv_pen_color_grey,0,LV_STATE_DEFAULT);
            lv_obj_set_style_border_color(lv_pen_color_green,lv_color_make(0,0,0),LV_STATE_DEFAULT);
            lv_obj_set_style_border_width(lv_pen_color_green,2,LV_STATE_DEFAULT);
            lv_pencolor = 1;
        }
        else if (obj == lv_pen_color_blue)
        {
            lv_obj_set_style_border_color(lv_pen_color_green,lv_palette_main(LV_PALETTE_GREEN),LV_STATE_DEFAULT);
            lv_obj_set_style_border_width(lv_pen_color_green,0,LV_STATE_DEFAULT);
            lv_obj_set_style_border_color(lv_pen_color_red,lv_palette_main(LV_PALETTE_RED),LV_STATE_DEFAULT);
            lv_obj_set_style_border_width(lv_pen_color_red,0,LV_STATE_DEFAULT);
            lv_obj_set_style_border_color(lv_pen_color_grey,lv_palette_main(LV_PALETTE_GREY),LV_STATE_DEFAULT);
            lv_obj_set_style_border_width(lv_pen_color_grey,0,LV_STATE_DEFAULT);
            lv_obj_set_style_border_color(lv_pen_color_blue,lv_color_make(0,0,0),LV_STATE_DEFAULT);
            lv_obj_set_style_border_width(lv_pen_color_blue,2,LV_STATE_DEFAULT);
            lv_pencolor = 2;
        }
        else if (obj == lv_pen_color_grey)
        {
            lv_obj_set_style_border_color(lv_pen_color_green,lv_palette_main(LV_PALETTE_GREEN),LV_STATE_DEFAULT);
            lv_obj_set_style_border_width(lv_pen_color_green,0,LV_STATE_DEFAULT);
            lv_obj_set_style_border_color(lv_pen_color_blue,lv_palette_main(LV_PALETTE_BLUE),LV_STATE_DEFAULT);
            lv_obj_set_style_border_width(lv_pen_color_blue,0,LV_STATE_DEFAULT);
            lv_obj_set_style_border_color(lv_pen_color_red,lv_palette_main(LV_PALETTE_RED),LV_STATE_DEFAULT);
            lv_obj_set_style_border_width(lv_pen_color_red,0,LV_STATE_DEFAULT);
            lv_obj_set_style_border_color(lv_pen_color_grey,lv_color_make(0,0,0),LV_STATE_DEFAULT);
            lv_obj_set_style_border_width(lv_pen_color_grey,2,LV_STATE_DEFAULT);
            lv_pencolor = 3;
        }
        
        lv_obj_set_style_shadow_width(obj,0,LV_STATE_DEFAULT);
    }
}

/**
 * @brief       返回主界面的按键回调函数
 * @param       event: 事件
 * @retval      无
 */
static void lv_back_event(lv_event_t *event)
{
    lv_event_code_t code = lv_event_get_code(event);
    lv_obj_t * obj = lv_event_get_target(event);
    
    if (code == LV_EVENT_RELEASED)
    {
        lv_obj_del(lv_touch_cont);
        lv_timer_del(lv_touchtask);
        lv_mainstart();
    }
}
/**
 * @brief       返回主界面的按键
 * @param       parent:父类
 * @retval      无
 */
void lv_btn_back(lv_obj_t * parent)
{
    /* 将样式初始化为默认状态 */
    static lv_style_t style;
    lv_style_init(&style);

    lv_style_set_radius(&style, 3);

    lv_style_set_bg_opa(&style, LV_OPA_100);
    lv_style_set_bg_color(&style, lv_palette_main(LV_PALETTE_BLUE));
    lv_style_set_bg_grad_color(&style, lv_palette_darken(LV_PALETTE_BLUE, 2));
    lv_style_set_bg_grad_dir(&style, LV_GRAD_DIR_VER);

    lv_style_set_border_opa(&style, LV_OPA_40);
    lv_style_set_border_width(&style, 2);
    lv_style_set_border_color(&style, lv_palette_main(LV_PALETTE_GREY));

    lv_style_set_shadow_width(&style, 8);
    lv_style_set_shadow_color(&style, lv_palette_main(LV_PALETTE_GREY));
    lv_style_set_shadow_ofs_y(&style, 8);

    lv_style_set_outline_opa(&style, LV_OPA_COVER);
    lv_style_set_outline_color(&style, lv_palette_main(LV_PALETTE_BLUE));

    lv_style_set_text_color(&style, lv_color_white());
    lv_style_set_pad_all(&style, 10);

    /* 初始化按下的样式 */
    static lv_style_t style_pr;
    lv_style_init(&style_pr);

    /* 按下时添加一个大的轮廓 */
    lv_style_set_outline_width(&style_pr, 30);
    lv_style_set_outline_opa(&style_pr, LV_OPA_TRANSP);

    lv_style_set_translate_y(&style_pr, 5);
    lv_style_set_shadow_ofs_y(&style_pr, 3);
    lv_style_set_bg_color(&style_pr, lv_palette_darken(LV_PALETTE_BLUE, 2));
    lv_style_set_bg_grad_color(&style_pr, lv_palette_darken(LV_PALETTE_BLUE, 4));

    /* 向大纲添加过渡 */
    static lv_style_transition_dsc_t trans;
    static lv_style_prop_t props[] = {LV_STYLE_OUTLINE_WIDTH, LV_STYLE_OUTLINE_OPA, 0};
    lv_style_transition_dsc_init(&trans, props, lv_anim_path_linear, 300, 0, NULL);

    lv_style_set_transition(&style_pr, &trans);

    lv_obj_t * btn1 = lv_btn_create(parent);
    lv_obj_remove_style_all(btn1);                          /* 移除来自主题的样式 */
    lv_obj_add_style(btn1, &style, 0);
    lv_obj_add_style(btn1, &style_pr, LV_STATE_PRESSED);
    lv_obj_set_size(btn1, LV_SIZE_CONTENT, LV_SIZE_CONTENT);
    lv_obj_align(btn1,LV_ALIGN_BOTTOM_RIGHT,15,0);
    lv_obj_add_event_cb(btn1,lv_back_event,LV_EVENT_ALL,NULL);
    
    lv_obj_t * label = lv_label_create(btn1);
    lv_label_set_text(label, "Back");
    lv_obj_center(label);
}

/**
 * @brief       清空屏幕并在右上角显示"RST"
 * @param       parent:父类
 * @retval      无
 */
void lv_load_draw_dialog(lv_obj_t *parent)
{
    lcd_clear(WHITE);       /* 清屏 */
    lcd_show_string(lcddev.width - 24, 0, 200, 16, 16, "RST", BLUE); /* 显示清屏区域 */
  
    #define TOP_OFFSET  5
    lv_obj_t * RST_btn = lv_label_create(parent);
    lv_obj_move_foreground(RST_btn);
    lv_label_set_text(RST_btn,"RST");
    lv_obj_align_to(RST_btn,NULL,LV_ALIGN_TOP_RIGHT,-5,TOP_OFFSET);
    lv_obj_add_flag(RST_btn,LV_OBJ_FLAG_CLICKABLE);
    lv_obj_add_event_cb(RST_btn,lv_rst_event,LV_EVENT_CLICKED,NULL);
    
    lv_obj_t * lv_pen_size = lv_label_create(parent);
    lv_label_set_text(lv_pen_size,"pen size");
    lv_obj_align_to(lv_pen_size,RST_btn,LV_ALIGN_OUT_BOTTOM_MID,0,10);
    
    lv_pen_size_2 = lv_led_create(parent);
    lv_obj_set_style_bg_color(lv_pen_size_2,lv_palette_main(LV_PALETTE_RED),LV_STATE_DEFAULT);
    lv_obj_align_to(lv_pen_size_2,lv_pen_size,LV_ALIGN_OUT_BOTTOM_MID,0,10);
    lv_obj_t *lv_pen_size_2_label = lv_label_create(parent);
    lv_label_set_text(lv_pen_size_2_label,"2");
    lv_obj_align_to(lv_pen_size_2_label,lv_pen_size_2,LV_ALIGN_LEFT_MID,-15,0);
    
    
    lv_pen_size_5 = lv_led_create(parent);
    lv_obj_align_to(lv_pen_size_5,lv_pen_size_2,LV_ALIGN_OUT_BOTTOM_MID,0,10);
    lv_obj_t *lv_pen_size_5_label = lv_label_create(parent);
    lv_label_set_text(lv_pen_size_5_label,"5");
    lv_obj_align_to(lv_pen_size_5_label,lv_pen_size_5,LV_ALIGN_LEFT_MID,-15,0);
    
    lv_pen_size_10 = lv_led_create(parent);
    lv_obj_align_to(lv_pen_size_10,lv_pen_size_5,LV_ALIGN_OUT_BOTTOM_MID,0,10);
    lv_obj_t *lv_pen_size_10_label = lv_label_create(parent);
    lv_label_set_text(lv_pen_size_10_label,"10");
    lv_obj_align_to(lv_pen_size_10_label,lv_pen_size_10,LV_ALIGN_LEFT_MID,-15,0);
    
    lv_pen_size_15 = lv_led_create(parent);
    lv_obj_align_to(lv_pen_size_15,lv_pen_size_10,LV_ALIGN_OUT_BOTTOM_MID,0,10);
    lv_obj_t *lv_pen_size_15_label = lv_label_create(parent);
    lv_label_set_text(lv_pen_size_15_label,"15");
    lv_obj_align_to(lv_pen_size_15_label,lv_pen_size_15,LV_ALIGN_LEFT_MID,-15,0);
    
    lv_obj_add_flag(lv_pen_size_2,LV_OBJ_FLAG_CLICKABLE);
    lv_obj_add_flag(lv_pen_size_5,LV_OBJ_FLAG_CLICKABLE);
    lv_obj_add_flag(lv_pen_size_10,LV_OBJ_FLAG_CLICKABLE);
    lv_obj_add_flag(lv_pen_size_15,LV_OBJ_FLAG_CLICKABLE);
    
    
    lv_obj_add_event_cb(lv_pen_size_2,lv_pen_size_event,LV_EVENT_ALL,NULL);
    lv_obj_add_event_cb(lv_pen_size_5,lv_pen_size_event,LV_EVENT_ALL,NULL);
    lv_obj_add_event_cb(lv_pen_size_10,lv_pen_size_event,LV_EVENT_ALL,NULL);
    lv_obj_add_event_cb(lv_pen_size_15,lv_pen_size_event,LV_EVENT_ALL,NULL);
    
    
    
    lv_obj_t * lv_pen_color = lv_label_create(parent);
    lv_label_set_text(lv_pen_color,"color");
    lv_obj_align_to(lv_pen_color,lv_pen_size,LV_ALIGN_OUT_BOTTOM_MID,0,150);
    
    lv_pen_color_red = lv_led_create(parent);
    lv_obj_set_style_shadow_width(lv_pen_color_red,0,LV_STATE_DEFAULT);
    lv_obj_set_style_bg_color(lv_pen_color_red,lv_palette_main(LV_PALETTE_RED),LV_STATE_DEFAULT);
    lv_obj_set_style_border_color(lv_pen_color_red,lv_color_make(0,0,0),LV_STATE_DEFAULT);
    lv_obj_set_style_border_width(lv_pen_color_red,2,LV_STATE_DEFAULT);
    lv_obj_align_to(lv_pen_color_red,lv_pen_color,LV_ALIGN_OUT_BOTTOM_MID,0,10);
    
    lv_pen_color_green = lv_led_create(parent);
    lv_obj_set_style_shadow_width(lv_pen_color_green,0,LV_STATE_DEFAULT);
    lv_obj_set_style_bg_color(lv_pen_color_green,lv_palette_main(LV_PALETTE_GREEN),LV_STATE_DEFAULT);
    lv_obj_set_style_border_color(lv_pen_color_green,lv_palette_main(LV_PALETTE_GREEN),LV_STATE_DEFAULT);
    lv_obj_align_to(lv_pen_color_green,lv_pen_color_red,LV_ALIGN_OUT_BOTTOM_MID,0,10);
    
    lv_pen_color_blue = lv_led_create(parent);
    lv_obj_set_style_shadow_width(lv_pen_color_blue,0,LV_STATE_DEFAULT);
    lv_obj_set_style_bg_color(lv_pen_color_blue,lv_palette_main(LV_PALETTE_BLUE),LV_STATE_DEFAULT);
    lv_obj_set_style_border_color(lv_pen_color_blue,lv_palette_main(LV_PALETTE_BLUE),LV_STATE_DEFAULT);
    lv_obj_align_to(lv_pen_color_blue,lv_pen_color_green,LV_ALIGN_OUT_BOTTOM_MID,0,10);
    
    lv_pen_color_grey = lv_led_create(parent);
    lv_obj_set_style_shadow_width(lv_pen_color_grey,0,LV_STATE_DEFAULT);
    lv_obj_set_style_bg_color(lv_pen_color_grey,lv_palette_main(LV_PALETTE_GREY),LV_STATE_DEFAULT);
    lv_obj_set_style_border_color(lv_pen_color_grey,lv_palette_main(LV_PALETTE_GREY),LV_STATE_DEFAULT);
    lv_obj_align_to(lv_pen_color_grey,lv_pen_color_blue,LV_ALIGN_OUT_BOTTOM_MID,0,10);
    
    
    lv_obj_add_flag(lv_pen_color_red,LV_OBJ_FLAG_CLICKABLE);
    lv_obj_add_flag(lv_pen_color_green,LV_OBJ_FLAG_CLICKABLE);
    lv_obj_add_flag(lv_pen_color_blue,LV_OBJ_FLAG_CLICKABLE);
    lv_obj_add_flag(lv_pen_color_grey,LV_OBJ_FLAG_CLICKABLE);
    
    
    lv_obj_add_event_cb(lv_pen_color_red,lv_pen_color_event,LV_EVENT_ALL,NULL);
    lv_obj_add_event_cb(lv_pen_color_green,lv_pen_color_event,LV_EVENT_ALL,NULL);
    lv_obj_add_event_cb(lv_pen_color_blue,lv_pen_color_event,LV_EVENT_ALL,NULL);
    lv_obj_add_event_cb(lv_pen_color_grey,lv_pen_color_event,LV_EVENT_ALL,NULL);
    
    
    lv_obj_t* line1 = lv_line_create(parent);
    lv_line_set_points(line1, line_points1, 6); 
    lv_obj_align_to(line1,lv_pen_size,LV_ALIGN_OUT_LEFT_TOP,0,-50);

    lv_btn_back(parent);/* 创建返回主界面按键 */
}


/**
 * @brief       电容触摸屏测试函数
 * @param       无
 * @retval      无
 */
void ctp_test(void)
{
    if (lcddev.id == 0X1018)maxp = 10;
  
    tp_dev.scan(0);

    for (t = 0; t < maxp; t++)
    {
        if ((tp_dev.sta) & (1 << t))
        {
            if (tp_dev.x[t] < lv_obj_get_width(lv_touch_cont) - lv_obj_get_width(lv_obj_get_child(lv_touch_cont,1)) - 10 && tp_dev.y[t] < lv_obj_get_height(lv_touch_cont))  /* 坐标在屏幕范围内 */
            {
                if (lastpos[t][0] == 0XFFFF)
                {
                    lastpos[t][0] = tp_dev.x[t];
                    lastpos[t][1] = tp_dev.y[t];
                }

                lcd_draw_bline(lastpos[t][0], lastpos[t][1], tp_dev.x[t], tp_dev.y[t], lv_pensise, POINT_COLOR_TBL[lv_pencolor]); /* 画线 */
                lastpos[t][0] = tp_dev.x[t];
                lastpos[t][1] = tp_dev.y[t];

            }
        }
        else 
        {
            lastpos[t][0] = 0XFFFF;
        }
    }    
}

/**
 * @brief       电阻触摸屏测试函数
 * @param       无
 * @retval      无
 */
void rtp_test(void)
{
    tp_dev.scan(0);

    if (tp_dev.sta & TP_PRES_DOWN)  /* 触摸屏被按下 */
    {
        if (tp_dev.x[0] < lv_obj_get_width(lv_touch_cont) - lv_obj_get_width(lv_obj_get_child(lv_touch_cont,1)) - 10 && tp_dev.y[0] < lv_obj_get_height(lv_touch_cont))
        {
             tp_draw_big_point(tp_dev.x[0], tp_dev.y[0], POINT_COLOR_TBL[lv_pencolor]);   /* 画点 */
        }
    }
}

void lv_touch_task(lv_timer_t *task)
{
    lv_touchtask = task;

    if (tp_dev.touchtype & 0X80)
    {
        ctp_test(); /* 电容屏测试 */
    }
    else
    {
        rtp_test(); /* 电组屏测试 */
    }
}

/**
 * @brief       电阻触摸屏测试函数
 * @param       无
 * @retval      无
 */
void lv_mainstart(void)
{
    lv_touch_cont = lv_obj_create(lv_scr_act());
    lv_obj_set_size(lv_touch_cont,lv_obj_get_width(lv_scr_act()),lv_obj_get_height(lv_scr_act()));
    lv_obj_clear_flag(lv_touch_cont,LV_OBJ_FLAG_SCROLLABLE);
    lv_load_draw_dialog(lv_touch_cont);
    lv_timer_create(lv_touch_task,10,NULL);
}

测试结果

五、进制系统

主函数

static void lv_atk_bit_str_reverse(char str[])
{
    int n=strlen(str);
    int i;
    char temp;
  
    for (i = 0;i < (n/2); i++)
    {
        temp = str[i];
        str[i] = str[n-i-1];
        str[n-i-1] = temp;
    }
}

/**
 * @brief       把二进制字符串转换为十进制
 * @param       pbin:二进制
 * @retval      二进制字符串转换为十进制整数的结果
 */
static long lv_atk_bit_bin_to_dec(const char *pbin)
{
    int ii=0;
    long result=0;

    while (pbin[ii] != 0)
    {
        result = result * 2 + (pbin[ii] - '0');
        ii++;
    }

    return result;
}

/**
 * @brief       查找按下的BIT位
 * @param       parent:父类
 * @retval      返回位数
 */
int lv_atk_bit_to_dec(lv_obj_t *parent)
{
    int  j = 0;

    for (int i = 0 ; i < LV_ATK_BIT_COUNT; i++)
    {

        if (parent == lv_bit_text[i])
        {
            return j;
        }
        
        j ++;
    }
    
    return j;
}

/**
 * @brief       将十进制转换为八进制
 * @param       n:十进制
 * @retval      返回八进制
 */
long lv_atk_dec_to_oct(long dec)
{
    int oct = 0, i = 0;

    i = 1;

    while (dec != 0)
    {
        oct += (dec % 8) * i;
        dec /= 8;
        i *= 10;
    }

    return oct;
}

/**
 * @brief       十进制转二进制
 * @param       n:十进制
 * @retval      返回二进制
 */
long lv_atk_bec_to_bin(long n)
{

    long result=0,k=1,i,temp;
    temp = n;

    while(temp)
    {
        i = temp%2;
        result = k * i + result;
        k = k*10;
        temp = temp/2;
    }
    printf("%ld\n", result);
    
    return result;
}

/**
 * @brief       十六进制转十进制
 * @param       n:十六进制
 * @retval      返回十进制
 */
long lv_atk_hex_to_dex(char*s)
{
    int i,t;
    long sum=0;
  
    for(i=0;s[i];i++)
    { 
        if(s[i]>= '0'  &&s[i]<='9')/* 当字符是'0'--'9'时,*-‘0'就行了 */
        {
            t=s[i]-'0';
        }
        
        if(s[i]>='a'&&s[i]<='z')
        {
            t=s[i]-'a'+10;/* 当字符是 abcdef 时,*-‘a’+10 就行了 */
        }
        
        if(s[i]>='A'&&s[i]<='Z')
        {
            t=s[i]-'A'+10;/* 当字符是 ABCDEF 时,*-‘A’+10 就行了 */
        }
        
        sum=sum*16+t; 
    }
    
    return sum;
}

/**
 * @brief       八进制转十进制
 * @param       n:八进制的数值
 * @retval      返回十进制
 */
long lv_atk_oct_to_dex(long n)
{
    int i=0,tmp,sum=0;

    while(n)
    {
        tmp=n%10;
        n=n/10;
        sum+=tmp*pow(8,i);
        i++;
    }
    
    printf("%d",sum);
    
    return sum;
}


/*
 *  函数名:   static void event_handler_regbit_map(lv_obj_t * obj, lv_event_t event)
 *  输入参数: 触发事件的对象
 *  输入参数: 触发的事件类型
 *  返回值:   无
 *  函数作用: 位按键响应事件,定位到当前选中的位按钮
*/
static void lv_event_bit_map_handler(lv_event_t *event)
{
    lv_event_code_t code = lv_event_get_code(event);
    lv_obj_t * obj = lv_event_get_target(event);
  
    if(code == LV_EVENT_CLICKED)
    {
        static char lv_buf[32];
        int lv_bit_post = 0;
        char lv_str_buf[32];
        char lv_oct_buf[32];
        char lv_bit_flag_buf[LV_ATK_BIT_COUNT - 1] = "00000000000000000000000000000000";
      
        if (lv_btnmatrix != NULL)
        {
            lv_obj_del(lv_btnmatrix); /* 删除键盘 */
            lv_textarea_set_cursor_click_pos(lv_middle, true);  /* 其他文本区域有效隐藏 */
            lv_middle = NULL;
            lv_btnmatrix = NULL;
        }
        
        lv_textarea_set_text(lv_bin, "");
        lv_textarea_set_text(lv_dec, "");
        lv_textarea_set_text(lv_hex, "");
        lv_textarea_set_text(lv_oct, "");
        lv_textarea_set_placeholder_text(lv_bin, "");
        lv_textarea_set_placeholder_text(lv_dec, "");
        lv_textarea_set_placeholder_text(lv_hex, "");
        lv_textarea_set_placeholder_text(lv_oct, "");
        lv_obj_t * lv_obj_child = lv_obj_get_child(obj, NULL);
        lv_bit_post = lv_atk_bit_to_dec(obj);

        lv_snprintf(lv_buf, sizeof(lv_buf), "%s",lv_label_get_text(lv_obj_child));

        if (strcmp(lv_buf, "1") == 0)
        {
            lv_label_set_text(lv_obj_child, "0");
            lv_bit_flag[lv_bit_post] = '0';
        }
        else if (strcmp(lv_buf, "0") == 0)
        {
            lv_label_set_text(lv_obj_child, "1");
            lv_bit_flag[lv_bit_post] = '1';
        }

        strcpy(lv_bit_flag_buf, lv_bit_flag);
        
        lv_atk_bit_str_reverse(lv_bit_flag_buf);
        
        lv_textarea_set_placeholder_text(lv_bin, lv_bit_flag_buf);
        const char * lv_show_lv_atk_str_buffer = lv_textarea_get_placeholder_text(lv_bin);                    /* 获取输入内容 */
        lv_snprintf(lv_str_buf, sizeof(lv_str_buf), "%d", lv_atk_bit_bin_to_dec(lv_show_lv_atk_str_buffer));  /* 二进制转十进制 */
        lv_textarea_set_placeholder_text(lv_dec, lv_str_buf);
        lv_snprintf(lv_oct_buf, sizeof(lv_oct_buf), "%d", lv_atk_dec_to_oct(atof((const char *)lv_str_buf)));
        lv_textarea_set_placeholder_text(lv_oct, lv_oct_buf);                                                 /* 十进制转八进制 */
        lv_snprintf(lv_str_buf, sizeof(lv_str_buf),"0x%X", lv_atk_bit_bin_to_dec(lv_show_lv_atk_str_buffer)); /* 二进制转十六进制 */
        lv_textarea_set_placeholder_text(lv_hex, lv_str_buf);
    }
}


/**
 * @brief  btnmatrix控件回调函数
 * @param  obj: 对象
 * @param  event: 事件  
 * @return 无
 */
static void lv_btnmatrix_event_handler(lv_event_t *event)
{
    lv_event_code_t code = lv_event_get_code(event);
    lv_obj_t * obj = lv_event_get_target(event);

    if(code == LV_EVENT_VALUE_CHANGED)
    {
        const char * txt = lv_btnmatrix_get_btn_text(lv_btnmatrix,lv_btnmatrix_get_selected_btn(obj));
      
        if (txt == btnm1_map[22]||txt == btnm1_map[21])
        {
            lv_obj_del(lv_btnmatrix); /* 删除键盘 */
            lv_btnmatrix = NULL;
            lv_middle = NULL;
        }
        
        for (int i = 0 ;i < 20 ;i ++)
        {
            if (txt == btnm1_map[i])
            {
                lv_textarea_add_text(lv_middle,(const char *)txt);
                break;
            }
        }

    }
}

/**
 * @brief       创建进制界面
 * @param       ta:文本区域
 * @param       e:事件
 * @retval      无
 */
static void lv_ta_cb_event_handler(lv_event_t *event)
{
    lv_event_code_t code = lv_event_get_code(event);
    lv_obj_t * ta = lv_event_get_target(event);
  
    if((code == LV_EVENT_CLICKED) && (lv_btnmatrix == NULL))
    {
        lv_middle = NULL;
        lv_textarea_set_cursor_click_pos(ta, false);               /* 失能游标隐藏 */
        lv_btnmatrix = lv_btnmatrix_create(lv_scr_act()); /* 创建矩阵按键 */
        lv_btnmatrix_set_map(lv_btnmatrix, btnm1_map);          /* 设置矩阵按键数组 */
        lv_btnmatrix_set_btn_width(lv_btnmatrix, 12, 1);        /* 设置按键的比例 */
        lv_obj_set_size(lv_btnmatrix,lcddev.width,lcddev.height/2);    /* 设置矩阵按键的大小 */
        lv_obj_align_to(lv_btnmatrix, NULL, LV_ALIGN_BOTTOM_MID, 0, 0);/* 设置对齐模式 */
        lv_obj_add_event_cb(lv_btnmatrix, lv_btnmatrix_event_handler,LV_EVENT_ALL,NULL); /* 设置矩阵按键的回调函数 */

      
        /* 清除文本区域开始 */
        lv_textarea_set_text(lv_bin, "");
        lv_textarea_set_text(lv_dec, "");
        lv_textarea_set_text(lv_hex, "");
        lv_textarea_set_text(lv_oct, "");
        lv_textarea_set_placeholder_text(lv_bin, "");
        lv_textarea_set_placeholder_text(lv_dec, "");
        lv_textarea_set_placeholder_text(lv_hex, "");
        lv_textarea_set_placeholder_text(lv_oct, "");
        /* 清除文本区域结束 */
      
        if (ta == lv_bin) /* 按下是二进制的文本区域实现代码 */
        {
            for (int i = 0 ; i < 18 ; i++)
            {
              if (i == 0 || i == 9 || i == 16 || i == 17) /* 矩阵按键的索引号0,9,16,17不做处理 */
                {
                    continue;
                }
                else /* 其他索引做处理 */
                {
                    lv_btnmatrix_set_btn_ctrl(lv_btnmatrix, i, LV_BTNMATRIX_CTRL_DISABLED); /* 失能这些索引 */
                }
            }
            lv_middle = lv_bin; /* 中间对象等于二进制文本区域对象 */
            lv_textarea_set_cursor_click_pos(lv_dec, true);  /* 其他文本区域有效隐藏 */
            lv_textarea_set_cursor_click_pos(lv_hex, true);
            lv_textarea_set_cursor_click_pos(lv_oct, true);
        }
        else if (ta == lv_dec)
        {
            for (int i = 0 ; i < 18 ; i++)
            {
                if (i == 10 || i == 11 || i == 12 || i == 13 || i == 14 || i == 15)
                {
                    lv_btnmatrix_set_btn_ctrl(lv_btnmatrix, i, LV_BTNMATRIX_CTRL_DISABLED);
                }
            }
            lv_middle = lv_dec;
            lv_textarea_set_cursor_click_pos(lv_bin, true);  /* 其他文本区域有效隐藏 */
            lv_textarea_set_cursor_click_pos(lv_hex, true);
            lv_textarea_set_cursor_click_pos(lv_oct, true);
        }
        else if (ta == lv_hex)
        {
            for (int i = 0 ; i < 19 ; i++)
            {
                lv_btnmatrix_set_btn_ctrl(lv_btnmatrix, i, LV_BTNMATRIX_CTRL_CHECKABLE);
            }
            lv_middle = lv_hex;
            lv_textarea_set_cursor_click_pos(lv_bin, true);  /* 其他文本区域有效隐藏 */
            lv_textarea_set_cursor_click_pos(lv_dec, true);
            lv_textarea_set_cursor_click_pos(lv_oct, true);
        }
        else if (ta == lv_oct)
        {
            for (int i = 0 ; i < 18 ; i++)
            {
                if (i > 6 && i < 16)
                {
                    lv_btnmatrix_set_btn_ctrl(lv_btnmatrix, i, LV_BTNMATRIX_CTRL_DISABLED);
                }
            }
            lv_middle = lv_oct;
            lv_textarea_set_cursor_click_pos(lv_bin, true);  /* 其他文本区域有效隐藏 */
            lv_textarea_set_cursor_click_pos(lv_dec, true);
            lv_textarea_set_cursor_click_pos(lv_hex, true);
        }
    }
    else if(code == LV_EVENT_VALUE_CHANGED) /* 如果文本区域的数值发生改变,就执行下面的代码 */
    {
        /*  根据输入类型转换数据 */
        char str_tmp[32];        /* 进制存储数组 */
        char lv_oct_buf[32];     /* 进制存储数组 */
        char lv_dex_oct_buf[32]; /* 十进制转八进制存储数组 */
        static char regbit_flag_buf[32];
        const char * lv_atk_str_buffer = lv_textarea_get_text(ta); /*  获取输入内容 */
      
        if (ta == lv_bin) /* 如果是二进制文本区域的数值改变 */
        {
            if (lv_atk_str_buffer != NULL)
            {
                memset(lv_oct_buf,0,sizeof(lv_oct_buf));
                lv_snprintf(str_tmp, sizeof(str_tmp),"%d", lv_atk_bit_bin_to_dec(lv_atk_str_buffer));               /*  二进制转十进制 */
                lv_textarea_set_placeholder_text(lv_dec, str_tmp);
                lv_snprintf(lv_oct_buf, sizeof(lv_oct_buf), "%d", lv_atk_dec_to_oct(atof((const char *)str_tmp)));
                lv_textarea_set_placeholder_text(lv_oct, lv_oct_buf);                                               /* 十进制转八进制 */
                lv_snprintf(str_tmp, sizeof(str_tmp), "0x%X", lv_atk_bit_bin_to_dec(lv_atk_str_buffer));            /* 二进制转十六进制 */
                lv_textarea_set_placeholder_text(lv_hex, str_tmp);

            }
            else /* 其他文本区域清空 */
            {
                lv_textarea_set_placeholder_text(lv_dec, "");
                lv_textarea_set_placeholder_text(lv_hex, "");
                lv_textarea_set_placeholder_text(lv_oct, "");
            }
        }
        else if (ta == lv_dec) /* 如果是十进制文本区域的数值改变 */
        {
            if (lv_atk_str_buffer != NULL)
            {
                /*  十进制转二进制 */
                memset(regbit_flag_buf,0,sizeof(regbit_flag_buf));
                memset(lv_oct_buf,0,sizeof(lv_oct_buf));
                sprintf(regbit_flag_buf,"%ld",lv_atk_bec_to_bin(atof((const char *)lv_atk_str_buffer)));
                lv_textarea_set_placeholder_text(lv_bin, regbit_flag_buf);
                lv_snprintf(lv_oct_buf, sizeof(lv_oct_buf), "%d", lv_atk_dec_to_oct(atof((const char *)lv_atk_str_buffer)));  /* 十进制转八进制 */
                lv_textarea_set_placeholder_text(lv_oct, lv_oct_buf);                                                         /* 十进制转八进制 */
                lv_snprintf(str_tmp, sizeof(str_tmp),"0x%X", lv_atk_bit_bin_to_dec(regbit_flag_buf));                         /* 二进制转十六进制 */
                lv_textarea_set_placeholder_text(lv_hex, str_tmp);
            }
            else
            {
                lv_textarea_set_placeholder_text(lv_bin, "");
                lv_textarea_set_placeholder_text(lv_hex, "");
                lv_textarea_set_placeholder_text(lv_oct, "");
            }

        }
        else if (ta == lv_hex) /* 如果是十六进制文本区域的数值改变 */
        {
            if (lv_atk_str_buffer != NULL)
            {
                memset(lv_oct_buf,0,sizeof(lv_oct_buf));
                memset(regbit_flag_buf,0,sizeof(regbit_flag_buf));
                memset(lv_dex_oct_buf,0,sizeof(lv_dex_oct_buf));
                lv_snprintf(lv_oct_buf, sizeof(lv_oct_buf), "%ld", lv_atk_hex_to_dex((char *)lv_atk_str_buffer));              /*  十六进制转十进制 */
                lv_textarea_set_placeholder_text(lv_dec, lv_oct_buf);
              
                sprintf(regbit_flag_buf,"%ld",lv_atk_bec_to_bin(atof((const char *)lv_oct_buf)));
                lv_textarea_set_placeholder_text(lv_bin, regbit_flag_buf);

                lv_snprintf(lv_dex_oct_buf, sizeof(lv_dex_oct_buf), "%d", lv_atk_dec_to_oct(atof((const char *)lv_oct_buf)));  /* 十进制转八进制 */
                lv_textarea_set_placeholder_text(lv_oct, lv_dex_oct_buf);                                                      /* 十进制转八进制 */
                lv_snprintf(str_tmp, sizeof(str_tmp),"0x%X", lv_atk_bit_bin_to_dec(regbit_flag_buf));                          /* 二进制转十六进制 */
                lv_textarea_set_placeholder_text(lv_hex, str_tmp);
            }
            else
            {
                lv_textarea_set_placeholder_text(lv_dec, "");
                lv_textarea_set_placeholder_text(lv_bin, "");
                lv_textarea_set_placeholder_text(lv_oct, "");
            }
        }
        else if (ta == lv_oct) /* 如果是八进制文本区域的数值改变 */
        {
            if (lv_atk_str_buffer != NULL)
            {
                memset(lv_oct_buf,0,sizeof(lv_oct_buf));
                memset(regbit_flag_buf,0,sizeof(regbit_flag_buf));
                lv_snprintf(lv_oct_buf, sizeof(lv_oct_buf), "%ld", lv_atk_oct_to_dex(atof((const char *)lv_atk_str_buffer)));  /*  八进制转十进制 */
                lv_textarea_set_placeholder_text(lv_dec, lv_oct_buf);
              
                sprintf(regbit_flag_buf,"%ld",lv_atk_bec_to_bin(atof((const char *)lv_oct_buf)));                              /* 十进制换二进制 */
                lv_textarea_set_placeholder_text(lv_bin, regbit_flag_buf);

                lv_snprintf(str_tmp, sizeof(str_tmp),"0x%X", lv_atk_bit_bin_to_dec(regbit_flag_buf));                          /* 二进制转十六进制 */
                lv_textarea_set_placeholder_text(lv_hex, str_tmp);
            }
            else
            {
                lv_textarea_set_placeholder_text(lv_dec, "");
                lv_textarea_set_placeholder_text(lv_bin, "");
                lv_textarea_set_placeholder_text(lv_hex, "");
            }
        }
    }
    
}

/**
 * @brief       创建进制界面
 * @param       parent:父类
 * @retval      无
 */
void lv_atk_scale_bit_init(lv_obj_t *parent)
{
    int lv_scale_col_1 = 0;   /*  列 */
    lv_obj_t *lv_obj_text;

    for (int i = 0 ; i < LV_ATK_BIT_COUNT; i++)
    {
        /*  位按钮编号索引 */
        lv_bit_index[i] = lv_obj_create(parent);    /*  创建obj对象 */
        lv_obj_set_style_bg_color(lv_bit_index[i], lv_color_hex3(0x00), LV_STATE_DEFAULT);    /*  设置颜色 */
        lv_obj_set_style_border_side(lv_bit_index[i], 0, LV_STATE_DEFAULT);    /*  设置边界宽度 */
        lv_obj_set_style_text_color(lv_bit_index[i], lv_color_hex3(0xffffff), LV_STATE_DEFAULT);  /*  设置字符 */
        lv_obj_set_style_radius(lv_bit_index[i], 2, LV_STATE_DEFAULT);         /*  设置圆角 */
        lv_obj_set_size(lv_bit_index[i], LV_ATK_BIT_W, LV_ATK_BIT_INDEX_H); /*  设置对象大小(宽度和高度) */ 

        /*  位按钮 */
        lv_bit_text[i] = lv_btn_create(parent);    /*  创建按钮对象 */
        lv_obj_set_style_radius(lv_bit_text[i], 5, LV_STATE_DEFAULT); /*  设置圆角 */
        lv_obj_set_style_bg_color(lv_bit_text[i], lv_palette_main(LV_PALETTE_RED), LV_STATE_DEFAULT); /*  设置颜色 */
        lv_obj_set_style_border_side(lv_bit_text[i], 0, LV_STATE_DEFAULT);  /*  设置边界宽度*/ 
        lv_obj_set_style_text_color(lv_bit_text[i], lv_color_hex3(0xffffff), LV_STATE_DEFAULT);  /*  设置字符 */
        lv_obj_set_size(lv_bit_text[i], LV_ATK_BIT_W, LV_ATK_BIT_H);  /*  设置对象大小(宽度和高度) */
        lv_obj_add_event_cb(lv_bit_text[i], lv_event_bit_map_handler,LV_EVENT_ALL,NULL);  /*  分配点击事件处理函数 */
        /* 位按钮数字 */
        lv_obj_text  = lv_label_create(lv_bit_text[i]);  /* 创建标签 */
        lv_label_set_text(lv_obj_text, "0");
        lv_obj_align_to(lv_obj_text, NULL, LV_ALIGN_CENTER, 0, 0);  /* 当前画布居中 */
        lv_obj_align_to(lv_bit_index[i], parent, LV_ALIGN_TOP_RIGHT, -(LV_ATK_BIT_ROW_SPACE*(lv_scale_col_1 ++ )+3), 50); /*  设置摆放位置 */
        lv_obj_align_to(lv_bit_text[i], lv_bit_index[i], LV_ALIGN_OUT_BOTTOM_MID, 0, 0);  /*  设置摆放位置 */
        
        if (i == 32)
        {
            lv_obj_set_style_bg_color(lv_bit_text[32], lv_palette_main(LV_PALETTE_BLUE), LV_STATE_DEFAULT); /*  设置颜色 */
            lv_obj_set_style_bg_color(lv_bit_index[32], lv_palette_main(LV_PALETTE_BLUE), LV_STATE_DEFAULT); /*  设置颜色 */
            lv_label_set_text(lv_obj_get_child(lv_bit_text[32],NULL), "");
        }

    }
    
    lv_bin_label = lv_label_create(parent);
    lv_label_set_text(lv_bin_label,"BIN");
    lv_obj_align_to(lv_bin_label,lv_bit_text[LV_ATK_BIT_COUNT - 1],LV_ALIGN_OUT_BOTTOM_MID,0,20);
    /*  二进制 */
    lv_bin = lv_textarea_create(parent);
    lv_textarea_set_accepted_chars(lv_bin, "01");  /*  设置字符列表,文本区域只接受这些字符 */
    lv_obj_set_style_text_font(lv_bin, &lv_font_montserrat_14, LV_STATE_DEFAULT);  /*  设置数值字体格式 */
    lv_obj_set_style_radius(lv_bin, 0, LV_STATE_DEFAULT);  /*  设置圆角 */
    lv_obj_set_size(lv_bin,lcddev.width/2,LV_ATK_BIT_H);
    lv_textarea_set_text(lv_bin, "");
    lv_textarea_set_one_line(lv_bin, true);
    lv_textarea_set_cursor_click_pos(lv_bin, true);
    lv_obj_add_event_cb(lv_bin, lv_ta_cb_event_handler,LV_EVENT_ALL,NULL);
    lv_obj_align_to(lv_bin, lv_bin_label, LV_ALIGN_OUT_RIGHT_MID, 12, 0);  /*  摆放位置 */
    
    
    lv_dec_label = lv_label_create(parent);
    lv_label_set_text(lv_dec_label,"DEC");
    lv_obj_align_to(lv_dec_label,lv_bin_label,LV_ALIGN_OUT_BOTTOM_MID,0,20);
    /*  十进制 */
    lv_dec = lv_textarea_create(parent);
    lv_textarea_set_accepted_chars(lv_dec, "0123456789");  /*  设置字符列表,文本区域只接受这些字符 */
    lv_obj_set_style_text_font(lv_dec, &lv_font_montserrat_14, LV_STATE_DEFAULT);  /*  设置文本字体格式 */
    lv_obj_set_style_radius(lv_dec, 0, LV_STATE_DEFAULT);  /*  设置圆角 */
    lv_obj_set_size(lv_dec,lcddev.width/2,LV_ATK_BIT_H);
    lv_textarea_set_text(lv_dec, "");
    lv_textarea_set_one_line(lv_dec, lv_dec);
    lv_textarea_set_cursor_click_pos(lv_dec, true);
    lv_obj_add_event_cb(lv_dec, lv_ta_cb_event_handler,LV_EVENT_ALL,NULL);
    lv_obj_align_to(lv_dec, lv_dec_label, LV_ALIGN_OUT_RIGHT_MID, 10, 0);  /*  摆放位置 */
    
    lv_hex_label = lv_label_create(parent);
    lv_label_set_text(lv_hex_label,"HEX");
    lv_obj_align_to(lv_hex_label,lv_dec_label,LV_ALIGN_OUT_BOTTOM_MID,0,20);
    /*  十六进制 */
    lv_hex = lv_textarea_create(parent);
    lv_textarea_set_accepted_chars(lv_hex, "0123456789ABCDEFabcdef");  /*  设置字符列表,文本区域只接受这些字符 */
    lv_obj_set_style_text_font(lv_hex, &lv_font_montserrat_14, LV_STATE_DEFAULT);  /*  设置文本字体格式 */
    lv_obj_set_style_radius(lv_hex, 0, LV_STATE_DEFAULT);        /*  设置圆角 */
    lv_obj_set_size(lv_hex,lcddev.width/2,LV_ATK_BIT_H);
    lv_textarea_set_text(lv_hex, "");
    lv_textarea_set_one_line(lv_hex, true);
    lv_textarea_set_cursor_click_pos(lv_hex, true);
    lv_obj_add_event_cb(lv_hex, lv_ta_cb_event_handler,LV_EVENT_ALL,NULL);
    lv_obj_align_to(lv_hex, lv_hex_label, LV_ALIGN_OUT_RIGHT_MID, 10, 0);  /*  摆放位置 */
    
    lv_oct_label = lv_label_create(parent);
    lv_label_set_text(lv_oct_label,"OCT");
    lv_obj_align_to(lv_oct_label,lv_hex_label,LV_ALIGN_OUT_BOTTOM_MID,0,20);
    /*  八进制 */
    lv_oct = lv_textarea_create(parent);
    lv_textarea_set_accepted_chars(lv_oct, "01234567");  /*  设置字符列表,文本区域只接受这些字符 */
    lv_obj_set_style_text_font(lv_oct, &lv_font_montserrat_14, LV_STATE_DEFAULT);  /*  设置文本字体格式 */
    lv_obj_set_style_radius(lv_oct, 0, LV_STATE_DEFAULT);        /*  设置圆角 */
    lv_obj_set_size(lv_oct,lcddev.width/2,LV_ATK_BIT_H);
    lv_textarea_set_text(lv_oct, "");
    lv_textarea_set_one_line(lv_oct, true);
    lv_textarea_set_cursor_click_pos(lv_oct, true);
    lv_obj_add_event_cb(lv_oct, lv_ta_cb_event_handler,LV_EVENT_ALL,NULL);
    lv_obj_align_to(lv_oct, lv_oct_label, LV_ALIGN_OUT_RIGHT_MID, 10, 0);  /*  摆放位置 */
}

/**
 * @brief       程序入口
 * @param       无
 * @retval      无
 */
void lv_mainstart(void)
{
    lv_snprintf(lv_bit_flag, sizeof(lv_bit_flag), "000000000000000000000000000000000"); /* 设置位的标志初始化值 */
    
    lv_scale_cont = lv_obj_create(lv_scr_act());                    /* 创建一个容器 */
    lv_obj_set_size(lv_scale_cont, lcddev.width, lcddev.height);    /* 设置容器的大小 */
    lv_obj_set_pos(lv_scale_cont,0,0);                              /* 设置容器的位置 */
    lv_btnmatrix = NULL;                                            /* 设置键盘对象位空 */
    lv_atk_scale_bit_init(lv_scale_cont);                           /*  初始化界面 */
}

测试结果

六、综合历程

主函数

void lv_general_win_create(void)
{
    #define TOP_OFFSET  -10
    lv_obj_t* back_btn = lv_label_create(lv_general_dev.parent);
    lv_label_set_text(back_btn, BACK_BTN_TITLE);
    lv_obj_add_flag(back_btn, LV_OBJ_FLAG_CLICKABLE);
    lv_obj_align_to(back_btn, NULL, LV_ALIGN_TOP_LEFT, 15, TOP_OFFSET);
    lv_obj_set_style_text_color(back_btn, lv_color_make(255, 255, 255), LV_STATE_DEFAULT);
    lv_obj_add_event_cb(back_btn, lv_general_dev.lv_back_event, LV_EVENT_ALL, NULL);
}

/**
  * @brief  计算前导置零
  * @param  无
  * @retval 无
  */
int lv_clz(unsigned int  app_readly_list[])
{
    int bit = 0;

    for (int i = 0; i < 32; i++)
    {
        if (app_readly_list[i] == 1)
        {
            break;
        }

        bit ++ ;
    }

    return bit;
}

/**
  * @brief  APP按键回调函数
  * @param  obj  :对象
  * @param  event:事件
  * @retval 无
  */
static void lv_imgbtn_control_event_handler(lv_event_t *event)
{
    lv_event_code_t code = lv_event_get_code(event);
    lv_obj_t * obj = lv_event_get_target(event);
    lv_obj_t *lv_app_parent = lv_obj_get_parent(obj);

    if (code == LV_EVENT_CLICKED)
    {
        for (int i = 0;i < image_mun;i ++)
        {
            if (obj == lv_app_t[i])
            {
                app_readly_list[i] = 1 ;                                       /* app就绪表位置1 */
            }
        }

        lv_trigger_bit = ((unsigned int)lv_clz((app_readly_list)));            /* 计算前导指令 */
        app_readly_list[lv_trigger_bit] = 0;                                   /* 该位清零就绪表 */
        lv_obj_del(lv_app_parent);                                             /* 界面切换使用删除方法 */
        lv_app_parent = NULL;                                                  /* 主界面的容器设置为空 */
        
        switch(lv_trigger_bit)                                                 /* 根据该位做相应的函数 */
        {
            case 1:
              lv_setting_demo();                                                 /* 设置系统(完成) */
              break;
            case 2:
              lv_shelf_demo();                                                 /* 板载测试系统(完成) */
              break;
            case 3:
              lv_draw_demo();                                                  /* 绘画(完成) */
              break;
            case 4:
              lv_calculator_demo();                                            /* 计算器(完成) */
              break;
            case 5:
              lv_qr_windowm();                                                 /* 二维码制作(完成) */
              break;
            default:
              break;
        }
    }
}

/**
  * @brief  APP显示
  * @param  parent:父类对象
  * @retval 无
  */
void lv_mid_cont_add_app(lv_obj_t *parent)
{
    int line_feed_num = 0;
    int lv_index = 0;
    lv_app_t[lv_index] = NULL;
    lv_index ++;
    int i = 0;
    int n = 1;

    lv_app_t[lv_index] = lv_obj_create(parent);
    lv_obj_set_pos(lv_app_t[lv_index],-7,20);
    lv_obj_set_size(lv_app_t[lv_index], app_image[lv_index].app_witch, app_image[lv_index].app_hietch);
    lv_obj_set_style_bg_color(lv_app_t[lv_index], lv_color_make(26, 57, 137), LV_STATE_DEFAULT);
    lv_obj_clear_flag(lv_app_t[lv_index], LV_OBJ_FLAG_SCROLLABLE);
    lv_obj_set_style_radius(lv_app_t[lv_index],0,LV_PART_MAIN);
    lv_obj_add_event_cb(lv_app_t[lv_index], lv_imgbtn_control_event_handler, LV_EVENT_ALL, NULL);

    lv_app_name[lv_index] = lv_label_create(lv_app_t[lv_index]);
    lv_obj_set_style_text_color(lv_app_name[lv_index],lv_color_make(255,255,255), LV_STATE_DEFAULT);
    lv_obj_set_style_text_font(lv_app_name[lv_index],&myFont14, LV_STATE_DEFAULT);
    lv_label_set_text(lv_app_name[lv_index], app_image[lv_index].app_text_English);
    lv_obj_align(lv_app_name[lv_index],LV_ALIGN_BOTTOM_LEFT,-10, 10);

    lv_app_img[lv_index] = lv_img_create(lv_app_t[lv_index]);
    lv_img_set_src(lv_app_img[lv_index], app_image[lv_index].app_image);
    lv_obj_center(lv_app_img[lv_index]);
    lv_obj_set_style_img_recolor_opa(lv_app_img[lv_index], 255, LV_PART_MAIN);
    lv_obj_set_style_img_recolor(lv_app_img[lv_index], lv_color_make(255, 255, 255), LV_STATE_DEFAULT);
    unsigned int lv_width_x = lv_obj_get_width(lv_app_t[1]) + 20;
    lv_index ++;
    

    for (lv_index = 2 ; lv_index < image_mun ; lv_index ++)
    {
        lv_app_t[lv_index] = lv_obj_create(parent);
        lv_obj_set_size(lv_app_t[lv_index], app_image[lv_index].app_witch, app_image[lv_index].app_hietch);
        lv_obj_set_style_bg_color(lv_app_t[lv_index], lv_color_make(26, 57, 137), LV_STATE_DEFAULT);
        lv_obj_clear_flag(lv_app_t[lv_index], LV_OBJ_FLAG_SCROLLABLE);
        lv_obj_set_style_radius(lv_app_t[lv_index], 0, LV_PART_MAIN);
        lv_obj_update_layout(lv_app_t[lv_index]);
        lv_width_x = lv_width_x + lv_obj_get_width(lv_app_t[lv_index]) + 10;

        if (lv_width_x < lv_obj_get_width(lv_scr_act()))
        {
            lv_obj_align_to(lv_app_t[lv_index], lv_app_t[lv_index - 1], LV_ALIGN_OUT_RIGHT_MID, 10, 0);
        }
        else
        {
            line_feed_num++;

            if (line_feed_num >= 2)
            {
                i = 10 * n;
                n ++;
            }
            else
            {
                i = 0;
            }
            
            lv_obj_set_pos(lv_app_t[lv_index], -7, (lv_obj_get_height(lv_app_t[lv_index]) + 20) * line_feed_num + 10 - i );
            lv_width_x = lv_obj_get_width(lv_app_t[lv_index]) + 10;
        }
        
        lv_app_name[lv_index] = lv_label_create(lv_app_t[lv_index]);
        lv_obj_set_style_text_color(lv_app_name[lv_index], lv_color_make(255, 255, 255), LV_STATE_DEFAULT);
        lv_obj_set_style_text_font(lv_app_name[lv_index], &myFont14, LV_STATE_DEFAULT);
        lv_label_set_text(lv_app_name[lv_index], app_image[lv_index].app_text_English);
        lv_obj_align(lv_app_name[lv_index], LV_ALIGN_BOTTOM_LEFT, -10, 10);

        lv_app_img[lv_index] = lv_img_create(lv_app_t[lv_index]);
        lv_img_set_src(lv_app_img[lv_index], app_image[lv_index].app_image);
        lv_obj_center(lv_app_img[lv_index]);
        lv_obj_set_style_img_recolor_opa(lv_app_img[lv_index], 255, LV_PART_MAIN);
        lv_obj_set_style_img_recolor(lv_app_img[lv_index], lv_color_make(255, 255, 255), LV_STATE_DEFAULT);
        lv_obj_add_event_cb(lv_app_t[lv_index], lv_imgbtn_control_event_handler, LV_EVENT_ALL, NULL);
    }
}

void lv_app_icon(lv_obj_t *praten)
{
    /* 左上角图标 */
    lv_obj_t* lv_letf_acon = lv_label_create(praten);
    lv_label_set_text(lv_letf_acon, LV_SYMBOL_WIFI " " LV_SYMBOL_AUDIO);
    lv_obj_align(lv_letf_acon,LV_ALIGN_TOP_LEFT,-5,-10);
    lv_obj_set_style_text_color(lv_letf_acon, lv_color_make(255, 255, 255), LV_STATE_DEFAULT);
    /* 中间的时间 */
    lv_obj_t* lv_timer = lv_label_create(praten);
    lv_label_set_text(lv_timer, "2022/1/20");
    lv_obj_align(lv_timer, LV_ALIGN_TOP_MID, 0, -10);
    lv_obj_set_style_text_color(lv_timer, lv_color_make(255, 255, 255), LV_STATE_DEFAULT);
    /* 右上角图标 */
    lv_obj_t* lv_right_acon = lv_label_create(praten);
    lv_label_set_text(lv_right_acon, LV_SYMBOL_BATTERY_3 " " LV_SYMBOL_USB);
    lv_obj_align(lv_right_acon, LV_ALIGN_TOP_RIGHT, 5, -10);
    lv_obj_set_style_text_color(lv_right_acon, lv_color_make(255, 255, 255), LV_STATE_DEFAULT);

}

/**
  * @brief  主界面
  * @param  无
  * @retval 无
  */
void lv_main_window(void)
{
    lv_obj_t *lv_main_cont = lv_obj_create(lv_scr_act());
    lv_obj_set_size(lv_main_cont, lv_obj_get_width(lv_scr_act()), lv_obj_get_height(lv_scr_act()));
    lv_obj_set_style_bg_color(lv_main_cont, lv_color_make(1, 27, 54), LV_STATE_DEFAULT);
    lv_obj_set_style_radius(lv_main_cont, 0, LV_PART_MAIN);
    lv_mid_cont_add_app(lv_main_cont);
    lv_app_icon(lv_main_cont);
}

/**
  * @brief  LVGL 入口
  * @param  无
  * @retval 无
  */
void lv_mainstart(void)
{
    lv_main_window();       /* 进入页面 */
}

测试结果

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐