-
简介
最近项目中使用的一个LCD断码屏显示驱动框架。
- 调用流程图
graph LR
L(调用seg_lcd_display_event_change_send目标显示对象修改API)--匹配对象:ELEM_A-->B(调用该对象seg_lcd_A_elem_display_set处理函数,修改对象A相关显示元素值)---->A(显示缓存值LCD_DRAM_BUFF)-->K(调用显示驱动函数lcd_display_func_cb)
L---匹配对象元素:ELEM_C-->C(调用该对象seg_lcd_B_elem_display_set处理函数,修改对象B相关显示元素值)---->A
L---匹配对象元素-->D(调用该对象seg_lcd_..._elem_display_set处理函数,修改对象...相关显示元素值)---->A
L---匹配对象元素:ELEM_N-->E(调用该对象seg_lcd_N_elem_display_set处理函数,修改对象N相关显示元素值)---->A
-
1.设置全局显示缓存,
LCD_DRAM_BUFF[SEG_NUM_MAX]; -
2.实现LCD独立显示事件内容:
seg_lcd_xx_elem_display_set(void *elem_value)- 例如对断码屏幕上的蓝牙图标的显示控制,
seg_lcd_ble_elem_display_set(void *elem_value) { /*假如该图标在SEG1段的最高位,则有如下*/ (*(unsigned char *)elem_value)?(LCD_DRAM_BUFF[1]|=(1<<7)):(LCD_DRAM_BUFF[1]&=~(1<<7)); } -
3.集合显示事件,并在其它需要的地方调用它,
void seg_lcd_display_event_change_send(event_em event_type,void *elem_value)- 实现如下
enum { ELEM_BLE_SYMB, ELEM_BUZ_SYMB, }event_em;/*独立的显示内容元素*/ void seg_lcd_display_event_change_send(event_em event_type,void *elem_value) { switch(event_type) { case ELEM_BLE_SYMB: seg_lcd_ble_elem_display_set(elem_value); break; case ELEM_BUZ_SYMB: seg_lcd_buz_elem_display_set(elem_value); break; case ...: break; default : break; } }- 事件调用案例如:
void ble_thread_entry(void *parameter) { unsigned char ble_connect_state=0; seg_lcd_display_event_change_send(ELEM_BLE_SYMB,&ble_connect_state); } -
4.设置全局显示回调函数指针,
void (*lcd_display_func_cb)(void) -
5.设置全局显示回调函数回,
void seg_lcd_display_cb_set(void (*display_func_cb)(void)), 主要用于显示页面控制,不同的显示内容实现一个页面显示函数,然后在不同的场景中设置。- 实现如下
void seg_lcd_display_cb_set(void (*display_func_cb)(void)) { lcd_display_func_cb = display_func_cb; }- 调用案例,假如屏幕上有电压,电流,重量的分界面功能,在不同的条件下进入所需界面,可如是下设置:
/*电压显示函数*/ void volt_display_func(void) { unsigned char volt_unit=0;//缺省电流单位:mA const unsigned int volt_value = dev_volt_get(); seg_lcd_vlot_elem_display_set(VOLT_VAL_ELEM,&volt_value); if(1000<volt_value) { volt_unit=0x01;//显示电流单位:A(安培) } seg_lcd_vlot_elem_display_set(VOLT_UNIT_ELEM,&volt_unit); } /*电流显示函数*/ void amp_display_func(void) { \\... } /*重量显示函数*/ void weight_display_func(void) { \\... } /*按键进行功能调用*/ void key_press_event(unsigned char key_id) { switch(key_id) { case KEY_VLOT: seg_lcd_display_cb_set(volt_display_func); break; case KEY_AMP: seg_lcd_display_cb_set(amp_display_func); break; case KEY_WEIGHT: seg_lcd_display_cb_set(weight_display_func); break; default: break; } } -
6.断码显示驱动
void seg_lcd_display(void)
{
lcd_display_func_cb();
}