在E22P-433MBH-SC 无线模块上配置了OLED显示屏、LED和按键,利用它可以分析例程的设计思想,并实现菜单方式下对LED的控制。
LED和按键的电路见图1和图2所示,从中可见到他们多引脚的使用情况。

图1 LED电路

图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 );
}为了满足控制2个LED的需要,将函数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的控制,其他部分为发生改变。

图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的脉络。
为了,点亮LED2和LED3,在函数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)。
具体的控制效果,见视频所示:
我要赚赏金
