LCD显示实验
单片机实验报告
班级:
姓名:
学号:
指导教师:
实验三 LCD显示实验(2学时)
一、实验目的:
学习液晶显示的编程方法,了解液晶显示模块的工作原理。
掌握液晶显示模块与单片机的接口方法。
学习和掌握8255扩展通用I/O的方法。
基于扩展I/O口,实现LCD显示器的控制。
二、实验设备:
CPU挂箱、8031CPU模块
三、实验内容:
在掌握8255扩展I/O口的基础上,实现LCD的显示,并显示“中北大学1105064102 姓名”。。
四、实验原理说明
LCD显示电路
点阵式LCD显示电路是在系统板上外挂电正式液晶显示模块,模块的数据线、状态、控制线都通过插孔引出。可直接与系统相连。
1、OCMJ2×8液晶模块介绍及使用说明
OCMJ中文模块系列液晶显示器内含 GB 2312 16*16点阵国标一级简体汉字和ASCII8*8(半高)及8*16(全高)点阵英文字库,用户输入区位码或 ASCII 码即可实
现文本显示。也可用作一般的点阵图形显示器之用。提供位点阵和字节点阵两种图形显示功能,用户可在指定的屏幕位置上以点为单位或以字节为单位进行图形显示。完全兼容一般的点阵模块。OCMJ中文模块系列液晶显示器可以实现汉字、ASCII 码、点阵图形和变化曲线的同屏显示,并可通过字节点阵图形方式造字。本系列模块具有上/下/左/右移动当前显示屏幕及清除屏幕的命令。一改传统的使用大量的设置命令进行初始
引
脚
名称方向说明引脚名称方向说明
1 VLED+ I 背光源正极(LED+5V)8 DB1 I 数据1
2 VLED- I 背光源负极(LED-OV)9 DB2 I 数据2
3 VSS I 地10 DB3 I 数据3
4 VDD I (+5V)11 DB4 I 数据4
5 REQ I 请求信号,高电平有效12 DB5 I 数据5
6 BUSY O 应答信号=1:已收到数据并正在处理
中
=0:模块空闲,可接收数据
13 DB6 I 数据6
7 DB0 I 数据0 14 DB7 I 数据7
1)表—1:OCMJ2X8(128X32)引脚说明
化的方法,OCMJ 中文模块所有的设置初始化工作都是在上电时自动完成的,实现了“即插即用”。同时保留了一条专用的复位线供用户选择使用,可对工作中的模块进
行软件或硬件强制复位。规划整齐的10个用户接口命令代码,非常容易记忆。标准用户硬件接口采用REQ/BUSY 握手协议,简单可靠。
硬件接口
接口协议为请求/应答(REQ/BUSY)握手方式。应答BUSY 高电平(BUSY =1)表示 OCMJ 忙于内部处理,不能接收用户命令;BUSY 低电平(BUSY =0)表示 OCMJ 空闲,等待接收用户命令。发送命令到 OCMJ可在BUSY =0 后的任意时刻开始,先把用户命令的当前字节放到数据线上,接着发高电平REQ 信号(REQ =1)通知OCMJ 请求处理当前数据线上的命令或数据。OCMJ模块在收到外部的REQ高电平信号后立即读取数据线上的命令或数据,同时将应答线BUSY变为高电平,表明模块已收到数据并正在忙于对此数据的内部处理,此时,用户对模块的写操作已经完成,用户可以撤消数据线上的信号并可作模块显示以外的其他工作,也可不断地查询应答线BUSY 是否为低(BUSY =0?),如果BUSY =0,表明模块对用户的写操作已经执行完毕。可以再送下一个数据。如向模块发出一个完整的显示汉字的命令,包括坐标及汉字代码在内共需5个字节,模块在接收到最后一个字节后才开始执行整个命令的内部操作,因此,最后一个字节的应答BUSY 高电平(BUSY =1)持续时间较长,具体的时序图和时间参数说明查阅相关手册。
用户命令
用户通过用户命令调用 OCMJ 系列液晶显示器的各种功能。命令分为操作码及操作数两部分,操作数为十六进制。共分为 3 类10 条。分别是:
一)、字符显示命令:1、显示国标汉
字;
2、显示8X8 ASCII字
符;
3、显示
8X16ASCII字
符;
二)、图形显示命
4、显示位点阵;
5、显示字节点阵;
令:
三)、屏幕控制命
6、清屏;
7、上移;
8、下移;
令:
9、左移;10、右移;
(以下所示取值范围分别为:2X8、4X8、5X10的取值范围)
1)显示国标汉字
命令格式: F0 XX YY QQ WW
该命令为5字节命令(最大执行时间为1.2毫秒,Ts2=1.2mS),其中
XX:为以汉字为单位的屏幕行坐标值,取值范围00到07、02到09、00到09 YY:为以汉字为单位的屏幕列坐标值,取值范围00到01、00到03、00到04 QQ WW:坐标位置上要显示的GB 2312 汉字区位码
2) 显示8X8 ASCII字符
命令格式:F1 XX YY AS
该命令为4字节命令(最大执行时间为0.8毫秒,Ts2=0.8mS),其中
XX:为以ASCII码为单位的屏幕行坐标值,取值范围00到0F、04到13、00到13
YY:为以ASCII码为单位的屏幕列坐标值,取值范围00到1F、00到3F、00到4F
AS:坐标位置上要显示的ASCII 字符码
3) 显示8X16 ASCII字符
命令格式:F9 XX YY AS
该命令为4字节命令(最大执行时间为1.0毫秒,Ts2=1.0mS),其中
XX:为以ASCII码为单位的屏幕行坐标值,取值范围00到0F、04到13、00到13
YY:为以ASCII码为单位的屏幕列坐标值,取值范围00到1F、00到3F、00到4F
AS:坐标位置上要显示的ASCII 字符码
4) 显示位点阵
命令格式: F2 XX YY
该命令为3字节命令(最大执行时间为0.1毫秒,Ts2=0.1mS),其中
XX:为以1*1点阵为单位的屏幕行坐标值,取值范围00到7F、20到9F、00到9F
YY:为以1*1点阵为单位的屏幕列坐标值,取值范围00到40、00到40、00到40
5) 显示字节点阵
命令格式: F3 XX YY BT
该命令为4字节命令(最大执行时间为0.1毫秒,Ts2=0.1mS),其中
XX:为以1*8点阵为单位的屏幕行坐标值,取值范围00到0F、04到13、00到13
YY:为以1*1点阵为单位的屏幕列坐标值,取值范围00到1F、00到3F、00到4F
BT:字节像素值,0 显示白点,1 显示黑点(显示字节为横向)
6) 清屏
命令格式:F4
该命令为单字节命令(最大执行时间为11毫秒,Ts2=11mS),其功能为将屏幕清空。
7) 上移
格式:F5
令为单字节命令(最大执行时间为25毫秒,Ts2=25mS),其功能为将屏幕向上移一个点阵行。
8) 下移
命令格式:F6
该命令为单字节命令(最大执行时间为30毫秒,Ts2=30mS),其功能为将屏幕向下移动一个点阵行。
9) 左移
命令格式:F7
该命令为单字节命令(最大执行时间为12毫秒,Ts2=12mS),其功能为将屏幕向左移动一个点阵行。
10) 右移
命令格式: F8
该命令为单字节命令(最大执行时间为12毫秒,Ts2=12mS),其功能为将屏幕向右移动一个点阵行。
显示窗口坐标关系
以上列表为汉字、ASCⅡ码显示屏幕坐标(ASCⅡ码Y坐标一点阵坐标为准)。如显示图形点阵,则以128*64(OCMJ4X8)或128*32(OCMJ2X8)点阵坐标为准,可在屏幕任意位置显示。
2、OCMJ2×8液晶模块外部连接原理图及接口说明
图3 –47 8051与OCMJ4X8模块连接图
模块上DB0~DB7插孔对应于位数据线;BUSY、REQ插孔分别对应于图中相应的引脚。
五、实验步骤
1、实验连线
8255的PA0~PA7接DB0~DB7,PC7接BUSY,PC0接REQ,CS8255接
CS0。
2、运行实验程序T20.asm,观察液晶的显示状态。
六、程序框图
开始
初始化
查表读数据
BUSY为0?数据输出
BUSY为1? REQ复位数据读完? REQ置位
结束N
Y
Y
N
Y
N
七、实验图像
图 1 1602液晶仿真图
图 2 1602LCD开发板显示图
实验代码如下,LCD分为驱动接口层和App层,驱动接口实现传输指令和数据。Ap P层利用Driver层实现的函数实现显示字符穿,数字等。最后主函数只需要调用App函数就可以,方便快捷,移植性强。只需改驱动就可以在其他平台·运行。
LCD_Driver :
#include "LCD_Driver.h"
void LCD_WriteData( uchar WD ) //写数据
{
while( LCD_CheckBusy() != 0 );
CE = 0;
RS = 1; //选择数据
RW = 0; //选择写数据
Delay_Us1;
CE = 1;
Delay_Us1;
LCDD( WD ); //数据
CE = 0;
}
void LCD_WriteInstruct( uchar Ins ) //写指令
{
while( LCD_CheckBusy() != 0 );
CE = 0;
RS = 0; //选择指令
RW = 0; //选择写数据
Delay_Us1;
CE = 1;
Delay_Us1;
LCDD( Ins ); //数据
CE = 0;
}
bit LCD_CheckBusy( void ) //检查忙
{
LCDD(0xff); //拉高做输入
CE = 0;
RS = 0;
RW = 1;
Delay_Us1;
CE = 1;
Delay_Us1;
return(P2&BIT(7));
}
LCD_App :
#include "LCD_App.h"
void LCD_Init( void ) //初始化LCD
{
LCD_WriteInstruct( 0x38 ); //设置接口方式
LCD_WriteInstruct( 0x06 );
LCD_WriteInstruct( 0x0f );
LCD_WriteInstruct( 0x01 );
LCD_WriteInstruct( 0x02 );
}
void LCD_WriteNum( uchar LineX , uchar BitX , uchar WD ) //写1位数字{
if( LineX==1 )
{
LCD_WriteInstruct( 0x80+BitX );
LCD_WriteData( 0x30+WD );
}
else
{
LCD_WriteInstruct( 0x80+0x40+BitX );
LCD_WriteData( 0x30+WD );
}
}
void LCD_WriteChar( uchar LineX , uchar BitX , uchar WD ) //写ASCII {
if( LineX==1 )
{
LCD_WriteInstruct( 0x80+BitX );
LCD_WriteData( WD );
}
else
{
LCD_WriteInstruct( 0x80+0x40+BitX );
LCD_WriteData( WD );
}
}
void LCD_WriteString( uchar LineX , uchar BitX , uchar *WD )//写字符串{
while( *WD != '\0' )
{
LCD_WriteChar( LineX , BitX++ , *WD );
WD++;
}
}
Main函数和键盘扫描带代码:
#include "SYS.h"
#include "LCD_App.h"
void main( void )
{
uchar Display_Num =0 ;
uchar Display_Num1;
LCD_Init();
LCD_WriteString( 1,0,"Name: MaChao");
LCD_WriteString( 2,0,"Num : 1105064347");
//分层实现主函数就是简洁明了 hhh
while(1)
{
;
}
}
八、实验步骤:
(1)在proteus下新建一个工程;
(2)按照原理图连接好仿真电路;
(3)在keil环境下编译好程序并生成 .HEX文件,导入单片机;
(4)运行程序,仿真,得出结果。
九、实验中遇到的问题及解决方法:
无法正常显示图像内容,位置显示错误