LCD12864显示屏是所说的点阵液晶显示模块,就是由12864个液晶显示点组成的一个128列64行的阵列,所以也就叫成了12864。每个显示点都对应着有一位二进制数,0表示灭,1表示亮。存储这些点阵信息的RAM被称为显示数据存储器。如果要显示某个图形或汉字就是将相应的点阵信息写入到对应的存储单元中。图形或汉字的点阵信息是由自己设计(如果模块带有字库,则不需要自己设计汉字),这时候问题的关键是显示点在液晶屏上的位置与其在存储器中的地址之间的关系。
LCD12864的引脚总共有20个,如图:
其中,引脚PSB为并/串行接口选择引脚,高电平为并行控制;低电平为串行控制。
其中可调电阻用于调整显示器的对比度。三极管是为增强电流的驱动能力,为背光LED提供足够的驱动电流。
LCD12864控制时序有两种,一种为并行控制时序(本次是以并行为例),另一种是串行控制时序。
简单来说,大部分情况下我们只对显示屏做写操作,读操作很少用,所以读操作就不做介绍。LCD12864显示屏控制程序简化下来,也相对简单,只需要实现忙检查、写数据、写指令、初始化四个控制函数即可实现对LCD12864的控制。写时序如图:
/*******************************************************************************
* 函 数 名 : LCD12864_Busy
* 函数功能 : 检测LCD是否忙
* 输 入 : 无
* 输 出 : 1或0(1表示不忙,0表示忙)
*******************************************************************************/
uchar LCD12864_Busy(void)
{
uchar i = 0;
LCD12864_RS = 0; //选择命令
LCD12864_RW = 1; //选择读取
LCD12864_EN = 1;
LCD12864_Delay1ms(1);
while((LCD12864_DATAPORT & 0x80) == 0x80) //检测读取到的值
{
i++;
if(i > 100)
{
LCD12864_EN = 0;
return 0; //超过等待时间返回0表示失败
}
}
LCD12864_EN = 0;
return 1;
}
/*******************************************************************************
* 函 数 名 : LCD12864_WriteCmd
* 函数功能 : 写命令
* 输 入 : cmd
* 输 出 : 无
*******************************************************************************/
void LCD12864_WriteCmd(uchar cmd)
{
uchar i;
i = 0;
while( LCD12864_Busy() == 0)
{
LCD12864_Delay1ms(1);
i++;
if( i>100)
{
return; //超过等待退出
}
}
LCD12864_RS = 0; //选择命令
LCD12864_RW = 0; //选择写入
LCD12864_EN = 0; //初始化使能端
LCD12864_DATAPORT = cmd; //放置数据
LCD12864_EN = 1; //写时序
LCD12864_Delay1ms(5);
LCD12864_EN = 0;
}
/*******************************************************************************
* 函 数 名 : LCD12864_WriteData
* 函数功能 : 写数据
* 输 入 : dat
* 输 出 : 无
*******************************************************************************/
void LCD12864_WriteData(uchar dat)
{
uchar i;
i = 0;
while( LCD12864_Busy() == 0)
{
LCD12864_Delay1ms(1);
i++;
if( i>100)
{
return; //超过等待退出
}
}
LCD12864_RS = 1; //选择数据
LCD12864_RW = 0; //选择写入
LCD12864_EN = 0; //初始化使能端
LCD12864_DATAPORT = dat; //放置数据
LCD12864_EN = 1; //写时序
LCD12864_Delay1ms(5);
LCD12864_EN = 0;
}
与LCD1602一样,LCD12864写数据和写指令的区别在于RS引脚的电平;RS为高电平时,写数据;RS为低电平时,写指令。
/*******************************************************************************
* 函 数 名 : LCD12864_Init
* 函数功能 : 初始化LCD12864
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void LCD12864_Init()
{
LCD12864_PSB = 1; //选择并行输入
LCD12864_RST = 1; //复位
LCD12864_WriteCmd(0x30); //选择基本指令操作
LCD12864_WriteCmd(0x0c); //显示开,关光标
LCD12864_WriteCmd(0x01); //清除LCD12864的显示内容
}
在LCD12864上显示特定的字符,实际上就是对LCD12864的DDRAM上写入对应的数据,显示屏便显示你想要的字符。其中,英文字符占用1个字节,中文字符占用2个字节。
如上图所示,第一行显示的地址为80H-87H,第二行为90H-97H,第三行为88H-8FH,第四行为98H-9FH。所以要显示屏上哪个位置显示哪个汉字,只需要写入对应位置的地址,再写入对应汉字即可。
只要实现以上忙检查、写数据、写指令、初始化四个控制函数,就可以实现LCD12864显示屏汉字的显示控制。
显示函数只需要写入起始坐标,然后显示对应的汉字。
/*******************************************************************************
* 函 数 名 : LCD12864_SetWindow
* 函数功能 : 设置在基本指令模式下设置显示坐标,并显示汉字。注意:x是设置行,y是设置列
* 输 入 : x, y,word
* 输 出 : 无
*******************************************************************************/
void LCD12864_SetWindow(uchar x, uchar y,uchar *word)
{
uchar pos;
uchar i=y;
if(x == 0) // 第一行的地址是80H
x = 0x80;
else if(x == 1) //第二行的地址是90H
x = 0x90;
else if(x == 2) //第三行的地址是88H
x = 0x88;
else if(x == 3) //第三行的地址是98H
x = 0x98;
pos = x + y;
LCD12864_WriteCmd(pos);
while(word[i]!='\0')
{
if(i<16) //判断是否在本行的显示范围内
{
LCD12864_WriteData(word[i]);
i++;
}
}
}
最后,在主函数上实现汉字的显示了。
#include
#include"lcd12864.h"
unsigned char code CharCode[]="电子应用学习馆";
void main()
{
unsigned char i;
LCD12864_Init();
LCD12864_SetWindow(0, 0,CharCode);
while(1);
}
如需LCD12864相关资料及例程, 请关注公众号,首页回复LCD12864获取资料