写在前面的话
液晶(LCD)显示具有功耗低、体积小、重量轻、超薄等许多其他显示器无法比拟的优点,近几年被广泛应用于FPGA控制的智能仪器、仪表和低功耗的电子产品中。LCD可分为段位式LCD、字符式LCD和点阵式LCD。其中段位式LCD和字符式LCD只能用于字符和数字的简单显示,不能满足图像曲线和汉字显示的要求;而点阵式LCD不仅可以显示字符、数字,还可以显示各种图形、曲线及汉字,并且可以实现屏幕上下左右滚动、动画功能、分区开窗口、反转、闪烁等功能,用途十分广泛。
基本概念
LCD12864 是一种具有4 位/8 位并行、2 线或3 线串行多种接口方式,内部含有国标一级、二级简体 、中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置8192 个16*16 点汉字,和128 个16*8 点ASCII 字符集,利用该模块灵活的接口方式和简单方便的操作指令,可构成全中文人机交互图形界面。可以显示8×4 行16×16 点 阵的汉字,也可完成图形显示。低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。
硬件电路结构
我们开发板上所使用的液晶为晶联讯生产的JLX12864G-13903型液晶显示器,可以显示128列*64行点阵单色图片,或显示8个/行*4行16*16点阵的汉字,或显示16个/行*8行8*8点阵的英文、数字、符号。
该液晶的通信方式可以通过不同的硬件设置,配置成串行和并行两种不同的通信方式。在这里,为了节约IO资源,我们将其配置成串行通信方式,具体电路结构如下:
由电路图可以看出,我们需要关心的其实也就只有五条线,那么接下来就让我们梳理一下这几条信号线的具体意义。
管脚接口 |
说明 |
12864_cs |
片选信号,低电平有效 |
12864_res |
复位信号,低电平有效 |
12864_rs |
寄存器选择信号,高为数据寄存器,低为指令寄存器 |
12864_sck |
串行时钟线 |
12864_sda |
串行数据线 |
官方代码解析
我们明白了定义的信号之后,接下来看一下它的时序:
注:此处的A0即为我们的12864_rs信号,SI是我们定义的数据线12864_sda,只是表示方式不同而已。
由时序图可以得出,只要我们的代码逻辑能符合上述时序要求,就可以顺利地发送数据,可是点亮这个LCD,需要哪些步骤呢?官方的资料提供了一些例程,可惜这些例程都是C语言版本的,接下来,就让我们这些“门外汉”慢慢品读吧。
C程序如下:
/* Test program for JLX12864G-139,串行接口 Driver IC is:ST7565R(or competible) Programmed by Ken,Dec.24,2010 JLX electronic Co.,ltd, http://www.jlxlcd.cn;http://www.jlxlcd.com.cn */ #include <reg51.H> sbit cs1=P1^1; sbit reset=P1^0; sbit rs=P3^0; sbit sclk=P3^1; sbit sid=P3^2; void transfer_data(int data1); void transfer_command(int data1); char code graphic1[]; char code graphic2[]; char code graphic3[]; char code graphic4[]; char code graphic5[]; void Delay(int i); void Delay1(int i); void disp_grap(char *dp); void initial_lcd(); void clear_screen(); void waitkey(); //===============main program=================== void main(void) { int i,j,k; initial_lcd(); while(1) { clear_screen(); //clear all dots disp_grap(graphic1); //display a picture of 128*64 dots waitkey(); disp_grap(graphic2); //display a picture of 128*64 dots waitkey(); disp_grap(graphic3); //display a picture of 128*64 dots waitkey(); disp_grap(graphic4); //display a picture of 128*64 dots waitkey(); disp_grap(graphic5); //display a picture of 128*64 dots waitkey(); } } /*LCD 初始化*/ void initial_lcd() { reset=0; /*低电平复位*/ Delay(20); reset=1; /*复位完毕*/ Delay(20); transfer_command(0xe2); /*软复位*/ Delay(5); transfer_command(0x2c); /*升压步聚 1*/ Delay(5); transfer_command(0x2e); /*升压步聚 2*/ Delay(5); transfer_command(0x2f); /*升压步聚 3*/ Delay(5); transfer_command(0x23); /*粗调对比度,可设置范围 0x20~0x27*/ transfer_command(0x81); /*微调对比度*/ transfer_command(0x1a); /*微调对比度的值,可设置范围 0x00~0x3f*/ transfer_command(0xa2); /*1/9 偏压比(bias)*/ transfer_command(0xc0); /*行扫描顺序:从上到下*/ transfer_command(0xa1); /*列扫描顺序:从左到右*/ transfer_command(0xaf); /*开显示*/ } //===============clear all dot martrics============= void clear_screen() { unsigned char i,j; for(i=0;i<9;i++) { cs1=0; transfer_command(0xb0+i); transfer_command(0x10); transfer_command(0x00); for(j=0;j<132;j++) { transfer_data(0x00); } } } //==================display a piture of 128*64 dots================ void disp_grap(char *dp) { int i,j; for(i=0;i<8;i++) { cs1=0; transfer_command(0xb0+i); //set page address, transfer_command(0x10); transfer_command(0x00); for(j=0;j<128;j++) { transfer_data(*dp); dp++; } } } //=============transfer command to LCM=============== void transfer_command(int data1) { char i; cs1=0; rs=0; for(i=0;i<8;i++) { sclk=0; if(data1&0x80) sid=1; else sid=0; Delay1(5); sclk=1; Delay1(5); data1=data1<<=1; } } //-----------transfer data to LCM--------------- void transfer_data(int data1) { char i; cs1=0; rs=1; for(i=0;i<8;i++) { sclk=0; if(data1&0x80) sid=1; else sid=0; sclk=1; data1=data1<<=1; } } //=============delay time===================== void Delay(int i) { int j,k; for(j=0;j<i;j++) for(k=0;k<990;k++); } //=============delay time===================== void Delay1(int i) { int j,k; for(j=0;j<i;j++) for(k=0;k<10;k++); } //--------------wait a switch,jump out if P2.0 get a signal"0"------------------ void waitkey() { repeat: if (P2&0x01) goto repeat; else Delay(1); if (P2&0x01) goto repeat; else; } char code graphic1[]={ /*-- 调入了一幅图像:D:\Backup\我的文档\My Pictures\12864-139 英文.bmp --*/ /*-- 宽度 x 高度=128x64 --*/ 0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, |