使用DS89C450作为静态LCD显示屏控制器

元器件信息   2024-07-30 16:53   184   0  

DS89C450  点击型号查看芯片规格书

Analog Devices(亚德诺) 芯片规格书大全

芯片规格书搜索工具-icspec


液晶显示屏(LCD)广泛用于各种现代电子设备上,例如计算器、手持式血糖仪、气站泵和电视机等。LCD功耗低,直视时有清晰的显示,在很多应用中已经替代了老的LED显示屏。很多微控制器(例如  MAXQ2000  )集成了能够驱动LCD显示板的LCD控制器,其占空比高达(1/4)。但是在某些情况下,具体应用中理想的微控制器不一定集成LCD控制器。在这些情况下,可以使用微控制器的端口引脚来驱动显示器,在软件中实现显示控制器。

本应用笔记阐述怎样利用DS89C450超高速快闪微控制器来实现一个简单的7段数位静态LCD显示控制器。由于没有采用  DS89C450  的特殊功能,该实例代码可以很容易导出到任何8051兼容微控制器中,只要微控制器有足够的引脚来驱动本应用中所采用的LCD显示板。

可以  下载  (ASM)本应用笔记的实例代码。

选择一款LCD显示板

在应用中选择LCD显示板时,应该为LCD仔细挑选匹配的兼容微控制器和LCD显示控制器。进行选择时,应考虑以下问题。

  • LCD的工作电压范围是多少? 由于DS89C450是5V微控制器,其端口引脚工作在5V电平上,我们必须选择一款5V LCD显示板。注意,很多集成了LCD控制器的微控制器使用专用供电输入(VLCD)来设置LCD控制器使用的电压范围。

  • LCD的占空比是多少?静态LCD显示板将显示屏中的每一段连接至专用驱动线。这意味着段驱动器的数量必须等于被驱动的LCD段的数量。然而,多路复用LCD显示板的每一条段驱动线(SEG)要驱动一个以上的LCD段。这些显示板使用多路公共背板(COM)输出,根据所采用的占空比,驱动SEG和COM线上VLCD和GND之间的多电平。由于我们使用的8051微控制器DS89C450只能将其端口引脚线驱动到5V和GND,因此,我们的情况限于静态LCD。关于驱动多路复用LCD的详细信息,请参考以下文档:

    • 应用笔记3548:"  Using an LCD with MAXQ Microntrollers  "。

    • MAXQ 系列用户指南:MAXQ2000补充材料  (English only)

  • LCD显示板工作需要多少段和多少公共驱动器? 控制静态LCD显示板时,被驱动的每一段需要一条驱动线(端口引脚),公共(COM)背板线需要额外的一个端口引脚。

对于本应用笔记,选用了Lumex  LCD-S401C52TR显示屏。该LCD是5V静态显示屏,含有4个7段数字和3个符号段(一个逗号和三个十进制小数点)。LCD上的每位数都由7段构成,如图1所示,A、B、G、E和D段被打开,显示数字"2"。

32048_3s81_3304.gif
图1. 7段LCD显示数字

LCD-S401C52TR显示屏含有一个COM背板(连接至两个引脚)和32个显示段,每个都连接至段驱动引脚。在这个例子中,我们只使用7段数字中的三个,意味着DS89C450需要驱动21条SEG线(三个数位中的每一个需要7段)和一条COM线,从而共需要22个端口引脚。当没有采用扩展存储器总线配置工作时,DS89C450提供24个推拉端口引脚。因此,微控制器有足够的I/O容量来完成这一任务(端口0还有其他的8个端口引脚。但是,三个引脚开漏,需要额外的上拉电阻才能用作通用I/O)。

硬件设置

这一例子的硬件设置基于DS89C450评估(EV)套件(B版),去掉了存储器接口CPLD (U5)和两个外部存储器芯片(U6和U7)。这一改动释放了多个端口引脚,可供我们的应用程序使用,否则这些引脚可用于实现扩展存储器总线,特别是端口0 (所有8条线)、端口2 (所有8条线)、端口3.6和3.7。请参见表1(注意:在这一例子中没有使用端口0)。DS89C450含有64kB内部代码空间和1kB内部数据SRAM,对于这一例子已经足够了。

