0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

零知开源——STM32F4实现ILI9486显示屏UI界面系列教程(二):日历功能实现

PCB56242069 ? 来源:PCB56242069 ? 作者:PCB56242069 ? 2025-06-25 17:34 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

教程将指导您在STM32F4平台上实现一个功能完善的日历应用,通过ILI9486电阻触摸屏提供直观的日期查看和交互体验。该日历应用是智能设备UI系统中的核心组件,具有以下核心功能:月份视图展示、流畅的交互体验、日期标记系统

一、硬件连接(同电子书教程)

硬件连接方式与电子书阅读器完全一致,请参考系列教程(一)的硬件连接部分。显示屏直接插入零知增强板专用接口,无需额外连线。

直达链接:零知开源——STM32F4实现ILI9486显示屏UI界面系列教程(一):电子书阅读器功能

ILI9486扩展板显示屏及日历UI页面图:

wKgZPGhbwkiAGpqYAA9lP_moQvc160.png

二、软件UI组件实现

2.1 核心数据结构

// 静态变量用于存储触摸状态
static lv_point_t calendar_touch_start;
static lv_calendar_ext_t * calendar_cal_ext;

2.2 触摸事件处理

// 日历事件处理函数
static void calendar_event_cb(lv_obj_t * obj, lv_event_t event)
{
    if (event == LV_EVENT_PRESSED) {
        lv_indev_t * indev = lv_indev_get_act();
        if (indev) {
            lv_indev_get_point(indev, &calendar_touch_start);
        }
    }
    else if (event == LV_EVENT_RELEASED) {
        lv_indev_t * indev = lv_indev_get_act();
        lv_point_t touch_end;
        if (indev) {
            lv_indev_get_point(indev, &touch_end);
            lv_coord_t dx = touch_end.x - calendar_touch_start.x;
            
            // 滑动阈值判断
            if (abs(dx) > 30) {
                if (dx > 0) {
                    // 向右滑动:上个月
                    if (calendar_cal_ext->showed_date.month <= 1) {
                        calendar_cal_ext-?>showed_date.month = 12;
                        calendar_cal_ext->showed_date.year--;
                    } else {
                        calendar_cal_ext->showed_date.month--;
                    }
                } else {
                    // 向左滑动:下个月
                    if (calendar_cal_ext->showed_date.month >= 12) {
                        calendar_cal_ext->showed_date.month = 1;
                        calendar_cal_ext->showed_date.year++;
                    } else {
                        calendar_cal_ext->showed_date.month++;
                    }
                }
                lv_obj_invalidate(obj);
            }
        }
    }
}

2.3 初始化界面

