什么是lcd12864?lcd12864的特性及其应用举例
扫描二维码
随时随地手机看文章
lcd12864带中文字库的128X64 是一种具有4 位/8 位并行、2 线或3 线串行多种接口方式,内部含有国标一级、二级简体 中文字库的点阵图形液晶显示模块;
其显示分辨率为128×64, 内置8192 个16*16 点汉字,和128 个16*8 点ASCII 字符 集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。
可以显示8×4 行16×16 点 阵的汉字. 也可完成图形显示.低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶 显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。
基本参数
(1)低电源电压(VDD:+3.0--+5.5V)
(2)显示分辨率:128×64 点
(3)内置汉字字库,提供8192 个16×16 点阵汉字(简繁体可选)
(4)内置128 个16×8 点阵字符
(5)2MHZ 时钟频率
(6)显示方式:STN、半透、正显
(7)驱动方式:1/32DUTY,1/5BIAS
(8)视角方向:6 点
(9)背光方式:侧部高亮白色LED,功耗仅为普通LED 的1/5—1/10
(10)通讯方式:串行、并口可选
(11)内置DC-DC 转换电路,无需外加负压
(12)无需片选信号,简化软件设计
(13)工作温度: 0℃ - +55℃ ,存储温度: -20℃ - +60℃
带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64,内置8192个16*16点汉字,和128个16*8点ASCII字符集。利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示8×4行16×16点阵的汉字。也可完成图形显示。低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。
lcd12864基本特性参数
(1)低电源电压(VDD:+3.0--+5.5V)
(2)显示分辨率:128×64点
(3)内置汉字字库,提供8192个16×16点阵汉字(简繁体可选)
(4)内置128个16×8点阵字符
(5)2MHZ时钟频率
(6)显示方式:STN、半透、正显
(7)驱动方式:1/32DUTY,1/5BIAS
(8)视角方向:6点
(9)背光方式:侧部高亮白色LED,功耗仅为普通LED的1/5—1/10
(10)通讯方式:串行、并口可选
(11)内置DC-DC转换电路,无需外加负压
(12)无需片选信号,简化软件设计
(13)工作温度:0℃-+55℃,存储温度:-20℃-+60℃
lcd12864引脚图及功能
1VSS-模块的电源地
2VDD-模块的电源正端
3V0-LCD驱动电压输入端
4RS(CS)H/L并行的指令/数据选择信号;串行的片选信号
5R/W(SID)H/L并行的读写选择信号;串行的数据口
6E(CLK)H/L并行的使能信号;串行的同步时钟
7DB0H/L数据0
8DB1H/L数据1
9DB2H/L数据2
10DB3H/L数据3
11DB4H/L数据4
12DB5H/L数据5
13DB6H/L数据6
14DB7H/L数据7
15PSBH/L并/串行接口选择:H-并行;L-串行
16NC空脚
17/RETH/L复位低电平有效
18NC空脚
19LED_A(LED+5V)背光源正极
20LED_K(LED-OV)背光源和负极
控制器接口信号说明
1、RS,R/W的配合选择决定控制界面的4种模式:
2、E信号
●忙标志:BFBF标志提供内部工作情况.BF=1表示模块在进行内部操作,此时模块不接受外部指令和数据.BF=0时,模块为准备状态,随时可接受外部指令和数据。利用STATUSRD指令,可以将BF读到DB7总线,从而检验模块之工作状态。
●字型产生ROM(CGROM)字型产生ROM(CGROM)提供8192个此触发器是用于模块屏幕显示开和关的控制。DFF=1为开显示(DISPLAYON),DDRAM的内容就显示在屏幕上,DFF=0为关显示(DISPLAYOFF)。DFF的状态是指令DISPLAYON/OFF和RST信号控制的。
●显示数据RAM(DDRAM)模块内部显示数据RAM提供64×2个位元组的空间,最多可控制4行16字(64个字)的中文字型显示,当写入显示数据RAM时,可分别显示CGROM与CGRAM的字型;此模块可显示三种字型,分别是半角英数字型(16*8)、CGRAM字型及CGROM的中文字型,三种字型的选择,由在DDRAM中写入的编码选择,在0000H—0006H的编码中(其代码分别是0000、0002、0004、0006共4个)将选择CGRAM的自定义字型,02H—7FH的编码中将选择半角英数字的字型,至于A1以上的编码将自动的结合下一个位元组,组成两个位元组的编码形成中文字型的编码BIG5(A140—D75F),GB(A1A0-F7FFH)。
●字型产生RAM(CGRAM)字型产生RAM提供图象定义(造字)功能,可以提供四组16×16点的自定义图象空间,使用者可以将内部字型没有提供的图象字型自行定义到CGRAM中,便可和CGROM中的定义一样地通过DDRAM显示在屏幕中。
●地址计数器AC地址计数器是用来贮存DDRAM/CGRAM之一的地址,它可由设定指令暂存器来改变,之后只要读取或是写入DDRAM/CGRAM的值时,地址计数器的值就会自动加一,当RS为“0”时而R/W为“1”时,地址计数器的值会被读取到DB6——DB0中。
光标/闪烁控制电路
此模块提供硬体光标及闪烁控制电路,由地址计数器的值来指定DDRAM中的光标或闪烁位置。
lcd12864指令说明
备注:当IC1在接受指令前,微处理器必须先确认其内部处于非忙碌状态,即读取BF标志时,BF需为零,方可接受新的指令;如果在送出一个指令前并不检查BF标志,那么在前一个指令和这个指令中间必须延长一段较长的时间,即是等待前一个指令确实执行完成。
lcd12864应用举例
1、使用前的准备:先给模块加上工作电压,再按照下图的连接方法调节LCD的对比度,使其显示出黑色的底影。此过程亦可以初步检测LCD有无缺段现象。
2、字符显示:带中文字库的128X64-0402B每屏可显示4行8列共32个16×16点阵的汉字,每个显示RAM可显示1个中文字符或2个16×8点阵全高ASCII码字符,即每屏最多可实现32个中文字符或64个ASCII码字符的显示。带中文字库的128X64-0402B内部提供128×2字节的字符显示RAM缓冲区(DDRAM)。字符显示是通过将字符显示编码写入该字符显示RAM实现的。根据写入内容的不同,可分别在液晶屏上显示CGROM(中文字库)、HCGROM(ASCII码字库)及CGRAM(自定义字形)的内容。三种不同字符/字型的选择编码范围为:0000~0006H(其代码分别是0000、0002、0004、0006共4个)显示自定义字型,02H~7FH显示半宽ASCII码字符,A1A0H~F7FFH显示8192种GB2312中文字库字形。字符显示RAM在液晶模块中的地址80H~9FH。字符显示的RAM的地址与32个字符显示区域有着一一对应的关系,其对应关系如下表所示。
3、图形显示
先设垂直地址再设水平地址(连续写入两个字节的资料来完成垂直与水平的坐标地址)
垂直地址范围AC5.。.AC0
水平地址范围AC3…AC0
绘图RAM的地址计数器(AC)只会对水平地址(X轴)自动加一,当水平地址=0FH时会重新设为00H但并不会对垂直地址做进位自动加一,故当连续写入多笔资料时,程序需自行判断垂直地址是否需重新设定。GDRAM的坐标地址与资料排列顺序如下图:
4、应用说明
用带中文字库的128X64显示模块时应注意以下几点:
①欲在某一个位置显示中文字符时,应先设定显示字符位置,即先设定显示地址,再写入中文字符编码。
②显示ASCII字符过程与显示中文字符过程相同。不过在显示连续字符时,只须设定一次显示地址,由模块自动对地址加1指向下一个字符位置,否则,显示的字符中将会有一个空ASCII字符位置。
③当字符编码为2字节时,应先写入高位字节,再写入低位字节。
④模块在接收指令前,向处理器必须先确认模块内部处于非忙状态,即读取BF标志时BF需为“0”,方可接受新的指令。如果在送出一个指令前不检查BF标志,则在前一个指令和这个指令中间必须延迟一段较长的时间,即等待前一个指令确定执行完成。指令执行的时间请参考指令表中的指令执行时间说明。⑤“RE”为基本指令集与扩充指令集的选择控制位。当变更“RE”后,以后的指令集将维持在最后的状态,除非再次变更“RE”位,否则使用相同指令集时,无需每次均重设“RE”位.
lcd12864驱动程序
/****************************************************************************/
/* */
/* Copyright (c) 2012, pcwebmaster */
/* All rights reserved. */
/* */
/* Email:pcwebmaste@163.com */
/* */
/****************************************************************************/
/****************************************************************************/
/* 文件名:LCD12864.c */
/* 版 本:Version 1.0 */
/* 描 述:实现液晶和单片机的通讯协议,根据计算机发给的命令进行人机交互 */
/* 作 者:pcwebmaste */
/* 函 数: */
/* LCD12864_init */
/* LCD12864WriteCommand */
/* LCD12864WriteByte */
/* LCD12864_init */
/* LCD12864SetXY */
/* LCD12864PrintfString */
/* 历史记录: */
/* pcwebmaste 2008-07-10 Creat Inital version. (Version 1.0) */
/* 模块化 2012-06-02 Creat Inital version. (Version 2.0) */
/****************************************************************************/
#include “12864.h”
#define LOW 0
#define HIGH 1
sbit wela = P2^6;
sbit dula = P2^7;
#define LCD12864_RS(x) {if((x))P3 |= 1《《LCD12864_RS_PIN;\
else P3 &=~(1《《LCD12864_RS_PIN);}//寄存器选择输入
#define LCD12864_RW(x) {if((x))P3 |= 1《《LCD12864_RW_PIN;\
else P3 &=~(1《《LCD12864_RW_PIN);}//液晶读/写控制
#define LCD12864_EN(x) {if((x))P3 |= 1《《LCD12864_EN_PIN;\
else P3 &=~(1《《LCD12864_EN_PIN);}//液晶使能控制
#define LCD12864_MD(x) {if((x))P3 |= 1《《LCD12864_MD_PIN;\
else P3 &=~(1《《LCD12864_MD_PIN);}//串/并方式控制
#define LCDWELA(x) {if((x))P2 |= 1《《6; else P2 &=~(1《《6);}
#define LCDDULA(x) {if((x))P2 |= 1《《7; else P2 &=~(1《《7);}
#define DelayNOP() {_nop_();_nop_();_nop_();_nop_();}
/*********************************************/
/* */
/* 主程序 */
/* */
/*********************************************
void main()
{
DelayNOP(); //延时
wela=LOW;
dula=LOW;
LCD12864_init(); //初始化LCD
LCD12864PrintfString(0,1,dis1);
LCD12864PrintfString(1,0,dis2);
LCD12864PrintfString(2,0,dis3);
LCD12864PrintfString(3,1,dis4);
while(1);
}
/********************************************
*函数名称:LCD12864_init
*输 入:无
*输 出:lcd_busy 为1时,忙,等待。
lcd-busy 为0时,闲,可写指令与数据
*说 明:LCD12864LCD检查忙状态
/*******************************************/
bit LCD1286_busy()
{
bit result;
LCD12864_RS(LOW);
LCD12864_RW(HIGH);
LCD12864_EN(HIGH);
DelayNOP();
result = (bit)(LCD12864_PORT&0x80);
LCD12864_EN(LOW);
return(result);
}
/********************************************
*函数名称:LCD12864WriteCommand
*输 入:ucCmd 要写入的命令
*输 出:无
*说 明:LCD12864 写命令
RS=L,RW=L,E=高脉冲,D0-D7=指令码。
********************************************/
void LCD12864WriteCommand(unsigned char ucCmd)
{
while(LCD1286_busy());
LCD12864_RS(LOW);
LCD12864_RW(LOW);
LCD12864_EN(LOW);
_nop_();
_nop_();
LCD12864_PORT = ucCmd;
DelayNOP();
LCD12864_EN(HIGH);
DelayNOP();
LCD12864_EN(LOW);
}
/********************************************
*函数名称:LCD12864WriteByte
*输 入:ucByte 要写入的字节
*输 出:无
*说 明:LCD12864 写字节
RS=H,RW=L,E=高脉冲,D0-D7=数据。
********************************************/
void LCD12864WriteByte(unsigned char ucByte)
{
while(LCD1286_busy());
LCD12864_RS(HIGH);
LCD12864_RW(LOW);
LCD12864_EN(LOW);
LCD12864_PORT = ucByte;
DelayNOP();
LCD12864_EN(HIGH);
DelayNOP();
LCD12864_EN(LOW);
}
/********************************************
*函数名称:LCD12864_init
*输 入:无
*输 出:无
*说 明:LCD12864LCD初始化设定
/*******************************************/
void LCD12864_init()
{
LCD12864_MD(HIGH); //并口方式
LCD12864WriteCommand(0x34); //扩充指令操作
LCD12864WriteCommand(0x30); //基本指令操作
LCD12864WriteCommand(0x0C); //显示开,关光标
LCD12864WriteCommand(0x01); //清除LCD的显示内容
}
/********************************************
*函数名称:LCD12864SetXY
*输 入:x 横坐标 y 纵坐标
*输 出:无
*说 明:LCD12864 设置坐标
********************************************/
void LCD12864SetXY(unsigned char X,unsigned char Y)
{
if (X==0)
{X=0x80;}
else if (X==1)
{X=0x90;}
else if (X==2)
{X=0x88;}
else if (X==3)
{X=0x98;}
LCD12864WriteCommand(X+Y); //显示地址
}
/********************************************
*函数名称:LCD12864SetXY
*输 入:x 横坐标 y 纵坐标
*输 出:无
*说 明:LCD12864 设置坐标
为什么这样写不行呢?
********************************************
void LCD12864SetXY(unsigned char x,unsigned char y)
{
switch(y)
{
case 1:
{
LCD12864WriteCommand(0x80+x);
}
break;
case 2:
{
LCD12864WriteCommand(0x90+x);
}
break;
case 3:
{
LCD12864WriteCommand(0x88+x);
}
break;
case 4:
{
LCD12864WriteCommand(0x98+x);
}
break;
default:break;
}
// LCD12864WriteCommand(x+y); //显示地址
}
/********************************************
*函数名称:LCD12864PrintfString
*输 入:x 横坐标 y 纵坐标 s字符串
*输 出:无
*说 明:LCD12864 打印字符串
********************************************/
void LCD12864PrintfString(unsigned char x,unsigned char y,unsigned char *s)
{
LCD12864SetXY(x,y); //设置显示坐标
while(s && *s)
{
LCD12864WriteByte(*s); //显示逐个字符
s++;
}
}
/****************************************************************************/
/* */
/* Copyright (c) 2012, pcwebmaster */
/* All rights reserved. */
/* */
/* Email:pcwebmaste@163.com */
/* */
/****************************************************************************/
/****************************************************************************/
/* 文件名:LCD12864.c */
/* 版 本:Version 1.0 */
/* 描 述:实现液晶和单片机的通讯协议,根据计算机发给的命令进行人机交互 */
/* 作 者:pcwebmaste */
/* 函 数: */
/* LCD12864_init */
/* LCD12864WriteCommand */
/* LCD12864WriteByte */
/* LCD12864_init */
/* LCD12864SetXY */
/* LCD12864PrintfString */
/* 历史记录: */
/* pcwebmaste 2008-07-10 Creat Inital version. (Version 1.0) */
/* 模块化 2012-06-02 Creat Inital version. (Version 2.0) */
/****************************************************************************/
#ifndef __12864_H__
#define __12864_H__
#include 《reg52.h》
#include 《intrins.h》
#define LCD12864_PORT P0 //数据口
#define LCD12864_RS_PIN 5
#define LCD12864_RW_PIN 6
#define LCD12864_EN_PIN 4
#define LCD12864_MD_PIN 7
unsigned char code dis1[] = {“中国昌乐是宝石”};
unsigned char code dis2[] = {“之都,西瓜之乡!”};
unsigned char code dis3[] = {“中国昌乐宝石城”};
unsigned char code dis4[] = {“人民欢迎您!”};
/********************************************
*函数名称:LCD12864_init
*输 入:无
*输 出:lcd_busy 为1时,忙,等待。
lcd-busy 为0时,闲,可写指令与数据
*说 明:LCD12864LCD检查忙状态
/*******************************************/
bit LCD1286_busy();
/********************************************
*函数名称:LCD12864WriteCommand
*输 入:ucCmd 要写入的命令
*输 出:无
*说 明:LCD12864 写命令
RS=L,RW=L,E=高脉冲,D0-D7=指令码。
********************************************/
void LCD12864WriteCommand(unsigned char ucCmd);
/********************************************
*函数名称:LCD12864WriteByte
*输 入:ucByte 要写入的字节
*输 出:无
*说 明:LCD12864 写字节
RS=H,RW=L,E=高脉冲,D0-D7=数据。
********************************************/
void LCD12864WriteByte(unsigned char ucByte);
/********************************************
*函数名称:LCD12864_init
*输 入:无
*输 出:无
*说 明:LCD12864LCD初始化设定
/*******************************************/
void LCD12864_init();
/********************************************
*函数名称:LCD12864SetXY
*输 入:x 横坐标 y 纵坐标
*输 出:无
*说 明:LCD12864 设置坐标
********************************************/
void LCD12864SetXY(unsigned char X,unsigned char Y);
/********************************************
*函数名称:LCD12864PrintfString
*输 入:x 横坐标 y 纵坐标 s字符串
*输 出:无
*说 明:LCD12864 打印字符串
********************************************/
void LCD12864PrintfString(unsigned char x,unsigned char y,unsigned char *s);
void LCD12864PrintfData(unsigned char x,unsigned char y,unsigned char DData);
/********************************************
*函数名称:LCD12864PrintfNum
*输 入:add ge shi bai
*输 出:无
*说 明:此函数不好写成通用函数,在连续地址里
连续写数字半角显示。根据情况修改
********************************************/
void LCD12864PrintfNum(unsigned char add,unsigned char ge,unsigned char shi,unsigned char bai)
{
LCD12864WriteCommand(add);
LCD12864WriteByte(bai+0x30);
LCD12864WriteByte(shi+0x30);
LCD12864WriteByte(ge+0x30);
}
#endif