问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

LCD段码屏程序设计技巧

创作时间:
作者:
@小白创作中心

LCD段码屏程序设计技巧

引用
CSDN
1.
https://blog.csdn.net/weixin_46313950/article/details/138742434

LCD段码屏是一种常见的显示设备,广泛应用于各种嵌入式系统中。本文将详细介绍LCD段码屏的程序设计技巧,包括基本参数设置、真值表设计以及C语言编程方法。

段式液晶程序设计技巧

一、段式液晶的基本参数

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语言的技巧会使程序更简洁,高效。

三、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];
}  

原文链接:https://blog.csdn.net/qq_18628523/article/details/100191712

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号