📄 lcd_driver.c
字号:
/*****************************************************************************************************
* 华南理工大学
* 机械工程学院 焊接研究所
* South China University of Technology
* (c) Copyright 2006, Leon Lee
* All Rights Reserved
*
* 项目名称: ARM_STUD_CONTROLLER.UV2
*
* 文件名称: Lcd_driver.c
*
* 作 者: Happy Xu
*
* 描 述: 基于PHILIPS LPC2136/38控制的逆变电源控制器焊接过程控制程序
*
* 备 注:
*
* 版 本:
* 版本号 | 日 期 | 签 名 | 描述
* ------------+----------+----------+----------------------------------------------
* V1.0 |2007/11/27| Happy Xu | 原始版本
* ------------+----------+----------+----------------------------------------------
*
*****************************************************************************************************/
#include "Arm-stud_Controller.h"
#include "../picture/hugonglabel.h"
#define SystemSet 0x40 //初始化器件和显示
U8 ParaSysTable8[] = {0x30, 0x87, 0x07, 0x27, 0x42, 0xf0, 0x28, 0x00};// “初始化设置”的命令参数表常量声明
/*
“初始化设置”的命令参数表,共有8个字节具体定义如下:
┏━━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┓
┃ 参数1 ┃ DR ┃ 0 ┃ B ┃ 1 ┃ W/S ┃ M2 ┃ M1 ┃ M0 ┃
┣━━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━┫
┃ 设置值 ┃ 0 ┃ 0 ┃ 1 ┃ 1 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ = 0x30
┗━━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┛
DR ------ 辅助位移时钟周期的选择位,通常 DR=0。
DR=0:正常运行;DR=1:使用辅助位移时钟周期。
备注:在控制双屏显示时需要液晶模块一行像素为64的整倍数,如果不是则控制器自动通
过填充数据“0”来凑齐64位,此时就需要增加辅助位移时钟周期。
B ------- 调整负向显示字符时的屏面边界,通常 B=1。
B=0:画面首行为边界;B=1:无边界。
备注:在文本方式下,第一行显示的字符是顶天的,没有天头。所以在制作负向字符显示时
的效果就不太理想。此时使用 B 参数位在显示控制时制造出一行空行作为天头,以达
到理想的显示效果。
W/S ----- 驱动系统配置。
W/S=0:单屏结构LCD驱动系统;W/S=1:双屏结构LCD驱动系统。
M2 ------ 选择外部字符发生器的字符点阵格式。
M2=0:8×8点阵字体;M2=1:8×16点阵字体。
M1 ------ 选择外部字符发生器CGRAM的字符代码范围。
M1=0:选择 0x80~0x9F 范围字符代码;
M1=1:选择 0x80~0x9F 和 0xE0~0xFF 范围字符代码。
M0 ------ 内、外字符发生器的选择。
M0=0:内部字符发生器有效;M0=1:外部字符发生器有效,此时内部字符发生器被屏蔽。
┏━━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━━━━━━━━━┓
┃ 参数2 ┃ WF ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ FX ┃
┣━━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━┳━━━┳━━━┫
┃ 设置值 ┃ 1 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 1 ┃ 1 ┃ 1 ┃ = 0x87
┗━━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┛
WF ------ 选择驱动器的交流驱动波形,通常 WF=1。
FX ------ 显示字符的宽度(点列数)。
FX=0:字宽度+字间距;FX=0x00~0x07。
备注:如果 FX 大于实际字符点阵的宽度,则余出的部分作为空点置于字符的右侧,形成字
符列间距。FX 取值在 0x00~0x07 范围内,代表1~8列/字符点阵。
┏━━━━┳━━━┳━━━┳━━━┳━━━┳━━━━━━━━━━━━━━━┓
┃ 参数3 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ FY ┃
┣━━━━╋━━━╋━━━╋━━━╋━━━╋━━━┳━━━┳━━━┳━━━┫
┃ 设置值 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 1 ┃ 1 ┃ 1 ┃ = 0x07
┗━━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┛
FY ------ 显示字符的高度(点行数)。
FX=0:字高度+字间距;FX=0x00~0x0F。
备注:如果 FY 大于实际字符点阵的高度,则余出的部分作为空点置于字符的下方,形成字
符行间距。FX 取值在 0x00~0x0F 范围内,代表1~16行/字符点阵。
┏━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 参数4 ┃ C/R ┃
┣━━━━╋━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┫
┃ 设置值 ┃ 0 ┃ 0 ┃ 1 ┃ 0 ┃ 0 ┃ 1 ┃ 1 ┃ 1 ┃ = 0x27
┗━━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┛
C/R ----- 设置有效显示窗口的宽度,C/R 表示在LCD上有效显示的字符数。
C/R 值设置显示屏幕上一行显示所占显示存储单元的字节数。C/R=0x00~0xEF。
例如:LCD屏幕上一行能显示30个字符,C/R 值设置为 30 ,则一行全显示满了;若
C/R 值设置为 25 ,则LCD一行左起显示25个字符而后5个字符位置为空白。
备注:C/R 值可以选择比显示屏的实际长度值小,但是余留部分不能超过64点列=8字节。
┏━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 参数5 ┃ TC/R ┃
┣━━━━╋━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┫
┃ 设置值 ┃ 0 ┃ 1 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 1 ┃ 0 ┃ = 0x42
┗━━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┛
TC/R ---- LCD驱动频率的时间常数,C/R 表示将晶振频率 Fosc 转换成LCD驱动工作频率 FR 的
时间常数。其可以由两个公式联合求出:
Fosc ≥ 9 × TC/R × L/F × FR
TC/R ≥ C/R + 4
其中 L/F 为扫描点行数;FR 为LCD显示帧扫描频率,通常 FR=70Hz。
一般情况下可以简单地由下式求出:TC/R ≥ C/R + 4 。
备注:本参数的设置有时是非常重要的,错误的设置可引起以下几种现象:
▲.行扫描停止且出现高对比度的水平线。
▲.显示不稳定,出现闪烁或全亮或全暗。
▲.LP 信号不足或不存在。
▲.在控制大规模液晶显示模块时,最大晶体振荡频率 10MHz 下,要满足 TC/R 取值
要求,就要降低液晶显示的帧扫描频率了。
┏━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 参数6 ┃ L/F ┃
┣━━━━╋━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┫
┃ 设置值 ┃ 1 ┃ 1 ┃ 1 ┃ 1 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ = 0xF0
┗━━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┛
L/F ----- LCD扫描点行数,L/F=0x00~0xFF。
┏━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 参数7 ┃ APL ┃
┣━━━━╋━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┫
┃ 设置值 ┃ 0 ┃ 0 ┃ 1 ┃ 0 ┃ 1 ┃ 0 ┃ 0 ┃ 0 ┃ = 0x28
┗━━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┛
┏━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 参数8 ┃ APH ┃
┣━━━━╋━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┫
┃ 设置值 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ = 0x00
┗━━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┛
AP ------ 显示屏幕上一行所占显示存储单元的字节数。
AP 为双字节参数,APH 为高8位,APL 为低8位。
通常 AP 取值为 C/R+1 或大于 C/R 值的整数,以方便计算整个显示行的显示存储器地址。
*/
#define Ovlay 0x5b // “显示区的合成方式及显示1区和3区的显示属性设置”的控制命令代码
/*
“显示区的合成方式及显示1区和3区的显示属性设置”的命令参数,共有1个字节具体定义如下:
┏━━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┓
┃ 参数1 ┃ 0 ┃ 0 ┃ 0 ┃ OV ┃ DM2 ┃ DM1 ┃ MX1 ┃ MX0 ┃
┣━━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━┫
┃ 设置值 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 1 ┃ 1 ┃ 0 ┃ 0 ┃ = 0x0c
┗━━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┛
OV ------ 选择显示区画面的合成方式。
OV=0:二重合成显示,用于文本与图形或图形与图形的混合显示;
OV=1:三重合成显示,仅用于图形混合显示。
DM2 ----- 显示3区的显示属性。
DM2=0:设置显示3区为文本显示属性,其数据均作为字符代码处理;
DM2=1:设置显示3区为图形显示属性,其数据均作为图形数据处理。
DM1 ----- 显示1区的显示属性。
DM2=0:设置显示1区为文本显示属性,其数据均作为字符代码处理;
DM2=1:设置显示1区为图形显示属性,其数据均作为图形数据处理。
MX1、MX0 --- 合成显示逻辑运算方式的组合设置。本组合设置共有下列4种合成显示逻辑运算方式:
MX1 MX0 合成显示逻辑运算方式 用途
0 0 逻辑或 底线坐标和文本图形混合显示
0 1 逻辑异或 负向字符显示,区域内闪烁底线
1 0 逻辑与 简单动画立体表达式
1 1 优先叠加 简单动画立体表达式
备注:合成显示逻辑运算产生的结果仅改变显示画面而不改变各显示区的内容。
*/
#define Scroll 0x44 //设定显示起始地址和显示范围
#define BasePart1 0x00
#define BasePart2 0x40
#define BasePart3 0x80
#define BasePart4 0x00
U8 ParaScrTableA[] = {0x00, BasePart1, 0xF0, 0x00, BasePart2, 0xF0, 0x00, BasePart3, 0x00, BasePart4};
/*
“显示区域设置”的命令参数表,共有10个字节具体定义如下:
ParaScrTableA[] =
{(SED1335_DB_1_ADDR & 0x00FF), (SED1335_DB_1_ADDR >> 8), SED1335_MAX_COLUMN,
(SED1335_DB_2_ADDR & 0x00FF), (SED1335_DB_2_ADDR >> 8), SED1335_MAX_COLUMN,
(SED1335_DB_3_ADDR & 0x00FF), (SED1335_DB_3_ADDR >> 8),
(SED1335_DB_4_ADDR & 0x00FF), (SED1335_DB_4_ADDR >> 8)}
┏━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 参数1 ┃ SAD1L ┃
┣━━━━╋━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┫
┃ 设置值 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ = 0x00
┗━━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┛
┏━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 参数2 ┃ SAD1H ┃
┣━━━━╋━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┫
┃ 设置值 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ = 0x00
┗━━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┛
SAD1 ---- 设置第1显示区在显示存储单元的首个地址。
SAD1 为双字节参数,SAD1H 为高8位,SAD1L 为低8位。
备注:本区为显示主区间,占用9600字节空间。
┏━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 参数3 ┃ SL1 ┃
┣━━━━╋━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┫
┃ 设置值 ┃ 1 ┃ 1 ┃ 1 ┃ 1 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ = 0xF0
┗━━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┛
SL1 ----- 设置第1显示区占有显示屏上的点行数。
┏━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 参数4 ┃ SAD2L ┃
┣━━━━╋━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┫
┃ 设置值 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ = 0x00
┗━━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┛
┏━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 参数5 ┃ SAD2H ┃
┣━━━━╋━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┫
┃ 设置值 ┃ 0 ┃ 4 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ = 0x40
┗━━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┛
SAD2 ---- 设置第2显示区在显示存储单元的首个地址。
SAD2 为双字节参数,SAD2H 为高8位,SAD2L 为低8位。
备注:本区为显示主区间,占用9600字节空间。
┏━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 参数6 ┃ SL2 ┃
┣━━━━╋━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┫
┃ 设置值 ┃ 1 ┃ 1 ┃ 1 ┃ 1 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ = 0xF0
┗━━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┛
SL2 ----- 设置第2显示区占有显示屏上的点行数。
┏━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 参数7 ┃ SAD3L ┃
┣━━━━╋━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┫
┃ 设置值 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ = 0x00
┗━━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┛
┏━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 参数8 ┃ SAD3H ┃
┣━━━━╋━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┫
┃ 设置值 ┃ 1 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ = 0x80
┗━━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┛
SAD3 ---- 设置第3显示区在显示存储单元的首个地址。
SAD3 为双字节参数,SAD3H 为高8位,SAD3L 为低8位。
备注:本区为第1显示区的补充区间,作为文本区定义,占用2K空间。
┏━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 参数9 ┃ SAD4L ┃
┣━━━━╋━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┫
┃ 设置值 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ = 0x00
┗━━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┛
┏━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃参数10┃ SAD4H ┃
┣━━━━╋━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┫
┃ 设置值 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ = 0x00
┗━━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┛
SAD4 ---- 设置第4显示区在显示存储单元的首个地址。
SAD4 为双字节参数,SAD4H 为高8位,SAD4L 为低8位。
备注:本区为第2显示区的补充区间,作为文本区定义,占用2K空间。
备注:后面预留空间将作为 CGRAM 使用。
*/
#define HdotScr 0x5a // “以点为单位的显示画面的水平位移量设置”的控制命令代码
/*
“以点为单位的显示画面的水平位移量设置”的命令参数具体定义如下:
┏━━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━━━━━━━━━┓
┃ 参数1 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ D ┃
┣━━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━┳━━━┳━━━┫
┃ 设置值 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ 0 ┃ = 0x00
┗━━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┛
D 取值在 0x00~0x07 范围内。
当 D 取值由 0x00 有规律的递增至 0x07 时,显示画面呈现左移效果;
当 D 取值由 0x07 有规律的递减至 0x00 时,显示画面呈现右移效果。
备注:本命令与“SED1335_SCROLL”命令结合使用方法:显示左移时,首先使用“SED1335_HDOTSCR”命
令使点位移参数从 0x00 -> 0x07,然后使用“SED1335_SCROLL”命令将显示起始地址 SAD 加
1,并同时将“SED1335_HDOTSCR”参数清零。循环上述过程,将产生显示水平向左点位移的效果。
显示右移时,首先使用“SED1335_HDOTSCR”命令使点位移参参从 0x07 -> 0x00,然后使用
“SED1335_SCROLL”命令将显示起始地址 SAD 减 1,并同时将“SED1335_HDOTSCR”参数置为
0x07。循环上述过程,将产生显示水平向右点位移的效果。
*/
#define DispOn 0x59 // “打开显示状态”的控制命令代码
#define DispOff 0x58 // “关闭显示状态”的控制命令代码
/*
“显示状态设置”的命令参数具体定义如下:
┏━━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┓
┃ 参数 ┃ FP5 ┃ FP4 ┃ FP3 ┃ FP2 ┃ FP1 ┃ FP0 ┃ FC1 ┃ FC0 ┃
┣━━━━╋━━━┻━━━╋━━━┻━━━╋━━━┻━━━╋━━━┻━━━┫
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -