资源描述
目录
一、 选题分析 1
二、 液晶显示控制电路与程序方案设计 2
2.1系统设计思路与框图 2
2.2框图模块功能描述及技术指标分析 3
2.3 电路原理图 4
2.4 相关芯片介绍 5
2.5程序主流程图以及子流程图 7
三、ST7920指令说明 10
四、具体功能程序及硬件实现 14
4.1主要功能程序实现 14
4.2实验步骤 17
4.3硬件电路实现与显示结果 19
4.4试验中遇到的问题 20
五、总结与体会 21
参考文献 22
附录 23
25
一、 选题分析
题目:液晶显示控制电路与程序设计
内容:完成单片机液晶接口的电路和程序设计,实现文本显示功能。
(1)液晶显示器为图形点阵液晶,型号YM12864R,控制芯片为ST7920
(2)正确连接液晶显示器与单片机
(3)编写液晶显示控制程序,显示如下内容:
分析:随着计算机及相关的微电子﹑光电子技术的迅猛发展,液晶显示模块在各种场合得到了越来越广泛的应用。目前,液晶显示主要有段式和点阵式两种,其中,点阵式更为广泛,其又可分为文本型显示和图形型显示。YM12864R作为汉字图形点阵液晶显示模块,可以显示汉字及图形,内置8192 个中文汉字、128 个字符及64X256点阵显示RAM,另外还提供四组16×16 点的自定义图像空间。YM12864R采用的控制芯片为ST7920,它是一种内置128×64 汉字图形点阵的液晶显示控制模块, ST7920 系列芯片由于内置了汉字库而无须人工取字模,在程序控制上简洁明。
为完成YM12864R控制和数据传输,单片机最小系统选择AT89S51,因为AT89S51片内ROM全都采用Flash ROM,具有在线编程可擦除技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,不需要对芯片多次拔插,所以不会对芯片造成损坏。
综上,硬件电路搭建可由YM12864R 液晶显示电路、单片机的最小系统AT89S51、及外围电路构成。
二、 液晶显示控制电路与程序方案设计
2.1系统设计思路与框图
液晶显示器YM12864R 的控制器ST7920 可以显示字母、数字符号、中文字型及自定图形显示,只要一个最小的微处理系统,将液晶显示模块的接口作为I/O 设备直接与之连接,就可以进行控制液晶显示器和数据传输,从而达到理想的显示效果。使用P3 口给液晶显示器提供控制信号,P0 口给液晶显示器传送数据。YM12864R 液晶显示器的控制信号有PSB、RS、R/W、E,其中RS、R/W、E分别对应接在AT89S51 的P3.0、P3.1、P3.2、P2.3 上,在本次设计中采用并行接口,故PSB接高电平,而8位数据口DB0~ DB7对应接在P0 口上。背光灯的电源正极、液晶显示器模块的电源正极以及LCD 驱动电压输入端都接在+5V 的稳压电源上。背光灯负极和模块的电源负极统一接地。液晶显示器模块的复位脚连接开关按纽与地相连。即可实现单片机对液晶显示汉字的控制。
系统设计图框如下图2.1所示,主要由单片机的最小系统AT89S51、YM12864R 液晶显示电路及外围电路构成。
图2.1 系统设计框图
2.2框图模块功能描述及技术指标分析
时钟振荡器模块:
利用晶体本身的特性,可以利用晶振与电容搭建振荡电路与AT89S51引脚XTAL1及XTAL2相连,向单片机提供一个频率稳定度较高的时钟脉冲,具体连接见原理图。此外,采用24M晶振获得较高的刷新率,可使屏幕显示更稳定。
开关复位电路模块:
AT89S51 的复位引脚RST 外接开关复位电路,当电路工作后,闭合开关,只要在RST 引脚上出现2 个机器周期以上的高电平,单片机即可复位。若RST始终保持高电平,则可对AT89S51 循环复位。开关复位电路的组成如原理图——电阻R2和开关S1串联后与电容C3并联,然后与R1串联对+5V电压进行分压,R1一端接地另一端接复位信号引脚RST。
AT89S51模块:
作为核心组成部件之一,ATS8951单片机给YM12864R液晶显示提供控制信号和进行数据传输,从整体上实现液晶显示控制。
AT89S51片内ROM全都采用Flash ROM,具有在线编程可擦除技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,不需要对芯片多次拔插,所以不会对芯片造成损坏。
AT89S51片内具有计算机正常运行所必需的部件,片外有很多供扩展用的(总线,并行和串行的输入/输出)管脚,便于扩展,很容易组成一定规模的计算机应用系统。具有丰富的控制指令,控制功能强。此外其体积小,功耗低,价格便宜。
YM12864R液晶显示模块:
YM12864R液晶显示模块,在其控制芯片ST7920调控下用来显示最终结果。除显示液晶块外,还包含两个重要外围电路——开关复位电路及电源控制电路,具体如原理图所示。YM12684的复位引脚RET 外接开关复位电路,当开关闭合时,RET引脚接地,模块复位;当开关断开时,复位信号无效。此外,外接电源电路利用滑动变阻器分压分别给YM12864R的电源地引脚VSS和LCD驱动电压输入端引脚V0供电。
2.3 电路原理图
电路原理图如图2.2所示,其中单片机AT89S51引脚P3.0-P3.2与YM12864R中RS、R/W、E的连接在图中以网络标签的形式给出。此外,相较于系统设计框图在液晶显示模块控制芯片的调控上,对复位引脚处以简单开关复位电路控制,而电压地VSS及LCD的操作电压以变阻器控制。
外接电源电路
时钟振荡器
开关复位电路
图2.2 电路原理图
2.4 相关芯片介绍
AT89S51:
AT89S51是一个低功耗,高性能CMOS 8位单片机,片内含4k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的AT89S51可为许多嵌入式控制应用系统提供高性价比的解决方案。
AT89S51引脚图如图2.3,其内部I/O部件包括:
1、 四个8位通用I/O端口,对应引脚P0、P1、P2和P3;
2、 两个16位定时计数器;(TMOD,TCON,TL0,TH0,TL1,TH1)
3、 一个串行通信接口;(SCON,SBUF)
4、 一个中断控制器;(IE,IP)
图2.3 AT89S51引脚图
ST7920:【4】
ST7920是台湾矽创电子公司生产的中文图形控制芯片,它是一种内置128*64-12汉字图形点阵的液晶显示控制模块,用于显示汉字及图形。该芯片共内置8192个中文汉字(16*16点阵)、128个字符的ASCII字符库(8*16点阵)及64*256点阵显示RAM(GDRAM)。为了能够简单、有效地显示汉字和图形,该模块内部设计有2MB的中文字型CGROM和64*256点阵的GDRAM绘图区域;同时,该模块还提供有4组可编程控制的16*16点阵造字空间;除此之外,为了适应多种微处理器和单片机接口的需要,该模块还提供了4位并行、8位并行、2线串行以及3线串行等多种接口方式。
利用上述功能可方便地实现汉字、ASCII码、点阵图形、自造字体的同屏显示,所有这些功能(包括显示RAM、字符产生器以及液晶驱动电路和控制器)都包含在集成电路芯片里,因此,只要一个最基本的微处理系统就可以通过ST7920芯片来控制其它的芯片。ST7920的主要技术参数和显示特性如下:
电源:VDD (-2.7~+5.5V)+5V(内置升压电路,一般无需负压);
功耗:正常模式:450μA,睡眠模式:3μA,低功耗模式:30μA;
显示内容:128列*64行;
显示颜色:黄绿;
显示角度:6:00钟直视;
LCD类型:STN;
与MCU接口:8位并行/3位串行;
配置有LED背光显示功能;
带有自动启动复位按钮(RESET);
在对ST7920读或写时,会用到两个8位的寄存器,一个是数据寄存器DR,另一个是指令寄存器IR。通过数据寄存器DR可以存取DDRAM、CGRAM、CGROM及IRAM的值。待存取的目标RAM的地址可通过命令来选择,每次数据寄存器DR的操作应以上次选择的目标RAM为主体来进行读出或写入。通过RS和RW的状态可以选择不同的读写模式,具体配置方法如表1所列。
表1 ST7920的寄存器读写状态
RS
RW
功能说明
低电平0
低电平0
MPU 写指令到指令寄存器IR
低电平0
高电平1
读出忙标志及地址计数器的状态
高电平1
低电平0
MPU 写指令到数据寄存器DR
高电平1
高电平1
MPU从数据寄存器DR 读出指令
2.5程序主流程图以及子流程图
整个程序除主函数外包含以下几个子函数: ST7920初始化、写指令、写数据、汉字显示、延时、清屏。ST7920初始化子函数用来完成液晶显示模块的初始化操作并设置显示的方式及必要的参数,为显示操作做好必要的准备;写指令函数向指令寄存器写入不同的命令从而控制液晶显示芯片的显示。写数据函数向数据寄存器写入数据从而在液晶显示屏上显示相应的或字符字符或此外写指令操作与写数据操作的过程基本一致,区别在于写状态对RS及RW的状态选择不同;汉字显示函数包含设置所要显示的汉字或字符的显示的地址,向显示RAM(DDRAM)写入所要显示汉字区码的高八位及低八位三个操作,从而实现在液晶屏上显示字符的功能;延时函数进行一定时间的等待,代替判断忙标志函数,使得上一个指令可以执行完毕,液晶屏处于空闲状态,以便于执行下一条指令;清屏函数用来清除屏幕,进行新的显示;汉字显示主程序包含初始化和调用汉字显示函数显示汉字两个操作,其完成整个汉字送液晶显示的调度。
汉字显示子函数流程、ST7920初始化、写指令、写数据子函数流程分别如图2.4、图2.5、图2.6及图2.7所示。其中,图2.6流程向ST7920写各种操作指令,图2.6流程向ST7920写各种操作数据,区别在于写状态对RS及RW的状态选择不同。延时子函数流程如图2.8所示,图2.9为汉字显示主流程,其完成整个汉字送液晶显示的调度。
图2.4 汉字显示子函数
图2.5 ST7920初始化
图2.6 写指令子函数
图2.7 写数据子函数
图2.8 延时子函数
图2.9 汉字显示主流程三、ST7920指令说明
ST7920的指令集包括基本指令和扩充指令,其中基本指令有11条,扩充指令有7条。每一个指令的长度都为8位。16×8点阵的ASCII字符代码也是8位。但是16×16点阵中文字符的代码为16位,必须分为两次传送,先传送高8位,再传送低8位。具体指令如下:
1、清除显示
CODE:
RW
RS
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
0
0
0
0
0
0
0
1
功能:清除显示屏幕,把DDRAM 位址计数器调整为“00H”。
2、位址归位
CODE:
RW
RS
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
0
0
0
0
0
0
1
X
功能:把DDRAM 位址计数器调整为“00H”,游标回原点,该功能不影响显示DDRAM。
3、进入设定点
CODE:
RW
RS
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
0
0
0
0
0
1
I/D
S
功能:把DDRAM 位址计数器调整为“00H”,游标回原点,该功能不影响显示DDRAM 功能:执行该命令后,所设置的行将显示在屏幕的第一行。显示起始行是由Z 地址计数器控制的,该命令自动将A0-A5 位地址送入Z 地址计数器,起始地址可以是0-63 范围内任意一行。Z 地址计数器具有循环计数功能,用于显示行扫描同步,当扫描完一行后自动加一。
4、显示状态 开/关
CODE:
RW
RS
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
0
0
0
0
1
D
C
B
功能: D=1;整体显示ON C=1;游标ON B=1;游标位置ON。
5、游标或显示移位控制
CODE:
RW
RS
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
0
0
0
1
S/C
R/L
X
X
功能:设定游标的移动与显示的移位控制位:这个指令并不改变DDRAM 的内容。
6、功能设定
CODE:
RW
RS
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
0
1
DL
X
0
RE
X
X
功能:DL=1(必须设为1) RE=1;扩充指令集动作 RE=0:基本指令集动作。
7、设定CGRAM 位址
CODE:
RW
RS
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
0
1
AC5
AC4
AC3
AC2
AC1
AC0
功能:设定CGRAM 位址到位址计数器(AC)。
8、设定DDRAM 位址
CODE:
RW
RS
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
1
AC6
AC5
AC4
AC3
AC2
AC1
AC0
功能:设定DDRAM 位址到位址计数器(AC)。
9、读取忙碌状态(BF)和位址。
CODE:
RW
RS
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
1
BF
AC6
AC5
AC4
AC3
AC2
AC1
AC0
功能:读取忙碌状态(BF)可以确认内部动作是否完成,同时可以读出位址计数器(AC)的值。
10、写资料到RAM
CODE:
RW
RS
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
1
0
D7
D6
D5
D4
D3
D2
D1
D0
功能:写入资料到内部的RAM(DDRAM/CGRAM/TRAM/GDRAM)。
11、读出RAM 的值
CODE:
RW
RS
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
1
1
D7
D6
D5
D4
D3
D2
D1
D0
功能:从内部RAM 读取资料(DDRAM/CGRAM/TRAM/GDRAM)。
12、 待命模式(12H)
CODE:
RW
RS
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
0
0
0
0
0
0
0
1
功能:进入待命模式,执行其他命令都可终止待命模式。
13、卷动位址或IRAM 位址选择(13H)
CODE:
RW
RS
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
0
0
0
0
0
0
1
SR
功能:SR=1;允许输入卷动位址 SR=0;允许输入IRAM 位址。
14、反白选择(14H)
CODE:
RW
RS
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
0
0
0
0
0
1
R1
R0
功能:选择4 行中的任一行作反白显示,并可决定反白的与否。
15、睡眠模式(015H)
CODE:
RW
RS
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
0
0
0
0
1
SL
X
X
功能:SL=1;脱离睡眠模式 SL=0;进入睡眠模式。
16、扩充功能设定(016H)
CODE:
RW
RS
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
0
0
1
1
X
1RE
G
0
功能:RE=1;扩充指令集动作 RE=0;基本指令集动作 G=1;绘图显示ON G=0;绘图显示OFF。
17、设定IRAM 位址或卷动位址(017H)
CODE:
RW
RS
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
0
1
AC5
AC4
AC3
AC2
AC1
AC0
功能:SR=1;AC5~AC0 为垂直卷动位址 SR=0;AC3~AC0 写ICONRAM 位。址
18、设定绘图RAM 位址(018H)
CODE:
RW
RS
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
1
AC6
AC5
AC4
AC3
AC2
AC1
AC0
功能:设定GDRAM 位址到位址计数器(AC)。
当ST7920在接收指令前,MCU必须先确认ST7920处于空闲状态。即读取BF=0,才能接收新的指令;如果在送出一条指令前不检查BF状态,则需要延时一段时间,确保上一条指令执行完毕。"RE"是基本指令集与扩充指令集的选择控制位,当更改"RE"的状态后,后续指令维持在最后状态。除非再次更改"RE"状态,否则使用相同指令集时,无需要重新设置"RE"。
四、具体功能程序及硬件实现
4.1主要功能程序实现
Ø 将要显示的汉字及字符在YM12864R数据手册中一一查出,定义于显示数据数组以便用于调用显示。具体如下:
unsigned char mx[32] [2]= //定义汉字字符数组
{0x20,0x20, //第一行
0xb3,0xa3,0xca,0xec,0xc0,0xed,0xb9,0xa4,0xd1,0xa7,0xd4,0xba, //常熟理工学院
0x20,0x20,
0x20,0x20,0x20,0x20, //第二行显示数据
0xbf,0xce,0xb3,0xcc,0xc9,0xe8,0xbc,0xc6, //课程设计
0x20,0x20,0x20,0x20,
0x20,0x20, //第三行显示数据
0xd7,0xf7,0xd5,0xdf,0xa1,0xc3,0x20,0x20,0xc5,0xa3,0xcc,0xce, //作者: 牛涛
0x20,0x20,
0x20,0x20, //第四行显示数据
0xd5,0xc5,0xc6,0xf4,0xcb,0xb3,0x20,0x20,0xd5,0xd4,0xbd,0xa8, //张启顺 赵建
0x20,0x20};
Ø 通过改变RS和RW的状态选择不同的读写模式,定义写指令及写数据子函数,以便调用来完成数据在液晶显示器上的显示,其中,通过延时调用来避开向液晶送数据的忙状态。子函数定义如下:
void wcom(unsigned char d) //写指令子函数
{
delay(2);
RW=0; //写选通
RS=0; //写指令
P0=d; //将要写的数据送给P1口
E=1; //使能有效
E=0; //关闭使能信号
delay(10);
}
void dat(unsigned char d) //写数据子函数
{
delay(2);
RS=1; //数据操作
RW=0; //写选通
P0=d; //将要写的数据送给P1口
E=1; //使能有效
E=0; //关闭使能信号
delay(10);
}
Ø 清屏以便重新显示:
void clearlcd() //清屏
{
wcom(0x01); //清除显示
}
Ø 对硬件端口及液晶显示器初始化:
void init() //初始化子函数
{
E=0; //关闭使能信号
wcom(0x38); //功能设定
wcom(0x08); //关显示指令
wcom(0x06); //游标右移
wcom(0x0c); //开显示指令
clearlcd(); //清屏
}
Ø 定义汉字显示子程序,以便调用向液晶显示器送显示数据:
void hanzi (unsigned char w, unsigned char wb1,unsigned char wb2 )
{ wcom(w); //设置起始地址
dat(wb1); //数据送液晶显示
dat(wb2);
}
Ø 编写主函数以完成最终整个实现程序过程的调度:
void main()
{
int i;
init(); //调用初始化函数进行初始化操作
while(1)
{
for(i=0;i<32;i++)
{
hanzi(addr[i],mx[i][0],mx[i][1] );; //调用汉字显示,向液晶送数据显示
}
}
}
4.2实验步骤
Ø 完成硬件电路的设计及焊接
Ø 完成软件的设计并编写具体程序
1、新建工程
在菜单Project-New Project中新建工程my1.uv2;
2、选择CPU
根据对话框选择CPU类型(公司、型号等)本次课程设计采用 ATMEL公司的AT89S51,点击确定按钮后出现如下对话框,选择“否”。
3、新建文件
点击File-New,新建文件,并保存为lcm.c;
4、添加源文件
点击Project-Window中Target1文件夹右边的“+”号,显示子文件夹Source Group 1,选中Source Group 1文件夹并点击鼠标“右键”,出现快捷菜单。点击Add Files To Group ‘Source Group 1’,在对话框中完成源文件向工程的添加。
添加完成后,在Project Workspace窗口的Source Group 1项前多了“+”号,点击“+”号即可看到所添加的文件“lcm.c”
5、编译
用快捷按钮Build target对工程进行编译,在Output Window中有编译提示信息,可根据该信息对源文件进行修改。
6、软件仿真
点击Strat/Stop Debug Session,可对程序进行设置断点、单步、连续等执行操作。
7、HEX文件设置
选中Target1文件夹并点击鼠标“右键”,选择快捷菜单中的Option for Target ‘ Target 1’。在“Output”对话框中选中复选框(Create HEX File),即可使工程在编译时生成紧凑的机器码(my1.hex)。
Ø 调试
调试主要分为硬件调试和软件调试:
硬件调试:主要是检测硬件电路是否有短路、断路、虚焊等。在焊接电路板的时候,应该从最基本的最小系统开始,分模块,逐个进行焊接测试。在对各个硬件模块进行测试时,要保证软件正确的情况下去测试硬件,要不然发生错误时,不知道到底是哪一方出错了。当然,在设计的过程中也存在着失误和不足。具体步骤及测试结果如下:
1、检查电源与地线是否全部连接上,用万用表对照电路原理图测试各导
线是否完全连接,测试结果所有连接线都已连接好;
2、单片机的晶振是否起振,用示波器观察波形,测试结果波形都很好;
3、检查各芯片的功能是否正常,检测按键的导通情况,测试结果正常。
软件调试:
软件部分是先参考书上的例子,然后自己根据硬件电路写程序,由于以前所学是C语言,所以这个系统在编写程序过程中都采用C语言编写。刚刚开始,编写不会一次性通过,经过仔细分析修改最后编译成功。软件调试主要是程序调试,将整个显示程序按照实现功能分为各子模块进行调试。
Ø ISPlay 1.3烧写软件使用
1、ISP JTAG硬件连接
将ISP JTAG分别与并口和目标板连接。
2、ISPlay 1.3 JTAG类型设置(BYTEBLASTER II JTAG)
(1)、主界面
点击 “ISPlay 1.3”快捷图标,进入ISPlay 1.3软件界面:
(2)、 设置
点击程序界面左下角的“程序设置”按钮,弹出“设置”对话框,点击“<<”按钮,选择Alter_BYTEBLASTLE类型JTAG配置文件后打开。按“确定”按钮后回到ISPlay1.3主界面,退出ISPlay 1.3程序后重启设置才有效。
3、ISPlay 1.3使用
重启ISPlay 1.3后即可对AT89S51/52单片机进行在系统(ISP)编程。
(1)、选择芯片(AT89S51/AT89S52),按检测按钮,会提示检测信息。
(2)、打开“文件”按钮,载入所需烧写的*.hex文件。
(3)、先“擦除”芯片原数据,后“写”数据,写完后可“读”、“校验”数据。
也可以在“设置”对话框中设定自动执行流程。
4.3硬件电路实现与显示结果
硬件电路连接及液晶显示结果如下图4.1及图4.2所示:
图4.1 硬件电路实物连接
图4.2 液晶结果显示
4.4试验中遇到的问题
本次试验中遇到了很多问题,首先是对芯片很陌生,不熟悉其工作原理、及指令,这个问题,通过查阅大量图书、上网搜索相关资料以及向老师请教,很容易就解决了。其次在编译程序时出现了不可打印的字符,改了好长时间也没盖好,最后请教老师才搞明白,原来有一部分无用字符隐藏在命令后面也不显示,从而影响程序。然后在焊接完电路和编完程序后写入芯片时,液晶显示屏芯片无任何显示,我们从软件和硬件两个方面进行检查:首先用Keil uVision3自身的调试功能进行调试,发现程序在判断忙标志函数出不来,陷入死循环,鉴于此我们用延时函数代替判断忙标志函数;然后继续调试,程序可以完全执行而无任何错误。修改后再把程序写入芯片,液晶显示屏还是无任何显示,于是我们从硬件方面检查:我们把程序下载到另外一组的液晶显示屏中发现,液晶显示屏可以显示,实现预定义的功能,这就证明了我们的程序无误,从而液晶无显示是由硬件电路造成的;我们换了一块新的液晶屏,不改变电路及端口的连接,发现液晶显示屏可以显示,能实现预定义的功能,因此我们判定是液晶显示芯片坏了。
本次试验基本实现了课程设计的要求,但由于实训时间过于短暂,还存在着一些问题,比如液晶显示的亮度不均匀 ,此外对一些扩展的功能也没有进行尝试。这些问题只能以后有时间了再来解决。
五、总结与体会
炎炎夏日,在这维期一周的电子综合设计中,我们小组对液晶显示控制电路与程序这一选题进行了讨论研究及相关方案设计。
通过这次电子综合实训,我们对液晶显示的段式和点阵式有了初步的了解,尤其是点阵式这一块,其又可分为文本型显示和图形型显示。本次电子设计实训我们选用了液晶YM12864R,由刚开始的对其的相关功能及使用的茫然,到对其基本使用原理和指令操作熟悉使用,期间遇到了系列问题,但这也加深了我们对YM12864R液晶显示块认知。此外,我们也深深意识到以往所学知识,如焊接电路板,线路的排版和连接等的重要性。
在这次三人一小组的实训,我们共同合作,查阅了大量的相关资料,力求做到规范清晰。在把握了整体的思路的基础上,完成了系统方案的设计,然后完成电路的焊接,最后我们从程序流程图着手, 将整个程序分成若干模块,分开编写,一边发现问题一边解决问题,软硬件结合,在实验板上检验程序测试情况,根据现象不断修改。在这个过程中我们体会到编程的技巧,设置子程序的合理性,同时对单片机最小系统的设计有了整体的理解和深刻的体会,使我们的思维的锻炼与能力培养有了很大的提高和长足的进步
历经无尽的重复调试与改进,最终,完成了预期结果。其间,我们尝到了酸甜苦乐,也学习到好多东西,感觉收获颇丰。另外,非常感谢老师给我们这个机会及耐心的指导,而且实验的设备全是新的,让我们在良好的环境中学习到团队合作精神,在热烈的夏天养成了吃苦耐劳的精神。
参考文献
[1] 钟承尧,严世胜. 单片机汉字显示系统的设计[J]. 学术探讨应用技术与研究,2006:70-71.
[2] 深圳市耀宇科技有限公司.YM12864R 图形点阵液晶显示模块使用手册[EB/OL].
http://www.yaoyu-lcm.com.
[3] 赵建领,薛园园等.51单片机开发与应用技术详解[M].北京:电子工业出版社,2009.
[4] 洪家平. 中文图形显示控制芯片ST7920 的原理与应用.
[5]张洪润.单片机应用设计200例.下(第一版).北京航空航天大学出版社,2006.
附录
#include<reg51.h> //引用头文件
#include<stdio.h>
unsigned char mx[32][2]= //定义汉字字符的去码数组
{0x20,0x20,0xb3,0xa3,0xca,0xec,0xc0,0xed,0xb9,0xa4,0xd1,0xa7,0xd4,0xba,0x20,0x20, 0x20,0x20,0x20,0x20,0xbf,0xce,0xb3,0xcc,0xc9,0xe8,0xbc,0xc6,0x20,0x20,0x20,0x20, 0x20,0x20,0xd7,0xf7,0xd5,0xdf,0xa1,0xc3,0x20,0x20,0xc5,0xa3,0xcc,0xce,0x20,0x20, 0x20,0x20,0xd5,0xc5,0xc6,0xf4,0xcb,0xb3,0x20,0x20,0xd5,0xd4,0xbd,0xa8,0x20,0x20};
unsigned char addr[32]= //定义地址
{0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f, 0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f};
sbit E=P3^2; //定义读写使能信号,高电平有效
sbit RW=P3^1; //定义读写选择信号,1为读选通,0为写选通
sbit RS=P3^0; //数据指令选择信号,1为数据操作,0为写指令或读状态
void delay (int n) //延时子程序
{ int j;
while(n--)
{
for(j=0;j<120;j++);
}
}
void wcom(unsigned char d) //写指令
{
delay(2);
RW=0; //写选通
RS=0; //写指令
P0=d; //将要写的数据送给P1口
E=1; //使能有效
E=0; //关闭使能信号
delay(10);
}
void dat(unsigned char d) //写数据
{
delay(2);
RS=1; //数据操作
RW=0; //写选通
P0=d; //将要写的数据送给P1口
E=1; //使能有效
E=0; //关闭使能信号
delay(10);
}
void clearlcd() //清屏
{
wcom(0x01); //清除显示
}
void init() //初始化子函数
{
E=0; //关闭使能信号
wcom(0x38); //功能设定
wcom(0x08); //关显示指令
wcom(0x06); //游标右移
wcom(0x0c); //开显示指令
clearlcd(); //清屏
}
void hanzi (unsigned char w, unsigned char wb1,unsigned char wb2 )
{ wcom(w); //设置起始地址
dat(wb1); //数据送液晶显示
dat(wb2);
}
void main()
{
int i;
init(); //调用初始化函数进行初始化操作
while(1)
{
for(i=0;i<32;i++)
{
hanzi(addr[i],mx[i][0],mx[i][1] ); //调用汉字显示,向液晶送数据显示
}
}
}
展开阅读全文