打印
[应用方案]

MCU的IO口直接驱动段码LCD

[复制链接]
2287|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhuotuzi|  楼主 | 2018-5-12 10:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
当产品需要段码LCD显示时,如果使用不带LCD驱动器的MCU,则需要外接LCD驱动IC,这会增加成本和PCB面积。事实上,很多小项目,比如大量的小家电,需要显示的段码不多,常见的是4个8带小数点或时钟的冒号“:”,这样如果使用IO口直接扫描显示,则会减小PCB面积,降低成本。
但是,本方案不合适驱动太多的段( 占用IO太多),也不合适非常低功耗的场合。
段码LCD驱动简单原理:如图1所示。
LCD是一种特殊的液态晶体,在电场的作用下晶体的排列方向会发生扭转,因而改变其透光性,从而可以看到显示内容。LCD有一个扭转阀值,当LCD两端电压高于此阀值时,显示内容,低于此阀值时,不显示。通常LCD有3个参数:工作电压、DUTY(对应COM数)和BIAS(即偏压,对应阀值),比如4.5V、1/4 DUTY、1/3 BIAS,表示LCD显示电压为4.5V,4个COM,阀值大约是1.5V,当加在某段LCD两端电压大于1.5V时(一般加4.5V)显示,而加1.5V时不显示。但是LCD对于驱动电压的反应不是很明显的,比如加2V时,可能会微弱显示,这就是通常说的“鬼影”。所以要保证驱动显示时,要大于阀值电压比较多,而不显示时,要用比阀值小比较多的电压。
注意:LCD的两端不能加直流电压,否则时间稍长就会损坏,所以要保证加在LCD两端的驱动电压的平均电压为0。LCD使用时分割扫描法,任何时候一个COM扫描有效,另外的COM处于无效状态。
驱动1/4Duty 1/2BIAS 3V的方案电路见图1,LCD扫描原理见图3,MCU为3V工作,用双向口做COM,PUSH-PULL或STANDARD输出口接SEG,并且每个COM都接一个47K电阻到一个电容,RC滤波后得到一个中点电压。在轮到某个COM扫描时,设置成PUSH-PULL输出,如果与本COM连接的SEG不显示,则SEG输出与COM同相,如果显示,则反相。扫描完后,这个COM的IO就设置成高阻,这样这个COM就通过47K电阻连接到1/2VDD电压,而SEG继续输出方波,这样加在LCD上的电压,显示时是+-VDD,不显示时是+-1/2VDD,保证了LCD两端平均直流电压为0。
驱动1/4Duty 1/3BIAS 3V的方案电路见图4,LCD扫描原理见图5,,MCU为5V工作,SEG线通过电阻分压输出1.5V、3.5V,COM线通过电阻分压输出0.5V、2.5V(高阻时)、4.5V。在轮到某个COM扫描时,设置成PUSH-PULL输出,如果与本COM连接的SEG不显示,则SEG输出与COM同相,如果显示,则反相。扫描完后,这个COM的IO就设置成高阻,这样这个COM就通过47K电阻连接到2.5V电压,而SEG继续输出方波,这样加在LCD上的电压,显示时是+-3.0V,不显示时是+-1.0V,完全满足LCD的扫描要求。
    当需要睡眠省电时,把所有COM和SEG驱动IO全部输出低电平,LCD驱动部分不会增加额外电流。
图1:驱动1/4Duty 1/2BIAS 3V LCD的电路
图2:段码名称图
图3:1/4Duty 1/2BIAS扫描原理图
图4:驱动1/4Duty 1/3BIAS 3V LCD的电路
图5:1/4Duty 1/3BIAS扫描原理图
为了使用方便,显示内容放在一个显存中,其中的各个位与LCD的段一一对应,见图6。
图6:LCD真值表和显存影射表
图7:驱动效果照片
本LCD扫描程序仅需要两个函数:
1、 LCD段码扫描函数  void        LCD_scan(void)
程序隔一定的时间调用这个函数,就会将LCD显示缓冲的内容显示到LCD上,全部扫描一次需要8个调用周期,调用间隔一般是1~2ms,假如使用1ms,则扫描周期就是8ms,刷新率就是125HZ。
2、 LCD段码显示缓冲装载函数  void   LCD_load(u8 n,u8 dat)
本函数用来将显示的数字或字符放在LCD显示缓冲中,比如LCD_load(1,6),就是要在第一个数字位置显示数字6,支持显示0~9,A~F,其它字符用户可以自己添加。
另外,用宏来显示、熄灭或闪烁冒号或小数点。

