首先,大家都不要以为使用单片机来驱动,就以为是断码屏直流驱动的了,其实呢,段码屏它是交流驱动的,什么是交流驱动呢?例如矩形波、正弦波等等。大家可能会经常的使用驱动芯片来玩,例如HT1621等等,但是有一些段式屏的IO口是比较少的,或者说是IO口充足的情况之下,也懒得在再去写控制器的驱动了。但是,IO的模拟驱动,段式液晶是有一个前提条件的,就是IO必须要是三态,
为什么?下面我们就一起细细的道来:
第一步:段码液晶屏最重要的参数:占空比、工作电压、偏压比。这三个参数都是非常重要的,都必须要满足。
第二步:驱动的方式:我们根据 LCD 的驱动原理可以知道,LCD的像素点上面只能够加上 AC的电压,LCD显示器的对比度则是由 COM脚上的电压值减去 SEG 脚上的电压值来决定,当这个电压差在大于 LCD 饱和电压时就能够打开像素点,小于 LCD 阈值电压时就能关闭像素点了,LCD 型的MCU 已经由内建的 LCD 驱动电路自动产生出LCD驱动信号了,因此只需要 I/O 口能仿真输出该驱动的信号,就能够完成 LCD 的驱动了。
段码液晶屏主要是有两种引脚,COM和SEG,和数码管比较像,但是,压差必须要是交替变化的,例:第一时刻是正向的3V,那么第二时刻就必须要是反向的3V,注意一点,如果你给段码液晶屏通直流电,那么不用多久这个屏幕就会报废,所以千万要注意。下面我们就来考虑如何模拟COM口的波形,我们以1/4D,1/2B为例子:
段码LCD屏的驱动方法
只要模拟出以上的波形,你的液晶屏就已经成功了一大半。
void display_sub(u8 y) //lcd display subroutine
{
switch(y) //4*com,VDD and -VDD LCD display,so 8 timebase interrupt one sacn period
{
case 1:
{com1_output_high()break}
case 2:
{com1_output_low()break}
case 3:
{com2_output_high()break}
case 4:
{com2_output_low()break}
case 5:
{com3_output_high()break}
case 6:
{com3_output_low()break}
case 7:
{com4_output_high()break}
case 8:
{com4_output_low()break}
default:
{LCDPluseStep=0
get_display_code(AD_Value,KeyScanRetVal)
break}
}
}
复制代码
如上图代码所示,定时到2ms,让4个COM交替的输出波形就可以了。
文章转载于LCD液晶屏:http://www.hzjingxian.com,转载请注明出处
同时我们还要注意,在COM的输出较高的时候,如果要屏幕亮,那么SEG就要输出低,那么在COM输出低的时候,SEG就要输出高了,保证COM和SEG的压差大于1/2B工作电压就可以正常显示了
下面我们看其中一个com口输出时的函数
static void seg1_output(void) //seg1 output subroutine
{
if(1 == (LCDPluseStep%2)) //com_pulse is odd,com output high (VDD)
{
if(0 == (DisplayCode1&0x10))
{SEG1=1}
else
{SEG1=0}
}
else //com_pulse is even,com output low (VSS)
{
if(0 == (DisplayCode1&0x10))
{SEG1=0}
else
{SEG1=1}
}
}
复制代码
必须时刻让SEG电平跟COM的电平成反向,那么驱动段式液晶就不会有多大的难度了
段码液晶屏:http://www.hzjingxian.com
文章原创于http://www.hzjingxian.com/zixun/xydt/822.html,转载请注明出处
#include<reg52.h>#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS = P2^1
sbit RW = P2^2
sbit E = P2^3
uchar idata wlcome[16]={"asdfghjklpoiuytr"}
uchar idata lcdtimer[16]={"qwertyuioplkjhgf"}
void delayus(uint a)//微秒延时//
{
while(a--)
}
void delay(uint dell)//毫秒延时//
{
uchar x
for(delldell>0dell--)
for(x=110x>0x--)
}
void wr_com(uchar temp)//写指令//0
{
RS=0
RW=0
P0=temp
E=1
E=0
}
void wr_data(uchar num)//写数据//
{
RS=1
RW=0
P0=num
E=1
E=0
}
void disp_lcd(uchar addr,uchar *templ)
{
uchar i
wr_com(addr)
delay(50)
for(i=0i<16i++)
{
wr_data(templ[i])
delay(50)
}
}
void lcd_init()//初始化液晶//
{
wr_com(0x30)
delay(50)
wr_com(0x38)
delay(50)
wr_com(0x01)
delay(50)
wr_com(0x06)
delay(50)
wr_com(0x0c)
delay(50)
}
void main()
{
lcd_init()
while(1)
{
disp_lcd(0x80,wlcome)
disp_lcd(0xc0,lcdtimer)
}
}
从上图 可以看出 这个段码LCD 是一个4路驱动的 也就是有4个COMLCD驱动分为静态驱动和动态驱动 静态驱动类似于LED的驱动 也就是说有一个COM(公共端)
共阴极或者共阳极 而动态驱动是类似于扫描一个横竖的矩阵 就拿上图为例 这就一个8X4的矩阵
从5到12 一共是8段SEG COM1-COM4是4段COM 如果想点亮其中的一端 就要选中对应的COM
和SEG 举例 比如像让P2这一端亮 我们要给COM2和6赋1 其他段也是一样的
这种段码的LCD 一般都用HT1621 详细的 *** 作方法 可以看下数据手册 按照典型电路连接就可以了
程序主要是初始化和送数函数
ID就是企鹅 可以一起讨论
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)