91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第1页

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

零知開源——STM32F4實現ILI9486顯示屏UI界面系列教程(一):電子書閱讀器功能

PCB56242069 ? 來源:PCB56242069 ? 作者:PCB56242069 ? 2025-06-25 10:34 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

教程將詳細介紹如何在零知增強板上使用3.5寸ILI9486顯示屏實現電子書閱讀器功能。我們將使用LVGL庫構建用戶界面,并實現翻頁、進度顯示等核心功能。

一、硬件連接

1.1 硬件組件清單

組件名稱 規格參數 備注
零知開發板 STM32F407VGT6 主控制器
ILI9486顯示屏 3.5英寸TFT LCD (480×320) 電阻觸摸屏
SD卡模塊 SPI接口,支持FAT32 存儲電子書文件
XPT2046觸摸控制器 SPI接口 集成在顯示屏模塊上
W25Q128 Flash芯片 128M-bit (16MB) 存儲字體和系統文件
USB數據線 直流供電 系統電源

1.2 連接方式

零知增強板設計有專門的顯示屏接口,3.5寸ILI9486顯示屏可直接插入增強板,無需額外連線

wKgZO2hagA6AYoFAAAhCLADMz80771.png

電子書閱讀器界面效果圖:

wKgZPGhagQmAXEBCABDxt94SIEU77.jpegwKgZO2hagDqARR5MAF4OJ1Lqm0g719.png

二、軟件UI組件實現

2.1 核心數據結構

static const char* ebook_content[] = {
    "Embedded Systems Fundamentalsnn"
    "Embedded systems are specialized computing systems that perform dedicated functions.",
    "Microcontroller Architecturenn"
    "Microcontrollers (MCUs) contain a processor core, memory, and programmable I/O peripherals.",
    "Real-Time Operating Systemsnn"
    "RTOS provides deterministic timing behavior for embedded applications.",
    "Communication Protocolsnn"
    "Wired: UART, SPI, I2C, CANnWireless: BLE, Wi-Fi, LoRaWAN",
    "Development Lifecyclenn"
    "Stages: Requirements, Design, Implementation, Testing, Deployment"
};

static const uint8_t ebook_page_count = sizeof(ebook_content) / sizeof(ebook_content[0]);

// 電子書翻頁事件回調
static void ebook_prev_event_cb(lv_obj_t* btn, lv_event_t event);
static void ebook_next_event_cb(lv_obj_t* btn, lv_event_t event);

typedef struct {
    uint8_t current_page;
    uint8_t total_pages;
    bool is_english;
    lv_point_t touch_start;  // 觸摸起始點
    lv_obj_t* page_label;
    lv_obj_t* progress_label;
    lv_obj_t* btn_translate;
} EBookState;

2.2 觸摸事件處理

// 聲明全局ebook_state變量
static EBookState ebook_state;

// 3. 完全兼容的觸摸事件處理(替代手勢事件)
static void ebook_touch_event_cb(lv_obj_t* obj, lv_event_t event) {
    static lv_point_t touch_start;
    static uint32_t touch_time;
    
    switch(event) {
        case LV_EVENT_PRESSED: {
            lv_indev_t* indev = lv_indev_get_act();
            if(indev) {
                lv_indev_get_point(indev, &touch_start);
                touch_time = lv_tick_get();
            }
            break;
        }
        case 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 - touch_start.x;
                uint32_t duration = lv_tick_elaps(touch_time);
                
                // 判斷有效滑動 (水平移動>30像素且時間 30 && duration < 300) {
                    if(dx > 0) {
                        // 向右滑動:上一頁
                        if(ebook_state.current_page > 0) {
                            ebook_prev_event_cb(NULL, LV_EVENT_SHORT_CLICKED);
                        }
                    } else {
                        // 向左滑動:下一頁
                        if(ebook_state.current_page < ebook_state.total_pages - 1) {
                            ebook_next_event_cb(NULL, LV_EVENT_SHORT_CLICKED);
                        }
                    }
                }
            }
            break;
        }
    }
}

// 更新電子書顯示
static void update_ebook_display() {
    // 重置位置避免動畫殘留
    lv_obj_set_x(ebook_state.page_label, 0);
    lv_label_set_text(ebook_state.page_label, ebook_content[ebook_state.current_page]);
    
    char progress[16];
    snprintf(progress, sizeof(progress), "%d/%d", ebook_state.current_page + 1, ebook_state.total_pages);
    lv_label_set_text(ebook_state.progress_label, progress);
}

2.3初始化界面

void show_app_book() {
    lv_obj_t* win = create_app_win("EBook Reader");
    lv_coord_t hres = lv_disp_get_hor_res(NULL);
    lv_coord_t vres = lv_disp_get_ver_res(NULL);
    
    // 初始化電子書狀態
    ebook_state.current_page = 0;
    ebook_state.total_pages = ebook_page_count;
    ebook_state.is_english = true; // 默認英文
    ebook_state.touch_start.x = 0;
    ebook_state.touch_start.y = 0;
    
    // 創建內容容器(支持觸摸檢測)
    lv_obj_t* content_cont = lv_cont_create(win, NULL);
    lv_obj_set_size(content_cont, hres - 40, vres - 100);
    lv_obj_align(content_cont, NULL, LV_ALIGN_IN_TOP_MID, 0, 20);
    // lv_obj_set_gesture_parent(content_cont, true);
    lv_obj_set_event_cb(content_cont, ebook_touch_event_cb);
    
    // 創建頁面標簽
    ebook_state.page_label = lv_label_create(content_cont, NULL);
    lv_obj_set_width(ebook_state.page_label, lv_obj_get_width(content_cont) - 20);
    lv_label_set_long_mode(ebook_state.page_label, LV_LABEL_LONG_EXPAND);
    lv_label_set_align(ebook_state.page_label, LV_LABEL_ALIGN_LEFT);
    lv_obj_set_width(ebook_state.page_label, lv_obj_get_width(content_cont) - 40); // 增加一些邊距
    lv_label_set_text(ebook_state.page_label, "");
    lv_obj_align(ebook_state.page_label, NULL, LV_ALIGN_CENTER, 0, 0);
    
    // 創建進度標簽
    ebook_state.progress_label = lv_label_create(win, NULL);
    lv_obj_align(ebook_state.progress_label, NULL, LV_ALIGN_IN_BOTTOM_MID, 0, -30);
    lv_label_set_text(ebook_state.progress_label, "0/0");
    
    // 初始顯示
    update_ebook_display();
}

2.4 翻頁功能實現

// 翻頁動畫函數 (兼容舊版LVGL)
static void ebook_page_anim(lv_obj_t* label, lv_coord_t start, lv_coord_t end) {
    lv_anim_t a;
    lv_anim_init(&a);
    // lv_anim_set_var(&a, label);
    lv_anim_set_values(&a, start, end);
    lv_anim_set_time(&a, 300, 0);  // 兼容舊版API:設置持續時間和延遲
    lv_anim_set_exec_cb(&a, label, (lv_anim_exec_xcb_t)lv_obj_set_x);  // 兼容舊版API
    lv_anim_create(&a);
}

// 上一頁事件
static void ebook_prev_event_cb(lv_obj_t* btn, lv_event_t event) {
    if(event == LV_EVENT_SHORT_CLICKED) {
        if(ebook_state.current_page > 0) {
            // 先設置新內容再動畫
            ebook_state.current_page--;
            update_ebook_display();
            
            // 從左側滑入動畫
            lv_obj_set_x(ebook_state.page_label, -lv_obj_get_width(lv_obj_get_parent(ebook_state.page_label)));
            ebook_page_anim(ebook_state.page_label, 
                           -lv_obj_get_width(lv_obj_get_parent(ebook_state.page_label)), 
                           0);
        }
    }
}

// 下一頁事件
static void ebook_next_event_cb(lv_obj_t* btn, lv_event_t event) {
    if(event == LV_EVENT_SHORT_CLICKED) {
        if(ebook_state.current_page < ebook_state.total_pages - 1) {
            ebook_state.current_page++;
            update_ebook_display();
            
            // 從右側滑入動畫
            lv_obj_set_x(ebook_state.page_label, lv_obj_get_width(lv_obj_get_parent(ebook_state.page_label)));
            ebook_page_anim(ebook_state.page_label, 
                           lv_obj_get_width(lv_obj_get_parent(ebook_state.page_label)), 
                           0);
        }
    }
}

2.5功能說明

支持左右滑動翻頁,滑動距離大于30像素且時間小于300ms時觸發

屏幕兩側的箭頭按鈕提供物理翻頁功能

使用LVGL動畫實現平滑的翻頁效果

底部顯示當前頁碼和總頁數

使用英文字體內容顯示(中文字體需要進一步優化取模)

三、零知IDE配置

3.1 項目設置

打開零知IDE,創建新項目

選擇正確的開發板型號(零知增強板)

添加以下庫依賴:

LVGL

ILI9486驅動

XPT2046觸摸驅動

3.2LCD屏幕驅動和初始化

/* 與LCD驅動關聯 */
void my_disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p)
{
         
        u16 height,width;
        u16 i,j;
        width=area->x2 - area->x1+1;                         //得到填充的寬度
        height=area->y2 - area->y1+1;                        //高度
        for(i=0;ix1,area->y1+i);           //設置光標位置
                LCD_WriteRAM_Prepare();     //開始寫入GRAM
                for(j=0;jLCD_RAM=color_p->full;//寫入數據
                        color_p++;
                }
        }
         
        lv_disp_flush_ready(disp); 
}

/* 中斷 ms */
static void lv_tick_handler(HardwareTimer*)
{
        lv_tick_inc(LVGL_TICK_PERIOD);
}

void lvgl_setup()
{
        lv_init();
         
        lv_disp_buf_init(&disp_buf, buf, NULL, LV_HOR_RES_MAX * 10);
         
        
        lv_disp_drv_t disp_drv;
        lv_disp_drv_init(&disp_drv);
        disp_drv.hor_res = LV_HOR_RES_MAX;
        disp_drv.ver_res = LV_VER_RES_MAX;
        disp_drv.flush_cb = my_disp_flush;
        disp_drv.buffer = &disp_buf;
        lv_disp_drv_register(&disp_drv);
         
         
       
        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);
         
        
        MyTim = new HardwareTimer(TIM2);
        MyTim->setMode(2, TIMER_OUTPUT_COMPARE);   
        MyTim->setOverflow(1000/LVGL_TICK_PERIOD, HERTZ_FORMAT); 
        MyTim->attachInterrupt(lv_tick_handler);
        MyTim->resume();
}

四、演示效果

4.1 功能演示

打開電子書應用,顯示第一頁內容

向右滑動:切換到上一頁內容

向左滑動:切換到下一頁內容

進度更新:底部頁碼隨翻頁自動更新

4.2 視頻演示

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

4.3 性能指標

項目 數值 說明
翻頁響應時間 < 100ms 從觸摸到頁面開始動畫的時間
動畫幀率 30 FPS 翻頁動畫流暢度
內存占用 42KB 包括LVGL和電子書數據
刷新率 30Hz 顯示屏刷新頻率

五、常見問題解決

5.1觸摸不靈敏

解決方案

檢查觸摸屏校準數據

增加觸摸檢測閾值

bool my_touchpad_read(lv_indev_drv_t * indev, lv_indev_data_t * data)
{
        static lv_coord_t last_x = 0;
        static lv_coord_t last_y = 0;
         
        
        data->state = ts.touched() ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL;
        if(data->state == LV_INDEV_STATE_PR){
                TS_Point p = ts.getPoint();
                 
               
                last_x = LV_HOR_RES-(p.y *LV_HOR_RES)/4095;       
                last_y = (p.x *LV_VER_RES)/4095;       
                 
                Serial.print("touched:");
                Serial.print(last_x);Serial.print(",");Serial.println(last_y);
        }
      
        data->point.x = last_x;
        data->point.y = last_y;
         
        return false; 
}

5.2翻頁卡頓

優化建議

減少頁面內容長度

使用LVGL的局部刷新功能

優化動畫參數

lv_anim_set_time(&a, 300, 0);  // 兼容舊版API:設置持續時間和延遲

六、總結與擴展

6.1 實現總結

本教程實現了電子書閱讀器的核心功能:中文內容顯示、觸摸翻頁、翻頁動畫效果、閱讀進度顯示

6.2 擴展建議

添加書簽保存和跳轉功能

實現字體大小切換

添加暗色主題保護視力

從SD卡加載電子書文件

6.3 下一步

在下一個系列教程中,我們將實現日歷顯示及切換

?零知開源是一個真正屬于國人自己的開源軟硬件平臺,在開發效率上超越了Arduino平臺并且更加容易上手,大大降低了開發難度。
?零知開源在軟件方面提供了完整的學習教程和豐富示例代碼,讓不懂程序的工程師也能非常輕而易舉的搭建電路來創作產品,測試產品。快來動手試試吧!

?訪問零知開源平臺,獲取更多實戰項目和教程資源吧!
www.lingzhilab.com

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 顯示屏
    +關注

    關注

    28

    文章

    4604

    瀏覽量

    76375
  • STM32F4
    +關注

    關注

    3

    文章

    203

    瀏覽量

    29039
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    開源——STM32F4結合BMP581氣壓傳感實現ST7789中文顯示教程

    開源平臺是個專為國開發者設計的軟硬件開源平臺,提供比Arduino更易上手的開發體驗。本教程展示了如何在
    的頭像 發表于 07-09 09:21 ?144次閱讀
    <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><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增強板的四路獨立計時

    本帖最后由 PCB56242069 于 2025-7-1 11:24 編輯 項目概述本教程將指導你如何使用STM32F407VET6增強板實現
    發表于 07-01 10:31

    開源——基于STM32F407VET6增強板的四路獨立計時

    本教程介紹基于STM32F407VET6增強板的四路獨立計時實現方案。項目采用TFT顯示屏
    的頭像 發表于 07-01 10:13 ?237次閱讀
    <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>增強板的四路獨立計時<b class='flag-5'>器</b>

    開源——STM32F4實現ILI9486顯示屏UI界面系列教程(四):相冊預覽和大圖功能

    電子書閱讀器完全致,請參考系列教程()的硬件連接部分。顯示屏直接插入
    發表于 06-30 09:13

    開源——STM32F4實現ILI9486顯示屏UI界面系列教程(四):相冊預覽和大圖功能

    本教程詳細講解如何在LVGL中實現相冊預覽和圖片放大功能。通過事件回調、窗口管理和圖片取模技術,構建流暢的用戶體驗。主要內容包括:硬件連接方式(與電子書教程相同)、軟件UI組件
    的頭像 發表于 06-27 12:01 ?153次閱讀
    <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界面系列教程(三):記事本功能實現

    。 ? 、硬件連接(同電子書教程)硬件連接方式與電子書閱讀器完全致,請參考系列教程(
    發表于 06-27 09:51

    開源——STM32F4實現ILI9486顯示屏UI界面系列教程(二):日歷功能實現

    ——STM32F4實現ILI9486顯示屏UI界面系列
    發表于 06-25 17:51

    開源——STM32F4實現ILI9486顯示屏UI界面系列教程(二):日歷功能實現

    本教程詳細介紹了基于STM32F4ILI9486觸摸的日歷應用開發,涵蓋硬件連接、軟件實現
    的頭像 發表于 06-25 17:34 ?175次閱讀
    <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><b class='flag-5'>實現</b>

    開源——STM32F4實現ILI9486顯示屏UI界面系列教程():電子書閱讀器功能

    本教程將詳細介紹如何在增強板上使用3.5寸ILI9486顯示屏實現電子書
    發表于 06-24 19:09

    STM32F3系列、STM32F4系列、STM32L4系列STM32L4+系列Cortex-M4編程手冊

    電子發燒友網站提供《STM32F3系列、STM32F4系列、STM32L4
    發表于 06-06 17:06 ?5次下載

    開源——STM32F4驅動MAX31865實現PT100高精度測溫

    材料增強板(STM32F407VET6) MAX31865模塊(支持三線制PT100) 三線制PT100傳感 0.96寸I2C OLED顯示屏
    發表于 05-26 18:52

    STM32項目實戰:基于STM32F4的智能大棚溫控系統(LVGL),附項目教程/源碼

    今天小編來分享個《智能大棚溫控系統》的項目案例,硬件平臺是STM32F4開發板+資源擴展板+顯示觸摸+仿真,項目的演示
    的頭像 發表于 10-25 13:54 ?1506次閱讀
    <b class='flag-5'>STM32</b>項目實戰:基于<b class='flag-5'>STM32F4</b>的智能大棚溫控系統(LVGL),附項目教程/源碼

    kindle是干嘛用的 kindle怎么導入電子書

    Kindle 是亞馬遜公司推出的電子書閱讀器,主要用于閱讀電子書、文章、漫畫、雜志等電子文檔
    的頭像 發表于 10-21 11:32 ?2144次閱讀
    主站蜘蛛池模板: 色先锋av资源中文字幕 | 久久国产免费福利永久 | 操伊人| 特级毛片免费看 | 国产午夜精品一区二区 | 亚洲午夜久久久久久噜噜噜 | 日本高清www | 你懂的 在线观看 | 久久国产精品99久久久久久老狼 | 欧美色图28p | 三级欧美视频 | 欧美性色欧美a在线播放 | 日本天堂网在线观看 | 亚洲黄网址 | 在线观看国产久青草 | 亚洲邪恶天堂影院在线观看 | 亚洲成在人线中文字幕 | 久久精品视频免费观看 | 亚洲夜夜骑 | 日韩天堂在线观看 | 加勒比一区二区三区 | 久久久久久久综合 | 日本69sex护士xxx | 国产又色 | 国模沟沟一区二区三区 | 久久夜色撩人精品国产 | 欧美一区二区三区综合色视频 | luxu259在线中文字幕 | 伊人手机在线观看 | 欧美成人aaa大片 | 人人福利 | 日韩天堂 | 不卡视频一区二区 | 成人久久伊人精品伊人 | 污污视频网址 | 日本一区二区不卡视频 | 色偷偷91综合久久噜噜 | 亚洲成人免费观看 | 亚洲无色 | 影院在线观看免费 | 男女爱爱视频免费 |