2023年11月30日发(作者:)

单片机实验报告

级:

名:

号:

指导教师:

实验三 LCD显示实验(2学时)

一、实验目的:

学习液晶显示的编程方法,了解液晶显示模块的工作原理。

掌握液晶显示模块与单片机的接口方法。

学习和掌握8255扩展通用I/O的方法。

基于扩展I/O口,实现LCD显示器的控制。

二、实验设备:

CPU挂箱、8031CPU模块

三、实验内容:

在掌握8255扩展I/O口的基础上,实现LCD的显示,并显示“中北大学

1105064102 姓名”。

四、实验原理说明

LCD显示电路

点阵式LCD显示电路是在系统板上外挂电正式液晶显示模块,模块的数据线、状

态、控制线都通过插孔引出。可直接与系统相连。

1OCMJ2×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

应答信号=1:已收到数据并正在处理

6 BUSY O 13 DB6 I 数据6

=0:模块空闲,可接收数据

7 DB0 I 数据0 14 DB7 I 数据7

1)表—1OCMJ2X8128X32)引脚说明

化的方法,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 条。分别是:

3、显示

8X16ASCII

符;

一)、字符显示命1、显示国标汉2、显示8X8 ASCII

令: 字; 符;

二)、图形显示命

令:

三)、屏幕控制命

令:

4、显示位点阵; 5、显示字节点阵;

6、清屏; 7、上移; 8、下移;

9、左移; 10、右移;

(以下所示取值范围分别为:2X84X85X10的取值范围)

1)显示国标汉字

命令格式: F0 XX YY QQ WW

该命令为5字节命令(最大执行时间为1.2毫秒,Ts2=1.2mS),其中

XX:为以汉字为单位的屏幕行坐标值,取值范围000702090009

YY:为以汉字为单位的屏幕列坐标值,取值范围000100030004

QQ WW:坐标位置上要显示的GB 2312 汉字区位码

2) 显示8X8 ASCII字符

命令格式:F1 XX YY AS

该命令为4字节命令(最大执行时间为0.8毫秒,Ts2=0.8mS),其中

XX:为以ASCII码为单位的屏幕行坐标值,取值范围000F041300

13

YY:为以ASCII码为单位的屏幕列坐标值,取值范围001F003F00

4F

AS:坐标位置上要显示的ASCII 字符码

3) 显示8X16 ASCII字符

命令格式:F9 XX YY AS

该命令为4字节命令(最大执行时间为1.0毫秒,Ts2=1.0mS),其中

XX:为以ASCII码为单位的屏幕行坐标值,取值范围000F04130013

YY:为以ASCII码为单位的屏幕列坐标值,取值范围001F003F00

4F

AS:坐标位置上要显示的ASCII 字符码

4) 显示位点阵

命令格式: F2 XX YY

该命令为3字节命令(最大执行时间为0.1毫秒,Ts2=0.1mS),其中

XX:为以1*1点阵为单位的屏幕行坐标值,取值范围007F209F00

9F

YY:为以1*1点阵为单位的屏幕列坐标值,取值范围004000400040

5) 显示字节点阵

命令格式: F3 XX YY BT

该命令为4字节命令(最大执行时间为0.1毫秒,Ts2=0.1mS),其中

XX:为以1*8点阵为单位的屏幕行坐标值,取值范围000F041300

13

YY:为以1*1点阵为单位的屏幕列坐标值,取值范围001F003F00

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*64OCMJ4X8)或128*32OCMJ2X8)点阵坐标为准,可在屏

幕任意位置显示。

2OCMJ2×8液晶模块外部连接原理图及接口说明

3 47 8051OCMJ4X8模块连接图

模块上DB0~DB7插孔对应于位数据线;BUSYREQ插孔分别对应于图中相应

的引脚。

五、实验步骤

1、实验连线

8255PA0~PA7DB0~DB7PC7BUSYPC0REQCS8255CS0

2、运行实验程序,观察液晶的显示状态。

六、程序框图

开始

初始化

查表读数据

BUSY为0?

Y

数据输出

REQ置位

N

BUSY为1?

Y

REQ复位

N

N

数据读完?

Y

结束

七、实验图像

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;

}

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

}

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)运行程序,仿真,得出结果。

九、实验中遇到的问题及解决方法:

无法正常显示图像内容,位置显示错误

(资料素材和资料部分来自网络,供参考。可复制、编制,期待你的好评与关

注)