国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

STM32移植LVGL+旋轉(zhuǎn)編碼器接口對(duì)接

這篇具有很好參考價(jià)值的文章主要介紹了STM32移植LVGL+旋轉(zhuǎn)編碼器接口對(duì)接。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

寫(xiě)在前面:本菜鳥(niǎo)結(jié)合了許多大佬的文章,成功實(shí)現(xiàn)了基于LVGL的GUI設(shè)計(jì),小開(kāi)心~淺淺記錄一下!~

本文以單片機(jī)STM32F103VET6為核心,利用ST7796芯片驅(qū)動(dòng)分辨率為480*320的LCD液晶屏模塊,移植LVGL,對(duì)接顯示接口,對(duì)接外部接口——旋轉(zhuǎn)編碼器,完成以上兩步,就可以實(shí)現(xiàn)LVGL的顯示和控制啦!Emmm可以開(kāi)始你的創(chuàng)作了!~

一、顯示接口對(duì)接

具體步驟:

下載源碼文件lvgl-master8.3進(jìn)行移植

這里我們以LCD顯示工程為基礎(chǔ)進(jìn)行移植。

1.新建四個(gè)組,分別存放源文件(source)、配置文件(config)、接口層文件(port)、示例(app)。

2.添加文件,lvgl/src下的.c文件移到source中,lv.conf.h添加到config中,lv_port_xxx.c文件添加到port中,示例文件添加到app中。

3.添加路徑,勾選C99,此時(shí)進(jìn)行編譯會(huì)有四個(gè)錯(cuò)誤,因?yàn)镃99的原因,在部分函數(shù)前要加static,否則會(huì)報(bào)錯(cuò),再進(jìn)行編譯會(huì)發(fā)現(xiàn)還有一個(gè)錯(cuò)誤:

stm32 lvgl,stm32,單片機(jī),嵌入式硬件,Powered by 金山文檔

解決方法是取消勾選Use MicroLIB,再編譯就會(huì)發(fā)現(xiàn)零錯(cuò)誤。

4.lv_conf.h配置:主要是一些宏定義,只需要修改一些宏定義即可進(jìn)行一些定制配置,如顯示器的寬度高度、色彩深度、DPI、提供給LVGL的空間等,可根據(jù)自己的需求打開(kāi)即可使用。

5.修改lv_port_disp.c接口文件:

使能后開(kāi)始對(duì)其進(jìn)行配置,修改頭文件名稱(chēng)并添加LCD頭文件,添加兩個(gè)宏,分別是屏幕的寬(480)和高(320)。

修改lv_port_disp_init()顯示接口初始化函數(shù),它是一個(gè)最頂層的初始化顯示設(shè)備的函數(shù)。然后選擇一種寫(xiě)緩存的方式及設(shè)置顯示分辨,這里我們選擇保留第一種寫(xiě)緩存的方式:只使用一個(gè)緩沖區(qū)

 /* Example for 1) */
    static lv_disp_draw_buf_t draw_buf_dsc_1;
    static lv_color_t buf_1[MY_DISP_HOR_RES * 10];                          /*A buffer for 10 rows*/
    lv_disp_draw_buf_init(&draw_buf_dsc_1, buf_1, NULL, MY_DISP_HOR_RES * 10);     

該文件內(nèi)還有兩個(gè)函數(shù)disp_init()和disp_flush()。在disp_init()中,需要提供屏幕的初始化代碼,這里直接調(diào)用驅(qū)動(dòng)成功的LCD模塊初始化代碼LCD_init()。接下來(lái)是disp_flush屏幕刷新函數(shù),這個(gè)函數(shù)需要調(diào)用底層LCD的操作接口,這里調(diào)用一個(gè)畫(huà)點(diǎn)的函數(shù),因?yàn)槠聊皇侵饌€(gè)繪制像素點(diǎn),從而填充一塊區(qū)域的,所以也可以直接調(diào)用一個(gè)繪制方形函數(shù)填充區(qū)域顯示。

/*Initialize your display and the required peripherals.*/
static void disp_init(void)
{
    /*You code here*/
    LCD_Init();
}

/*Flush the content of the internal buffer the specific area on the display
 *You can use DMA or any hardware acceleration to do this operation in the background but
 *'lv_disp_flush_ready()' has to be called when finished.*/
static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{
    /*The most simple case (but also the slowest) to put all pixels to the screen one-by-one*/

    int32_t x;
    int32_t y;
    for(y = area->y1; y <= area->y2; y++) {
        for(x = area->x1; x <= area->x2; x++) {
            /*Put a pixel to the display. For example:*/
            /*put_px(x, y, *color_p)*/
            LCD_DrawPoint(x,y,color_p->full);
            color_p++;
        }
    }
    /*IMPORTANT!!!
     *Inform the graphics library that you are ready with the flushing*/
    lv_disp_flush_ready(disp_drv);
}

6.最后需要配置一個(gè)定時(shí)器為L(zhǎng)VGL提供心跳,這里可以使用系統(tǒng)滴答定時(shí)器,也可以使用其他定時(shí)器配置,然后在主循環(huán)中調(diào)用lv_task_handler()函數(shù),這樣需要顯示的內(nèi)容才會(huì)實(shí)時(shí)更新到屏幕上,至此LVGL的顯示配置完成。

    while(1)
    {
        lv_tick_inc(5);
        lv_task_handler();
        delay_ms(5);
    }

二、旋轉(zhuǎn)編碼器接口對(duì)接

首先在lv_port_indev.c的接口初始化中保留Encoder部分,在encoder_init()中編寫(xiě)旋轉(zhuǎn)編碼器相關(guān)的初始化代碼,再指定用于讀取按鍵狀態(tài)的函數(shù)encoder_read,將旋轉(zhuǎn)編碼器注冊(cè)到LVGL中。最后對(duì)encoder相關(guān)函數(shù)進(jìn)行編寫(xiě),主要是encoder_read,分為三種情形,分別是旋轉(zhuǎn)編碼器左旋、右旋和按下時(shí)對(duì)應(yīng)控制界面的功能。

void lv_port_indev_init(void)
{
    /**
     * Here you will find example implementation of input devices supported by LittelvGL:
     *  - Touchpad
     *  - Mouse (with cursor support)
     *  - Keypad (supports GUI usage only with key)
     *  - Encoder (supports GUI usage only with: left, right, push)
     *  - Button (external buttons to press points on the screen)
     *
     *  The `..._read()` function are only examples.
     *  You should shape them according to your hardware
     */

    static lv_indev_drv_t indev_drv;
    
    /*------------------
     * Encoder
     * -----------------*/

    /*Initialize your encoder if you have*/
    encoder_init();

    /*Register a encoder input device*/
    lv_indev_drv_init(&indev_drv);
    indev_drv.type = LV_INDEV_TYPE_ENCODER;
    indev_drv.read_cb = encoder_read;
    indev_encoder = lv_indev_drv_register(&indev_drv);

    /*Later you should create group(s) with `lv_group_t * group = lv_group_create()`,
     *add objects to the group with `lv_group_add_obj(group, obj)`
     *and assign this input device to group to navigate in it:
     *`lv_indev_set_group(indev_encoder, group);`*/
    lv_group_t * group= lv_group_create();
    lv_indev_set_group(indev_encoder, group);
/*------------------
 * Encoder
 * -----------------*/

/*Initialize your keypad*/
static void encoder_init(void)
{
    /*Your code comes here*/
    Encoder_Init();
}

/*Will be called by the library to read the encoder*/
static void encoder_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
{
    static uint32_t last_key = 0;
    uint32_t act_key = Encoder_Scan(0);
    if(act_key != 0) {
        switch(act_key) {
            case 1:
                act_key = LV_KEY_ENTER;
                encoder_state = LV_INDEV_STATE_PR;    
                break;
            case 2:
                act_key = LV_KEY_LEFT;
                encoder_diff = -1;
                encoder_state = LV_INDEV_STATE_REL;
                break;
            case 3:
                act_key = LV_KEY_RIGHT;
                encoder_state = LV_INDEV_STATE_REL;
                encoder_diff = 1;
                break;
        }
        last_key = act_key;
    }
    else{
        encoder_diff = 0;
        encoder_state = LV_INDEV_STATE_REL;
        }
    data->key = last_key;
    data->enc_diff = encoder_diff;
    data->state = encoder_state;
    encoder_diff=0;
}


/*Call this function in an interrupt to process encoder events (turn, press)*/
static void encoder_handler(void)
{
    /*Your code comes here*/
    encoder_diff += 0;
    encoder_state = LV_INDEV_STATE_REL;

}

與其他輸入設(shè)備接口不同的是,旋轉(zhuǎn)編碼器較特殊,光移植完還無(wú)法使用,如需使用還要?jiǎng)?chuàng)建“組”。這里引入“組”這一概念,當(dāng)需要用鍵盤(pán)或者編碼器來(lái)模擬按鍵控制對(duì)象時(shí),就需要把控制對(duì)象添加進(jìn)“組”。例如,如果一個(gè)旋鈕被聚焦,當(dāng)向左或向右旋轉(zhuǎn)編碼器時(shí),旋鈕的值會(huì)隨之改變。這種操作的前提便是將輸入設(shè)備與“組”關(guān)聯(lián)起來(lái),即通過(guò)lv_group_add_obj()函數(shù)將控件添加進(jìn)“組”,才能實(shí)現(xiàn)編碼器與LVGL接口對(duì)接和實(shí)現(xiàn)界面控制。但是需要注意的是,并非所有控件都能夠加入“組”并且被使用。比如我們添加“標(biāo)簽”這個(gè)控件時(shí),即使將它加入到“組”中,用編碼器旋轉(zhuǎn)聚焦時(shí)也不會(huì)切換到這個(gè)“標(biāo)簽”。