void show_app_calendar()
{
    lv_obj_t *win = create_app_win("Calendar");
    lv_coord_t hres = lv_disp_get_hor_res(NULL);
    lv_coord_t vres = lv_disp_get_ver_res(NULL);
    
    // 创建日历对象
    lv_obj_t * calendar = lv_calendar_create(win, NULL);
    lv_obj_set_size(calendar, hres - 40, vres - 100);
    lv_obj_align(calendar, NULL, LV_ALIGN_CENTER, 0, 10);
    
    // 设置当前日期
    lv_calendar_date_t today;
    today.year = 2025;
    today.month = 6;
    today.day = 18;
    lv_calendar_set_today_date(calendar, &today);
    lv_calendar_set_showed_date(calendar, &today);
    
    // 设置高亮日期(示例)
    static lv_calendar_date_t highlighted_dates[2];
    highlighted_dates[0].year = 2025;
    highlighted_dates[0].month = 6;
    highlighted_dates[0].day = 20;
    
    highlighted_dates[1].year = 2025;
    highlighted_dates[1].month = 6;
    highlighted_dates[1].day = 25;
    
    lv_calendar_set_highlighted_dates(calendar, highlighted_dates, 2);
    
    // 设置样式(可选)
    static lv_style_t style_today_box;
    lv_style_copy(&style_today_box, lv_calendar_get_style(calendar, LV_CALENDAR_STYLE_TODAY_BOX));
    style_today_box.body.border.color = LV_COLOR_RED;
    style_today_box.body.border.width = 2;
    lv_calendar_set_style(calendar, LV_CALENDAR_STYLE_TODAY_BOX, &style_today_box);
    
    static lv_style_t style_highlighted_days;
    lv_style_copy(&style_highlighted_days, lv_calendar_get_style(calendar, LV_CALENDAR_STYLE_HIGHLIGHTED_DAYS));
    style_highlighted_days.text.color = LV_COLOR_BLUE;
    lv_calendar_set_style(calendar, LV_CALENDAR_STYLE_HIGHLIGHTED_DAYS, &style_highlighted_days);
    
    // 保存日历扩展数据用于事件处理
    calendar_cal_ext = lv_obj_get_ext_attr(calendar);
    
    // 设置事件回调
    lv_obj_set_event_cb(calendar, calendar_event_cb);
    
    // 添加滑动提示文本
    lv_obj_t * hint_label = lv_label_create(win, NULL);
    lv_label_set_text(hint_label, "Swipe left/right to change month");
    lv_obj_align(hint_label, calendar, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
    lv_obj_set_style(hint_label, &lv_style_plain_color);
}

2.4 功能说明

通过左右滑动实现自然流畅的月份切换

可标记重要日期(如会议、生日)

当前日期有特殊红色边框标识

触摸日期时有视觉反馈效果

三、零知IDE配置(同电子书教程)

请参考系列教程(一)的零知IDE配置部分,确保:

正确配置LCD屏幕驱动

启用触摸屏支持

添加LVGL库依赖

四、演示效果

4.1 功能演示

主界面点击日历图标进入应用

查看当前月份日期布局

左右滑动切换不同月份

点击查看高亮日期的详细信息

4.2 视频效果

https://www.bilibili.com/video/BV1J9KEzDELn/?spm_id_from=333.1387.homepage.video_card.click&vd_source=a31e3d8d8ce008260eee442534c2f63d

日历界面显示当前月份,高亮日期为蓝色,今日有红色边框

4.3 性能指标

项目 数值 说明
月份切换响应 < 80ms 从滑动到页面刷新的时间
内存占用 38KB 包括LVGL和日历数据
刷新率 40Hz 日历界面刷新频率
触摸精度 ±2像素 日期选择精度

五、常见问题解决

5.1 日期显示错位

解决方案

// 在日历创建后添加布局刷新
lv_obj_refresh_ext_draw_pad(calendar);

5.2 滑动不灵敏

优化方案

// 降低滑动检测阈值(原30像素改为20像素)
if (abs(dx) > 20) { 
    // 月份切换逻辑
}

5.3 高亮日期不显示

检查步骤

确认日期格式正确:{年, 月, 日}

检查高亮日期数组大小匹配

验证样式是否正确应用:

// 调试打印当前样式
lv_style_t *style = lv_calendar_get_style(calendar, LV_CALENDAR_STYLE_HIGHLIGHTED_DAYS);
Serial.printf("Text color: %dn", style->text.color.full);

六、总结与扩展

6.1 实现总结

本教程实现了日历的核心功能:

直观的月份/日期展示

流畅的滑动切换体验

重要日期标记功能

实时日期显示集成

6.2 扩展建议

//1.添加事件提醒
typedef struct {
    lv_calendar_date_t date;
    char event[32]; // 事件描述
} CalendarEvent;

//2.周视图切换
lv_obj_t *btn_switch = lv_btn_create(win, NULL);
lv_obj_set_event_cb(btn_switch, switch_view_cb);

//农历支持
const char* get_lunar_date(uint8_t month, uint8_t day);

6.3 下一步

在下一个系列教程中,我们将实现记事本键盘和显示功能。

?零知实验室 - 让嵌入式开发更简单:
www.lingzhilab.comhttp://www.lingzhilab.com/

?零知开源是一个真正属于国人自己的开源软硬件平台,在开发效率上超越了Arduino平台并且更加容易上手,大大降低了开发难度。
?零知开源在软件方面提供了完整的学习教程和丰富示例代码,让不懂程序的工程师也能非常轻而易举的搭建电路来创作产品,测试产品。快来动手试试吧!

?访问零知开源平台,获取更多实战项目和教程资源吧!

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 显示屏
    +关注

    关注

    28

    文章

    4616

    浏览量

    76770
  • STM32F4
    +关注

    关注

    3

    文章

    203

    浏览量

    29142
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    开源——STM32F4结合BMP581气压传感器实现ST7789中文显示教程

    开源平台是一个专为国开发者设计的软硬件开源平台,提供比Arduino更易上手的开发体验。本教程展示了如何在STM32F407VET6增强
    的头像 发表于 07-09 09:21 ?274次阅读
    <b class='flag-5'>零</b><b class='flag-5'>知</b><b class='flag-5'>开源</b>——<b class='flag-5'>STM32F4</b>结合BMP581气压传感器<b class='flag-5'>实现</b>ST7789中文<b class='flag-5'>显示</b>教程

    开源——STM32F4结合BMP581气压传感器实现ST7789中文显示教程

    STM32F407VET6增强板上实现ST7789显示屏的中文显示
    发表于 07-08 18:55

    开源——STM32F1驱动BMP581压强传感器使用SPI实现ST7789显示的环境监测系统

    组件 型号 数量 主控板标准板 1 气压传感器 BMP581 1 显示屏ST7789 (240x320)1 杜邦线公对公若干 1.2 接线方案
    发表于 07-03 17:26

    开源——基于STM32F407VET6增强板的四路独立计时器

    ;gt;声音提示:蜂鸣器提供报警音效 >长/短按操作: 按钮支持不同时长的操作一、硬件准备 1.1 硬件清单主控板:STM32F407VET6增强板< 显示屏:1.5
    发表于 07-01 10:31

    开源——基于STM32F407VET6增强板的四路独立计时器

    本教程介绍基于STM32F407VET6增强板的四路独立计时器实现方案。项目采用TFT显示屏、蜂鸣器和按钮构建交互系统,支持各计时器独立
    的头像 发表于 07-01 10:13 ?330次阅读
    <b class='flag-5'>零</b><b class='flag-5'>知</b><b class='flag-5'>开源</b>——基于<b class='flag-5'>STM32F</b>407VET6<b class='flag-5'>零</b><b class='flag-5'>知</b>增强板的四路独立计时器

    开源——STM32F4实现ILI9486显示屏UI界面系列教程(四):相册预览和大图功能

    与电子书阅读器完全一致,请参考系列教程(一)的硬件连接部分。显示屏直接插入增强板专用接口,无需额外连线。系列教程直达:
    发表于 06-30 09:13

    开源——STM32F4实现ILI9486显示屏UI界面系列教程(四):相册预览和大图功能

    本教程详细讲解如何在LVGL中实现相册预览和图片放大功能。通过事件回调、窗口管理和图片取模技术,构建流畅的用户体验。主要内容包括:硬件连接方式(与电子书教程相同)、软件UI组件实现(主
    的头像 发表于 06-27 12:01 ?210次阅读
    <b class='flag-5'>零</b><b class='flag-5'>知</b><b class='flag-5'>开源</b>——<b class='flag-5'>STM32F4</b><b class='flag-5'>实现</b><b class='flag-5'>ILI9486</b><b class='flag-5'>显示屏</b><b class='flag-5'>UI</b><b class='flag-5'>界面</b><b class='flag-5'>系列</b>教程(四):相册预览和大图<b class='flag-5'>功能</b>

    开源——STM32F4实现ILI9486显示屏UI界面系列教程(三):记事本功能实现

    在智能设备的人机交互界面中,记事本功能是基础且重要的应用场景。本教程将基于STM32F4和LVGL库,在3.5英寸ILI9486显示屏
    发表于 06-27 09:51

    开源——STM32F4实现ILI9486显示屏UI界面系列教程():日历功能实现

    ——STM32F4实现ILI9486显示屏UI界面系列
    发表于 06-25 17:51

    开源——STM32F4实现ILI9486显示屏UI界面系列教程(一):电子书阅读器功能

    增强板设计有专门的显示屏接口,3.5寸ILI9486显示屏可直接插入增强板,无需额外连线 电子书阅读器
    发表于 06-24 19:09

    STM32F3系列STM32F4系列STM32L4系列STM32L4+系列Cortex-M4编程手册

    电子发烧友网站提供《STM32F3系列STM32F4系列STM32L4系列
    发表于 06-06 17:06 ?6次下载

    开源——STM32F4驱动MAX31865实现PT100高精度测温

    本教程详细介绍了增强板(STM32F407VET6)通过MAX31865模块读取三线制PT100铂电阻温度的完整实现方案。重点包括:1)硬件配置,需修改MAX31865跳线至三线制
    的头像 发表于 06-06 09:27 ?816次阅读
    <b class='flag-5'>零</b><b class='flag-5'>知</b><b class='flag-5'>开源</b>——<b class='flag-5'>STM32F4</b>驱动MAX31865<b class='flag-5'>实现</b>PT100高精度测温

    开源——STM32F4驱动MAX31865实现PT100高精度测温

    材料增强板(STM32F407VET6) MAX31865模块(支持三线制PT100) 三线制PT100传感器 0.96寸I2C OLED显示屏(SSD1306驱动) 杜邦线若干2
    发表于 05-26 18:52

    STM32项目实战:基于STM32F4的智能大棚温控系统(LVGL),附项目教程/源码

    今天小编来分享一个《智能大棚温控系统》的项目案例,硬件平台是STM32F4开发板+资源扩展板+显示触摸+仿真器,项目的演示界面如下图所示。智能大棚温控系统项目,需要一个风扇执行器件;
    的头像 发表于 10-25 13:54 ?1595次阅读
    <b class='flag-5'>STM32</b>项目实战:基于<b class='flag-5'>STM32F4</b>的智能大棚温控系统(LVGL),附项目教程/源码

    STM32项目实战:基于STM32F4的智能灯光控制系统(LVGL),附项目教程/源码

    平台是STM32F4开发板+资源扩展板+显示触摸+仿真器,项目的演示界面如下图所示。智能灯光控制系统项目,需要一个LED灯光执行器件,模拟灯光效果;一个光照传感
    的头像 发表于 10-17 16:16 ?1947次阅读
    <b class='flag-5'>STM32</b>项目实战:基于<b class='flag-5'>STM32F4</b>的智能灯光控制系统(LVGL),附项目教程/源码