LCD12864显示屏概述及控制程序

描述

一. 概述

LCD12864显示屏是所说的点阵液晶显示模块,就是由12864个液晶显示点组成的一个128列 64行的阵列,所以也就叫成了12864。 每个显示点都对应着有一位二进制数,0表示灭,1表示亮。 存储这些点阵信息的RAM被称为显示数据存储器。 如果要显示某个图形或汉字就是将相应的点阵信息写入到对应的存储单元中。 图形或汉字的点阵信息是由自己设计(如果模块带有字库,则不需要自己设计汉字),这时候问题的关键是显示点在液晶屏上的位置与其在存储器中的地址之间的关系。

二. LCD12864基本参数

1.电气参数

  • 电源电压:VDD:+3.0--+5.5V
  • 显示分辨率:128×64点
  • 内置汉字字库,提供8192个16×16点阵汉字(简繁体可选)
  • 内置128个16×8点阵字符
  • 2MHZ时钟频率
  • 显示方式:STN、半透、正显
  • 驱动方式:1/32DUTY,1/5BIAS
  • 视角方向:6点
  • 背光方式:侧部高亮白色LED,功耗仅为普通LED的1/5—1/10
  • 通讯方式:串行、并口可选
  • 内置DC-DC转换电路,无需外加负压
  • 无需片选信号,简化软件设计
  • 工作温度:0℃-+55℃,存储温度:-20℃-+60℃

2. 引脚说明

LCD12864的引脚总共有20个,如图:

显示模块

显示模块

其中,引脚PSB为并/串行接口选择引脚,高电平为并行控制; 低电平为串行控制。

3. 电路图

显示模块

其中可调电阻用于调整显示器的对比度。 三极管是为增强电流的驱动能力,为背光LED提供足够的驱动电流。

三. 控制程序

1.控制时序

LCD12864控制时序有两种,一种为并行控制时序(本次是以并行为例),另一种是串行控制时序。

简单来说,大部分情况下我们只对显示屏做写操作,读操作很少用,所以读操作就不做介绍。 LCD12864显示屏控制程序简化下来,也相对简单,只需要实现忙检查、写数据、写指令、初始化四个控制函数即可实现对LCD12864的控制。 写时序如图:

显示模块

2. 忙状态检查函数

/*******************************************************************************
* 函 数 名         : 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;
}

3. 写指令函数

/*******************************************************************************
* 函 数 名         : 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;              
}

4. 写数据函数

/*******************************************************************************
* 函 数 名         : 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为低电平时,写指令。

5. 初始化函数

/*******************************************************************************
* 函 数 名         : 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个字节。

1. 显示坐标关系

显示模块

如上图所示,第一行显示的地址为80H-87H,第二行为90H-97H,第三行为88H-8FH,第四行为98H-9FH。 所以要显示屏上哪个位置显示哪个汉字,只需要写入对应位置的地址,再写入对应汉字即可。

2. 显示汉字

只要实现以上忙检查 、 写数据 、 写指令 、初始化四个控制函数,就可以实现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++;
    } 
  }
}

3.主函数

最后,在主函数上实现汉字的显示了。
#include
#include"lcd12864.h"


unsigned char code CharCode[]="电子应用学习馆";


void main()
{
  unsigned char i;


  LCD12864_Init();
  LCD12864_SetWindow(0, 0,CharCode);
  while(1);
}
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分