怎样驱动段码LCD液晶显示屏
2019-01-01

LCD驱动必须使用交流电压驱动才能保持稳定的显示,如果在LCD上加上稳定的直流电压,不但不能正常显示,时间久了还会损坏LCD。一段LCD由背电极和段电极组成,需要显示时,在背电极和段电极之间加上合适的交流电压(通常使用方波)。为了调节对比度,可以调节方波中每半个周期中显示的时间(即占空比)来实现。 


    通常,为了节约驱动口,将多个背电极连在一起,形成公共背电极端:COM。另外,再将属于不同COM的段电极连接在一起,形成公共段电极端:SEG。当在某个COM和某个SEG之间加了足够的交流电压之后,就会将对应的段点亮(实际上是变黑)。 


  比如,在展讯达公司设计的PCBA模块上使用的这种LCD,有4个COM,还有16个SEG。要想某一SEG显示时,需要在对应的SEG和COM之间加上足够的交流电压。在展讯达的板子上,COM驱动使用了两个电阻分压,输出电压为1/2Vcc,当不想让某位显示时,就将它的电压设置为1/2Vcc(通过设置IO口为高阻态来完成),这样加在对应的SEG和COM之间的电压只有1/2Vcc,不足以点亮对应的SEG。需要显示的,就将COM电压设置为0或者1,这样SEG电压跟COM电压相反的段就被点亮了(变黑),因为它们之间的电压为Vcc。通过定期扫描每个COM,即可稳定的在LCD上显示需要的图形了。需要显示字符或者数字时,自己先将对应的图案设计好,在显示时,发送到相应的SEG和COM上即可。但是如果使用100%的时间都驱动的话,会造成对比度太高,甚至出现不该显示的地方也显示了。因此在显示一段时间后,就将COM和SEG都设置为低,以关闭它的显示,降低对比度。通过调节关闭时间的长短(PWM),可以调节对比度。在下面的测试程序中,为了简化程序,使用了50%固定的占空比。 


  为了方便描述,我们把COM为低电平时点亮叫做正亮,COM为高电平时点亮叫做负亮。扫描每个COM分成4个阶段:正亮,关闭,负亮,关闭。因此对于本板子上的LCD驱动,总共有16个状态,每个COM都有上面所说的4个状态。我们每隔2ms就切换一次状态,这样整个扫描周期就是2*16=32ms,基本上感觉不到闪烁。 


  但是需要注意的是,这个LCD中的每个COM并不是刚好对应着显示图案中的一个字符的位置。每个COM都对应着每个显示字符中的相同4段!换句话说,要显示第一个字符位置的字符,每个COM都要被用到。因此,要改变某个字符位置的显示,就需要改变每次COM输出时对应的SEG中的4段。为此,建立一个缓冲区,当需要修改显示字符时,就修改缓冲区中的内容。这个缓冲区有4行,每行中有16个SEG,对应着一个COM。需要修改显示时,把每行中对应的4个SEG设置为需要的值,这样就实现了某个显示位置图案的修改。 


  为了显示字符,需要事先把需要显示的字符按照SEG和COM的分布,制作成数据保存起来,需要显示时,就把它复制到显示缓冲区中对应的位置去。另外,由于输入的参数是字符的ASCII码,因此还需要将ASCII码转换为对应的字符图案的索引值。使用一个专门的函数来完成这些转换和填充缓冲区,在需要修改显示数据时,就调用该函数。 


  为了方便大家对这个LCD的驱动方式和编程,下面简单的画一下驱动的波形图。

怎样驱动段码LCD液晶显示屏


这里只画出2个SEG波形图,实际有16个SEG,只要你理解了2个SEG的,那么16个的也是一样的意思。如图所示,所有偶数阶段都是关闭显示阶段,这时COM和SEG都是0,将不会有段被点亮,通过调节关闭显示阶段所占的时间百分比,即可调节总体显示的对比度。SEG和COM之间电平相差1格的显示不出来或者浓度不够,而SEG和COM之间电平相差2格的则可以显示出来或者浓度较深。例如第一阶段中的SEG1和COM1之间相差2格,第三阶段中COM1和SEG1相差2格,因而SEG1和COM1之间的交叉点(即点1)被显示。又如第九阶段的SEG1和COM3之间相差2格,第十一阶段中的COM3和SEG1之间相差2格,因而SEG1和COM3之间的交叉点(即点5)被显示出来。其它点以此类推。 


最后,再来看看展讯达公司LCD液晶模块板子上的LCD的COM和SEG之间的关系图,如下图所示。


怎样驱动段码LCD液晶显示屏

(段码分布图)


  图中显示,S0、S1、S2、S3属于第一个字符,在显示第一个字符时,只要在对应的COM选中时,将需要显示的SEG放在上面即可。其余几个字符类似。例如要显示一个数字3,则应该将A段、B段、C段、D段、G段、K段显示。某段显示,用1表示,不显示用0表示,得到的各段值如下:(低--------》高)

X=0 I='0' A='1' DP='0'         0 0 1 0  

F=0 H='0' J='0' B='1'          0 0 0 1

E=0 G='1' K='1' C='1'         0 1 1 1

L=0 M='0' N='0' D='1'         0 0 0 1

注意是低位在先的,把每行用十六进制来表示(高位在先),就是0x4,0x8,0xE,0x8。它们分别对应着 

COM1~COM3选中时S3~S0的输出值。为了方便管理,将这4个十六进制值合并为一个2字节的值0x48E8保存。其它各字符的构造方式相同。显示时,分别取出各段的值写入到对应的缓冲区去。 


扫描LCD的程序流程如下: 

①、COM1设置为低电平,其余COM为1/2高电平,设置PE口为需要的电平(16个段码),延时2ms; 

②、4个COM、PE口均设置为低电平,关闭显示,延时2ms; 

③、COM1设置为高电平,其余COM为1/2高电平,设置PE口为需要的电平(第一步16个段码的取反),延时2ms。 

④、4个COM、PE口均设置为低电平,关闭显示,延时2ms; 

然后对剩下的3个COM重复前面4个步骤,这样一个完整的扫描就完成了。


用这个原理驱动过一个产品的LCD,效果不错。2.5ms中断一次,20ms完成一次扫描,50HZ的刷新率。用的是MEGA8,省掉了一片HT1621


怎样驱动段码LCD液晶显示屏


//引入头文件********************************************************* 

#include   'delay.h' 

#include   'delay.c' 

#include       


//字符查表*********************************************************** 

     const unsigned char Lcd[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66,  

                                    0x6d, 0x7d, 0x07, 0x7f, 0x6f};   


//******************************************************************* 

//函数名称:port_init(); 

//输入参数:无 

//输出参数:无 

//功能描述:端口设置 

//建造日期:2018.06.03 

//***************************************************************** 

void PortInit(void) 

 { 

     PORTA = 0xff;                                         //A 口设置  

     PORTB = 0xff;                                         //B 口设置 

  

     TRISA = 0x00;                                         //    

     TRISB = 0x00;                                         // 

 } 


//******************************************************************* 

//函数名称:main(); 

//输入参数:无 

//输出参数:无 

//功能描述:主要程序 

//建造日期:2018.06.03 

//******************************************************************* 

void main(void)                                            // 

 {    

     unsigned char temp[3]; 

     unsigned char i, j; 

        

     PortInit();                                           //脚位设置 

     

     temp[0] = Lcd[1]; 

     temp[1] = Lcd[2]; 

     temp[2] = Lcd[3]; 

      

     while (1) 

      { 

       PORTA = 0b11111110;                                 //正亮显示 

       TRISA = 0b11111110; 


       PORTB = temp[0]; 

       DelayMs(2); 


       PORTA = 0b11111000;                                 //关闭显示 

       TRISA = 0b11111000; 

  

       PORTB = 0x00; 

       DelayMs(2); 


       PORTA = 0b11111111;                                 //负亮显示 

       TRISA = 0b11111110; 


       PORTB = temp[0] ^ 0xff; 

       DelayMs(2); 


       PORTA = 0b11111000;                                 //关闭显示 

       TRISA = 0b11111000; 

  

       PORTB = 0x00; 

       DelayMs(2);                                          


       PORTA = 0b11111101;                                 //正亮显示 

       TRISA = 0b11111101; 


       PORTB = temp[1]; 

       DelayMs(2); 


       PORTA = 0b11111000;                                 //关闭显示 

       TRISA = 0b11111000; 

  

       PORTB = 0x00; 

       DelayMs(2); 


       PORTA = 0b11111111;                                 //负亮显示 

       TRISA = 0b11111101; 


       PORTB = temp[1] ^ 0xff; 

       DelayMs(2); 


       PORTA = 0b11111000;                                 //关闭显示 

       TRISA = 0b11111000; 

  

       PORTB = 0x00; 

       DelayMs(2); 


       PORTA = 0b11111011;                                 //正亮显示 

       TRISA = 0b11111011; 


       PORTB = temp[2]; 

       DelayMs(2); 


       PORTA = 0b11111000;                                 //关闭显示 

       TRISA = 0b11111000; 

  

       PORTB = 0x00; 

       DelayMs(2); 


       PORTA = 0b11111111;                                 //负亮显示 

       TRISA = 0b11111011; 


       PORTB = temp[2] ^ 0xff; 

       DelayMs(2); 


       PORTA = 0b11111000;                                 //关闭显示 

       TRISA = 0b11111000; 

  

       PORTB = 0x00; 

       DelayMs(2); 


推荐新闻
点阵LCD液晶显示屏的创新
如果只是单挑液晶显示屏出来说的话大众对于其的了解是有一定程度的,但是若是在它的前面加上一个限定像是说...
点阵LCD液晶显示屏价格实惠的怎么找?
显示屏的使用以及价格实惠的如何找,很多用户其实也是比较关心的。点阵LCD液晶显示屏的使用不只是为了在...
点阵LCD液晶显示屏有哪些优点?
点阵LCD液晶显示屏重点是质量有点出色所以在从需求上看,在于当前液晶显示屏的点阵设计是逐渐占据了市场...
点阵LCD液晶显示屏如何买质量好的?
质量好使用起来比较方便的点阵LCD液晶显示屏是目前市场上比较受到大众欢迎的,显示屏的设计和实用性种类...