段式液晶程序设计技巧

段式液晶程序设计技巧

一、段式液晶的基本参数

1.Duty:占空比

该项参数一般也称为Duty数或者com数,段式液晶一般采用时分动态扫描的驱动模式,此模式下,每个com的有效选通时间与整个扫描周期的比值即占空比是固定的,等于1/com数。

2.Bias:偏置

LCD的SEG/COM的驱动波形为模拟信号,而各档模拟电压相对于LCD输出的最高电压的比例称为偏置,而一般来讲,Bias是以最低一档与输出最高电压的比值来表示。一般而言,bias和duty之间是有一定联系的,duty数越多,每根com对应的扫描时间变短,而要达到同样的显示亮度和显示对比度,von的电压就要提高,选电平和非选电平的差异需要加大,即Bias需要加大,Duty和Bias间有一个经验公式,即:
Bias = 1/(√Duty + 1)

3.VDD:工作电压

液晶分子是需要交流信号来驱动的,长时间的直流电压加在液晶分子两端,会影响液晶分子的电气化学特性,引起显示模糊,寿命减少,其破坏性不可恢复。

4.Frame:扫描帧频

扫描频率,直接驱动液晶分子的交流电压的频率一般在60~100Hz之间,具体是依据LCDPanel的面积和设计而定,频率过高,会导致驱动功耗的增加,频率过低,会导致显示闪烁,同时如果扫描频率同光源的频率之间有整数倍关系,则显示也会有闪烁现象出现。

其他诸如可视角度,连接方式,工作温度范围之类的,那就根据具体需求让供应商做就好了;

二、段码液晶屏真值表

这个如果设计好了,程序写起来也会方便很多,以下面的为例:
在这里插入图片描述
在这里插入图片描述
主要是中间8个显示数字的段码,所有的最好按照同样的规律排布:
在这里插入图片描述
这样我们就好计算出显示不同数字所需要的数组:
在这里插入图片描述
然后将数组写到程序中:
在这里插入图片描述
至于如何控制段码屏显示,有的MCU如MSP4304152支持段码驱动,如果不支持可以使用专门的驱动IC如HT1621B/HT1622等,驱动搞定之后,无非就是写入数据,每个数据位控制对应的段码显示还是不显示;
道理都一样,但是使用一些C语言的技巧会使程序更简洁,效率更高;

下面要介绍的就是一个结构体和一个数组组合为一个共用体:

typedef union _DISPLAY{
    struct{
        unsigned NUM4:8;        
        
        unsigned NUM5_3:3;//低位开始
        unsigned S14_KBIT:1;
        unsigned NUM5_4:4;
        
        unsigned NUM6_3:3;
        unsigned S13_RH:1;
        unsigned NUM6_4:4;
        
        unsigned NUM7_3:3;
        unsigned S10_BOT_P:1;
        unsigned NUM7_4:4;
        
        unsigned NUM0:8;
        
        unsigned NUM1_3:3;
        unsigned S12_F:1;
        unsigned NUM1_4:4;
        
        unsigned NUM2_3:3;
        unsigned S11_C:1;
        unsigned NUM2_4:4;
        
        unsigned NUM3_3:3;
        unsigned S9_TOP_P:1;
        unsigned NUM3_4:4;

        unsigned S5_BAUD:1;
        unsigned S6_ADR:1;
        unsigned S7_TX:1;
        unsigned S8_RX:1;
        unsigned S1_WARNNING:1;
        unsigned S2_HI:1;
        unsigned S3_LO:1;
        unsigned S4_SET:1;
        }Segment;
 //段码真值表中对应到SEG18*4 = 72 ,共72个段码,这里是以一个字节(8bit)为单位写数据,所以数组大小为72/8 = 9 
	UINT8 Content[9];
}DISPLAY;
void AppLCDShowVersionAddr(void)
{
    UINT8 i,*Point;
    
    CommSet.Addr = ParaRO.Item.Serial[0];
    
    UINT8 temp = CommSet.Addr;
    
    
    for (i = 0; i < DISP_LEN; i++)//Clear Display
      Display.Content[i] = 0;
        
    Display.Segment.S9_TOP_P = ON; //单独控制某一个段码
     
    Display.Content[4] |= NUMBER[BLANK];//控制整个数码显示对应内容
    Display.Content[5] |= NUMBER[CHAR_U];
    Display.Content[6] |= NUMBER[ParaRO.Item.Version[3]-48];
    Display.Content[7] |= NUMBER[ParaRO.Item.Version[4]-48];

    Display.Content[3] |= NUMBER[temp % 10];  
    temp /= 10;
    Display.Content[2] |= NUMBER[temp % 10];
    Display.Content[1] |= NUMBER[temp /= 10];
    
/*********************LCDUpdate**********************/
	Point = (void *)&LCDM1;
	for(i=0;i<DISP_LEN;i++)//填充完数组后直接用数组刷新所有显示内容
		*Point++ = Display.Content[i];
}
  • 8
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值