📄 1335c51.c
字号:
#include <reg52.h>
#include <stdlib.h>
#include <intrins.h>
#include <stdio.h>
#include "TypeDefines.h"
#include "1335c51.h"
#include "delay.h"
extern uchar code Cdotlib[][16];
extern int idata hight_limit;
extern int idata sensitive_limit;
extern int idata delay_value; //延时值(ms)
//============================ 1335 常用指令列表 ===============================
//初始化设置。A0=1..写指令/0...读写参数。后续8字节参数串ParaSysTable8[]
#define SystemSet 0x40 // 时序要求:/WR=0;/RD=1
uchar code ParaSysTable8[]= {
0x32,0x87,0x07,0x27,0x42,0xf0,0x28,0x00 // P1-P8参数
};
// 30H,87H,07H,27H,42H,0F0H,30H,00H
/*SystemSet初始化设置参数表,共八字节具体定义如下:
P1 [ DR | 0 | IV | 1 | W/S | M2 | M1 | M0 ] = 0x30
0 0 1 1 0 0 0 0
DR.... 辅助位移时钟周期的选择位。DR=0为正常运行;DR=1为使用辅助位移时钟周期。
通常=0
[说明]在控制双屏显示时需要液晶模块一行像素为64的整倍数,如果不是则控制器自
动通过填充数据'0'来凑齐64位,此时就需要增加辅助位移时钟周期。
IV.... 负向字符显示时屏面边界选择位。=0为首行作为边界;=1则无边界。通常=1
[说明]在文本方式下,第一行显示的字符是顶天的,没有天头。所以在制作负向字
符显示时的效果就不太理想。此时使用IV参数位在显示控制时制造出一行空行
作为天头,以达到理想的显示效果。
W/S... 适配驱动系统选择位。改为将选择产生驱动时序信号的类型。0为单屏结构液晶
显示驱动系统;1为双屏结构液晶显示驱动系统
M2.... 外部字符发生器的字体选择位。0=8*8;1=8*16
M1.... 外部字符发生器Cgram代码区选择位。0选择Cgram1字符代码为0x80~0x9f;1选择
Cgram1 + Cgram2,字符代码为0x80~9f和0xe0~0xff
M0.... 字符发生器选择位. 0为内部字符发生器;1为外部字符发生器。
[说明]M2,M1,M0组合设置了字符发生器的结构
P2 [ WF | 0 | 0 | 0 | 0 | FX ] = 0x87
1 0 0 0 0 1 1 1
WF.... 交流驱动波形选择位。0为C型驱动波形,行翻转驱动波形,交流驱动波形输出
WF每16行翻转1次;1为B型驱动波形,交流驱动波形输出每一帧翻转1次,通常
取1
FX.... 字符体宽度设置参数(点列数)。若FX大于实际字符体的宽度,则余出的部分
作为空点置于字符体的右侧,形成字符字间距。FX取值在0~7范围内,代表1~8
列/字符体。
P3 [ WF | 0 | 0 | 0 | FY ] = 0x07
0 0 0 0 0 1 1 1
WF.... 同上;
FY.... 字符体高度设置参数(点行数)。若FY大于实际字符体的宽度,则余出的部分
作为空点置于字符体的下方,形成字符行间距。FY取值在0~0xf之间,代表1-16
点行/字符体
P4 [ C/R ] = 0x27
C/R... 有效显示窗口宽度设置参数。C/R值设置了显示屏上一行显示所占显示存储器的
单元数(字节数)。C/R取值在0~0xef范围内,表示显示屏上一个显示行所占
显示存储器的单元数为1~240个字节。
[说明]C/R值可以选择得比显示屏的实际长度值小,但是余留部分不能超过64点列
=8字节
P5 [ TC/R ] = 0x42
TC/R.. 驱动频率的时间常数。TC/R是晶振频率Fosc转换成液晶显示驱动工作频率FR的
时间常数。它可以简单地由下式求出:
TC/R >= C/R +4
[说明] 该参数的设置有时是非常重要的。错误的设置可引起以下几种现象:
*行扫描停止且出现高对比度的水平线
*显示不稳定,出现闪烁或全亮或全暗
*LP信号不足或不存在。
在取值时还是允许有一定的选取范围的。
TC/R与震荡频率的关系为: Fosc >= 9 * TC/R * L/F * FR
TC/R也可以由以上两个公式联合求出。FR为液晶显示帧扫描频率,通常=70Hz.
在控制大规模液晶显示模块时,最大震荡频率10MHz下,要满足TC/R取值要求,
就要降低液晶显示的帧扫描频率了。
P6 [ L/F ] = 0xF0
L/F... 扫描驱动的帧参数。L/F值设置了控制器所要控制的液晶显示驱动系统的扫描数,
其倒数为占空比系数。当液晶显示驱动系统为单屏结构时,L/F即为1帧的扫描
行数;当液晶显示驱动系统为双屏结构时,L/F为1帧扫描行数的2倍,此时L/F
必须为偶数值。L/F取值范围在0~0xff范围内,对应扫描行数为1~256行。
P7 [ APL ] = 0x30
P8 [ APH ] = 0x00
ap在显示存储器内分配一个显示行的单元数(字节数)。ap为双字节参数,apl为低8位,
aph为高8位。通常AP取值为C/R + 1或大于C/R值的整数,以方便计算个显示行的显示存
储器地址。
*/
//显示域设置。A0=1..写指令/0...读写参数。后续10字节参数串ParaScrTableA[]
#define Scroll 0x44 // 时序要求:/WR=0;/RD=1
#define BasePart1 0x00
#define BasePart2 0x40
#define BasePart3 0x80
#define BasePart4 0x00
uchar code ParaScrTableA[]= {
0x00,BasePart1,0xF0,0x00,BasePart2,0xF0,0x00,BasePart3,0x00,BasePart4
};
/*..............................................................................
该指令设置了四个显示区的起始地址SAD合格区所控制的显示行数SL.设置的参数与‘系统
设定’指令设置的参数结合将确定显示RAM中的各显示区域范围与有效的显示区域。定时间
定量地递增或递减某区的起始地址SAD,将产生显示画面的平滑滚动。该指令有10个参数。
部分参数的设置是有效的,但设置的顺序不能改变也不能省略。Scroll初始化设置参数表,
共10字节具体定义如下:
................................................................................
P1 [ SAD1L ] = 0x00
P2 [ SAD1H ] = 0x00
SAD1显示1区首地址。SAD1确定了第1显示区的起始地址。他由双字节组成。
本区为显示主区间,占用8K空间
P3 [ SL1 ] = 0xF0
SL1显示一区所控制的显示屏上的行数:0~(L/F)
................................................................................
P4 [ SAD2L ] = 0x00
P5 [ SAD2H ] = 0x40
SAD2显示2区首地址。SAD2确定了第2显示区的起始地址。他由双字节组成。
本参数表定义这个区占用8K空间
P6 [ SL2 ] = 0xF0
SL2显示2区所控制的显示屏上的行数:0~(L/F)
................................................................................
P7 [ SAD3L ] = 0x00
P8 [ SAD3H ] = 0x40
SAD3显示3区首地址。SAD3确定了第3显示区的起始地址。他由双字节组成。
作为文本区定义,占用2K空间
................................................................................
P9 [ SAD4L ] = 0x00
P10 [ SAD4H ] = 0x00
SAD4显示4区首地址。SAD4确定了第4显示区的起始地址。他由双字节组成。
作为文本区定义,占用2K空间
................................................................................
后面预留空间将作为cgram使用
..............................................................................*/
//休闲模式设置。A0=1;/WR=0;/RD=1;后续参数:无
#define SleepIn 0x53
/*该指令强制SED1335等进入休闲工作方式。在该指令输入后,SED1335等在扫描最后一行时
将列驱动器清零;置YDIS=0,使液晶显示驱动系统关闭显示驱动电源;将显示存储器管理信
号/VCE=1,以保护显示数据不被破坏;终止包括振荡器在内的所有内部逻辑电路的运行,但
保存原设置的参数,使其进入休闲方式。退出休闲方式需要计算机重新写入'SYSTEM SET'指
令的P1参数。该指令无效。
*/
//显示状态设置。A0=1..ON/0..OFF;/WR=0;/RD=1.后续参数1字节:
#define DispOn 0x59
#define DispOff 0x58
/*代码 [ 0 1 0 1 1 0 0 ON/OFF ]
该指令设置了显示的各种状态。他们有显示开关的设置,光标的显示状态的设置和各显示区
显示状态的设置。在指令代码中就含有一个参数位:=0关显示;=1开显示。
[说明]该参数位控制着显示的总开关状态。
后续参数:[ FP5 FP4 FP3 FP2 FP1 FP0 FC1 FC0 ]
FC1,FC0..光标状态设置位。他们组合设置了光标显示的4种状态:
==========================================
FC1 FC0 光 标 状 态
==========================================
0 0 光标显示关闭
0 1 光标显示但不闪烁
1 0 光标以 FR/32Hz 的频率闪烁显示
1 1 光标以 FR/64Hz 的频率闪烁显示
==========================================
[注]光标闪烁的亮与暗占空比为7:3
FP1,FP0...显示一区状态设置位.他们组合设置了一区显示的4种状态
FP3,FP2...显示二、四区状态设置位.他们组合设置了二、四区显示的4种状态
FP5,FP4...显示三区状态设置位.他们组合设置了三区显示的4种状态
==========================================
FP1 FP0 显示一区显示状态
FP3 FP2 显示二、四区显示状态
FP5 FP4 显示三区显示状态
==========================================
0 0 画面显示关闭
0 1 画面显示但不闪烁
1 0 画面以 FR/32Hz的频率闪烁显示
1 1 画面以 FR/64Hz的频率闪烁显示
==========================================
[注]画面闪烁的亮与暗占空比为7:3
[说明]:这些参数位都是控制着各显示区的显示状态。该状态的实现需要在总开关为开状态
时有效。
*/
//显示合成方式设置。A0=1..写指令/0...读写参数;/WR=0;/RD=1.后续参数1字节:
#define Ovlay 0x5b
/* 该指令设置了显示区的合成显示方式以及显示1区和3区的显示方式。该指令带有一个参
数。参数的功能如下:
P [ 0 0 0 OV DM2 DM1 MX1 MX0 ]
OV...显示合成设置位。=0为二重合成显示,用于文本与图形或图形与图形的混合显示;=1为
三重合成显示,仅用于图形混合显示。
[说明1]:二重合成显示方式是将两个显示区的内容经某一种逻辑运算合成出新的显示数据
从而产生新的显示画面。该方式将以第一、第二显示区为主,第三第四显示区为辅的合
成,合成方式如下:
SAD2 +--------+ --- SAD2 +----------+ ---
|L2 | |L2 | ^
SAD1 +--------+ | SAD1-+---------+ | |
|L1 | | SL2 |L1 | |
(SL1) | | | (SL1) | | | SL2
| |-+ --- SAD3 |---------| | |
| | | |L3 |---+ ---
+--------+ + 新数据 (L/F-SL1)| | |
逻辑 +---------+ - +->新数据
运算 逻辑
运算
(a)单屏结构:显示1,2区参加的 (b)单屏结构:显示1,2,3区参加的
二重合成显示方式 二重合成显示方式(一)
SAD2-- +----------+ ---- SAD2-- +-----------+ ---
| L2 | (SL2) | L2 | (SL2)
SAD1--+---------+ | SAD1- +----------+ |
| L1 |--+ - SAD3 (SL1) | L1 |--+ ---
| |L3| | |L4| (L/F-SL2)
| | | (SL3) SAD3- +----------+ |
| |--+ ---- | L3 |--+ ---
| | v (L/F-SL1)| | v
+---------+- + 新数据 +----------+->+ 新数据
逻辑 逻辑
运算 运算
(c)单屏结构:显示1,2,3区参加的 (d)单屏结构:显示1,2,3,4区参加的
二重合成限时方式(二) 二重合成限时方式
[说明2]:三重合成显示方式是将三个显示区的内容经某一种或二种逻辑运算合成出新的显示
数据从而产生新的显示画面。该方式将以第一、第二、第三显示区参加的合成,合成方
式如下:
SAD3------ +---------------+
| L3 |
SAD2---- +---------------+ |
|L2 | |
SAD1-- +---------------+ | |
|L1 | |--+
| | | |
| |--+ |
| | v v
+---------------+->+--+->新数据
逻辑
运算
MX1,MX0....显示合成方式设置位。组合设置了4种合成显示方式:
==============================================================================
MX1 MX0 合成方式 用途
==============================================================================
0 0 L1 or L2 or L3 简单逻辑或合成 底线坐标和文本图形混合显示
0 1 (L1 xor L2) or L3 逻辑异或。或合成 负向字符显示,区域内闪烁底线
1 0 (L1 and L2) or L3 逻辑与。或合成 简单动画立体表达式
1 1 L1 > L2 > L3 优先叠加 简单动画立体表达式
==============================================================================
[说明]
1。合成显示产生的结果仅改变显示画面而不改变各显示区的内容
2。优先叠加合成显示是三个显示区以L1覆盖L2、L2覆盖L3的方式逻辑或合成显示,当关
闭L1时,L2和L3与L1相同的显示部分(为'1'处)被关闭;当L2被关闭时,L3与L2相同显
示的部分(为'1'处)被关闭。
DM1.......显示一区的显示属性位。DM1=0设置显示一区为文本显示属性,其数据均作为字
符代码处理;=1设置显示一区为图形显示属性,其数据均作为图形数据处理。
DM2.......显示三区的显示属性位。DM2=0设置显示三区为文本显示属性,其数据均作为字
符代码处理;=1设置显示三区为图形显示属性,其数据均作为图形数据处理。
*/
//点位移设置。A0=1..写指令/0...读写参数;/WR=0;/RD=1.后续参数1字节:
#define HdotScr 0x5a
/*该指令设置了以点为单位的显示画面的水平位移量。该指令的作用有二:1。在制作负向
显示字符时,与'SYSTEM SET'参数'IV'结合使用。通过设置该指令可以产生做边界,使得行
首字符有比较好的显示效果。2。在制作画面滚动显示效果时与'SCROOLL'指令结合产生水平
向点滚动的效果。但要注意的是该指令控制在显示数据合成之后向驱动系统输出之处,故该
指令所产生的滚动效果是针对所有参加显示的区,因此,要想使某一显示区产生点滚动而其
他显示区不动是不可能的??(可以在调用本指令以前先关闭其他显示区?)
附带参数: [ 0 0 0 0 0 D ]
D......水平点位移参数。D取值在0~7,当D取值由0->7方向递增时,显示画面呈现左移效果,
反之右移。
[说明]:与SCROLL指令结合使用方法:显示左移时,首先使用HDOY SCR指令使点位移参数从
0->7然后使用SCROLL指令将显示起始地址SAD加1,并同时将HDOT SCR参数清零。循环上述过
程,将产生显示水平向左点位移的效果。显示右移时,首先使用HDOY SCR指令使点位移参数
从7->0,然后使用SCROLL指令将显示起始地址SAD减1,并同时将HDOT SCR参数置7。循环上
述过程,将产生显示水平向右点位移的效果。
*/
//光标形状设置。A0=1..写指令/0...读写参数;/WR=0;/RD=1.后续参数2字节
#define CsrForm 0x5d
/* 该指令设置了光标的显示形状。光标的显示形状有线状形式和块状形式两种。光标的形
状是可以设置的。该指令所带的两个参数将实现对光标形状的设置。两参数功能如下:
P1 [ 0 0 0 0 0 CRX ]
CRX....光标形状水平方向点列数。CRX取值 0~7,对应实际点列1~8点, CRX<=FX.
P2 [ CM 0 0 0 0 CRY ]
CRY....光标形状垂直方向点行数。CRY取值范围 1~FH,对应实际点行1~16行,CRY=0或
CRY>FY无效
CM.....光标形状选择位。=0为线状光标显示;=1为块状光标显示。
[说明]:线状光标的形状由CRX确定其长度,由CRY确定其所占的显示行数,当CRY=FY时,
光标显示底线形式。光标显示仅在文本方式下有效。
*/
//Cgram首地址设置.A0=1..写指令/0...读写参数;/WR=0;/RD=1.后续参数2字节
#define CgramAdr 0x5c
/* 该指令设置了CGRAM在显示存储器内的起始地址SAG.从该地址SAG起的2K字节空间(M2=0)
或4K字节空间(M2=1)为CGRAM区域。该指令带有两个参数:
P1 [ SAGL ]
P2 [ SAGH ]
SAG.... CGRAM起始地址。SAGL为SAG的低8位,SAGH为SAG的高8位。
[说明]SAG所指向对应的是字符代码0的字模首地址,所以对于CGRAM1的首地址应该是SAG+
0x80*8,CGRAM2区域的字符代码为0xE0~0xFF,但是由于控制部在CGRAM2的首地址上安置了异
或0x40的电路,所以,CGRAM2的地址应按0xA0~0xBF计算,即CGRAM2的首地址为SAG+0xA0*8
*/
//光标移动方向设置。A0=1;/WR=0;/RD=1.后续参数:无
#define CsrDirR 0x4c
#define CsrDirL 0x4d
#define CsrDirU 0x4e
#define CsrDirD 0x4f
/* 该指令规定了光标指针CSR在计算机读写显示数据后自动修复的方向,从显示效果来说,
就是光标移动的方向设置。该指令的两个参数位DR1,DR0:
===========================
DR1 DR0 自动定位方向
===========================
0 0 右
0 1 左
1 0 上
1 1 下
===========================
*/
//光标指针设置。A0=1..写指令/0...读写参数;/WR=0/1;/RD=1/0(指令/后续参数读写).后
//续参数2字节
#define CsrW 0x46
/* 该指令设置了光标指针CSR.该指针有两个功能:1。作为当前光标显示的位置;2。作为
显示存储器当前的地址指针。2个参数:CSRL,CSRH
[说明]:当光标指针指向有效显示区域之外时,光标将自动消失,但不影响显示数据的读写。
光标指针在计算机的每次读写显示数据操作后,将根据最近设置的光标指针移动方向而自动
修正。光标指针不受画面滚动操作的影响。
*/
//读取光标指针。A0=1..写指令/0...读写参数;/WR=0;/RD=1.后续参数2字节
#define CsrR 0x47
/* 该指令代码写入后,计算机将从SED1335等数据通道读出当前的光标指针值。光标指针读
出的顺序是先CSRL再CSRH.
*/
//数据写入设置。A0=1..写指令/0...读写参数;/WR=0;/RD=1.后续参数N字节
#define mWrite 0x42
/*该指令写入后将允许计算机连续的向显示存储器内写入数据。写入的单元地址由光标指针
CSR提供,写操作完成后光标指针自动根据所设置的光标指针移动方向进行修改。显示数据
写入操作在计算机写入下一指令代码后结束。
*/
//数据读取设置。A0=1..写指令/0...读写参数;/WR=0;/RD=1.后续参数N字节
#define mRead 0x43
// 程序参数定义,根据用户选择的LCM型号修改
#define Busy 0x40 // 忙状态标志位0b0100 0000
#define paraP9 0x28 // 相对于320 X 240
#if 0
//菜单光标控制程序,控制光标开/关
void SurCtl(uint x0, uchar y0, uint xt, uchar yt, uchar att)
{
Rectangle(x0-7, y0-7, xt+7, yt+7, att);
Rectangle(x0-6, y0-6, xt+6, yt+6, att);
Rectangle(x0-5, y0-5, xt+5, yt+5, att);
if(att==0)
{
Linexy(x0-8,y0-8,x0-4,y0-4,1);
Linexy(x0-8,yt+8,x0-4,yt+4,1);
Linexy(xt+8,y0-8,xt+4,y0-4,1);
Linexy(xt+8,yt+8,xt+4,yt+4,1);
}
}
//============================== 西文显示演示程序 ==============================
// 仅仅用于文本方式下的西文字符串显示,本函数只写入第3显示区
void TextDisp( uchar Ox,uchar Oy, uchar *ptr )
{
uchar TexLength=0,ii;
uint iTemp;
while(ptr[TexLength]>0x1f) {TexLength++;}; // 获取字串长度
iTemp = Oy*paraP9+Ox;
//WriteCommand( CsrForm ); // 光标形状设置,代码0x5d
//WriteData( 0x07 ); // 设置光标水平点为CSX=8
//WriteData( 0x07 ); // 光标为块状形式,垂直点为CSY=8
//WriteCommand( DispOn ); // 写入指令DISP ON/OFF代码,后续参数:
//WriteData( 0x56 ); // 01 01 01 10显示1~4区开显示,光标闪烁显示
iTemp = (uint)Oy * paraP9 + Ox; // 光标位置到实际ram地址换算
WriteCommand( CsrDirR ); // 自动右移光标指向
WriteCommand( CsrW ); // 制定光标位置
WriteData( (uchar)(iTemp &0xff) ); // 设置光标地址CSR
WriteData( (uchar)(iTemp /256 + BasePart1) );
WriteCommand( mWrite ); // 当前位置写入数据指令
for(ii=0;ii < TexLength;ii++) {
WriteData( ptr[ii] ); // 写入显示字符代码
}
WriteCommand( DispOn );
WriteData( 0x54 );
}
#endif
//数字显示,por为是表示负数,要显示“-”
void NumDisp(uchar x0, uchar y0, int dat)
{
uint temp;
uint tempPtr;
tempPtr = (uint)y0*paraP9+x0-1;
WriteCommand(CsrDirR);
WriteCommand( CsrW ); // 制定光标位置
WriteData( (uchar)(tempPtr &0xff) ); // 设置光标地址CSR
WriteData( (uchar)(tempPtr /256 + BasePart1) );
WriteCommand( mWrite ); // 当前位置写入数据指令
if(dat<0)
{
WriteData('-');
dat-=1;
dat=~dat;
}
else
{
WriteData(' ');
}
WriteData(dat/1000+48);
temp=dat%1000;
WriteData(temp/100+48);
temp%=100;
WriteData(temp/10+48);
WriteData(temp%10+48);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -