这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【E22P-433MBH-SC无线模块开发测试套件】以菜单方式控制LED的成果贴

共1条 1/1 1 跳转至

【E22P-433MBH-SC无线模块开发测试套件】以菜单方式控制LED的成果贴

助工
2026-09-10 15:21:00     打赏

E22P-433MBH-SC 无线模块上配置了OLED显示屏、LED和按键,利用它可以分析例程的设计思想,并实现菜单方式下对LED的控制。

LED和按键的电路见图1和图2所示,从中可见到他们多引脚的使用情况。

image.png

1 LED电路

image.png

2 按键电路

 

为实现菜单下对LED的控制,首先要弄清菜单管理的程序结构。

其主程序为:

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_I2C2_Init();
  MX_SPI1_Init();
  MX_USB_DEVICE_Init();
  MX_TIM2_Init();
  e22_demo_init();
  Menu_Init();
  while (1)
  {
     Menu_Task();  
  }
}

可见,它是在完成相关的初始化后,通过调用函数Menu_Task()来进行菜单管理的。

其中,函数Menu_Init()的内容为:

void Menu_Init(void)
{
  Disp_Init();
    Menu_Teamp();
    logo_callback( NULL );
}

为了满足控制2LED的需要,将函数Menu_Teamp()的内容修改为:

static void Menu_Teamp(void)
{
    AddPage("[Home]", &Menu, &Home_Page, &HomeHead_Item, &Home_Page, NULL, logo_callback );
        AddItem(" +Setting", PARENTS, NULL, &setting_item, &Home_Page, &setting_page, NULL);
            AddPage("[Exit]", &Menu, &setting_page, &setting_exit_item, &setting_page, &Home_Page, NULL);
                AddItem(" -LoRa SF", DATA, &user_config.lora_sf, &lora_sf_item, &setting_page, NULL, lora_sf_callback );
                AddItem(" -LoRa BW", DATA, &user_config.lora_bw, &lora_bw_item, &setting_page, NULL, lora_bw_callback );
                AddItem(" -LoRa CR", DATA, &user_config.lora_cr, &lora_cr_item, &setting_page, NULL, lora_cr_callback ); 
                                AddItem(" -Frequency", DATA, &user_config.frequency_mhz, &frequency_item, &setting_page, NULL, lora_frequency_callback ); 
                                AddItem(" -TX Power", DATA, &user_config.tx_power, &tx_power_item, &setting_page, NULL, tx_power_callback); 
                                AddItem(" -TX Count", DATA, &user_config.tx_count, &tx_count_item, &setting_page, NULL, tx_count_callback); 
                AddItem(" -Back Color", SWITCH, NULL, &bg_color_item, &setting_page, NULL, background_color_callback );
                AddItem("LED1 ON", LOOP_FUNCTION, NULL, &tx_mode_item, &Home_Page, NULL, tx_mode_callback);
                AddItem("LED2 ON", LOOP_FUNCTION, NULL, &rx_mode_item, &Home_Page, NULL, rx_mode_callback);
                AddItem("LED OFF", LOOP_FUNCTION, NULL, &version_item, &Home_Page, NULL, version_callback); 
                AddItem(" -Reset",   LOOP_FUNCTION, NULL, &reset_item, &Home_Page, NULL, reset_callback);
}

其执行效果见图3所示,为了不破坏无线通讯的原有功能,只在原程序的基础上添加了对LED的控制,其他部分为发生改变。

image.png

3 菜单形式

 

那是如何添加LED控制代码的呢?

这就要弄清函数AddItem()是如何执行功能处理的,以语句AddItem("LED OFF", LOOP_FUNCTION, NULL, &version_item, &Home_Page, NULL, version_callback);

为例,它是通过version_callback来调用功能处理函数的。

而函数version_callback()的内容为:

void led_callback( xpItem item )
{  
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET); 
        OLED_ClearBuffer();
        OLED_DrawStr(0,  Font_Size*1, "Model Type:");  
        OLED_DrawStr(8, Font_Size*2, "E22P-433M30S"); 
    OLED_DrawLine(0, Font_Size*2+3,127,Font_Size*2+3 ); 
        OLED_DrawLine(0, Font_Size*4+6,127,Font_Size*4+6 );  
    OLED_SendBuffer();
}


其中的:

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);

2条语句是后加的,用于控制LED

至此,我们就理清了菜单控制LED的脉络。

为了,点亮LED2LED3,在函数rx_mode_callback()中,需添加语句HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET),在函数tx_mode_callback()中,需添加语句HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET)

 具体的控制效果,见视频所示:


共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]