跟我学51单片机(八)——图型带字库液晶128×64
一、原理简介
我手里的这款128×64液晶内部是以ST7920芯片作为控制器,是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置8192个16×16点汉字,和128个16×8点ASCII字符集。可以显示8×4行16×16点阵的汉字。因此利用该液晶模块可以灵活的构成全中文人机交互图形界面,也可完成图形显示。低电压低功耗也是其一显着特点。其外观图如图1(a)所示,其管脚排布如图1(b)所示。
值得说明一点的是,只要是控制器为ST7920芯片(或者类似芯片型号)的带字库的128×64液晶,不论其背光的颜色(普遍可见的有黄绿色、蓝色和白色),甚至管脚分布稍有差异,其特性与控制方法基本都是一样。128×64液晶的管脚各功能如表1所示。
其中并行模式下,管脚RS为高电平时, DB7~DB0为显示数据;RS为低电平时,表示DB7~DB0为显示指令。
R/W管脚为高电平且E为高电平时,数据被读到DB7~DB0,R/W管脚为低电平且E管脚从高电平跳到低电平时,DB7~DB0的数据被写到IR或DR,如表2、表3所示。
值得注意的是,当128×64液晶工作在2线或3线串行接口方式时,所需要的控制管脚发生改变,如表1中所示,第4管脚成为串行的片选信号,第5管脚成为串行的数据口,而第6管脚成为串行的同步时钟,所以表2、3不适合串行工作下的管脚状态。本文中对串行控制128×64液晶不做过多介绍,感兴趣的读者可以在本刊网站(www.ele169.com)下载串行控制程序。
12864液晶模块的控制芯片有两套控制命令,分为基本指令和扩充指令。这里介绍几个12864液晶编程时经常用到的几个指令(见表4)。
二、电路详解
如图2所示,128×64液晶的控制管脚都接到了单片机管脚上,前文提到,在功能设置指令中可以将液晶设为并行的8位、4位数据接口,图中采用的是8位的数据接口,当然也可以当四位数据接口或者串行接口来用。另液晶电源正端接5V,负端接地,背光正端由5V经过一个二极管降压后接入,负端接地。此外,液晶的偏压管脚(VO)接到一个电位器的中间抽头,电位器的两端分别接5V和地,这样就可通过调节电位器来实现对128×64液晶对比度的调节。经实验测试,笔者手里的128×64液晶的偏压管脚的电压调节到3.6~3.7V时对比度效果最好。读者可以自己实践测试。
图2 128×64液晶与单片机的连接图
三、程序设计
在程序设计之前,我们先了解下128×64液晶内部控制器ST7920的读写时序,其读写时序如图3、4所示。
图3 ST7920的数据写入时序(8位数据线模式)
图4 ST7920的数据读取时序(8位数据线模式)
对照时序图和表2、表3,我们可以很容易的写出驱动128×64液晶的各个子函数,如下所示:
/*读忙函数:检测液晶是否能够接收数据或命令,可用
一段延时替代*/
void check_busy(void)
{
BF = HIGH;
//将读忙管脚设为输入
RS = LOW;
//读忙时,RS电平应为低
RW = HIGH;
//读忙时,RS电平应为高
E = HIGH;
//E置高,配合数据读取
while(BF==1);
//死循环,如果忙,则一直等待
E = LOW; //E置低
}
/*写指令函数:向寄存器写入控制字
参数:cmd - 要写入的控制字*/
void LCD_en_command(uchar cmd)
{
check_busy();
//先检测液晶是否能够接收指令
RS= LOW;
//写指令时,RS电平应为低
RW=LOW;
//写指令时,RS电平应为低
LCDIO= cmd;
//将要写入的指令输出到对应的端口
E=HIGH;
//E置高
E=LOW;
//E置低,下降沿写入数据
}
/*写数据函数:向寄存器写入数据
参数:dat - 要写入的数据*/
void LCD_en_dat(uchar dat)
{
check_busy();
//先检测液晶是否能够接收数据
RS=HIGH;
//写数据时,RS电平应为高
RW=LOW;
//写数据时,RW电平应为低
LCDIO=dat;
//将要写入的数据输出到对应的端口
E=HIGH;
//E置高
E=LOW;
//E置低,下降沿写入数据
}
要使128×64液晶能正常工作和操作方便,除了写数据和命令函数外,还需要进行初始化等操作,先将本讲中所用到的操作128×64液晶的主要函数设计如下。
液晶初始化函数:初始化液晶,设置液晶的工作方式等。
void LCD_init(void)
{
RST=0;
//RST管脚置低,复位液晶
LCD_delay();
//延时一段时间,以完全复位
RST=1;
//RST管脚置高,复位完成
PSB=1;
//PSB管脚置高,并行工作模式
LCD_en_command(0x30);
//设置8位并数据格式
LCD_en
- 关于RTX51 TINY的分析与探讨(05-30)
- 浅析8051模块化编程技巧(05-28)
- 基于DSP和单片机通信的液晶显示设计方案(07-20)
- 锁相环控制及初始化简析(08-27)
- 基于MSP430自动胀管控制器的研究(09-07)
- 嵌入式C实现延时程序的不同变量的区别(03-01)