將所需控件加入“組”旋轉(zhuǎn)編碼器即可正常使用,即可完成編碼器接口與LVGL的對(duì)接。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-687025.html

到了這里,關(guān)于STM32移植LVGL+旋轉(zhuǎn)編碼器接口對(duì)接的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 關(guān)于stm32旋轉(zhuǎn)編碼器計(jì)次亂跳問(wèn)題(消抖)

    旋轉(zhuǎn)編碼器A口接GPIOB0,B口接GPIOB1。設(shè)置中斷類(lèi)型為上升下降沿均觸發(fā)。 輸出是用0.96寸oled輸出 A腳設(shè)置為上升下降沿均會(huì)進(jìn)中斷,下降上升一個(gè)變換周期,判斷這個(gè)周期的A腳,B腳的始末狀態(tài),來(lái)判斷正反轉(zhuǎn)一次。 A口輸出的波形用來(lái)中斷,B口輸出的波形用來(lái)判斷正轉(zhuǎn)還是反轉(zhuǎn)

    2024年02月16日
    瀏覽(29)
  • 【STM32】HAL庫(kù)自學(xué)記錄-旋轉(zhuǎn)編碼器的使用

    【STM32】HAL庫(kù)自學(xué)記錄-旋轉(zhuǎn)編碼器的使用

    通過(guò)本文可學(xué)會(huì)兩種實(shí)現(xiàn)判斷旋轉(zhuǎn)編碼器正轉(zhuǎn)反轉(zhuǎn)的方法,可根據(jù)自己的應(yīng)用場(chǎng)景來(lái)選擇使用哪種方法。 1、芯片:STM32F103RCT6 2、STM32CubeMx軟件 3、IDE: MDK-Keil軟件 4、旋轉(zhuǎn)編碼器模塊 5、XCOM V1.4串口軟件 圖中C端為GND。 方向 :A相和B相相差一個(gè)相位,一般來(lái)說(shuō)是90°。A相信號(hào)在

    2024年02月11日
    瀏覽(27)
  • 【單片機(jī)】STM32單片機(jī)讀取旋轉(zhuǎn)編碼器,TIM定時(shí)器編碼器模式捕獲,程序

    【單片機(jī)】STM32單片機(jī)讀取旋轉(zhuǎn)編碼器,TIM定時(shí)器編碼器模式捕獲,程序

    旋轉(zhuǎn)編碼器簡(jiǎn)單來(lái)說(shuō),就是會(huì)輸出2個(gè)PWM,依據(jù)相位可以知道旋轉(zhuǎn)方向,依據(jù)脈沖個(gè)數(shù)可以知道旋轉(zhuǎn)的角度。一般旋轉(zhuǎn)一圈有一個(gè)固定數(shù)值的脈沖個(gè)數(shù)。 旋轉(zhuǎn)編碼器廣泛用于電機(jī)、或者角度傳感器,STM32的定時(shí)器可以直接接入這兩個(gè)波形獲取到信息。 前兩個(gè)引腳(接地和Vcc)

    2024年02月13日
    瀏覽(22)
  • 【STM32】STM32學(xué)習(xí)筆記-對(duì)射式紅外傳感器計(jì)次 旋轉(zhuǎn)編碼器計(jì)次(12)

    【STM32】STM32學(xué)習(xí)筆記-對(duì)射式紅外傳感器計(jì)次 旋轉(zhuǎn)編碼器計(jì)次(12)

    相關(guān)頭文件: misc.h 1.1 NVIC_PriorityGroupConfig函數(shù) 1.2 NVIC_PriorityGroup類(lèi)型 1.3 NVIC_Init函數(shù) 1.4 NVIC_InitTypeDef類(lèi)型 NVIC_IRQChannel取值 成員NVIC_IRQChannelPreemptionPriority可賦的值:最大取值15,具體有上面設(shè)置的優(yōu)先級(jí)組中規(guī)定的位數(shù)決定 成員NVIC_IRQChannelSubPriority可賦的值:最大取值15,具體有

    2024年01月15日
    瀏覽(17)
  • (STM32)PWM輸出控制電機(jī)旋轉(zhuǎn)并且使用編碼器讀取脈沖數(shù)

    (STM32)PWM輸出控制電機(jī)旋轉(zhuǎn)并且使用編碼器讀取脈沖數(shù)

    目錄 ?前言 一、pwm輸出讓電機(jī)轉(zhuǎn)? 1.電機(jī)的接線說(shuō)明 2.驅(qū)動(dòng)的接線說(shuō)明 3.pwm輸出代碼 ?pwm.c pwm.h 4.輸出pwm控制電機(jī)旋轉(zhuǎn) 二、配置定時(shí)器編碼器模式 1.定時(shí)器編碼器模式 編碼器原理 編碼器相關(guān)的概念 2.編碼器模式——代碼部分 3.獲取脈沖數(shù) 三、定時(shí)讀取編碼器讀取的脈沖數(shù)

    2024年02月03日
    瀏覽(29)
  • STM32——TIM編碼器接口

    STM32——TIM編碼器接口

    Encoder Interface 編碼器接口 編碼器接口可接收增量(正交)編碼器的信號(hào),根據(jù)編碼器旋轉(zhuǎn)產(chǎn)生的正交信號(hào)脈沖, 自動(dòng)控制CNT自增或自減 ,從而指示編碼器的位置、旋轉(zhuǎn)方向和旋轉(zhuǎn)速度 每個(gè)高級(jí)定時(shí)器和通用定時(shí)器都擁有 1個(gè)編碼器接口 ,C8T6擁有4個(gè)編碼器接口 兩個(gè)輸入引腳

    2024年01月19日
    瀏覽(57)
  • STM32 TIM編碼器接口

    STM32 TIM編碼器接口

    單片機(jī)學(xué)習(xí)! 目錄 文章目錄 前言 一、編碼器接口簡(jiǎn)介 1.1 編碼器接口作用 1.2 編碼器接口工作流程 1.3 編碼器接口資源分布 1.4?編碼器接口輸入引腳 二、正交編碼器 2.1 正交編碼器功能 2.2 引腳作用 2.3 如何測(cè)量方向 2.4 正交信號(hào)優(yōu)勢(shì) 2.5 執(zhí)行邏輯 三、編碼器定時(shí)器框圖 3.1 編

    2024年04月14日
    瀏覽(23)
  • STM32第五課:對(duì)射式紅外線傳感器計(jì)數(shù)和旋轉(zhuǎn)編碼器計(jì)數(shù)

    STM32第五課:對(duì)射式紅外線傳感器計(jì)數(shù)和旋轉(zhuǎn)編碼器計(jì)數(shù)

    1.1 產(chǎn)品特性 ?????????使用ITR9606高靈敏度槽型光耦器件,它由一個(gè)紅外發(fā)光二極管和一個(gè)NPN光電三極管組成,槽寬度為5mm。傳感器特設(shè)M3固定安裝孔,調(diào)節(jié)方向與固定方便易用,使用寬電壓LM393比較器,信號(hào)干凈,波形好,驅(qū)動(dòng)能力強(qiáng),超過(guò)15mA。廣泛用于電機(jī)轉(zhuǎn)速檢測(cè),

    2024年02月20日
    瀏覽(26)
  • STM32單片機(jī)(五)第二節(jié):EXTI外部中斷練習(xí)2(旋轉(zhuǎn)編碼器計(jì)次)

    STM32單片機(jī)(五)第二節(jié):EXTI外部中斷練習(xí)2(旋轉(zhuǎn)編碼器計(jì)次)

    ?? 專(zhuān)欄簡(jiǎn)介:本專(zhuān)欄記錄了從零學(xué)習(xí)單片機(jī)的過(guò)程,其中包括51單片機(jī)和STM32單片機(jī)兩部分;建議先學(xué)習(xí)51單片機(jī),其是STM32等高級(jí)單片機(jī)的基礎(chǔ);這樣再學(xué)習(xí)STM32時(shí)才能融會(huì)貫通。 ?? 專(zhuān)欄適用人群 :適用于想要從零基礎(chǔ)開(kāi)始學(xué)習(xí)入門(mén)單片機(jī),且有一定C語(yǔ)言基礎(chǔ)的的童鞋

    2024年02月11日
    瀏覽(25)
  • STM32定時(shí)器的編碼器接口模式

    STM32定時(shí)器的編碼器接口模式

    MCU為STM32L431,通用定時(shí)器框圖: 編碼器接口模式一共有三種,通過(guò)TIMx_SMCR寄存器的SMS[3:0]位來(lái)選擇。模式1計(jì)數(shù)器僅在TI1FP1的邊沿根據(jù)TI2FP2的電平來(lái)判斷向上/下計(jì)數(shù);模式2計(jì)數(shù)器僅在TI2FP2的邊沿根據(jù)TI1FP1的電平來(lái)判斷向上/下計(jì)數(shù);模式3計(jì)數(shù)器同時(shí)在TI1FP1和TI2FP2的邊沿根據(jù)另

    2023年04月15日
    瀏覽(24)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包