液晶显示器
一. 实验目的:
1. 了解全点阵图形LCD的结构和原理掌握在MSP430上如何使用外设。
2. 了解LCD显示器的
工作原理
数字放映机工作原理变压器基本工作原理叉车的结构和工作原理袋收尘器工作原理主动脉球囊反搏护理
、种类(笔段型、点阵字符型、点阵图形)
及主要性能指标。
3. 掌握图形点阵LCD的编程使用方法;理解LCD显示模块命令的种类、功能及使用方法。
4. 了解LCD字符生成软件的使用方法(见附录)。
二. 实验内容:
1. 在LCD上显示Hello和中文字“南京工业大学”。
2. 通过键盘控制Hello或者中文字符在LCD上左右、上下移动。
3. 学会使用字符生成软件来实现任意字符代码的生成和显示。
4. 其他另外可以实现的目标:使字符在按键没有松动的情况下连续移动;实现字符的循环移动,即当字符串移动到边界时仍可以移动,显示不完的部分从另一边显示出来。
三. 实验原理:
1. 图形点阵式液晶原理
液晶是一种具有规则性分子排列的有机化合物,它既不是液体也不是固
体,而是介于固态和液态之间的物质。液晶具有电光效应和偏光特性,这是它能用于显示的主要原因。常用的液晶显示器可分成3类,分别是扭曲向列型(Twisted Nematic)、超扭曲向列型(Super TN)和彩色薄膜型。字符点阵式属于扭曲向列型LCD。
典型的字符点阵式液晶显示器是由控制器、驱动器、字符发生器ROM、
字符发生器RAM和液晶屏组成,字符由5*7 点阵或5*10点阵组成。一般结果如图一所示:
图一 128x64 点阵图形液晶模块方框示意图
此次实验所用的LCD型号是RT12864CT。12864是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及128*64全点阵液晶显示器组成。可完成图形显示,也可以显示8*4个(16*16)汉字。
管脚号
管脚名称
LEVER
管脚功能描述
1
VSS
0
电源地
2
VDD
+5.0V
电源电压
3
V0
-
液晶显示器驱动电压
4
D/I(RS)
H/L
D/I=“H”,
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
示DB7∽DB0为显示数据
D/I=“L”,表示DB7∽DB0为显示指令数据
5
R/W
H/L
R/W=“H”,E=“H”数据被读到DB7∽DB0
R/W=“L”,E=“H→L”数据被写到IR或DR
6
E
H/
R/W=“L”,E信号下降沿锁存DB7∽DB0
R/W=“H”,E=“H”DDRAM数据读DB7∽DB0
7
DB0
H/L
数据线
8
DB1
H/L
数据线
9
DB2
H/L
数据线
10
DB3
H/L
数据线
11
DB4
H/L
数据线
12
DB5
H/L
数据线
13
DB6
H/L
数据线
14
DB7
H/L
数据线
15
CS1
H/L
H:选择芯片(右半屏)信号
16
CS2
H/L
H:选择芯片(左半屏)信号
17
RET
H/L
复位信号,低电平复位
18
VOUT
-10V
LCD驱动负电压
19
LED+
-
LED背光板电源
20
LED-
-
LED背光板电源
表1:12864LCD的引脚说明
128x64 点阵图形液晶模块的内部结构可分为三个部分:LCD 控制器,LCD 驱动器,LCD 显示装置。应注意的是,无背光液晶模块同EL、LED 背光的液晶模块内部结构有较大的区别,特别注意第19、20 脚的供电来源及相关参数,如图二所示:
图 2 128x64 点阵图形液晶模块的内部结构
12864LCD的指令系统及时序:该类液晶显示模块(即KS0108B及其兼容控制驱动器)的指令系统比较简单,总共只有七种。其指令表如表2所示:
指令名称
控制信号
控制代码
R/W
RS
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
显示开关
0
0
0
0
1
1
1
1
1
1/0
显示起始行设置
0
0
1
1
X
X
X
X
X
X
页设置
0
0
1
0
1
1
1
X
X
X
列地址设置
0
0
0
1
X
X
X
X
X
X
读状态
1
0
BUSY
0
ON/OFF
RST
0
0
0
0
写数据
0
1
写数据
读数据
1
1
读数据
表2:12864LCD指令表
2. MCU与LCD、键盘连接电路图:
LCD的7—14引脚分别连接到149的44—51引脚(P5口),其他引脚2号引脚连接到J28排线上(与5V电源接通给LCD供电)、1--GND、4—36、5—37、6—38、15—39、16—42、17—43;18接滑动变阻器R10(调节LCD的亮度)。键盘连接省略。
3. LCD显示
流程
快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计
图:
图 3 LCD显示主程序流程图 图4初始化子程序流程图
图5 写指令子程序流程图 图 6 送数据子程序流程图
四.实验步骤和结果:
通过调试可以正确的显示“Hello”或者“南京工业大学”,中英文字符的切换需要通过程序修改才能实现(可以试着用中断来实现),比较繁琐。同时通过键盘来实现字符在LCD屏幕上的上下左右的移动。
五.附录:
1.字模软件使用方法:
首先打开“PCtoLCD2002.exe”,显示界面如下图7所示:
图 7 字符生成软件界面
然后点击选项菜单,通过上面程序所述,选项中要选择:阴码、逐列式、逆向、16进制、C51格式,点击确定。如图8所示设置:
图8 字符软件设置界面
接着在左下方空白 格子里输入要显示字符,点击“生成字模”,变会出现对应的字符编码,复制到程序中编译即可。
2.程序(键盘扫描函数省略):
/*****************************************************************************
* 文件名称: main.c
* 文件说明 根据键盘的控制,移动字符串"Hello"或者"南京工业大学",行列键盘的"7"用于字符串左移,"8"用于字符串下移,"9"用于字符串右移,"5"用于字符串上移。按键每按一下向各自的方向移动一个点阵的位置。
******************************************************************************/
#define MSP430F149_H 0
#include
#ifndef LCD_IN_USE
#include "lcd.c"
#endif
#ifndef KEY_BOARD
#include "keyboard12.c"
#endif
#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 // 选择显示英文字符
void drawStr(unsigned char x,unsigned char y);
void op_Select(char OP);
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 showData_1[]={ //16*16点点阵的"南京工业大学“
0x04,0x00,0xE4,0xFF,0x24,0x00,0x24,0x08,0x64,0x09,0xA4,0x09,0x24,0x09,0x3F,0x7F, 0x24,0x09,0xA4,0x09,0x64,0x09,0x24,0x48,0x24,0x80,0xE4,0x7F,0x04,0x00,0x00,0x00,/*"南",0*/
0x04,0x00,0x04,0x40,0x04,0x20,0xE4,0x1B,0x24,0x02,0x24,0x42,0x25,0x82,0x26,0x7E, 0x24,0x02,0x24,0x02,0x24,0x02,0xE4,0x0B,0x04,0x10,0x04,0x60,0x04,0x00,0x00,0x00,/*"京",1*/
0x00,0x20,0x04,0x20,0x04,0x20,0x04,0x20,0x04,0x20,0x04,0x20,0x04,0x20,0xFC,0x3F, 0x04,0x20,0x04,0x20,0x04,0x20,0x04,0x20,0x04,0x20,0x04,0x20,0x00,0x20,0x00,0x00,/*"工",2*/
0x00,0x40,0x10,0x40,0x60,0x40,0x80,0x43,0x00,0x40,0xFF,0x7F,0x00,0x40,0x00,0x40, 0x00,0x40,0xFF,0x7F,0x00,0x42,0x00,0x41,0xC0,0x40,0x30,0x40,0x00,0x40,0x00,0x00,/*"业",3*/
0x20,0x80,0x20,0x80,0x20,0x40,0x20,0x20,0x20,0x10,0x20,0x0C,0x20,0x03,0xFF,0x00, 0x20,0x03,0x20,0x0C,0x20,0x10,0x20,0x20,0x20,0x40,0x20,0x80,0x20,0x80,0x00,0x00,/*"大",4*/
0x40,0x04,0x30,0x04,0x11,0x04,0x96,0x04,0x90,0x04,0x90,0x44,0x91,0x84,0x96,0x7E,0x90,0x06,0x90,0x05,0x98,0x04,0x14,0x04,0x13,0x04,0x50,0x04,0x30,0x04,0x00,0x00,/*"学",5*/
};
const unsigned char mapTbl[]=
{
0x01,0x03,0x07,0x0f,
0x1f,0x3f,0x7f,0xff
};
unsigned char px, // 显示字符串的X位置
py, // 显示字符串的Y位置
width; // 字符串的宽度
unsigned char * showBuf; // 显示数据缓冲区
void main()
{
WDTCTL = WDTHOLD + WDTPW; // 关闭看门狗
init_LCD(); // 初始化点阵LCD
init_Keyboard(); // 初始化键盘
op_Select(OP_CHINESE); // 选择显示字符类型
drawStr(px,py); //显示字符串
while(1)
{
key_Event(); //
检测
工程第三方检测合同工程防雷检测合同植筋拉拔检测方案传感器技术课后答案检测机构通用要求培训
按键事件
if(key_Flag== 0x01) //有按键
{
key_Flag=0x00; //清除按键标识
if(key_val==0x05) //上移
{
if(px>TOP) //如果可以上移
{
clear_Rect(px/8,0,3,64); //清除chip1可能有数据的三个区域
clear_Rect(px/8,64,3,64); //清除chip2可能有数据的三个区域
drawStr(px-1,py); //显示字符
px = px-1;
}
}else if (key_val==0x07) //左移
{
if(py>LEFT) //如果可以左移
{
clear_Rect(px/8,0,3,64);
clear_Rect(px/8,64,3,64);
drawStr(px,py-1);
py=py-1;
}
}else if (key_val==0x08) //下移
{
if(px>(8-t1); //右移(8-t1)
t3 = showBuf[2*(tmpv-y)+1];
t3 = t3 & mapTbl[8-t1]; //取得低(8-t1)位
t3=t3<>(8-t1); //右移(8-t1)位
write_Data(t2); //填写数据
}
}
}
void op_Select(char OP)
{
if(OP==OP_CHINESE)
{
width = CH_WIDTH; // 设定字符串长度
px=0; // 初始化显示位置,X坐标
py=0; // Y坐标
showBuf = showData_1;
}
else if (OP==OP_ENGLISH)
{
width = EN_WIDTH; // 设定字符串长度
px=24; // 初始化显示位置,X坐标
py=40; // Y坐标
showBuf = showData;
}
}
LCD显示函数:
#include
void write_Command(char cmd)
{
P4OUT &= 0xfb; //禁止 EN
P5DIR = 0xff;
P4OUT &= 0xfc; //rs=0 ,r/w=0
P5OUT = cmd;
P4OUT |= 0x04; //使能
P4OUT &= 0xfb; //禁止
}
void move_To(char x,char y)
{
unsigned char tmp;
tmp=(y&0x7f);
if(tmp<64) //如果位置在Chip1
{
P4OUT &= 0xbf; //cs2=0
P4OUT |= 0x08; //cs1=1
write_Command(0xb8 + x); //设置 x
write_Command(0x40 + tmp); //设置 y
}else if(tmp>63) //在 chip2
{
P4OUT &= 0xF7; //cs1=0
P4OUT |= 0x40; //cs2=1
write_Command(0xb8 + x); //设置 x
write_Command(0x40 + tmp-64); //设置 y
}
}
void write_Data(char content)
{
P5DIR = 0x00; // 置位输入模式
P4OUT |= 0x02; // r/w=1 读状态
P4OUT |= 0x04; // chip 使能
while((P3IN & 0x80)==0x80);//检测LCD是否忙
P4OUT &= 0xfb;//disable EN
P5DIR = 0xff;
P4OUT &= 0xfc; //rs=0 ,r/w=0
P4OUT |= 0x01; //rs=1
P5OUT = content;
P4OUT |= 0x04; //p2.2=1 使能
P4OUT &= 0xfb; //p2.2=0 禁止
}
void clear_Rect(unsigned char x,unsigned char y,unsigned char h,unsigned char w)
{
unsigned char tmpv,tmp;
for(tmpv=x;tmpv<(x+h);tmpv++)
{
for(tmp=y;tmp<(y+w);tmp++)
{
move_To(tmpv,tmp);//移动
write_Data(0x00); //在当前位置写0,即清除当前位置的显示内容
}
}
}
void init_LCD()
{
P5DIR = 0xff; // 设置P3输出模式
P5OUT = 0x00; // 初始值为0
P4DIR |= 0xcf; // P2.0~P3,P2.6,p2.7 置为输出模式
P4OUT |= 0x48 ; // cs1,cs2 为1,reset=0
_NOP();
_NOP();
_NOP();
P4OUT |= 0x04; // en=1
P4OUT |= 0x80;
write_Command(0xc0); //
write_Command(0x3f); //显示开
clear_Rect(0,0,8,64); //清除第一块
clear_Rect(0,64,8,64); //清除第二块
}
3.系统原理图: