一、LCM12864液晶显示模块简介
LCM12864液晶显示模块是由128列64行液晶显示点阵和其控制电路组成,整个电路板外形、尺寸如图8-1所示。该显示模块不仅可以显示数字,还可以显示汉字和图形。模块电路板下端有20个接线引脚,其中VDD与VSS引脚是LCM12864液晶模块电源与地接入端,VOUT是LCM12864液晶模块自生成负电压输出端。VO 需要一个外部的0V~-10V 负压输入,可接入电位器调整液晶灰度。在背光电路中需要串接5 欧姆电阻,直接将背光接入电源可能会造成损坏。其余引脚由单片机控制。 图8-1 LCM12864液晶显示模块外型图
LCM12864液晶显示模块的引脚定义如表8-1所示。
表8-1 LCM12864引脚说明
标号 | 名称 | 参数 | 说明 |
1 | VSS | GND 0V | 模块电源地 |
2 | VDD | +5V | 模块电源 +5V DC |
3 | VO | 0V ~-10V | 外部液晶偏置电压输入端 |
4 | D/I | H/L | |
挂墙柜5 | R/W | H/L | H:MPU LCM读数据;L:MPU LCM写数据 |
6 | E | H/L | LCM使能 |
7 | DB0 | H/L | 数据线 0(H表示高电平,L表示低电平 |
8 | DB1 | H/L | 数据线 1 |
9 | DB2 | H/L | 数据线 2 |
10 | DB3 | H/L | 数据线 3 |
11 | DB4 | H/L | 数据线 4 |
12 | DB5 | H/L | 数据线 5 |
13 | DB6 | H/L | 数据线 6 |
14 | DB7 | H/L | 数据线 7 |
15 | CS1 | H/L | 左半屏使能(低电平有效) |
16 | CS2 | H/L | 右半屏使能(低电平有效) |
17 | /RST | H/L | LCM复位(低电平有效) |
18 | VOUT | GND 0V | 模块电源地 |
19 | SLA | +5V | LED背光电源+5V DC 真空脱蜡炉 |
| | | |
二、LCM12864驱动电路
MSP430F169单片机与LCM12864接口电路如图8-3所示。
电动美容仪图8-3单片机与LCM12864接口电路
三、单片机与LCM12864接口时序
完成硬件连接后,显示内容由程序控制。编程时可认为LCM12864模块是一个可双向数据传输的外设,当输出、输入数据(含模块命令)时,必须按时序控制其命令线和数据线。LCM12864模块接收到数据(含模块命令)后,根据命令线状态和数据内容进行译码,完成相应操作。
写数据时序图如图8-4所示。当读/写线为低电平时,单片机通过数据线向LCM12864液晶显示模块中写入数据。当使能端由低电平变高电平时,数据写入。当CS1输入低电平时,为左半屏使能,在左半屏显示数据。当CS2输入低电平时,为右半屏使能,在右半屏显示数据。当D/I输入为高电平时,为输入数据,当输入为低电平时,为输入指令。读数据时序图如图8-5所示。当R/W输入为高电平、使能端由低电平变高电平时,单片机读数据。
图8-4写数据时序图
图8-5读数据时序图
5.单片机与LCM12864接口程序设计
具体显示驱动程序如下:
/**************************************************************************
* 文件名称:main.c
* 文件说明:显示"Hello"
**************************************************************************/
#include <msp430x41x.h>
#define TOP 0 // 竖直方向零点
#define BOTTOM 64 // 竖直方向坐标最大值
#define LEFT 0 // 水平方向坐标最小值
#define RIGHT 128 // 水平方向坐标最大值
#define EN_WIDTH 40 // Hello 字符串的长度 #define CH_WIDTH 96 // 中文字符串的长度
#define OP_CHINESE 1 // 选择显示中文字符
#define OP_ENGLISH 2 // 选择显示英文字符
unsigned char showData[]={//16*8点阵的“Hello”
0x08,0x20,0xF8,0x3F,0x08,0x21,0x00,0x01,
0x00,0x01,0x08,0x21,0xF8,0x3F,0x08,0x20,//H (0)
0x00,0x00,0x00,0x1F,0x80,0x22,0x80,0x22,
0x80,0x22,0x80,0x22,0x00,0x13,0x00,0x00,//e (1)
0x00,0x00,0x08,0x20,0x08,0x20,0xF8,0x3F,
背胶橡皮布
0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00,//l (2)
0x00,0x00,0x08,0x20,0x08,0x20,0xF8,0x3F,
0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00,//l (3)
0x00,0x00,0x00,0x1F,0x80,0x20,0x80,0x20,
0x80,0x20,0x80,0x20,0x00,0x1F,0x00,0x00,//o (4)
};
unsigned char px, // 显示字符串的X位置
py, // 显示字符串的Y位置
width; // 字符串的宽度
//write_Command(),用于写命令到LCD,CS(片选)在此函数外设置
void write_Command(char cmd)
{
P3OUT &= 0xfb; //禁止 EN
P5DIR = 0xff;
脚踏式垃圾桶 P3OUT &= 0xfc; //rs=0 ,r/w=0
P5OUT = cmd;
P3OUT |= 0x04; //使能
P3OUT &= 0xfb; //禁止
}
// 设置显示的位置,含片选
void move_To(char x,char y)
{
unsigned char tmp;
tmp=(y&0x7f);
if(tmp<64) //如果位置在Chip1
{
P3OUT &= 0xbf; //cs2=0
P3OUT |= 0x08; //cs1=1
write_Command(0xb8 + x); //设置 x
write_Command(0x40 + tmp); //设置 y
}else if(tmp>63) //在 chip2
{
P3OUT &= 0xF7; //cs1=0
P3OUT |= 0x40; //cs2=1
write_Command(0xb8 + x); //设置 x
write_Command(0x40 + tmp-64); //设置 y
}
}
// write data
void write_Data(char content)
{
P5DIR = 0x00; // 置位输入模式
P3OUT |= 0x02; // r/w=1 读状态
P3OUT |= 0x04; // chip 使能
while((P5IN & 0x80)==0x80);//检测LCD是否忙
P3OUT &= 0xfb; //disable EN
P5DIR = 0xff;
P3OUT &= 0xfc; //rs=0 ,r/w=0
P3OUT |= 0x01; //rs=1
P5OUT = content;
P3OUT |= 0x04; //p2.2=1 使能
P3OUT &= 0xfb; //p2.2=0 禁止
}
// 在指定的位置显示字符串"Hello" ,x是行坐标,y是列坐标,0=<x<=RIGHT - 字符串长度
// 0=<y<=BOTTOM-字符串高度
void drawStr(unsigned char x,unsigned char y) //显示程序
{
unsigned char tmpv;
for(tmpv=y;tmpv<y+width;tmpv++)
{