实验二心电图机液晶显示系统实验图形部分.docx
《实验二心电图机液晶显示系统实验图形部分.docx》由会员分享,可在线阅读,更多相关《实验二心电图机液晶显示系统实验图形部分.docx(38页珍藏版)》请在冰豆网上搜索。
![实验二心电图机液晶显示系统实验图形部分.docx](https://file1.bdocx.com/fileroot1/2022-12/30/452f9303-de95-4d7c-92dd-f7556d9226ec/452f9303-de95-4d7c-92dd-f7556d9226ec1.gif)
实验二心电图机液晶显示系统实验图形部分
实验二心电图机液晶显示系统实验(图形部分)
李元斌
1、实验目的
●了解液晶显示的原理
●掌握液晶面板上进行波形显示的原理和方法
●掌握单片机编程技巧
2、实验要求
●了解80C51单片机及OCMJ4X8C液晶模组的硬件配置及连接方法
●掌握80C51单片机的编程语言
●掌握波形输出程序的算法和结构
●编写程序并调试程序
3、实验设备
●单片机仿真器
●金鹏OCMJ4X8C液晶模组
●稳压电源
4、实验内容
4.1实验说明
心电图是反映心脏兴奋的电活动过程,它对心脏基本功能及其病理研究方面,具有重要的参考价值。
心电图可以分析与鉴别各种心律失常,也可以反映心肌受损的程度、病理发展过程和心房、心室的功能结构情况,在指导心脏手术进行及指示必要的药物处理上有参考价值。
心电图的检查还必须结合多种指标和临床资料,进行全面综合分析,才能对心脏的功能结构做出正确的判断。
由此可以看出心电图的显示在临床医疗方面的重要性。
液晶显示在心电图机中的应用是将数字技术、计算机技术结合起来,利用单片机和液晶显示模块进行波形显示。
系统的主要功能是提供中文界面,对存储的心电图数据进行波形输出。
系统使用液晶显示模块,并利用51单片机作为系统控制核心,负责控制、检测、输入/输出显示等一系列的程序动作,使整个系统操作简便并且充满人性化。
4.2OCMJ4X8C液晶模块简介
概述
C系列中文模块可以显示字母、数字符号、中文字形及图形,具有绘图及文字画面混合显示功能。
提供三种控制接口,分别是8位微处理器接口,4位微处理器接口及串行接口。
所有的功能,包含显示RAM,字符产生器,都包含在一个芯片里面,只要一个最小的微处理器系统,就可以方便的操作模块。
内置2M-位中文字型ROM(CGROM),总共提供8192个中文字型(16*16点阵),16K-位半宽字型ROM(HCGROM)总共提供126个符号字型(16*8点阵),64*16-位字型产生RAM(CGRAM),另外绘图显示画面提供一个64*256点的绘图区域(GDRAM),可以和文字画面混合显示。
提供多功能指令:
画面清除、光标归位、显示打开/关闭、光标显示/隐藏、显示字符闪烁、光标移位、显示移位、垂直画面卷动、反白显示、待命模式。
主要参数:
1、工作电压(VDD):
4.5~5.5V
2、逻辑电平:
2.7~5.5V
3、LCD驱动电压(Vo):
0~7V
4、工作温度(Ta):
0~55℃(常温)/-20~75℃(宽温)
保存温度(Tstg):
-10~65℃(常温)/-30~85℃(宽温)
外形尺寸
注意:
放置液晶时焊盘一侧应放在下侧,此时左上角坐标为(0,0)
接口信号:
OCMJ4X8C液晶显示模块的接口信号包括8位三态数据线DB0~DB7、命令数据线RS、片选信号线E、串并行模式选择线PSB以及读写控制线RW等。
详细的接口信号端说明如下表所列。
编号
符号
引脚说明
编号
符号
引脚说明
1
VSS
GND(0V)
11
DB4
数据4
2
VDD
逻辑电平(+5V)
12
DB5
数据5
3
V0
LCD供电电压(悬空)
13
DB6
数据6
4
RS
1:
数据0:
命令
14
DB7
数据7
5
R/W
1:
读0:
写
15
PSB
1:
并行模式0:
串行模式
6
E
使能端(高电平有效)
16
NC
空脚
7
DB0
数据0
17
/RST
重启复位(低电平有效)
8
DB1
数据1
18
NC
空脚
9
DB2
数据2
19
LEDA
背光源正极(+5V)
10
DB3
数据3
20
LEDK
背光源负极(0V)
备注:
上表所示接口功能均为并行模式下功能,串口模式下部分接口功能不同或无效
硬件连接图
4.3程序设计(汇编语言编程)
4.3.1发送数据子程序
SEND_D:
LCALLCHK_BUSY
SETBRS
CLRRW
MOVP1,A
SETBE
NOP
NOP
CLRE
RET
4.3.2写指令子程序
SEND_I:
LCALLCHK_BUSY
CLRRS
CLRRW
MOVP1,A
SETBE
NOP
NOP
CLRE
RET
4.3.3读数据子程序
READ_D:
LCALLCHK_BUSY
SETBRS
SETBRW
SETBE
NOP
MOVA,P1
CLRE
MOVSTORE,A
RET
4.3.4测忙碌子程序
CHK_BUSY:
MOVP1,#0FFH
CLRRS
SETBRW
SETBE
JBP1.7,$
CLRE
RET
4.3.5写坐标子程序
WR_ZB:
MOVA,#34H
LCALLSEND_I
MOVA,LCD_Y
LCALLSEND_I
MOVA,LCD_X
LCALLSEND_I
MOVA,#30H
LCALLSEND_I
RET
注:
程序中出现的NOP指令不能省略,否则数据传送将发生错误,原因请参见时序图。
4.3.6初始化
在程序启动时,应先对液晶进行初始化,代码如下:
INITIAL:
MOVA,#34H;34H--扩充指令操作
LCALLSEND_I
MOVA,#30H;30H--基本指令操作
LCALLSEND_I
MOVA,#01H;清除显示
LCALLSEND_I
MOVA,#06H;指定在资料写入或读取时,光标的移动方向
LCALLSEND_I
MOVA,#0CH;开显示,关光标,不闪烁
LCALLSEND_I
RET
4.3.7绘图
绘图显示RAM提供64*32个字节的记忆空间,最多可以控制256*64点的二维绘图缓冲空间,在更改绘图RAM时,由扩充指令设定GDRAM地址,先设垂直地址再设水平地址,再写入两个8位的资料到绘图RAM,而地址计数器会自动加1,整个写入绘图RAM的步骤如下:
1、先将垂直的字节坐标(Y)写入绘图RAM地址
2、再将水平的字节坐标(X)写入绘图RAM地址
(参见WR_ZB程序)
3、将D15~D8写入到RAM中
4、将D7~D0写入到RAM中
例如:
描记如图示的一组点的程序为:
MOVLCD_X,#80H
MOVLCD_Y,#80H
LCALLWR_ZB
MOVA,#0EBH
LCALLSEND_D
MOVA,#00H
LCALLSEND_D
4.3.8波形显示
由上面的例子可以看出,绘图时描点的顺序是从左至右,从波形的角度看,横坐标代表时间,则一次要写16个时刻的点,可是我们每次拿到一个数据只能确定它的纵坐标,很难同时得到占用同一横坐标的其他15个时刻的纵坐标并转化为2个字节的数组。
因此我们需要对同一坐标连续写16次,方法为:
计算得到第一个点的纵坐标,在这个纵坐标上写80H和00H(即将第一个点描记出来),将80H和00H(字)右环移,计算第二个点的纵坐标,如果与第一个不同,则在此纵坐标上写右环移后的字;如果与第一个相同,则将右环移后的字与8000H取并,再写入这个纵坐标……这样,每次循环16次,再增加横坐标,循环16次,增加横坐标……
流程图如下:
参考程序如下:
LGS2:
MOVR1,#8
MOVLCD_X,#80H
MOVDPTR,#TAB
C2:
MOVR0,#16
MOVDH,#80H
MOVDL,#00H
C1:
CLRA
MOVCA,@A+DPTR
INCDPTR
MOVB,#4
DIVAB
CJNEA,#31,CNEXT
LJMPHIGHER;上半区
CNEXT:
JCLOWER;下半区
HIGHER:
MOVB,A
MOVA,#63
CLRC
SUBBA,B
ORLA,#80H
MOVLCD_Y,A
LJMPNEX
LOWER:
MOVB,A
MOVA,#31
CLRC
SUBBA,B
ORLA,#80H
MOVLCD_Y,A
MOVA,LCD_X
ORLA,#08H
MOVLCD_X,A
NEX:
LCALLWR_ZB
LCALLREAD_D;读出的为高8位地址
LCALLREAD_D
MOVR6,STORE;高8位
LCALLREAD_D
MOVR7,STORE;低8位
LCALLWR_ZB
MOVA,DH
ORLA,R6
LCALLSEND_D
MOVA,DL
ORLA,R7
LCALLSEND_D
LCALLRCIR;对字右环移
MOVA,LCD_X
ANLA,#0F7H
MOVLCD_X,A;恢复LCD_X在上半区
DJNZR0,C1
INCLCD_X
DJNZR1,C2
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
MOVA,#36H
LCALLSEND_I
MOVA,#30H
LCALLSEND_I
LJMP$
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$对字右环移子程序
RCIR:
MOVA,DH
CLRC
RRCA
MOVDH,A
MOVA,DL
RRCA
JBPSW.7,RNEXT
MOVDL,A
RET
RNEXT:
ORLA,#80H
MOVDL,A
RET
4.3.9波形的移动显示
可以看出,上面的做法得到的波形并不能移动,只能静止的显示,由于数据有256个,而液晶横向只有128个点,因此一半的心电图信息就无法显示,因此,我们希望能够让波形滚动显示,以便看到心电的完整信息。
做法为:
当描记128个点后,就将写入数据的指针向TAB后移一位,重新写128个点,如此循环128次即可让波形滚动起来。
参考程序二:
;******************OCM4x8C用上半区域显示波形(半屏)*********
;将LGS2中的LCD_X改为88H即可在下半区域作图********
RSEQUP3.0
RWEQUP3.1
EEQUP3.2
PSBEQUP3.3
RSTEQUP3.4
LCD_XEQU30H
LCD_YEQU31H
COUNTEQU32H
COUNT1EQU33H
COUNT2EQU34H
COUNT3EQU35H
LCD_DATAEQU36H
LCD_DATA1EQU37H
LCD_DATA2EQU38H
STOREEQU39H
DHEQU40H
DLEQU41H
;***********************************************
ORG0000H
LJMPMAIN
ORG0100H
MAIN:
NOP
NOP
MOVSP,#5FH
SETBRST
NOP
SETBPSB
;********************初始化**********************
LGS0:
MOVA,#34H;34H--扩充指令操作
LCALLSEND_I
MOVA,#30H;30H--基本指令操作
LCALLSEND_I
MOVA,#01H;清除显示
LCALLSEND_I
MOVA,#06H;指定在资料写入或读取时,光标的移动方向
LCALLSEND_I
MOVA,#0CH;开显示,关光标,不闪烁
LCALLSEND_I
;***********************************************
CLRRAM:
MOVLCD_DATA1,#00H;GDRAM写0子程序
MOVLCD_DATA2,#00H
LCALLLAT_DISP
LJMPLGS2
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
LAT_DISP:
MOVCOUNT3,#02H;显示点阵子程序
MOVLCD_X,#80H
LAT_DISP1:
MOVLCD_Y,#80H
CLRF0
MOVCOUNT2,#20H
LAT_DISP2:
MOVCOUNT1,#10H
LCALLWR_ZB
LAT_DISP3:
JBF0,LAT_DISP32
MOVLCD_DATA,LCD_DATA1
AJMPLAT_DISP31
LAT_DISP32:
MOVLCD_DATA,LCD_DATA2
LAT_DISP31:
MOVA,LCD_DATA
LCALLSEND_D
DJNZCOUNT1,LAT_DISP31
INCLCD_Y
CPLF0
DJNZCOUNT2,LAT_DISP2
MOVLCD_X,#88H
DJNZCOUNT3,LAT_DISP1
MOVA,#36H
LCALLSEND_I
MOVA,#30H
LCALLSEND_I
RET
;***********************************************
LGS2:
MOVR1,#8
MOVLCD_X,#80H
MOVDPTR,#TAB
C2:
MOVR0,#16
MOVDH,#80H
MOVDL,#00H
C1:
CLRA
MOVCA,@A+DPTR
INCDPTR
MOVB,#8
DIVAB
MOVB,A
MOVA,#31
CLRC
SUBBA,B
ORLA,#80H
MOVLCD_Y,A
LCALLWR_ZB
LCALLREAD_D;address
LCALLREAD_D
MOVR6,STORE;most8
LCALLREAD_D
MOVR7,STORE;least8
LCALLWR_ZB
MOVA,DH
ORLA,R6
LCALLSEND_D
MOVA,DL
ORLA,R7
LCALLSEND_D
LCALLRCIR;对字右环移
DJNZR0,C1
INCLCD_X
DJNZR1,C2
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
MOVA,#36H
LCALLSEND_I
MOVA,#30H
LCALLSEND_I
LJMP$
;***********************************************
WR_ZB:
MOVA,#34H
LCALLSEND_I
MOVA,LCD_Y
LCALLSEND_I
MOVA,LCD_X
LCALLSEND_I
MOVA,#30H
LCALLSEND_I
RET
;***********************************************
SEND_D:
LCALLCHK_BUSY;写数据子程序
SETBRS
CLRRW
MOVP1,A
SETBE
NOP
NOP
CLRE
RET
SEND_I:
LCALLCHK_BUSY;写指令子程序
CLRRS
CLRRW
MOVP1,A
SETBE
NOP
NOP
CLRE
RET
READ_D:
LCALLCHK_BUSY;读数据子程序
SETBRS
SETBRW
SETBE
NOP
MOVA,P1
CLRE
MOVSTORE,A
RET
CHK_BUSY:
MOVP1,#0FFH;测忙碌子程序
CLRRS
SETBRW
SETBE
JBP1.7,$
CLRE
RET
RCIR:
MOVA,DH
CLRC
RRCA
MOVDH,A
MOVA,DL
RRCA
JBPSW.7,RNEXT
MOVDL,A
RET
RNEXT:
ORLA,#80H
MOVDL,A
RET
;***********************************************
TAB:
DB72,72,72,72,71,71,70,70,69,69,68,67,67,66,66,66
DB66,66,67,68,69,70,71,71,72,72,72,72,72,72,72,72
DB72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72
DB72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72
DB66,54,46,38,26,15,12,11,12,16,23,44,66,97,122,145
DB156,163,168,176,188,202,210,205,198,188,172,160,146,136,125,113
DB104,94,85,77,72,70,68,66,64,63,62,61,60,59,58,58
DB57,56,55,55,54,53,53,52,52,51,51,50,50,49,49,48
DB48,47,47,46,46,45,45,44,44,43,43,42,42,41,41,40
DB40,39,39,38,38,37,37,36,36,35,35,34,34,33,33,32
DB32,31,30,29,28,27,26,25,24,23,22,20,19,18,17,16
DB15,14,13,13,12,12,12,12,12,13,13,14,14,15,16,17
DB18,20,21,22,23,25,26,27,29,30,31,33,34,36,38,39
DB41,43,45,47,48,50,51,53,54,55,56,58,59,60,61,62
DB64,65,66,67,68,69,70,70,71,71,72,72,72,72,72,72
DB72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72
END
;******************OCM4x8C全屏显示波形******************
RSEQUP3.0
RWEQUP3.1
EEQUP3.2
PSBEQUP3.3
RSTEQUP3.4
LCD_XEQU30H
LCD_YEQU31H
COUNTEQU32H
COUNT1EQU33H
COUNT2EQU34H
COUNT3EQU35H
LCD_DATAEQU36H
LCD_DATA1EQU37H
LCD_DATA2EQU38H
STOREEQU39H
DHEQU40H
DLEQU41H
;***********************************************
ORG0000H
LJMPMAIN
ORG0100H
MAIN:
NOP
NOP
MOVSP,#5FH
SETBRST
NOP
SETBPSB
;********************初始化**********************
LGS0:
MOVA,#34H;34H--扩充指令操作
LCALLSEND_I
MOVA,#30H;30H--基本指令操作
LCALLSEND_I
MOVA,#01H;清除显示
LCALLSEND_I
MOVA,#06H;指定在资料写入或读取时,光标的移动方向
LCALLSEND_I
MOVA,#0CH;开显示,关光标,不闪烁
LCALLSEND_I
;***********************************************
CLRRAM:
MOVLCD_DATA1,#00H;GDRAM写0子程序
MOVLCD_DATA2,#00H
LCALLLAT_DISP
LJMPLGS2
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
LAT_DISP:
MOVCOUNT3,#02H;显示点阵子程序
MOVLCD_X,#80H
LAT_DISP1:
MOVLCD_Y,#80H
CLRF0
MOVCOUNT2,#20H
LAT_DISP2:
MOVCOUNT1,#10H
LCALLWR_ZB
LAT_DISP3:
JBF0,LAT_DISP32
MOVLCD_DATA,LCD_DATA1
AJMPLAT_DISP31
LAT_DISP32:
MOVLCD_DATA,LCD_DATA2
LAT_DISP31:
MOVA,LCD_DATA
LCALLSEND_D
DJNZCOUNT1,LAT_DISP31
INCLCD_Y
CPLF0
DJNZCOUNT2,LAT_DISP2
MOVLCD_X,#88H
DJNZCOUNT3,LAT_DISP1
MOVA,#36H
LCALLSEND_I