keasen的笔记 https://bbs.21ic.com/?117088 [收藏] [复制] [RSS]

日志

普通MCU驱动液晶LCD方法

已有 2596 次阅读2009-5-6 01:27 |系统分类:单片机| LCD, 普通IO, 模拟, 驱动, 液晶

原创博客,转载请注明出处: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   把#改成@  黄思普




路过

鸡蛋

鲜花

握手

雷人

发表评论 评论 (1 个评论)

回复 acmilann 2009-5-8 04:01
我们这边有带驱动的单片机 ,52内核的 acmilann@126.com www.vangotech.com