单片机控制LCD液晶显示器含程序.docx
- 文档编号:6305234
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:17
- 大小:304.22KB
单片机控制LCD液晶显示器含程序.docx
《单片机控制LCD液晶显示器含程序.docx》由会员分享,可在线阅读,更多相关《单片机控制LCD液晶显示器含程序.docx(17页珍藏版)》请在冰豆网上搜索。
单片机控制LCD液晶显示器含程序
液晶显示器
一.实验目的:
1.了解全点阵图形LCD的结构和原理掌握在MSP430上如何使用外设。
2.了解LCD显示器的工作原理、种类(笔段型、点阵字符型、点阵图形)
及主要性能指标。
3.掌握图形点阵LCD的编程使用方法;理解LCD显示模块命令的种类、功能及使用方法。
4.了解LCD字符生成软件的使用方法(见附录)。
二.实验内容:
1.在LCD上显示Hello和中文字“南京工业大学”。
2.通过键盘控制Hello或者中文字符在LCD上左右、上下移动。
3.学会使用字符生成软件来实现任意字符代码的生成和显示。
4.其他另外可以实现的目标:
使字符在按键没有松动的情况下连续移动;实现字符的循环移动,即当字符串移动到边界时仍可以移动,显示不完的部分从另一边显示出来。
三.实验原理:
1.图形点阵式液晶原理
液晶是一种具有规则性分子排列的有机化合物,它既不是液体也不是固
体,而是介于固态和液态之间的物质。
液晶具有电光效应和偏光特性,这是它能用于显示的主要原因。
常用的液晶显示器可分成3类,分别是扭曲向列型(TwistedNematic)、超扭曲向列型(SuperTN)和彩色薄膜型。
字符点阵式属于扭曲向列型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”,表示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脚的供电来源及相关参数,如图二所示:
图2128x64点阵图形液晶模块的内部结构
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显示流程图:
图3LCD显示主程序流程图图4初始化子程序流程图
图5写指令子程序流程图图6送数据子程序流程图
四.实验步骤和结果:
通过调试可以正确的显示“Hello”或者“南京工业大学”,中英文字符的切换需要通过程序修改才能实现(可以试着用中断来实现),比较繁琐。
同时通过键盘来实现字符在LCD屏幕上的上下左右的移动。
五.附录:
1.字模软件使用方法:
首先打开“PCtoLCD2002.exe”,显示界面如下图7所示:
图7字符生成软件界面
然后点击选项菜单,通过上面程序所述,选项中要选择:
阴码、逐列式、逆向、16进制、C51格式,点击确定。
如图8所示设置:
图8字符软件设置界面
接着在左下方空白格子里输入要显示字符,点击“生成字模”,变会出现对应的字符编码,复制到程序中编译即可。
2.程序(键盘扫描函数省略):
/*****************************************************************************
*文件名称:
main.c
*文件说明根据键盘的控制,移动字符串"Hello"或者"南京工业大学",行列键盘的"7"用于字符串左移,"8"用于字符串下移,"9"用于字符串右移,"5"用于字符串上移。
按键每按一下向各自的方向移动一个点阵的位置。
******************************************************************************/
#defineMSP430F149_H0
#include
#ifndefLCD_IN_USE
#include"lcd.c"
#endif
#ifndefKEY_BOARD
#include"keyboard12.c"
#endif
#defineTOP0//竖直方向零点
#defineBOTTOM64//竖直方向坐标最大值
#defineLEFT0//水平方向坐标最小值
#defineRIGHT128//水平方向坐标最大值
#defineEN_WIDTH40//Hello字符串的长度
#defineCH_WIDTH96//中文字符串的长度
#defineOP_CHINESE1//选择显示中文字符
#defineOP_ENGLISH2//选择显示英文字符
voiddrawStr(unsignedcharx,unsignedchary);
voidop_Select(charOP);
unsignedcharshowData[]={//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*/
};
unsignedcharshowData_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*/
};
constunsignedcharmapTbl[]=
{
0x01,0x03,0x07,0x0f,
0x1f,0x3f,0x7f,0xff
};
unsignedcharpx,//显示字符串的X位置
py,//显示字符串的Y位置
width;//字符串的宽度
unsignedchar*showBuf;//显示数据缓冲区
voidmain()
{
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;
}
}elseif(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;
}
}elseif(key_val==0x08)//下移
{
if(px { clear_Rect(px/8,0,3,64); clear_Rect(px/8,64,3,64); drawStr(px+1,py); px=px+1; } }elseif(key_val==0x09)//右移 { if(py { clear_Rect(px/8,0,3,64); clear_Rect(px/8,64,3,64); drawStr(px,py+1); py=py+1; } } } } } voiddrawStr(unsignedcharx,unsignedchary) { unsignedchartmpv,t1,t2,t3; if((x&0x07)==0x00)//如果刚好位于某一页的开始 { for(tmpv=y;tmpv { move_To(x/8,tmpv);//移动到指定页 write_Data(showBuf[2*(tmpv-y)]);//填写数据 move_To(x/8+1,tmpv);//由于显示的字符是16*N点阵,占用两页,现在移动到下页 write_Data(showBuf[2*(tmpv-y)+1]);//填写数据 } }else{ t1=(x&0x07); for(tmpv=y;tmpv { move_To(x/8,tmpv);//移动位置 t2=showBuf[2*(tmpv-y)];//取得要显示的数据 t2=t2&mapTbl[8-t1];//获取数据的低(8-t1)位 t2=t2< write_Data(t2);//填写数据 move_To(x/8+1,tmpv);//移动 t2=showBuf[2*(tmpv-y)];//取得数据 t2=t2>>(8-t1);//右移(8-t1) t3=showBuf[2*(tmpv-y)+1]; t3=t3&mapTbl[8-t1];//取得低(8-t1)位 t3=t3< t2=(t2+t3);//组合成要显示的数据 write_Data(t2);//显示数据 move_To(x/8+2,tmpv);//移动到下一页 t2=showBuf[2*(tmpv-y)+1]; t2=t2>>(8-t1);//右移(8-t1)位 write_Data(t2);//填写数据 } } } voidop_Select(charOP) { if(OP==OP_CHINESE) { width=CH_WIDTH;//设定字符串长度 px=0;//初始化显示位置,X坐标 py=0;//Y坐标 showBuf=showData_1; } elseif(OP==OP_ENGLISH) { width=EN_WIDTH;//设定字符串长度 px=24;//初始化显示位置,X坐标 py=40;//Y坐标 showBuf=showData; } } LCD显示函数: #include voidwrite_Command(charcmd) { P4OUT&=0xfb;//禁止EN P5DIR=0xff; P4OUT&=0xfc;//rs=0,r/w=0 P5OUT=cmd; P4OUT|=0x04;//使能 P4OUT&=0xfb;//禁止 } voidmove_To(charx,chary) { unsignedchartmp; 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 }elseif(tmp>63)//在chip2 { P4OUT&=0xF7;//cs1=0 P4OUT|=0x40;//cs2=1 write_Command(0xb8+x);//设置x write_Command(0x40+tmp-64);//设置y } } voidwrite_Data(charcontent) { P5DIR=0x00;//置位输入模式 P4OUT|=0x02;//r/w=1读状态 P4OUT|=0x04;//chip使能 while((P3IN&0x80)==0x80);//检测LCD是否忙 P4OUT&=0xfb;//disableEN 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禁止 } voidclear_Rect(unsignedcharx,unsignedchary,unsignedcharh,unsignedcharw) { unsignedchartmpv,tmp; for(tmpv=x;tmpv<(x+h);tmpv++) { for(tmp=y;tmp<(y+w);tmp++) { move_To(tmpv,tmp);//移动 write_Data(0x00);//在当前位置写0,即清除当前位置的显示内容 } } } voidinit_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.系统原理图:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 控制 LCD 液晶显示器 程序
![提示](https://static.bdocx.com/images/bang_tan.gif)