沙发
zhuotuzi|  楼主 | 2018-5-12 10:20 | 只看该作者
/****************** LCD段码扫描函数 ***************************

u8        code T_COM[4]={0x08,0x04,0x02,0x01};

void        LCD_scan(void)        //5us @22.1184MHZ

{   u8        j;

j = scan_index >> 1;        //COMx

P2n_pure_input(0x0f);       //全部COM输出高阻, COM为中点电压

if(scan_index & 1)          //反相扫描

{   P1 = ~LCD_buff[j];        //送SEG驱动码

P2 = ~(LCD_buff[j|4] & 0xf0);   //送SEG驱动码和COM驱动码

}

else         //正相扫描

{   P1 = LCD_buff[j];          //送SEG驱动码

P2 = LCD_buff[j|4] & 0xf0;  //送SEG驱动码和COM驱动码

}

P2n_push_pull(T_COM[j]);        //某个COM设置为推挽输出

if(++scan_index >= 8)        scan_index = 0;   //扫描完成,重复扫描

}



/****************** LCD段码显示缓冲装载函数 ***************************/

/****************** 对第1~6数字装载显示函数 ***************************/

u8        code T_LCD_mask[4]  = {~0xc0,~0x30,~0x0c,~0x03};

u8        code T_LCD_mask4[4] = {~0x40,~0x10,~0x04,~0x01};

void        LCD_load(u8 n,u8 dat)        //n为第几个数字,为1~6,dat为要显示的数字        10us@22.1184MHZ

{   u8        i,k;

u8        *p;

if((n == 0) || (n > 6))        return;

i = t_display[dat];



if(n <= 4)        //1~4

{   n--;

p = LCD_buff;

}

else

{   n = n - 5;

p = &LCD_buff[4];

}



k = 0;

if(i & 0x08)        k |= 0x40;        //D

*p = (*p & T_LCD_mask4[n]) | (k>>2*n);

p++;



k = 0;

if(i & 0x04)        k |= 0x40;        //C

if(i & 0x10)        k |= 0x80;        //E

*p = (*p & T_LCD_mask[n]) | (k>>2*n);

p++;



k = 0;

if(i & 0x02)        k |= 0x40;        //B

if(i & 0x40)        k |= 0x80;        //G

*p = (*p & T_LCD_mask[n]) | (k>>2*n);

p++;



k = 0;

if(i & 0x01)        k |= 0x40;        //A

if(i & 0x20)        k |= 0x80;        //F

*p = (*p & T_LCD_mask[n]) | (k>>2*n);

}

使用特权

评论回复
板凳
zhuotuzi|  楼主 | 2018-5-12 10:21 | 只看该作者
40-IO-LCD-8x6-2014-6-19.rar (1.72 MB)


使用特权

评论回复
地板
xuanhuanzi| | 2018-5-12 11:07 | 只看该作者
还以为跟数码管是一样的呢,原来还是有区别的。

使用特权

评论回复
5
zhuomuniao110| | 2018-5-12 22:31 | 只看该作者
受教了,还以为必须用带LCD驱动器的单片机呢。

使用特权

评论回复
6
小灵通2018| | 2018-5-13 12:55 | 只看该作者
我也是以为跟数码管驱动一样呢。

使用特权

评论回复
7
734774645| | 2018-5-13 23:05 | 只看该作者
原来要这么驱动啊,不是电极两边加上就行吗,还要波?

使用特权

评论回复
8
幸福小强| | 2018-5-15 20:12 | 只看该作者
每一种显示都有对应的驱动。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

197

主题

3263

帖子

7

粉丝