||
原创博客,转载请注明出处:keasen
在众多显示器件中,TN液晶显示器以它价格低廉,耗电量低,显示清晰等优势成为很多小产品的首选显示器件;lcd正常显示需要交流方波,而且为了不重复显示笔段,需要4个COM分时显示,但是专用的lcd驱动芯片价格较高,且增加了系统的复杂程度,带lcd驱动的mcu价格更是不低,怎么办呢? 如果我们徐娅的笔段不多的话就可以考虑用普通IO型的单片机模拟lcd驱动波形来使用lcd了.
要使用LCD之前我们需要了解关于LCD的几个参数:
1. 电压: 这个我们一般和mcu供电电压一致就可以了,lcd电压高于mcu电压易造成亮度不够,lcd电压低于mcu电压易造成鬼影(不该点亮的笔段却点亮)
2. 偏压(BIAS): 偏压级数越多lcd的对比度级别就越多,对于mcu驱动的简单lcd我们为了简单只需要亮和不亮两种状态就够了,所以只要1/2的就可以了,不必做成1/3,1/4 .
3. 周期(DUTY): 周期跟公共端COM的个数有关,例如3个com,周期就是1/3 ,4个com周期就是1/4
了解以上几点我们就可以进行下一步了,下面以一个例子作为引述:
图1 LCD 逻辑图
图2 MCU脚位图
我们以以上两个图片作为此次实验,图1为LCD的逻辑图和连线图,图2是与单片机连接的脚位图,注意实际上单片机的COM1-COM4这几个引脚对地和VCC之间接有100K的电阻.
我们需要在lcd上面第一个8字从0-9依次显示,每秒递增1次,一直循环: 根据图1得到0-9的com1-com4对应的SEG码如下:
;;;;;;;;;COM1BTL查表;;;;;;;;;;;;;
COM1BTL: ADD PC,A
RETL 0XF1;0
RETL 0XF3
RETL 0XF1
RETL 0XF1
RETL 0X03;4
RETL 0XF1;5
RETL 0XF1
RETL 0XF1
RETL 0XF1
RETL 0XF1;9
;;;;;;;;;;;;;;;;
;;;;;;;COM2BTL查表;;;;;;;
COM2BTL: ADD PC,A
RETL 0XF0;0
RETL 0XF2;1
RETL 0XF2;2
RETL 0XF2;3
RETL 0XF0;
RETL 0XF1
RETL 0XF1;6
RETL 0XF2;
RETL 0XF0;
RETL 0XF0;9
;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;COM3BTL查表;;;;;;;;
COM3BTL: ADD PC,A
RETL 0XF1;0
RETL 0XF3;1
RETL 0XF0;2
RETL 0XF2;3
RETL 0XF2;4
RETL 0XF2;5
RETL 0XF0;6
RETL 0XF3;7
RETL 0XF0;8
RETL 0XF2;9
;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;COM4BTL查表;;;;;;;;;
COM4BTL: ADD PC,A
RETL 0XF0;0
RETL 0XF2;1
RETL 0XF1;2
RETL 0XF0;3
RETL 0XF2;4
RETL 0XF0;5
RETL 0XF0;6
RETL 0XF2;7
RETL 0XF0;8
RETL 0XF0;9
以上查表采用的是0代表点亮1代表不点亮,得到以上查表我们需要做的就是每个COM分时输出固定的波形,com输出波形同时查表输出对应的笔段,这样就能正常显示了,具体流程图如下;
1. COM1 输出高,其他com1/2电平(输入),seg查表
2.COM1 输出低,其他com1/2电平(输入),seg查表并取反
3. COM2 输出高,其他com1/2电平(输入),seg查表
4. COM2 输出低,其他com1/2电平(输入),seg查表并取反
5. COM3 输出高,其他com1/2电平(输入),seg查表
6. COM3 输出低,其他com1/2电平(输入),seg查表并取反
7. COM4 输出高,其他com1/2电平(输入),seg查表
8. COM4 输出低,其他com1/2电平(输入),seg查表并取反
9. 跳到1
具体程序如下:
LCD_DSPLY:
;11111;COM1=3V,其他COM=1.5V;;;;;;;;;;;;;
MOV A,@0XFF;
IOW P5
IOW P6
;;;;;;;;;;;;
MOV A,LCD_BUF; LCD显示查表
CALL COM1BTL ;
MOV P6,A;驱动seg显示
;;;;;;;;;;;;;
MOV A,@0B00001110
IOW P5;P5方向
BS P5,COM1;COM1=3V
;;;;;;;;;;;;;
MOV A,@0B11111100
IOW P6
;;;;;;;;;;
CALL DELAY16MS;延时16ms,扫描一个周期=16ms约60HZ
;2222;COM1=0V,其他COM=1.5V;;;;;;;;;;;;;;
MOV A,@0XFF;
IOW P5
IOW P6
;;;;;;;;
MOV A,LCD_BUF; LCD显示查表
CALL COM1BTL ;
MOV TBL_BUF,A;
COMA TBL_BUF;seg取反
MOV P6,A;驱动seg显示
;;;;;;;;;;;;;;;
MOV A,@0B00001110
IOW P5;P5方向
BC P5,COM1;COM1=0V
;;;;;;;;;;;;
MOV A,@0B11111100
IOW P6
;;;;;;;;;;;;
CALL DELAY16MS;延时16ms,扫描一个周期=16ms约60HZ
;;;3333333;COM2=3V,其他COM=1.5V;;;;;;;;;;;;;;
MOV A,@0XFF;
IOW P5
IOW P6
;;;;;;;;;;;;;;
MOV A,LCD_BUF; LCD显示查表
CALL COM2BTL ;
MOV P6,A;驱动seg显示
;;;;;;;;;;;;;;;;
MOV A,@0B00001101
IOW P5;P5方向
BS P5,COM2;COM2=3V
;;;;;;;;;;;;;;;;;;;
MOV A,@0B11111100
IOW P6
;;;;;;;;;;;;;;;;
CALL DELAY16MS;延时16ms,扫描一个周期=16ms约60HZ
;;;;;;44444444,COM2=0V,其他COM=1.5V;;;;;;;;;;;;;;
MOV A,@0XFF;
IOW P5
IOW P6
;;;;;;;;;;;;;;
MOV A,LCD_BUF; LCD显示查表
CALL COM2BTL ;
MOV TBL_BUF,A;
COMA TBL_BUF;seg取反
MOV P6,A;驱动seg显示
;;;;;;;;;;;;;;;;;;;
MOV A,@0B00001101
IOW P5;P5方向
BC P5,COM2;COM2=0V
;;;;;;;;;;;;;;;;;;;;;;
MOV A,@0B11111100
IOW P6
;;;;;;;;;;;;;;
CALL DELAY16MS;延时16ms,扫描一个周期=16ms约60HZ
;;;;55555,COM3=3V,其他COM=1.5V;;;;;;;;;;;;;;
MOV A,@0XFF;
IOW P5
IOW P6
;;;;;;;;;;;;;
MOV A,LCD_BUF; LCD显示查表
CALL COM3BTL ;
MOV P6,A;驱动seg显示
;;;;;;;;;;;
MOV A,@0B00001011
IOW P5;P5方向
BS P5,COM3;COM3=3V
;;;;;;;;;;;;;;;
MOV A,@0B11111100
IOW P6
;;;;;;;;;;
CALL DELAY16MS;延时16ms,扫描一个周期=16ms约60HZ
;;6666666,COM3=0V,其他COM=1.5V;;;;;;;;;;;;;;
MOV A,@0XFF;
IOW P5
IOW P6
;;;;;;;;;;
MOV A,LCD_BUF; LCD显示查表
CALL COM3BTL ;
MOV TBL_BUF,A;
COMA TBL_BUF;seg取反
MOV P6,A;驱动seg显示
;;;;;;;;;;;
MOV A,@0B00001011
IOW P5;P5方向
BC P5,COM3;COM3=3V
;;;;;;;;;;;;;;
MOV A,@0B11111100
IOW P6
;;;;;;;;;;;
CALL DELAY16MS;延时16ms,扫描一个周期=16ms约60HZ
;;7777777,COM4=3V,其他COM=1.5V;;;;;;;;;;;;;;
MOV A,@0XFF;
IOW P5
IOW P6
;;;;;;;;;;;;;;;;
MOV A,LCD_BUF; LCD显示查表
CALL COM4BTL ;
MOV P6,A;驱动seg显示
;;;;;;;;;;;;;;
MOV A,@0B00000111
IOW P5;P5方向
BS P5,COM4;COM4=3V
;;;;;;;;;;;;;;
MOV A,@0B11111100
IOW P6
;;;;;;;;;;;;
CALL DELAY16MS;延时16ms,扫描一个周期=16ms约60HZ
;;;;888888,COM4=0V,其他COM=1.5V;;;;;;;;;;;;;;
MOV A,@0XFF;
IOW P5
IOW P6
;;;;;;;;;;;;;
MOV A,LCD_BUF; LCD显示查表
CALL COM4BTL ;
MOV TBL_BUF,A;
COMA TBL_BUF;seg取反
MOV P6,A;驱动seg显示
;;;;;;;;;;;;
MOV A,@0B00000111
IOW P5;P5方向
BC P5,COM4;COM4=3V
;;;;;;;;;;;
MOV A,@0B11111100
IOW P6
;;;;;;;;;;;
CALL DELAY16MS;延时16ms,扫描一个周期=16ms约60HZ
JMP LCD_DSPLY; 跳回第一步,循环通过上面的程序就能正常显示了,只中断里面LCD_BUF每秒递增一个,到10就归零,这样就能从0-9一直循环显示了,正式使用时需要显示其他字形码,只要把TBL_BUF相应的位置1即可,
上实际效果图:
欢迎光临我的网站 www.szonko.com 也可写信和我交流 keasen2003#yahoo.com.cn 把#改成@ 黄思普