日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

启明云端分享|干货来了,怎么用ESP32-S2驱动断码屏呢?更多干货欢迎关注启明云端CSDN技术社区!

發布時間:2024/10/14 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 启明云端分享|干货来了,怎么用ESP32-S2驱动断码屏呢?更多干货欢迎关注启明云端CSDN技术社区! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、基礎理論

ESP32-S2具有43個GPIO,理論上可以支持835=280段,但實際上,受限于刷新率和保持時間的限制,按刷新時間20ms,保持時間1ms計算,大概能支持的上限為820=160段。

ESP32-S2 IO拉電流可以達到40mA,但是灌電流只有28mA,所以對于常見的共陰段碼顯示屏,如果亮度不夠,需要加共陰極 二極管驅動。本DEMO僅供演示,IO口直接驅動。

軟件架構上,先創建一個定時器任務,設置為20mS刷一次屏,按每條陰極線保持800us~1ms時間順序刷新顯示數據。
本文的目的是演示如何用ESP32-S2驅動段碼屏,所寫代碼僅適合特定的顯示屏,用戶需要根據選用的段碼屏,編寫匹配的程序。

二、代碼實現

1.框架

建components\display\src和components\display\include文件夾,將顯示部分代碼作為一個部件放在user_display.c和user_display.h,方便維護和擴展。
先看user_display.c的實現
2.IO配置和初始化部分
#include <stdio.h>
#include “freertos/FreeRTOS.h”
#include “freertos/task.h”
#include “freertos/queue.h”
#include “driver/timer.h”
#include “driver/gpio.h”
#include “user_display.h”

/LED模塊******************/

uint8_t display_temperature_88=0; //溫度顯示全局變量,00~99
uint8_t display_temperature_sw=ON; //溫度顯示開關

uint8_t display_capacitance_88=0;//容量顯示全局變量,00~99
uint8_t display_capacitance_sw=ON;//容量顯示開關

uint8_t display_time_88=60;//時間顯示全局變量,00~99
uint8_t display_time_sw=ON;//時間顯示開關

uint8_t line8_sw=ON;//陰極線8顯示控制開關
uint8_t line9_sw=ON;//陰極線9顯示控制開關
uint8_t line10_water_sw=ON;//陰極線10花灑顯示控制開關
uint8_t decorate_sw=ON;//陰極線11、12裝飾條顯示控制開關
uint8_t lineH_sw=ON;//陽極線H顯示控制開關
uint8_t line13_sw=ON;//陰極線13顯示控制開關

uint8_t line10_cap=1;//陰極線10容量選擇,0=不顯示,1=8L,2=10L,3=12L

static uint8_t display_fan_num=0;//風扇狀態動態計數器
static uint8_t display_fire_num=0;//火焰指示動態計數器
static uint8_t display_water_num=0;//花灑動態計數器

#define user_delay_time_us 800 //LED保持時間

/陽極IO/
#define positive_A 33
#define positive_B 34
#define positive_C 35
#define positive_D 36
#define positive_E 37
#define positive_F 38
#define positive_G 39
#define positive_H 40

/陰極IO/
#define negative_1 1
#define negative_2 2
#define negative_3 3
#define negative_4 4
#define negative_5 5
#define negative_6 6
#define negative_7 7
#define negative_8 8
#define negative_9 9
#define negative_10 10
#define negative_11 11
#define negative_12 12
#define negative_13 13
#define negative_14 14
#define negative_15 15
#define negative_16 16

/IO配置函數*********/
void user_led_init(void)
{
/設置陽極為上拉輸出***/
gpio_pad_select_gpio(positive_A);
gpio_set_direction(positive_A, GPIO_MODE_OUTPUT);

gpio_pad_select_gpio(positive_B); gpio_set_direction(positive_B, GPIO_MODE_OUTPUT);gpio_pad_select_gpio(positive_C); gpio_set_direction(positive_C, GPIO_MODE_OUTPUT);gpio_pad_select_gpio(positive_D); gpio_set_direction(positive_D, GPIO_MODE_OUTPUT);gpio_pad_select_gpio(positive_E); gpio_set_direction(positive_E, GPIO_MODE_OUTPUT);gpio_pad_select_gpio(positive_F); gpio_set_direction(positive_F, GPIO_MODE_OUTPUT);gpio_pad_select_gpio(positive_G); gpio_set_direction(positive_G, GPIO_MODE_OUTPUT);gpio_pad_select_gpio(positive_H); gpio_set_direction(positive_H, GPIO_MODE_OUTPUT);/***********設置陰極為開漏輸出**************/gpio_pad_select_gpio(negative_1); gpio_set_direction(negative_1, ((GPIO_MODE_DEF_OUTPUT) | (GPIO_MODE_DEF_OD)));gpio_pad_select_gpio(negative_2); gpio_set_direction(negative_2, ((GPIO_MODE_DEF_OUTPUT) | (GPIO_MODE_DEF_OD)));gpio_pad_select_gpio(negative_3); gpio_set_direction(negative_3, ((GPIO_MODE_DEF_OUTPUT) | (GPIO_MODE_DEF_OD)));gpio_pad_select_gpio(negative_4); gpio_set_direction(negative_4, ((GPIO_MODE_DEF_OUTPUT) | (GPIO_MODE_DEF_OD)));gpio_pad_select_gpio(negative_5); gpio_set_direction(negative_5, ((GPIO_MODE_DEF_OUTPUT) | (GPIO_MODE_DEF_OD)));gpio_pad_select_gpio(negative_6); gpio_set_direction(negative_6, ((GPIO_MODE_DEF_OUTPUT) | (GPIO_MODE_DEF_OD)));gpio_pad_select_gpio(negative_7); gpio_set_direction(negative_7, ((GPIO_MODE_DEF_OUTPUT) | (GPIO_MODE_DEF_OD)));gpio_pad_select_gpio(negative_8); gpio_set_direction(negative_8, ((GPIO_MODE_DEF_OUTPUT) | (GPIO_MODE_DEF_OD)));gpio_pad_select_gpio(negative_9); gpio_set_direction(negative_9, ((GPIO_MODE_DEF_OUTPUT) | (GPIO_MODE_DEF_OD)));gpio_pad_select_gpio(negative_10); gpio_set_direction(negative_10, ((GPIO_MODE_DEF_OUTPUT) | (GPIO_MODE_DEF_OD)));gpio_pad_select_gpio(negative_11); gpio_set_direction(negative_11, ((GPIO_MODE_DEF_OUTPUT) | (GPIO_MODE_DEF_OD)));gpio_pad_select_gpio(negative_12); gpio_set_direction(negative_12, ((GPIO_MODE_DEF_OUTPUT) | (GPIO_MODE_DEF_OD)));gpio_pad_select_gpio(negative_13); gpio_set_direction(negative_13, ((GPIO_MODE_DEF_OUTPUT) | (GPIO_MODE_DEF_OD)));gpio_pad_select_gpio(negative_14); gpio_set_direction(negative_14, ((GPIO_MODE_DEF_OUTPUT) | (GPIO_MODE_DEF_OD)));gpio_pad_select_gpio(negative_15); gpio_set_direction(negative_15, ((GPIO_MODE_DEF_OUTPUT) | (GPIO_MODE_DEF_OD)));gpio_pad_select_gpio(negative_16); gpio_set_direction(negative_16, ((GPIO_MODE_DEF_OUTPUT) | (GPIO_MODE_DEF_OD)));/**********IO初始化***********/ gpio_set_level(positive_A, 0); gpio_set_level(positive_B, 0); gpio_set_level(positive_C, 0); gpio_set_level(positive_D, 0); gpio_set_level(positive_E, 0); gpio_set_level(positive_F, 0); gpio_set_level(positive_G, 0); gpio_set_level(positive_H, 0);gpio_set_level(negative_1, 1); gpio_set_level(negative_2, 1); gpio_set_level(negative_3, 1); gpio_set_level(negative_4, 1); gpio_set_level(negative_5, 1); gpio_set_level(negative_6, 1); gpio_set_level(negative_7, 1); gpio_set_level(negative_8, 1); gpio_set_level(negative_9, 1); gpio_set_level(negative_10, 1); gpio_set_level(negative_11, 1); gpio_set_level(negative_12, 1); gpio_set_level(negative_13, 1); gpio_set_level(negative_14, 1); gpio_set_level(negative_15, 1); gpio_set_level(negative_16, 1);

}

void user_led_on(uint8_t positive_io)
{
gpio_set_level(positive_io, 1);
}

void user_led_off(uint8_t positive_io)
{
gpio_set_level(positive_io, 0);
}

void user_led_all_off(void)
{
gpio_set_level(positive_A, 0);
gpio_set_level(positive_B, 0);
gpio_set_level(positive_C, 0);
gpio_set_level(positive_D, 0);
gpio_set_level(positive_E, 0);
gpio_set_level(positive_F, 0);
gpio_set_level(positive_G, 0);
gpio_set_level(positive_H, 0);

gpio_set_level(negative_1, 1); gpio_set_level(negative_2, 1); gpio_set_level(negative_3, 1); gpio_set_level(negative_4, 1); gpio_set_level(negative_5, 1); gpio_set_level(negative_6, 1); gpio_set_level(negative_7, 1); gpio_set_level(negative_8, 1); gpio_set_level(negative_9, 1); gpio_set_level(negative_10, 1); gpio_set_level(negative_11, 1); gpio_set_level(negative_12, 1); gpio_set_level(negative_13, 1); gpio_set_level(negative_14, 1); gpio_set_level(negative_15, 1); gpio_set_level(negative_16, 1);

}

3.8字段碼驅動,完成數字0~9的顯示

/8字段碼驅動****/
void display_driver_0() //驅動層,顯示數字0
{
user_led_on(positive_A);
user_led_on(positive_B);
user_led_on(positive_C);
user_led_on(positive_D);
user_led_on(positive_E);
user_led_on(positive_F);
}

void display_driver_1() //驅動層,顯示數字1
{
user_led_on(positive_B);
user_led_on(positive_C);
}

void display_driver_2() //驅動層,顯示數字2
{
user_led_on(positive_A);
user_led_on(positive_B);
user_led_on(positive_G);
user_led_on(positive_E);
user_led_on(positive_D);
}

void display_driver_3() //驅動層,顯示數字3
{
user_led_on(positive_A);
user_led_on(positive_B);
user_led_on(positive_G);
user_led_on(positive_C);
user_led_on(positive_D);
}

void display_driver_4() //驅動層,顯示數字4
{
user_led_on(positive_F);
user_led_on(positive_G);
user_led_on(positive_B);
user_led_on(positive_C);
}

void display_driver_5() //驅動層,顯示數字5
{
user_led_on(positive_A);
user_led_on(positive_F);
user_led_on(positive_G);
user_led_on(positive_C);
user_led_on(positive_D);
}

void display_driver_6() //驅動層,顯示數字6
{
user_led_on(positive_A);
user_led_on(positive_F);
user_led_on(positive_G);
user_led_on(positive_C);
user_led_on(positive_D);
user_led_on(positive_E);
}

void display_driver_7() //驅動層,顯示數字7
{
user_led_on(positive_A);
user_led_on(positive_B);
user_led_on(positive_C);
}

void display_driver_8() //驅動層,顯示數字8
{
user_led_on(positive_A);
user_led_on(positive_B);
user_led_on(positive_C);
user_led_on(positive_D);
user_led_on(positive_E);
user_led_on(positive_F);
user_led_on(positive_G);
}

void display_driver_9() //驅動層,顯示數字9
{
user_led_on(positive_A);
user_led_on(positive_F);
user_led_on(positive_G);
user_led_on(positive_B);
user_led_on(positive_C);
}

void display_mid_num(uint8_t display_number) //中間層,顯示數字,display_number:要顯示的數字,個位數0~9
{
switch(display_number)
{
case 0:
display_driver_0();
break;
case 1:
display_driver_1();
break;
case 2:
display_driver_2();
break;
case 3:
display_driver_3();
break;
case 4:
display_driver_4();
break;
case 5:
display_driver_5();
break;
case 6:
display_driver_6();
break;
case 7:
display_driver_7();
break;
case 8:
display_driver_8();
break;
case 9:
display_driver_9();
break;
}

ets_delay_us(user_delay_time_us); //保持時間,可以用其它時間合適任務來替代 user_led_all_off(); //關,準備顯示下一位

}

4.按每根陰極線為一個單元,動態刷新數據

/段碼顯示APP****/
void user_display_temperature(void) //顯示溫度,全局變量display_temperature_88傳遞溫度值
{
uint8_t temp_High;//溫度高位數
uint8_t temp_Low;//溫度低位數

if(display_temperature_sw) {if(display_temperature_88>=10&&display_temperature_88<=99){temp_High=display_temperature_88/10;temp_Low=display_temperature_88%10;}else{temp_High=0;temp_Low=display_temperature_88;}gpio_set_level(negative_1, 0); //開高位顯示,line1display_mid_num(temp_High);gpio_set_level(negative_2, 0); //開低位顯示,line2display_mid_num(temp_Low); }

}

void user_display_capacitance(void) //顯示容量,全局變量display_capacitance_88傳遞容量值
{
uint8_t Cap_High;//溫度高位數
uint8_t Cap_Low;//溫度低位數

if(display_capacitance_sw) {if(display_capacitance_88>=10&&display_capacitance_88<=99){Cap_High=display_capacitance_88/10;Cap_Low=display_capacitance_88%10;}else{Cap_High=0;Cap_Low=display_capacitance_88;}gpio_set_level(negative_4, 0); //開高位顯示,line4display_mid_num(Cap_High);gpio_set_level(negative_5, 0); //開低位顯示,line5display_mid_num(Cap_Low); }

}

void user_display_time(void) //顯示時間,全局變量display_time_88傳遞時間值
{
uint8_t time_High;//溫度高位數
uint8_t time_Low;//溫度低位數

if(display_time_sw) {if(display_time_88>=10&&display_time_88<=99){time_High=display_time_88/10;time_Low=display_time_88%10;}else{time_High=0;time_Low=display_time_88;}gpio_set_level(negative_6, 0); //開高位顯示,line6display_mid_num(time_High);gpio_set_level(negative_7, 0); //開低位顯示,line7display_mid_num(time_Low); }

}

void user_display_line8(void) //陰極8線顯示,變量line8_sw控制火焰圖標的顯示,0=不顯示,1=顯示
{

if(line8_sw) {display_fire_num++;switch(display_fire_num){case 4:gpio_set_level(positive_H, 1);break;case 8:gpio_set_level(positive_F, 1);gpio_set_level(positive_G, 1);break;}if(display_fire_num>=12) //計數循環{display_fire_num=0;} }gpio_set_level(positive_A, 1); gpio_set_level(positive_B, 1); gpio_set_level(positive_C, 1); gpio_set_level(positive_D, 1); gpio_set_level(positive_E, 1); //開LOGOgpio_set_level(negative_8, 0);ets_delay_us(user_delay_time_us); user_led_all_off();

}

void user_display_line9(void) //陰極9線顯示,變量line9_sw控制風扇圖標的顯示,0=不顯示,1=顯示
{

if(line9_sw) {display_fan_num++;switch(display_fan_num){case 1:gpio_set_level(positive_A, 1);break;case 2:gpio_set_level(positive_B, 1);break;case 3:gpio_set_level(positive_C, 1);break;case 4:gpio_set_level(positive_D, 1);break;case 5:gpio_set_level(positive_E, 1);break;case 6:gpio_set_level(positive_F, 1);break;}if(display_fan_num>=6) //計數循環{display_fan_num=0;} }gpio_set_level(positive_G, 1); //開"'C"gpio_set_level(positive_H, 1); //"變升"gpio_set_level(negative_9, 0);ets_delay_us(user_delay_time_us); user_led_all_off();

}

void user_display_line10(void) //陰極10線顯示,變量line10_water花灑圖標,0=不顯示,1=顯示,變量line10_cap控制容量的,0=不顯示,1=8L,2=10L,3=12L
{

if(line10_water_sw) {gpio_set_level(positive_A, 1); //開"花灑"display_water_num++;switch(display_water_num){case 3:gpio_set_level(positive_B, 1);break;case 6:gpio_set_level(positive_C, 1);break;case 9:gpio_set_level(positive_D, 1);break;}if(display_water_num>=9) //計數循環{display_water_num=0;} }if(line10_cap) {switch(line10_cap){case 1:gpio_set_level(positive_G, 1);break;case 2:gpio_set_level(positive_F, 1);break;case 3:gpio_set_level(positive_E, 1);break;} }gpio_set_level(positive_H, 1); //"L"gpio_set_level(negative_10, 0);ets_delay_us(user_delay_time_us); user_led_all_off();

}

void user_display_decorate(void) //陰極11、12線顯示,變量decorate_sw控制裝飾條,0=不顯示,1=顯示
{

if(decorate_sw) {gpio_set_level(positive_A, 1);gpio_set_level(positive_B, 1);gpio_set_level(positive_C, 1);gpio_set_level(positive_D, 1);gpio_set_level(positive_E, 1);gpio_set_level(positive_F, 1);gpio_set_level(positive_G, 1);gpio_set_level(positive_H, 1);gpio_set_level(negative_11, 0);gpio_set_level(negative_12, 0);gpio_set_level(negative_13, 0);gpio_set_level(negative_14, 0);gpio_set_level(negative_15, 0);gpio_set_level(negative_16, 0);ets_delay_us(user_delay_time_us);user_led_all_off(); }

}

void user_display_lineH(void) //陽極H線顯示,變量lineH_sw控制裝飾條,0=不顯示,1=顯示
{

if(lineH_sw) {gpio_set_level(positive_H, 1);gpio_set_level(negative_1, 0);gpio_set_level(negative_2, 0);gpio_set_level(negative_3, 0);gpio_set_level(negative_4, 0);gpio_set_level(negative_5, 0);gpio_set_level(negative_6, 0);gpio_set_level(negative_7, 0);ets_delay_us(user_delay_time_us);user_led_all_off(); }

}

void user_display_line13() //陰極13線顯示,變量line13_sw控制顯示時間還是故障代碼,0=關閉,1=時間,2=故障代碼
{

if(line13_sw) {switch(line13_sw){case 1:gpio_set_level(positive_G, 1); //"M"gpio_set_level(positive_C, 1);gpio_set_level(positive_D, 1); //"時 間"break;case 2:gpio_set_level(positive_E, 1);gpio_set_level(positive_F, 1); //"故障代碼"break;} }gpio_set_level(positive_A, 1); gpio_set_level(positive_B, 1); //"浴缸注水"gpio_set_level(negative_13, 0);ets_delay_us(user_delay_time_us); user_led_all_off();

}
5.至此,屏的驅動編寫完成,接下來是建立一個定時器任務,這個代碼直接用官方例程即可。

/定時器模塊***************/

#define TIMER_DIVIDER 16 // Hardware timer clock divider
#define TIMER_SCALE (TIMER_BASE_CLK / TIMER_DIVIDER) // convert counter value to seconds
#define TIMER_INTERVAL0_SEC (3.4179) // sample test interval for the first timer
#define TEST_WITHOUT_RELOAD 0 // testing will be done without auto reload
#define TEST_WITH_RELOAD 1 // testing will be done with auto reload

/*

  • A sample structure to pass events
  • from the timer interrupt handler to the main program.
    */
    typedef struct {
    int type; // the type of timer’s event
    int timer_group;
    int timer_idx;
    uint64_t timer_counter_value;
    } timer_event_t;

xQueueHandle timer_queue;
/*

  • Timer group0 ISR handler

*/
void IRAM_ATTR timer_group0_isr(void *para)
{
timer_spinlock_take(TIMER_GROUP_0);
int timer_idx = (int) para;

/* Retrieve the interrupt status and the counter valuefrom the timer that reported the interrupt */ uint32_t timer_intr = timer_group_get_intr_status_in_isr(TIMER_GROUP_0); uint64_t timer_counter_value = timer_group_get_counter_value_in_isr(TIMER_GROUP_0, timer_idx);/* Prepare basic event datathat will be then sent back to the main program task */ timer_event_t evt; evt.timer_group = 0; evt.timer_idx = timer_idx; evt.timer_counter_value = timer_counter_value;/* Clear the interruptand update the alarm time for the timer with without reload */ if (timer_intr & TIMER_INTR_T0) {evt.type = TEST_WITHOUT_RELOAD;timer_group_clr_intr_status_in_isr(TIMER_GROUP_0, TIMER_0);timer_counter_value += (uint64_t) (TIMER_INTERVAL0_SEC * TIMER_SCALE);timer_group_set_alarm_value_in_isr(TIMER_GROUP_0, timer_idx, timer_counter_value); } else if (timer_intr & TIMER_INTR_T1) {evt.type = TEST_WITH_RELOAD;timer_group_clr_intr_status_in_isr(TIMER_GROUP_0, TIMER_1); } else {evt.type = -1; // not supported even type }/* After the alarm has been triggeredwe need enable it again, so it is triggered the next time */ timer_group_enable_alarm_in_isr(TIMER_GROUP_0, timer_idx);/* Now just send the event data back to the main program task */ xQueueSendFromISR(timer_queue, &evt, NULL); timer_spinlock_give(TIMER_GROUP_0);

}

/*

  • Initialize selected timer of the timer group 0
    /
    void user_tg0_timer_init(int timer_idx,bool auto_reload, double timer_interval_sec)
    {
    / Select and initialize basic parameters of the timer */
    timer_config_t config = {
    .divider = TIMER_DIVIDER,
    .counter_dir = TIMER_COUNT_UP,
    .counter_en = TIMER_PAUSE,
    .alarm_en = TIMER_ALARM_EN,
    .auto_reload = auto_reload,
    }; // default clock source is APB
    timer_init(TIMER_GROUP_0, timer_idx, &config);

    /* Timer’s counter will initially start from value below.
    Also, if auto_reload is set, this value will be automatically reload on alarm */
    timer_set_counter_value(TIMER_GROUP_0, timer_idx, 0x00000000ULL);

    /* Configure the alarm value and the interrupt on alarm. */
    timer_set_alarm_value(TIMER_GROUP_0, timer_idx, timer_interval_sec * TIMER_SCALE);
    timer_enable_intr(TIMER_GROUP_0, timer_idx);
    timer_isr_register(TIMER_GROUP_0, timer_idx, timer_group0_isr,
    (void *) timer_idx, ESP_INTR_FLAG_IRAM, NULL);

    timer_start(TIMER_GROUP_0, timer_idx);
    }

/*

  • 定時刷屏
    */
    void user_timer_evt_task(void *arg)
    {
    while (1)
    {
    timer_event_t evt;
    xQueueReceive(timer_queue, &evt, portMAX_DELAY);

// printf("-------- TASK TIME --------\n");
/刷數碼管*/
user_display_temperature();
user_display_capacitance();
user_display_time();
/按陰極線刷圖標*/
user_display_line8();
user_display_line9();
user_display_line10();
user_display_lineH();
user_display_line13();
user_display_decorate();
}
}

/*

  • 定時器刷屏函數,

  • 功能:配置定時器,開定時器任務,刷屏

  • 參數:timer_sec,定時器任務運行間隔時間
    */
    void user_display_app(double timer_ms)
    {
    user_led_init(); //配置GPIO

    /配置和啟用定時器任務*/
    timer_queue = xQueueCreate(10, sizeof(timer_event_t));
    user_tg0_timer_init(TIMER_1, TEST_WITH_RELOAD, timer_ms/1000);
    xTaskCreate(user_timer_evt_task, “user_timer_evt_task”, 2048, NULL, 5, NULL);
    }
    6.user_display.C的內容編寫完畢,user_display.h比較簡單,主要是聲明全局變量和外部函數。
    #ifndef __time_H
    #define __time_H

#define OFF 0
#define ON 1

extern uint8_t display_temperature_88;
extern uint8_t display_capacitance_88;
extern uint8_t display_time_88;
extern uint8_t display_temperature_sw;
extern uint8_t display_capacitance_sw;
extern uint8_t display_time_sw;
extern uint8_t line8_sw;
extern uint8_t line9_sw;
extern uint8_t line10_water_sw;
extern uint8_t decorate_sw;
extern uint8_t lineH_sw;
extern uint8_t line13_sw;
extern uint8_t line10_cap;

void user_display_app(double timer_sec);

#endif

7.在main.C里面,運行一次user_display_app()即可啟動刷屏,用戶應用程序user_app()給全局變量賦值可控制顯示內容,用戶不需要深入了解顯示屏的運行,專心做用戶邏輯。

#include <stdio.h>
#include “freertos/FreeRTOS.h”
#include “freertos/task.h”
#include “freertos/queue.h”
#include “driver/timer.h”
#include “driver/gpio.h”
#include “user_display.h”

#define TIMER_INTERVAL1_ms 20 // 刷屏時間,ms

static uint8_t display_time_num=0;//顯示計數器

void user_app() //demo,每隔2秒溫度+1,容量+1,時間+1,用戶可在此函數里通過對顯示全局變量進行賦值來控制顯示內容
{
/顯示buff
display_temperature_sw=ON; //溫度顯示開關
display_capacitance_sw=ON;//容量顯示開關
display_time_sw=ON;//時間顯示開關
line8_sw=ON;//陰極線8顯示控制開關
line9_sw=ON;//陰極線9顯示控制開關
line10_water_sw=ON;//陰極線10花灑顯示控制開關
decorate_sw=ON;//陰極線11、12裝飾條顯示控制開關
lineH_sw=ON;//陽極線H顯示控制開關
line13_sw=ON;//陰極線13顯示控制開關,0=關閉,1=時間,2=故障代碼

display_temperature_88=0; //溫度數字 display_capacitance_88=0; //容量數字 display_time_88=0; //時間數字

**********************************/

display_time_num++; if(display_time_num>=101){display_time_num=0;}if(display_time_num/100){display_temperature_88++; //溫度+1if(display_temperature_88>99){display_temperature_88=0;}display_capacitance_88++; //容量+1if(display_capacitance_88>12){display_capacitance_88=0;}display_time_88++; //時間+1if(display_time_88>60){display_time_88=0;}}vTaskDelay(20 / portTICK_PERIOD_MS); //每隔20ms刷新一次顯示數據,所以,應用不能刷得太快

}

void app_main(void)
{
user_display_app(TIMER_INTERVAL1_ms); //刷屏函數,至少運行一次即可

while(1) {user_app(); //用戶應用函數 }

}

三、程序優化

顯示函數里LED點亮需要保持一定時間,大致在600us~1ms,DEMO是直接采用延遲函數來保持。用戶可以在延遲函數里插入一些應用,例如ADC采樣,按鍵掃描,數據發送等等。

調試時,可以修改以下2個時間,獲得最佳的顯示效果

#define user_delay_time_us 800 //LED保持時間
#define TIMER_INTERVAL1_ms 20 // 刷屏時間,ms

總結

以上是生活随笔為你收集整理的启明云端分享|干货来了,怎么用ESP32-S2驱动断码屏呢?更多干货欢迎关注启明云端CSDN技术社区!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 精品成人在线观看 | 欧美老女人bb | 污视频在线播放 | 国产交换配乱淫视频免费 | 欧美亚洲二区 | 专干中国老太婆hd | 91久久精品www人人做人人爽 | 一本毛片| 99国产一区| 国产精品久久久久久吹潮 | 欧美视频精品在线 | 国产精品毛片va一区二区三区 | 粗大的内捧猛烈进出在线视频 | 法国空姐电影在线观看 | 国产精品久久久av | 日韩一区二区三免费高清在线观看 | 日韩精品观看 | 羞视频在线观看 | 国产一区二区免费在线 | 国产在线97| xxxx国产片 | 亚洲成人日韩在线 | 探花国产在线 | 欧洲美女av | 亚洲成人免费观看 | 黄色国产网站 | 在线视频成人 | 日韩色综合网 | 国产夫绿帽单男3p精品视频 | 高清一区二区三区四区五区 | 蜜桃av噜噜 | 免费成人一级片 | 香港三级日本三级三69 | 欧美午夜网站 | 四虎影酷 | 韩国精品av | 精产国品一二三产品蜜桃 | 精品成在人线av无码免费看 | 国内精品福利视频 | 欧美在线日韩在线 | 精品人妻一区二区色欲产成人 | 亚洲日本韩国在线 | 一二区视频| 国产中文字幕乱人伦在线观看 | 一级爱爱免费视频 | 国产乱淫av麻豆国产 | 按摩毛片 | 国产美女主播 | 欧美在线www | 激情综合网五月天 | 亚洲成人黄色小说 | 天天操夜夜操夜夜操 | 福利一二三区 | 美女被捅个不停 | 日本一区二区三区免费电影 | 日本免费黄色小视频 | 日韩在线视屏 | 波多野结衣 在线 | 日产电影一区二区三区 | 欧美一区亚洲二区 | 中文在线不卡 | 日本在线一区 | 亚洲AV无码成人精品区麻豆 | 美女久久久 | 国产黄色一级片视频 | 亚洲成人婷婷 | 99热在线观看免费精品 | www天天操| 伊人影院99 | 高清中文字幕在线a片 | 国产精品精品国产色婷婷 | 国产福利影院 | 亚洲成人77777 | 精品久久久影院 | 青春草在线视频免费观看 | 手机av在线看 | 我看黄色一级片 | 国产精品久久久免费视频 | 欧美一级免费黄色片 | 黄色三及 | 欧美粗暴jizz性欧美20 | 视频在线观看一区二区三区 | 人人爱人人澡 | 国产精品xxx在线 | 在线观看欧美一区 | caoporn国产| 黄色小视频免费网站 | 蜜桃做爰免费网站 | 91网站免费在线观看 | 日日爱99| 国产偷人妻精品一区 | 欧美videos另类精品 | av在线观| 日韩福利一区二区 | 亚洲一级特黄 | 伊人小视频 | 中文字幕有码在线 | 黄色网在线看 | 四季av中文字幕一区 |