LCD断码屏显示应用框架

248 阅读1分钟
  • 简介

    最近项目中使用的一个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();
  }