第 1 页
LCD Driver(液晶驱动器)
在单片机的应用中,人机界面占据相当重要的地位。人机界面主要包括事件
输入和结果指示,事件输入包括键盘输入,通讯接口,事件中断等,结果指示包
括 LED/LCD 显示、通讯接口、外围设备操作等。而在这些人机界面当中,LCD 显
示技术由于其具有界面友好,成本较低等特点而在很多应用场合得以广泛应用。
我们在第一章 SH6xxx 单片机分类中就介绍过,LCD 类单片机是 SH6xxx 单片机
产品线的一个重要类别。
0. LCD的显示原理
在讲解 LCD driver 之前,我们先就 LCD 的显示原理作一简单的介绍。
LCD(Liquid Crystal Display)是利用液晶分子的物理结构和光学特性进行显
示的一种技术。液晶分子的特性:
液晶分子是介于固体和液体之间的一种棒状结构的大分子物质;
在自然形态,具有光学各向异性的特点,在电(磁)场作用下,呈各向同性
特点;
下面以直视型简单多路 TN/STN LCD Panel(液晶显示面板)的基本结构介绍 LCD
的基本显示原理,示意图如图 1-1:
图 1-1 LCD 的基本显示原理
第 2 页
整个 LCD Panel 由上下玻璃基板和偏振片组成,在上下玻璃之间,按照螺旋
结构将液晶分子有规律的进行涂层。液晶面板的电极是通过一种 ITO 的金属化合
物蚀刻在上下玻璃基板上。如图所示,液晶分子的排列为螺旋结构,对光线具有
旋旋旋光性,上下偏振片的偏振角度相互垂直。在上下基板间的电压为 0时,自
然光通过偏振片后,只有与偏振片方向相同的光线得以进入液晶分子的螺旋结构
的涂层中,由于螺旋结构的的旋旋旋光性,将入射光线的方向旋转 90 度后照射到
另一端的偏振片上,由于上下偏振片的偏振角度相互垂直,这样入射光线通过另
一端的偏振片完全的射出,光线完全进入观察者的眼中,看到的效果就为白色。
而在上下基板间的电压为一交流电压时,液晶分子的螺旋结构在电(磁)场的作用
下,变成了同向排列结构,对光线的方向没有作任何旋转,而上下偏振片的偏振
角度相互垂直,这样入射光线就无法通过另一端的偏振片射出,光线无法进入观
察者的眼中,看到的效果就为黑色。这样通过在上下玻璃基板电极间施加不同的
交流电压,即可实现液晶显示的两种基本状态亮(On)和暗(Off)。
在实际的液晶模以驱动电压中,有几个参数非常关键:
交流电压,液晶分子是需要交流信号来驱动的,长时间的直流电压加在液
晶分子两端,会影响液晶分子的电气化学特性,引起显示模糊,寿命的减
少,其破坏性为不可恢复;
扫描频率,直接驱动液晶分子的交流电压的频率一般在 60~100Hz 之间,
具体是依据 LCD Panel 的面积和设计而定,频率过高,会导致驱动功耗的
增加,频率过低,会导致显示闪烁,同时如果扫描频率同光源的频率之间
有倍数关系,则显示也会有闪烁现象出现。
COM1COM1
ONE FRAME
1-2 帧频(Frame)示意图
液晶分子是一种电压积分型材料,它的扭曲程度(透光性)仅仅和极板间电
压的有效值有关,和充电波形无关。电压的有效值用 COM/SEG 之间的电压
差值的均方根 VRMS
示:
[ ] dttV
T
RMSV
T 2
0
)(1)( ∫=
LCD 显示黑白(透光和不透光)的电压有效值的分界电压称为开启电压 Vth,当
电压有效值超过 Vth,螺旋结构的旋光角度加大,透光率急剧变化,透明度急剧上
升。反之,则透明度急剧下降。光线的透射率与交流电压的有效值的关系如图 1-3:
第 3 页
100
90
10
0
Tr
an
sp
ar
en
t D
eg
re
e(
R
el
at
iv
e) 90%
10%
Voltage(Vrms)
2 4 6Vth
V10 V90
Von(rms) Voff( rms)
图 1-3 光线的透射率与交流电压的有效值的关系图
LCD 类单片机内嵌的 LCD driver(液晶驱动器),正是通过系统的控制,按照
用户定义的显示图案,产生点亮 LCD(Liquid Crystal Display,液晶)所需的模拟
驱动波形,接到 LCD Panel(液晶显示屏)上点亮对应的像素而达到显示的效果。
占空比(Duty)
该项参数一般也称为 Duty 数或 COM 数。由于 STN/TN 的 LCD 一般是采用时分
动态扫描的驱动模式,在此模式下,每个 COM 的有效选通时间与整个扫描周
期的比值即占空比(Duty)是固定的,等于 1/COM 数。
偏置(Bias)
LCD 的 SEG/COM 的驱动波形为模拟信号,而各档模拟电压相对于 LCD 输出的最
高电压的比例称为偏置,而一般来讲,Bias 是以最低一档与输出最高电压的
比值来表示,如图 1-4 所示(1/4 Duty,1/3 Bias):
SEGn
V3
COM4 - SEGn
SEGn+1
0
COM4
COM3
COM2
COM1
COM4
COM3
COM2
COM1
V2
V1
V3
0
V2
V1
V3
0
V2
V1
V3
0
V2
V1
V3
0
V2
V1
V
0
V2
V1
V3
0
V
V1
-V3
-V2
-V1
SEGn+1
SEGn
Select
COMX
Light
SEGX
Unselect
Unlight
Unlight UnlightSEGX
V3
V2
V1
0
V3
V2
V1
0
V3
V2
V1
0
Select
Unselect
One
Frame
图 1-4 LCD driver 驱动波形图
该图对应的是 1/4 duty,1/3 bias 的液晶驱动波形,COM 数为 4,每个 COM
第 4 页
的有效选通时间与整个扫描周期的比值(Duty)=1/4,驱动波形的模拟电压共
分 3档,V3 位输出最高电压,V2,V1 为输出中间电压,并且 V1/V3=1/3,所
以上述波形图对应的 Duty=1/4,Bias=1/3。
一般而言,Bias 和 Duty 之间是有一定关系的,duty 数越多,每根 COM 对应
的扫描时间变短,而要达到同样的显示亮度和显示对比度,VON 的电压就要提
高,选电平和非选电平的差异需要加大,即 Bias 需要加大,Duty 和 Bias 间
有一经验公式,即
)1Duty/(1Bias +=
0. LCD驱动器的电源
液晶驱动波形为由若干档直流电平组合而成的模拟波形,各档直流电平的比
例关系反映驱动波形的 Bias 比例关系,各档电平的具体幅值取决于 LCD Panel 的
液晶特性和 Duty 数的多少。图 1-5 为一 LCD 驱动电源部分的示意图:
Contrast
Adjust
LCD
common driver
LCD
segment driver
COM1~COMn
SEG1~SEGn
VDD
Power
Regulator
Vn,Vn-1...V0, 0Bias Voltage
Generator
图 1-5 LCD 驱动电源部分的示意图
电源调整器部分(Power Regulator):
产生 LCD 驱动所需的最高直流电平,一般分为三种:
a) LCD 驱动所需的最高直流电平等于外部输入电源 VDD 的,此部分就直接
将 VDD 输入至后续电路;
b) LCD 驱动所需的最高直流电平大于外部输入电源 VDD,且不需要稳压输出
的,如固定等于 1.5VDD 或 2.0VDD,此部分通常做法是将外部输入电源 VDD
通过升压电路(pump)升至所需的电压,输入至后续电路;
c) LCD 驱动所需的最高直流电平大于外部输入电源 VDD,且需要稳压输出的,
即驱动所需的最高直流电平不随 VDD 的变化而变化的,如要求 VDD =2.4~
5.5V 全电压范围里,VLCD 的输出电压都保持不变,此部分通常做法是首
先产生一个误差范围符合要求的电压基准源,然后将此电压基准源比例放
大至所需的电压,同时外部输入电源 VDD 通过升压电路(pump)升至一定的
电压,如 2VDD,作为比例放大部分的电源。如图 1-6:
第 5 页
Reference
Voltage
VDD
Pump
Amplifier
n*VDD
Vref VLCD
图 1-6 电源调整器部分结构示意图
对比度/亮度调整部分(Contrast Adjustment):
通过对比度/亮度控制寄存器,调节输出的 LCD 驱动电压。
设置此部分的目的有三个:
) 同一颗单片机适配的 LCD Panel 的选择余地较大,LCD panel 的工作电压(额
定电压)处于 LCD 驱动器输出的最高电压和最低电压之间即可;
) 可以有效的消除 LCD Panel 在制作过程中工作电压的偏移,特别是 TN/STN
等对成本要求较严格的 LCD Panel,其最佳工作电压与设计工作电压间的偏
移较大;
) 有些产品的 LCD driver 无电源调整电路,其 LCD 输出的最高电压(VLCD)与
外部输入电源跟随变化。在实际产品中,特别是使用电池作为电源的应用
场合,外部输入电源随着使用时间的加长会慢慢降低,LCD 输出的电压和
LCD Panel 的对比度也会随之降低,这时保持 LCD Panel 的对比度不变,就
可以通过调节对比度/亮度控制寄存器进行调节。
此部分依据每颗单片机产品的定位不同,有所差异,有些产品无部分,包含
此部分的在调节档数或调节精度上也有所差异。
偏置电压产生部分(Bias Voltage Generator):
LCD driver 输出的最高电压通过偏置电压产生电路,根据选择的偏置设置,
产生LCD交流驱动波形所需要的其它几档偏置电压(VLCD,Vn,Vn-1,…V1,V0),
提供给后续的 COM/SEG 波形产生电路。
此部分的实现方式一般分为两种:
) 电阻分压结构,即依据 Bias 的设置,选择合适的分压电阻,产生需要的
直流分压电平,如图 1-7;
第 6 页
V3=5/6*VLCD
VLCD
VLCD
V1=2/3*VLCD
V0=1/3*VLCD
1/3 Bias
R
R
R
VLCD
VLCD
V2=3/4*VLCD
V1=2/4*VLCD
V0=1/4*VLCD
1/4 Bias
R
R
R
R
VLCD
VLCD
V3=4/5*VLCD
V2=3/5*VLCD
V1=2/5*VLCD
V0=1/5*VLCD
1/5 Bias
R
R
R
R
R
VLCD
VLCD
V2=4/6*VLCD
V1=2/6*VLCD
V0=1/6*VLCD
1/6 Bias
R
R
2R
R
R
图 1-7 电阻分压结构的偏压电路示意图
) 电容结构,这是一种较为特殊的 LCD driver 的电源结构,在这种结构下,
电压调整部分和电压偏置部分是整合在一起的,电源升压部分是直接按照
Bias 的设置产生 LCD driver 需要的直流分压电平,如图中,VP2 是 2 倍
的 VDD,VP1 是 3 倍的 VDD。
在此结构下,如图 1-8 所示的外接电容一般情况是必须要的,否则仅仅依
靠芯片内的电容,其驱动能力较差。
图 1-8 电容分压结构的偏压电路示意图
COM/SEG 驱动波形产生部分(COM/SEG driver):
此部分的结构示意如图 1-9:
第 7 页
Data
/Scan counter
Data
/Scan counter
Data
/Scan counter
Data
/Scan counter
COM/SEG pad
COM/SEG pad
COM/SEG pad
COM/SEG pad
VLCD
Vx
Vy
GND
COM/SEG Driver
图 1-9 COM/SEG 驱动波形产生示意图
COM/SEG driver 可以看作一组多路选择开关,COM driver 依据扫描计数器的
值,SEG driver 依据显示数据 RAM 对应的值,从输入的直流分压电平中进行选
择并从相应的 COM/SEG 引脚加以输出。这样从整个 LCD 扫描周期来讲,从
COM/SEG 引脚上就输出了驱动 LCD Panel 所需要的模拟电压波形。
直流分压电平的选择关系如表 1-1 及图 1-10:
项目 1/3Bias 1/4Bias 1/5Bias 1/7Bias
直流分压电平
VLCD
V1=2/3VLCD
V2=1/3VLCD
GND
VLCD
V1=3/4VLCD
V2=2/4VLCD
V3=1/4VLCD
GND
VLCD
V1=4/5VLCD
V2=3/5VLCD
V3=2/5VLCD
V4=1/5VLCD
GND
VLCD
V1=6/7VLCD
V2=5/7VLCD
V3=2/7VLCD
V4=1/7VLCD
GND
选电平 VLCD VLCD VLCD VLCD COM
driver 非选电平 V2 V3 V4 V4
选电平 GND GND GND GND
前半扫
描周期 SEG
driver 非选电平 V1 V2 V2 V2
选电平 GND GND GND GND COM
driver 非选电平 V1 V1 V1 V1
选电平 VLCD VLCD VLCD VLCD
后半扫
描周期 SEG
driver 非选电平 V2 V2 V3 V3
表 1-1 直流分压电平的选择关系表
第 8 页
SELECT UNSELECT
COM
SELECT UNSELECT
SEG
1/5 BIAS1/4 BIAS
SELECT UNSELECT VLCD
V1
V2
COM V3
GND
SELECT UNSELECT
V1
SEG V2
V3
V4
VLCD
V4
GND
VLCD
V1
V2
V3
GND
VLCD
V1
V2
V3
GND
SEG
COM3
COM2
COM1
VLCD
V1
V2
V3
GND
VLCD
V1
V2
V3
GND
VLCD
V1
V2
V3
GND
VLCD
V1
V2
V3
GND
Selected Unselected
图 1-10 SEG/COM 波形图
第 9 页
0. LCD显示RAM(LCD Display RAM)
用户对 LCD Driver 的操作一方面是通过操作 LCD driver 的控制寄存器,来
设置 LCD driver 的工作模式(包括 Duty/Bias/Contrast/扫描频率/LCD 开关等的
设置),另一方面 LCD Panel 上显示所需的内容是通过读写 LCD 显示 RAM 来实现。
LCD RAM 的结构不同于其它 Data RAM,它是一个双口 RAM(Dual Port)的结构,一
边为 CPU 的读写接口,另外一边是与 LCD driver 的读接口。
LCD RAM 的字节排列顺序是与 LCD 输出的 COM/SEG 阵列相对应的。
如表 1-2:
Bit3 Bit2 Bit1 Bit0
Address
COM4 COM3 COM2 COM1
$300 SEG1 SEG1 SEG1 SEG1
$301 SEG2 SEG2 SEG2 SEG2
$302 SEG3 SEG3 SEG3 SEG3
$303 SEG4 SEG4 SEG4 SEG4
$304 SEG5 SEG5 SEG5 SEG5
$305 SEG6 SEG6 SEG6 SEG6
$306 SEG7 SEG7 SEG7 SEG7
$307 SEG8 SEG8 SEG8 SEG8
$308 SEG9 SEG9 SEG9 SEG9
$309 SEG10 SEG10 SEG10 SEG10
$30A SEG11 SEG11 SEG11 SEG11
$30B SEG12 SEG12 SEG12 SEG12
$30C SEG13 SEG13 SEG13 SEG13
$30D SEG14 SEG14 SEG14 SEG14
$30E SEG15 SEG15 SEG15 SEG15
… … … … …
表 1-2 LCD RAM 分配表
举例,如果要将 COM2 与 SEG3 交点处的点点亮,只需将 LCD RAM $302 的 Bit1 置 1
即可,其余的工作由 LCD driver 的硬体自动完成。
0. LCD COM/SEG的复用功能
SH6xxx 产品线中,有些产品的 LCD COM/SEG 正常情况下用作 LCD driver 的
COM/SEG 信号的输出线,但依据实际应用情况,如 LCD 扫描线有空余,输入输出端
口有所不够,在这个时候,就可以讲这些扫瞄线设置为输入输出端口,当作通用
第 10 页
的输入输出端口来使用,当然有些可能设置为输出端口,具体的功能和设置请参
考相应的产品说明书。
例如:在 SH67P54 中,SEG1~8 的第二功能为输入输出端口 PORTC 和 PORTD,
SH67K(P)93 中,SEG36~50 的第二功能为 PORTF,PORTE,PORTD 和 PORTC,SEG24~
35 的第二功能为输出端口。
LCD COM/SEG 复用为输入输出端口(I/O),输出端口(Output)
LCD 扫描与键盘扫描复用
LCD COM/SEG 的第二功能设置为输入输出端口时,其可以作为通用的端口使用,设
置为输出端口时,其仅可以作为输出端口使用。在后一种情况下,LCD 与键盘扫描
扫描线复用是一种最常见的应用,下面就这一应用进行讨论。
下图为 LCD 扫描与键盘扫描复用时的示意图(以 3x3 键盘为例):
SEGa
SEGb
SEGc
LCD Panel
Px
Py
Pz
AN1 AN2 AN3
AN4 AN5 AN6
AN7 AN8 AN9
COM/SEG
COM/SEG SEGa~c
SH66xx
图 1-11 LCD 扫描与键盘扫描复用时的示意图
如图 1-11 中,SEGa~c 的第二功能为输出扫描口,同时接到键盘矩阵和 LCD Panel
上,Px,Py,Pz 为三根输入输出端口,用作键盘扫瞄输入线,其内部上拉电阻打
开,或外接上拉电阻,图中二极管的作用为防止双键或多键按下时,按键对 LCD
显示产生影响。SEG/COM 用作输出口时,对应的数据位一般为一独立的数据寄存器。
如 SH67P90 中 SEG24~35:
第 11 页
Addr Bit 3 Bit 2 Bit 1 Bit 0 R/W Remarks
$15 - O/S2 O/S1 O/S0 R/W LCD control register1
$3C8 SCAN35 SCAN34 SCAN33 SCAN32 R/W
Data Register of LCD SEG35 - 32 when
SEG35 - 32 shared as output port.
$3C9 SCAN31 SCAN30 SCAN29 SCAN28 R/W
Data Register of LCD SEG31 - 28 when
SEG20 - 17 shared as output port.
$3CA SCAN27 SCAN26 SCAN25 SCAN24 R/W
Data Register of LCD SEG27 - 24 when
SEG16 – 13 shared as output port.
$15 为 SEG24~35 第一/第二功能选择控制寄存器,$3C8~3CA 为 SEG24~35 用作
输出端口时的数据寄存器。
程序操作流程如图 1-12:
SEGa=0,SEGb=1,SEGc=1
SEGa~c switch to output port
Read Px~Py status
SEGa~c switch to LCD SEG
judge AN1~AN3 is pressed
SEGa=1,SEGb=0,SEGc=1
SEGa~c switch to output port
Read Px~Py status
SEGa~c switch to LCD SEG
judge AN4~AN6 is pressed
SEGa=1,SEGb=0,SEGc=1
SEGa~c switch to output port
Read Px~Py status
SEGa~c switch to LCD SEG
judge AN7~AN9 is pressed
Key scan start
Key scan start
图 1-12 LCD 扫描与键盘扫描复用程序流程图
在上述流程中有几点非常重要:
COM/SEG 用作键盘扫描线的时间越快越好,这样才能最大程度的避免键盘
扫瞄对 LCD 显示带来的影响。
1) 切换到键盘扫描线之前,先将扫描输出端口数据寄存器数据设置好,设置
好后再行切换;
2) 键盘扫描线输出后,立即读取键盘输入端口的状态,并将 COM/SEG 切换回
LCD COM/SEG 输出,再行处理键盘扫瞄数据;
3) 键盘扫瞄的频率不宜太快,否则即使每次扫描的时间很短,但同一时间内
第 12 页
扫描次数太多,结果是对 LCD 显示仍然产生较大的影响,同键盘扫瞄频率
较慢,但每次扫描时间较长的产生的影响一样。一般键盘扫瞄的频率限制
在 2~3Hz 以下,由于存在按键数量差异,液晶扫描频率不同,液晶面板
的大小/电压/段码差异,此值依据具体的案例会有所不同。
上述流程只是提供一种思路,并未涉及如消抖等细节问题,具体应用中仅
供参考。
0. LCD应用实例
在使用带 LCD 驱动模块的中颖单片机来驱动 LCD 的时候,在电路接口设计上
是非常简单的。
首先要先查看所要驱动的LCD共有多少个COMMON口和SEGMENT口,根据COMMON
口和 SEGMENT 口的数目来挑选所要匹配的单片机上的 LCD 驱动口。由于有些单片
机的 LCD 驱动口是与 I/O 口复用的,所以在考虑这一点的时候还要考虑一下 I/O
口是否够用。比如作用 SH66P51 来驱动一片有 4个 COMMON 口、12 个 SEGMENT 口的
LCD,且 I/O 口的使用上使用到了 PORTC 和 PORTD,这样先根据 LCD 有 4 个 COMMON
口,所以SEG29/COM4的引脚必须选择作为COM4使用,而SEG27/COM6和 SEG28/COM5
就可以选择为 SEG27 和 SEG28 使用(由于这块 LCD 只有 12 个 SEGMENT 口,所以最
终单片机的 SEG27 和 SEG28 也是没用到)。单片机由于被使用到了 PORTC 和 PORTD
的 I/O 口,所以 SEG1~SEG8 就不能再使用了,LCD 上的 SEGMENT1~SEGMENT12 就
只好依次接到单片机的 SEG9~SEG20,剩下的 SEG21~SEG28 不使用,可以悬空。
LCD 显示软件模块
现在以 SH66P51 为例讲述一下一个 4个 COMMON 口,8个 SEGMENT 口的显示时
间的 LCD 的驱动。
LCD 平面显示图如图 1-13 所示:
图 1-13 LCM 平面显示图
这块 LCD 共有 12 个引脚,包括 4个 COMMON 口和 8个 SEGMENT 口,显示 12 小
时制的时钟和分钟。
这里,我们可以看一下这块 LCD 的 SEGMENT 图与 COMMON 图:
第 13 页
图 1-14 LCD SEG/COM 走线图
电路原理图
由于系统设计中并没有要求要使用到 PORTC 和 PORTD 的 I/O 口,所以将 PORTC
和 PORTD 与 SEG1~8 这八个复用引脚设置为 SEG1~8 来使用。LCD 有 4 个 COMMON
口,SEG29/COM4 设置为 COM4 使用。
SH66P51 内部有自带的 RESET 引脚上拉电阻,所以在搭建电路时可以省去外部
RESET 电路中的上拉电阻,只需在烧写 IC 的时候打开 RESET 引脚上拉电阻即可。使
用 32.768KHz 晶振作为主振荡器,LCD 驱动的时锺来源于晶振的振荡时锺。
第 14 页
SW1
32768HZ
Y1
12P
C9
12P
C8
0.1uF
C5
0.1uF
C4
0.1uF
C1
0.1uF
C3
0.1uF
C2
0.1uF
C7
VCC
47K
R1
0.1uF
C6
VCC
3
3
4
4
5
5
6
6
2
2
1
1
7
7
8
8
9
9
10
10
11
11
12
12
*
CUP1 17
VSUB 18
VP1 19
VP2 20
VP3 21
COM1 22
CUP2 16
/RESET 15
TEST 14
REM 13
VDD 12
PA
.0
6
G
N
D
7
O
SC
X
O
/P
E
.1
8
O
SC
X
I/
PE
.0
9
O
SC
O
10
O
SC
I
11
PB
.1
1
PB
.0
2
PA
.3
3
PA
.2
4
PA
.1
5
SE
G
21
28
SE
G
22
27
SE
G
23
26
C
O
M
4/
SE
G
29
25
C
O
M
3
24
C
O
M
2
23
SE
G
20
29
SE
G
19
30
SE
G
18
31
SE
G
17
32
SE
G
16
33
SEG4/PC.339
SEG3/PC.240
SEG2/PC.141
SEG1/PC.042
PB.343
PB.244
SEG5/PD.038
SEG6/PD.137
SEG7/PD.236
SEG8/PD.335
SEG1534
SH
66
P5
1
U1
com
4
com
3
com
2
com
1
SE
G
8
SE
G
7
SE
G
6
SE
G
5
SE
G
4
SE
G
3
SE
G
2
SE
G
1
LCD
图 1-15 LCD 显示实例原理图
程序设计
软件将设计一个 LCD 显示模块作为例子供写 LCD 显示程序的程序员参考一下
而已。
为了方便说明 LCD 显示,所以挑选了一个时间的显示作为例子,在程序中也
就写进去一个时间跳动的小程序,目的只是作为 LCD 显示模块调试用而已。时间
从 AM12:00 开始,循环运行。
当上电时,由于 LCD 驱动寄存器的值是不定的,若在这个时候打开 LCD 的话,
就会导致 LCD 显示一些乱的点,所以在上电未打开 LCD 的时候要先对用于 LCD 显
示的寄存器进行清零,以避免出现上电乱显示。
在写 LCD 显示程序之前,要先对 LCD 进行分析,由显示的段和 SEGMENT 线与
COMMON 线的关系列出 LCD 的矩阵表,得到如下表:
第 15 页
REGISTER LCD COM4 COM3 COM2 COM1
$300 SEG1 MIN_L_d MIN_L_c MIN_L_b MIN_L_a
$301 SEG2 CIRH MIN_L_e MIN_L_g MIN_L_f
$302 SEG3 MIN_H_d MIN_H_c MIN_H_b MIN_H_a
$303 SEG4 CIRL MIN_H_e MIN_H_g MIN_H_f
$304 SEG5 HOU_L_d HOU_L_c HOU_L_b HOU_L_a
$305 SEG6 AM HOU_L_e HOU_L_g HOU_L_f
$306 SEG7 HOU_H_d HOU_H_c HOU_H_b HOU_H_a
$307 SEG8 PM HOU_H_e HOU_H_g HOU_H_f
表 1-3 LCD 显示矩阵表
得到矩阵表之后,可对矩阵表进行分析,找出最方便写出显示程序的规律。
比如上面这张表,我们可以看出 LCD 中的每个 7 段码的排列是有规律的:都是从
高到低为 d 段、c 段、b 段和 a 段依次存在同一个寄存器中,e 段、g 段和 f 段又
是从高到低放在同一个寄存器的低三位。这样就方便了建表,具体的建表方法请
参看程序。
例 6-1 以时间 LCD 显示为例带有 LCD 显示模块的程序
LIST P=66P51
ROMSIZE=2048
;************************************************
; 系统寄存器(BANK0)
;************************************************
IE EQU 00H ;中断使能标志
IRQ EQU 01H ;中断请求标志
BTM EQU 03H ;基本定时器模式寄存器
LCDON EQU 07H ;位 2:设置打开 LCD
TBR EQU 0EH ;查表寄存器
INX EQU 0FH ;间接寻址伪索引寄存器
DPL EQU 10H ;INX 数据指针低四位
DPM EQU 11H ;INX 数据指针中三位
DPH EQU 12H ;INX 数据指针高三位
OSDUTY EQU 15H ;位 1-0:选择 LCD 占空比, 位 2:设置 PORTC 作为 SEG1-4, 位 3:设置
;PORTD 作为 SEG5-8
WDT EQU 1EH ;位 2-0:看门狗定时控制寄存器, 位 3:看门狗溢出标志
;************************************************
; 系统寄存器 BANK6(LCD)
;************************************************
第 16 页
SEG1 EQU 00H ;SEG1 寄存器
SEG2 EQU 01H ;SEG2 寄存器
SEG3 EQU 02H ;SEG3 寄存器
SEG4 EQU 03H ;SEG4 寄存器
SEG5 EQU 04H ;SEG5 寄存器
SEG6 EQU 05H ;SEG6 寄存器
SEG7 EQU 06H ;SEG7 寄存器
SEG8 EQU 07H ;SEG8 寄存器
;************************************************
; 用户定义寄存器 (BANK0)
;************************************************
AC_BAK EQU 28H ;AC 值备份寄存器
TMP EQU 29H ;临时寄存器
FLAG1 EQU 2AH ;位 0=1, 已计一次 0.5 秒
;位 1=1 为 PM, 位 1=0 为 AM
SEC_L EQU 2BH ;秒钟低位寄存器
SEC_H EQU 2CH ;秒钟高位寄存器
MIN_L EQU 2DH ;分钟低位寄存器
MIN_H EQU 2EH ;分钟高位寄存器
HOU_L EQU 2FH ;时钟低位寄存器
HOU_H EQU 30H ;时钟高位寄存器
;************************************************
; 程序
;************************************************
ORG 0000H
JMP RESET
RTNI
RTNI
JMP BASETIMER ;基准定时器中断服务程序入口
RTNI
;*******************************************
; 子程序: BASETIEMR 中断服务程序
;*******************************************
BASETIMER:
STA AC_BAK,00H ;备份 AC 值
ANDIM IRQ,1101B ;清基准定时器中断请求标志
BASETIMER_END:
LDI IE,0010B ;打开基准定时器中断
第 17 页
LDA AC_BAK,00H ;取出 AC 值
RTNI
;*******************************************
; 上电程序
;*******************************************
RESET:
NOP
LDA WDT,00H ;重置 WDT
;--------------------------------------
;先清用户寄存器
POWER_RESET:
LDI DPL,08H
LDI DPM,02H
LDI DPH,00H
POWER_RESET_1:
LDI INX,00H
ADIM DPL,01H
LDI TBR,00H
ADCM DPM,00H
BA3 POWER_RESET_2
JMP POWER_RESET_3
POWER_RESET_2:
ADIM DPH,01H
ANDIM DPM,0111B
POWER_RESET_3:
SBI DPH,01H
BNZ POWER_RESET_1
SBI DPM,02H
BNZ POWER_RESET_1
SBI DPL,08H
BNZ POWER_RESET_1
;--------------------------------------
;上电时,先对驱动 LCD 的寄存器进行清零,以免打开 LCD 时出现乱点
CLR_LCD:
LDI DPL,00H
LDI DPM,00H
LDI DPH,06H
CLR_LCD_1:
第 18 页
LDI INX,00H
ADIM DPL,01H
CLR_LCD_2:
SBI DPL,08H
BNZ CLR_LCD_1
;--------------------------------------
;初始化系统寄存器
SYSTEM_INITIAL:
;初始化基准定时器
LDI BTM,1010B ;设置基准定时器预分频为/8, 中断定时为 0.5s
;初始化 LCD 驱动模块
LDI OSDUTY,1100B ;设置 PORTC 作为 SEG1-4, 设置 PORTD 作为 SEG5-8,
;1/4 占空比, 1/3 偏压, SEG29/COM4 作为 COM4 使用
LDI LCDON,0100B ;打开 LCD
;初始化 WDT
LDI WDT,0001B ;设置看门狗定时为 1s
;--------------------------------------
;初始化用户寄存器
USER_INITIAL:
LDI HOU_H,01H ;设置初始时间为 AM12:00
LDI HOU_L,02H
LDI MIN_H,00H
LDI MIN_L,00H
;--------------------------------------
MAIN_PRE:
LDI IRQ,00H
LDI IE,0010B ;打开基准定时器中断
;*********************************
MAIN:
NOP
HALT ;进入 HALT 模式,等待中断唤醒,不影响 LCD 显示
NOP
NOP
;*********************************
TIME:
LDA WDT,00H ;重置 WDT
LDA FLAG1,00H
BA0 TIME_ADDS ;之前已计一次 0.5s,应该加上 1s
第 19 页
ORIM FLAG1,0001B ;置 "已计一次 0.5s"标志
JMP TIME_END
TIME_ADDS:
ANDIM FLAG1,1110B ;清"已计一次 0.5s"
ADIM SEC_L,01H ;秒数加一
DAA SEC_L
LDI TBR,00H
ADCM SEC_H,00H
SBI SEC_H,06H
BAZ TIME_ADDM ;满 60 秒,分钟应该加一
JMP TIME_END
TIME_ADDM:
LDI SEC_H,00H ;清秒钟为 00
ADIM MIN_L,01H ;分钟加一
DAA MIN_L
LDI TBR,00H
ADCM MIN_H,00H
SBI MIN_H,06H
BAZ TIME_ADDH ;满 60 分,时钟应该加一
JMP TIME_END
TIME_ADDH:
LDI MIN_H,00H ;清分钟为 00
SBI HOU_H,01H
BNZ TIME_ADDH_2
SBI HOU_L,02H
BNZ TIME_ADDH_2 ;时钟不是 12 点,跳转
;时钟为 12 点,下一个小时应该是 1点,设置时钟为 01
TIME_ADDH_1:
LDI HOU_H,00H
LDI HOU_L,01H
JMP TIME_END
TIME_ADDH_2:
ADIM HOU_L,01H ;时钟加一
DAA HOU_L
LDI TBR,00H
ADCM HOU_H,00H
SBI HOU_H,01H
BNZ TIME_END
第 20 页
SBI HOU_L,02H
BNZ IME_END ;加完时钟后不是 12 点,跳转
;加完之后时钟为 12 点,该转换 AM 和 PM
EORIM FLAG1,0010B ;转换 AM/PM 标志
TIME_END:
;**************************************
; 模块: LCD 显示模块
; 输入变量: FLAG1,MIN_L,MIN_H,HOU_L,HOU_H
; 使用变量: TBR,TMP
; 输出变量: SEG1,SEG2,SEG3,SEG4,SEG5,SEG6,SEG7,SEG8
;**************************************
DISP:
LDI TBR,1000B
EORM SEG2,06H
LDI TBR,1000B
EORM SEG4,06H ;每 0.5 秒,改变":"的亮/灭,达到闪烁 ":",周期为 1秒
DISP_AMPM:
LDA FLAG1,00H
BA1 DISP_PM ;PM,跳转
DISP_AM:
LDI TBR,0111B
ANDM SEG8,06H ;清"PM"显示
LDI TBR,1000B
ORM SEG6,06H ;显示"AM"
JMP DISP_M
DISP_PM:
LDI TBR,0111B
ANDM SEG6,06H ;清"AM"显示
LDI TBR,1000B
ORM SEG8,06H ;显示"PM"
DISP_M:
LDI TBR,0FH
LDA MIN_L,00H
CALL 07FAH ;查表得显示数据
STA SEG1,06H ;显示分钟低位的 dcba 四段
LDI TMP,1000B
ANDM SEG2,06H
LDA TBR,00H
第 21 页
ORM SEG2,06H ;显示分钟低位的 egf 三段
LDI TBR,0FH
LDA MIN_H,00H
CALL 07FAH ;查表得显示数据
STA SEG3,06H ;显示分钟高位的 dcba 四段
LDI TMP,1000B
ANDM SEG4,06H
LDA TBR,00H
ORM SEG4,06H ;显示分钟高位的 egf 三段
DISP_H:
LDI TBR,0FH
LDA HOU_L,00H
CALL 07FAH ;查表得到显示数据
STA SEG5,06H ;显示时钟低位的 dcba 四段
LDI TMP,1000B
ANDM SEG6,06H
LDA TBR,00H
ORM SEG6,06H ;显示时钟低位的 egf 三段
LDA HOU_H,00H
BAZ DISP_H_1 ;时钟高位若为 0, 不显示高位,跳转
LDI TBR,0FH
LDA HOU_H,00H
CALL 07FAH ;查表得到显示数据
STA SEG7,06H ;显示时钟高位的 dcba 四段
LDI TMP,1000B
ANDM SEG8,06H
LDA TBR,00H
ORM SEG8,06H ;显示时钟高位的 egf 三段
JMP DISP_END
DISP_H_1:
LDI TBR,00H
STA SEG7,06H
LDI TBR,1000B
ANDM SEG8,06H ;清时钟高位显示
DISP_END:
;**************************************
第 22 页
JMP MAIN
;************************************************
;LCD 显示数据表:根据 LCD 的矩阵表定出数据表是按 egf,dcba 来建立的
ORG 07F0H
;0egf, dcba
RTNW 0101B,1111B ;0
RTNW 0000B,0110B ;1
RTNW 0110B,1011B ;2
RTNW 0010B,1111B ;3
RTNW 0011B,0110B ;4
RTNW 0011B,1101B ;5
RTNW 0111B,1101B ;6
RTNW 0000B,0111B ;7
RTNW 0111B,1111B ;8
RTNW 0011B,1111B ;9
ORG 07FAH
TJMP
END