市面上的LCD12864显示屏有很多种其中粗了分有带字库的和不带字库的,带字库的LCD因其自身带有各种字型ROM特别适合小存储微处理器使用。带字库LCD显示屏因其控制器不同又可以分为好几种,本文要介绍的金鹏电子生产的OCMJ4X8C_3型12864LCD显示屏是基于ST7920控制器,所以只要是该控制器驱动的显示屏大体使用是一样的。从金鹏电子官方下载OCMJ4X8C_3型LCD的技术资料,主要包括如下内容:
其中『C系列中文机内码表』主要包含该型号显示屏ROM中所包含的汉字及字符编码表;『演示程序』文件夹中为官方提供的51单片机显示程序,这个很重要,要知道有时候当说明书讲的似懂非懂时一段代码就把一切都给说清道明了,谁要写说明书的那家伙是工科男呢——说得很少,做的很好,我们总是不善于表达;剩下的pdf文件就是说明书了(废话,我不是文盲!),但是你不能指望你所遇到的每一个问题都能从说明书中得到解答,正如上面所说琢磨演示程序的代码有时候来到更透彻,同时别忘了反复的实验,因为实践是检验真理的唯一标准。
引脚说明:
引脚 |
名称 |
说明 |
引脚 |
名称 |
说明 |
1 |
VSS |
GND (0V) |
11 |
DB4 |
数据4 |
2 |
VDD |
Supply Voltage for logic (+5V) |
12 |
DB5 |
数据5 |
3 |
NC |
悬空 |
13 |
DB6 |
数据6 |
4 |
RS(CS) |
H:Data L:Instruction Code (Chip enable for serial mode) |
14 |
DB7 |
数据7 |
5 |
R/W(STD) |
H:Read L:Write (serial data for serial mode) |
15 |
PSB |
H:Parallel Mode L:Serial Mode |
6 |
E(SCLK) |
Enable Signal.高电平有效 (serial clock) |
16 |
NC |
|
7 |
DB0 |
数据0 |
17 |
/RST |
复位信号,低电平有效 |
8 |
DB1 |
数据1 |
18、19 |
保留 |
|
9 |
DB2 |
数据2 |
20 |
LEDA |
背光电源正极(+5V) |
10 |
DB3 |
数据3 |
21 |
LEDK |
背光负电源(0V) |
注:括号中的标识为串行通信标识。
串行通信:
① 引脚定义描述
VSS:液晶显示地(GND)。
VDD:液晶显示电源(+5V)。
CS:片选,使能信号,该引脚为高读写才能成功。
STD:数据信号。
SCLK:同步时钟信号,上升沿有效。
PSB:并口/串口选择信号。高电平定义为并口,低电平定义为串口通信。
/RST:复位信号,低电平有效。
LEDA:背光电源正。
LEDK:背光电源负。
② 通讯协议分析
当PSB脚接低电位时,LCD模块将进入串行传输模式。串行通信主要用到CS、SCLK、STD 三根线来实现,其中CS为片选使能,SCLK为同步时钟信号,STD为传输的数据信号。从一个完整的串行传输流程来看,一开始先传输启始字节,根据定义启始字节前五位为“同步位”字符串(五个连续的“1”),此时传输计数将被重置并且串行传输将被同步,再跟随的两个位字符串(第六、第七位)分别指定传输方向位(RW)及寄存器选择位(RS),最后第八位则为“0”。再接收到包含同步位及RW和RS资料的启始字节后,每一个八位的指令(数据)将被分为两个字节发送接收:高4位(DB7~DB4)的数据将会被放在第一个字节的LSB部分,而低4位(DB3~DB0)的数据会被放在第二个字节的LSB部分,至于相关的另四位则以“0”填充。
串行通信时序图
总结:因为串行通信的数据是以位为单位进行传输,所以只要在每位数据的传输过程中适当的添加一段延时基本上就能保证数据收发成功。至于实践代码完全可以借鉴官方PDF说明书中51程序。
③ 关于整行反白显示
ST7920手册中提到扩展功能中有一个反白指令,对于4行LCD这个指令实为鸡肋,为什么这么说?!请看手册关于这条指令的描述:
“功能:选择4行中的任一行作反白显示,并可决定反白与否。
注:4X8C/_3/_6的一、三行为反白选择的第一行,二、四行为反白选择的第二行。”,看到没,只能两奇数或偶数行同时反白,所以,要实现单独行反白还得靠自己动手。在官方提供的51演示程序中有一段关于两个字的反白代码,片段如下:
*-----------------------------------------------*/
//当data1=0xff,data2=0xff时,在x0,y0处反白显示16xl*yl.
//使用:con_disp(0xff,0xff,0x8c,0x80,2,16);
voidcon_disp (uchar data1,uchar data2,uchar x0,uchar y0,uchar xl,uchar yl)
{
uchar i,j;
for(j=0;j<yl;j++)
{
for(i=0;i<xl;i++)
{
wr_lcd (comm,0x34);
wr_lcd (comm,y0+j);
wr_lcd (comm,x0+i);
wr_lcd (comm,0x30);
wr_lcd (dat,data1);
wr_lcd (dat,data2);
}
}
wr_lcd (comm,0x36);
}
分析总结:开扩展功能(指令:0x34),往CGROM中写入地址y,x,回到基本指令功能(0x30),写0xFF反白,写0x00清除反白,最后开图形显示(0x36)。
并行通讯