LCD-S401C52TR显示屏上的段和公共线通过靠近原型区的J4插头连接至DS89C450的端口引脚。段行通过1k欧姆电阻连接至端口引脚,而没有直接和端口引脚连接。之所以采用这种设置是因为DS89C450的端口引脚比LCD显示板驱动线常用的方式有更强的驱动能力(0态和单稳态强下拉,1态强上拉,然后弱上拉)。由于COM线有较大的电容,需要较强的驱动,它直接连接到其端口引脚。但是,本应用不建议段行直接由端口引脚驱动。这种配置会出现一个问题:随着越来越多的段打开,通过LCD显示屏,在段和公共面之间的电容耦合会使COM线偏离其预置状态(之所以出现这一问题,是因为工作段对公共面总是保持正电压)。结果,应该关掉的段会被部分打开。所以通过电阻连接端口引脚,以减小驱动能力,避免这一问题的发生。

表1. LCD显示板和端口引脚连接

DS89C450 Port PinJ4 Header PinLCD Pin(s)LCD SignalNotes
P1.01214AThrough 1k欧姆
P1.12204BThrough 1k欧姆
P1.23194CThrough 1k欧姆
P1.34184DThrough 1k欧姆
P1.45174EThrough 1k欧姆
P1.56224FThrough 1k欧姆
P1.67234GThrough 1k欧姆
P1.781, 40COMConnect directly
P2.021253AThrough 1k欧姆
P2.122243BThrough 1k欧姆
P2.223153CThrough 1k欧姆
P2.324143DThrough 1k欧姆
P2.425133EThrough 1k欧姆
P2.526263FThrough 1k欧姆
P2.627273GThrough 1k欧姆
P3.010302AThrough 1k欧姆
P3.111292BThrough 1k欧姆
P3.212112CThrough 1k欧姆
P3.313102DThrough 1k欧姆
P3.41492EThrough 1k欧姆
P3.515312FThrough 1k欧姆
P3.616322GThrough 1k欧姆


还需要对硬件设置进行一些说明:

  • 采用了一个标准16.384MHz晶振(插在Y1上)来为DS89C450提供时钟。

  • 运行应用程序时,DIP开关SW1.1和SW4.2应在ON位置;所有其他应为OFF。

  • 装入应用程序(使用MAXQ微控制器工具套件(MTK)或者另一开发工具)时,DIP开关SW1.1、SW1.2、SW1.3、SW4.1和SW4.2应在ON位置;所有其他应为OFF。

  • 当LCD显示屏运行时,总是可以在LED条形显示U10上看到端口1的状态。这属于正常,由于LCD显示屏被缓冲过,因此,不会影响应用程序。

  • P3.0和P3.1也被用于串口0的Tx/Rx线。所以,当应用程序装入(使用串口启动加载程序)时,由于这些线的活动,LCD的一两个段会闪烁。这属于正常。当应用程序运行时,DIP开关SW1.2和SW1.3应关断,以禁止串口功能。

  • LCD显示屏上任何没有使用的段必须驱动到OFF状态,不允许浮空。可以通过将一个或者多个没有使用的段连接至驱动到OFF状态(和COM相同的电压波形)的端口引脚来完成这一任务,也可以将没有使用的段直接连接至COM。

驱动LCD段

LCD段的默认状态是OFF (例如,透明);没有加电压时,段应该为透明状态,相对于LCD显示板背景是看不到的。此外,当相同的电压加在段线(SEG)和公共背板(COM)上时,段保持关断。当段的SEG引脚和COM面之间有电压差时,段才切换到ON (例如,不透明)状态。当该电压达到一个特殊电平时,即阈值电压,段变暗,最终完全不透明。阈值电压是LCD显示板指定工作电压的百分比,不同的LCD有不同的阈值电压。

电压差的极性并不影响驱动LCD段。例如,驱动3V阈值电压LCD的控制器可以通过设置COM至地,SEGn至3V来接通段n,也可以设置COM至3V,SEGn至地达到同样目的。这一事实非常重要,因为如果LCD上的静态直流电压保持时间过长,段可能会被损害,无法再正常开关。为避免这一问题,不论段处于ON还是OFF状态,总是以交替波形来驱动LCD段,以确保每个段上总的直流电压保持为零(图2)。

32048_pmz8_1219.gif
图2. 静态LCD段的交替驱动波形

如图2所示,静态显示屏的COM引脚一直被一个50%占空比的方波驱动,该方波电平在VLCD (我们的设置是5V)和GND之间。利用两个模式之一来驱动每一条段线。

  • 要把段打到OFF,应采用和我们驱动COM引脚一样的波形来驱动它。这可以保证SEG/COM对上的直流电压始终为零,意味着段将保持关断。

  • 要把段打到ON,应采用和COM波形相反的信号来驱动它。这意味着,一半的时间以正电压驱动段,另一半的时间以负电压驱动它。这两个状态有相同的视觉显示,因此,段看起来一直接通。由于电压差的平均直流值是零,不会有导致损害LCD玻璃的静态直流偏置。

不同的LCD显示板有不同的LCD驱动频率(称之为帧频率)。实际应用合适的频率值取决于特定硬件设置的试验情况。由于LCD段状态改变率受限于段的总电容,LCD只在特定范围的帧频率内才能正常工作。一般而言,这一范围在20Hz至200Hz之间。本应用笔记的实例代码使LCD大概运行在30Hz左右。特定显示屏的帧速率太高或者太低都会导致LCD段闪烁,或者看起来变暗。

下面是驱动LCD段运行的主程序。

Main:
 mov IE, #080h ; Disable timer 0 interrupt temporarily
 mov R2, DigitP1 ; Grab local copies of digit variables
 mov R3, DigitP2
 mov R4, DigitP3 
 mov IE, #082h ; Re-enable timer 0 interrupt

 mov A, R2 
 call getDigit ; Calculate segment pattern for ones digit
 anl A, #01111111b ; Ensure that COM (P1.7) is driven low
 mov P1, A

 mov A, R3 
 call getDigit ; Calculate segment pattern for tens digit
 mov P2, A

 mov A, R4
 call getDigit ; Calculate segment pattern for hundreds digit
 mov P3, A

;;;; Delay loop ;;;;

 mov R0, #0FFh
L1A:
 mov R1, #0FFh
L1B:
 djnz R1, L1B
 djnz R0, L1A

;;;;;;;;;;;;;;;;;;;;;;

 mov A, R2 
 call getDigit ; Calculate segment pattern for ones digit
 cpl A ; Inverse of the pattern driven on the first frame half
 orl A, #10000000b ; Ensure that COM (P1.7) is driven high
 mov P1, A
 

 mov A, R3
 call getDigit ; Calculate segment pattern for tens digit
 cpl A ; Inverse of the pattern driven on the first frame half
 mov P2, A

 mov A, R4
 call getDigit ; Calculate segment pattern for hundreds digit
 cpl A ; Inverse of the pattern driven on the first frame half
 mov P3, A

;;;; Delay loop ;;;;

 mov R0, #0FFh
L2A:
 mov R1, #0FFh
L2B:
 djnz R1, L2B
 djnz R0, L2A

;;;;;;;;;;;;;;;;;;;;;;

 ljmp Main ; Go back for another frame cycle (endless loop)

注意,COM线(连接至P1.7)总是采用相同的波形驱动:前半帧为低电平,后半帧为高电平。对于段线,帧第一部分的模式驱动和第二部分的相反。以同样方式将三个数位的每一个分别连接至三个端口之一,所以,段A总是连接至Px.0,段B连接至Px.1,依此类推。这种配置使实例代码能够使用getDigit子程序来计算三个LCD显示板数位中每一个的段模式。

;***************************************************************************
;*
;* getDigit
;* 
;* Returns an LCD segment pattern (in Acc) for the decimal digit (0 to 9)
;* input (also in Acc)
;*

getDigit:
 cjne A, #0, getDigit_not0
; xgfedcba
 mov A, #00
                        
登录icspec成功后,会自动跳转查看全文
博客评论
还没有人评论,赶紧抢个沙发~
发表评论
说明:请文明发言,共建和谐网络,您的个人信息不会被公开显示。