1系统概述
1.1系统设计任务、目的和意义1、设计12864LCD与单片机的显示接口电路;2、至少设置两个按键,按下不同的按键,显示不同的内容,要求所显示内容为汉字。
随着社会的发展,趣来趣多的地方需要应用显示功能,各种数字显示仪器中的显示、广告牌、数码产品等,传统的数码管显示已经远远不能满足各行各业的需求。基于单片机的LCD显示是一种用单片机来控制的一种显示系统,它不仅能显示种各数字、字母、还能显示各种字体的汉字以及一些简单的图象,使用起来极为方便,只要通过对单片机写入一定的程序来控制LCD的显示即可完成,根据程序的不同而产生不同不效果以满足各种不同需求。
1.2LCD显示原理
LCD由两块玻璃板构成,厚约1mm,其间由包含有液晶材料的5μm均匀间隔隔开。因为液晶材料本身并不发光,所以在显示屏两边都设有作为光源的灯管,而在液晶显示屏背面有一块背光板(或称匀光板)和反光膜,背光板是由荧光物质组成的可以发射光线,其作用主要是提供均匀的背景光源。
背光板发出的光线在穿过第一层偏振过滤层之后进入包含成千上万液晶液滴的液晶层。液晶层中的液滴都被包含在细小的单元格结构中,一个或多个单元格构成屏幕上的一个像素。在玻璃板与液晶材料之间是透明的电极,电极分为行和列,在行与列的交叉点上,通过改变电压而改变液晶的旋光状态,液晶材料的作用类似于一个个小的光阀。在液晶材料周边是控制电路部分和驱动电路部分。当LCD中的电极产生电场时,液晶分子就会产生扭曲,从而将穿越其中的光线进行有规则的折射,然后经过第二层过滤层的过滤在屏幕上显示出来。
1.单片机及LCD选型LCD来显示一些要求的汉字,如邵阳学院、电气工程系、零八电本二班等字样。单片机种类繁多,由于上课学习的是51系列的单片机,着重介绍了89C51,故对此类型的单片机比较熟悉,故在此设计中选用的单片机为AT89C51,方便操作和进一步学习加深。对于LCD,此设计的要求要用128×64的LCD,同时由于AMPIRE12864LCD的资料比较容易得到,便于快速上手,所以就选用AMPIRE12864LCD用来作为显示1.4系统总设计框图
此设计的总设计框图如下:
图1.1总设计框图
2系统硬件设计
2.1硬件的选择
在此设计中用到的元件列表如下:
表2-1元件列表
AT89C51 AMPIRE12864LCD BUTTON RESPACK-8 CRYSTAL RES CAP CAP-ELEC 2.2AMPIRE12864LCD简介
2.2.1主要参数
表2-2主要参数
显示容量:128X64点阵(STN型)模块最佳工作电压:5.0V 工作电压:4.8~5.2V点尺寸:0.48X0.48(WXH)mm 工作电流:5.1mA(5.0V) 工作温度:-20~60℃背光源颜色:黄绿存储温度:-30~70℃背光源电流:<140mA
2.2.2引脚简介
表2-3引脚简介
编号符号引脚说明编号符号引脚说明电源地DataI/O 2 VDD 电源正极(+5V)DataI/O 3 V0 LCD偏压输入DataI/O 4 RS 数据/命令选择端(H/L)DataI/O 5 R/W 读写控制信号(H/L)DataI/O 6 E 使能信号片选IC1信号DataI/O 16 CS2 片选IC2信号DataI/O 17 RTS 复位端(H:正常工作,L:复位)DataI/O 18 VEE LCD驱动负压输出(-5V)指令码功能关显示开显示指令码功能设置显示初始行指令码功能0B8H+页码(0~7)设置数据地址页指针40H+列码(0~63)设置数据地址列指针2.3主要电路模块简介
本硬件电路主要由四大模块组成:主芯片模块;晶振和复位电路模块;控制接钮模块;显示电路模块。
2.3.1主芯片模块
XTAL1:接外部晶振的一。XTAL2:接外部晶振的一XTAL2端是否有脉冲信号输出。RST:AT89C51的复位信号输入引脚。ALE:允许地址锁存信号ALE引脚不断向外输出正脉冲信号,此频率为振荡器频率的1/6。CPU访问片外存储器时,ALE输出信号作为锁存低8位地址的控制信号。PSEN:访问外部程序存储器选通信号,低电平有效PSEN有效。但在此期间内,每当访问外部数据存储器时,这两次有效的PSEN信号将不出现。EA:该引脚为低电平时,则读取外部的程序代码来执行程序P0、P1、P2、P3:输入输出口。XTAL1,输出端为XTAL2,两个跨接石英晶体及两个电容就可以构成稳定的自激振荡器。电容器通常取30pF左右,可以稳定频率并对振荡频率有微调作用。下部分为手动复位和上电自动复位组合的复位电路。上电自动复位是在加电瞬间电容通过充电来实现。在通电瞬间电容通过电阻充电,RES端出现正脉冲,用以复位。只要电源的上升时间不超过1ms,就可以实现自动上电复位,即接通电源就完成了系统的复位初始化。所谓手动复位,是指通过接通一按钮开关,使单片机进入复位状态。系统上电运行后,若需要复位,一般是通过手动复位来实现的。图如图2.5。
2.3.3控制按钮模块
上方的按钮为常规显示汉字的按钮,一按下一行内容就以常规方式显示出来。再按一次则接着常规显示下一行,每次按下只显示一行。下方的按钮为滚动显示汉字的按钮,一按下一行内容就以滚动方式显示出来,再按一次显示下一行,每次按下只显示一行。按上键,所连引脚出现下降沿,此起外部中断0,当出现外部中断0,则产生一个常规方式显示的条件,常规显示出现。按下键,所连引脚出现下降沿,此起外部中断1,当出现外部中断1,则产生一个滚动方式显示的条件,滚动显示出现。图如图2.4。
2.3.4显示电路模块
P0口提供指令和数据信号,由DB0到DB7
图2.3主芯片图
图2.4控制键钮电路图
图2.5复位与晶振电路图
图2.6显示电路图
2.4完整硬件电路图
图2.7完整电路图
3系统软件设计
3.1程序设计
3.1.1程序设计整体思路
此设计是由单片机控制的LCD显示系统,外二个按钮来控制显示的方式。对于按钮的工作方式可以是中断也可以是查询,在此设计中所选用的外部中断。用P2口来作为LCD的显示控制端。对于此设计,因为要求是用128×64的显示器来显示汉字,所以,首先是通过一定的软件如ZIMO等来获取你想要显示的汉字的编码代码由于此LCD的显示屏被分为了两部分,即左半屏和右半屏,分别由CS1和CS2来控制,所以应该对两半屏分别编程取显示地址。同时还得用一个显示子程序来显示显示地址中保存的显示代码(汉字代码)。由此LCD的显示时序可知,显示过程中还需要一定的延时()并且在显示前需将一些特定的控制端置相应的电平所以还需要一个适当的延时子程序以及输入数据前的准备程序。除了这些外,还应写一个初始化程序,用来对中断等一些程序所需要的端口进行初始再者就是两个中断程序。最后就是主函数,它的主要功能就是判断中断是否来临,来临了是外部中断0还是外部中断1,然后根据是0还是1来执行相应的程序,选择相应的显示方式。四行全显示完了后,中断失效,即不对显示造成影响。1.2主要子程序模块
延时子程序
voiddelay()
{uchari;
for(i=0;i<20;i++);
}
输入准子程序
voidready(){
doi=0;图3 wor=0;
ena=0;
delay();
ena=1;
}
输入子程序
voidmodel() 图32输入准备子程序流程图
{
P0=0x3f;
ready();
P0=0xc0;
ready();
P0=x;
ready();
P0=y;
ready();图33输入子程序流程图
}
显示子程序
voiddisplay()
{P0=d[i];
i++;
doi=1;
wor=0;
ena=0;
}
图34显示子程序流程图
3.2主程序流程简图
图3-5
3.3仿真结果及分析
(a)(b)(c)
(d)(e)(f)
图36仿真结果
结果分析:第一幅图为按protues后出现的现象,即LCD被通电。第二幅图为按下上键后出现的现象。即常规显示一行汉字。第三幅图为再次按下上键后出现的现象,即再以常规方式显示一行汉字。第四幅图为单步运行时运行到一定时间时出现的现象,此次显示可以看出为铵下下键后才会出现的,即以滚动方式显示汉字。第五幅图同样还是为单步运行时运行到一定时间出现的现象,即以滚动方式滚动显示到图中的那一时刻。第六幅图为最终的显示情况,在此之后按键已经无效,即不再对显示有任何影响。
本次课程设计从布置下来到最后的完成,虽然没有像真正搞设计那样复杂,程序那样繁琐,需要的大量的时间和精力投入,需要大量人力、物力、财力等的支持,但由于是初次搞这样的设计,没有任何的经验,在设计中过程中还是让我倍感吃力。首先就是LCD的选择,因为在此之前没有学习过像LCD这样的器件,对于我完全是一个新的概念,所以一时让我不知所措。其次就是软件的编写,其中汉字代码的得到以及我自己发挥的显示方式——滚动显示也让我头痛了好一阵子。最后,就是说起来简单但其实对我这样的新手来说一点也不简单的任务,那就是相关文档的制作。
总之,在这次设计过程中让我尝到了设计的困难之外,更重要的是让我感觉到了设计的魅力,说句实在话蛮有味的,特别是在成功仿真后,着实让自己有一种成就感。在此过过程中不仅巩固了我对Word及单片机的使用,同时也让我对LCD显示有了一个较为清楚的了解,弥补了我的一个盲区,再者让我对一些设计文章的排版要求有了一个清楚的了解,这样可以让我在以后的设计课题中至少在排版这一块少走很多弯路。相信这将是一次较有意义的课程设计。
[1]侯玉宝等.基于protues的51系列单片机设计与仿真.北京:电子工业出版社,2008.
[2]李朝青.单片机原理及接口技术.北京:北京航空航天大学出版社,2006.
[3]朱清慧等.Protues教程——电子线路设计、制版与仿真.北京:清华大学出版社,2008.
[4]http://www.Sunman.product/SMG12864A.htm.
附录A
图1
附录B
#include"reg51.h"
#defineucharunsignedchar
#defineuintunsignedint
sbitdoi=P2^0;
sbitena=P2^1;
sbitwor=P2^2;
sbitcs1=P2^3;
sbitcs2=P2^4;
ucharx=0xb8;y=0x40,a=1,b=1;
uinti=0,biao,k=0;
codeuchard[]=
{0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, //()
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X80,0X00,0X44,0X03,0X24,0X0D, //(邵)
0X9C,0X04,0XA2,0X04,0XA2,0X07,0X1E,0X00,
0X00,0X00,0XF8,0X7F,0X08,0X00,0X64,0X02,
0X94,0X02,0X0C,0X07,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,//()
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0XFC,0X3F,0X42,0X00, //(阳0X9A,0X00,0XE6,0X00,0X00,0X00,0X00,0X00,
0XF0,0X07,0X88,0X04,0X88,0X04,0X08,0X04,
0XF8,0X0F,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, //()
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0XC0,0X04,0X70,0X04,0X22,0X04, //(学0X24,0X04,0XA0,0X04,0X52,0X24,0X54,0X43,
0XD0,0X3E,0X58,0X02,0X17,0X02,0X10,0X02,
0X30,0X02,0X10,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, //()
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0XFC,0X3F,0X44,0X00,0XB4,0X20, //(院0XCC,0X10,0X20,0X08,0X18,0X05,0X50,0X03,
0X4A,0X01,0XAC,0X1F,0XA8,0X20,0X88,0X20,
0X18,0X20,0X00,0X1C,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, //()
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, //()
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0XF8,0X0F,0X48,0X04, //(电0X48,0X04,0X48,0X04,0X48,0X04,0XFF,0X3F,
0X48,0X44,0X48,0X44,0X48,0X44,0X48,0X44,
0XF8,0X4F,0X00,0X40,0X00,0X70,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, //()
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X20,0X00,0X10,0X00,0X8C,0X00, //(气0XA7,0X00,0XA4,0X00,0XA4,0X00,0XA4,0X00,
0XA4,0X00,0XA4,0X00,0XA4,0X00,0XA4,0X0F,
0X24,0X30,0X04,0X40,0X04,0XF0,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, //()
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X20,0X02,0X20,0X02,0X20, //(工)
0X02,0X20,0X02,0X20,0X02,0X20,0X02,0X20,
0XFE,0X3F,0X02,0X20,0X02,0X20,0X02,0X20,
0X02,0X20,0X02,0X20,0X00,0X20,0X00,0X20,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, //()
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X10,0X04,0X12,0X03,0XD2,0X00,0XFE,0XFF, //(程)
0X91,0X00,0X11,0X41,0X80,0X44,0XBF,0X44,
0XA1,0X44,0XA1,0X7F,0XA1,0X44,0XA1,0X44,
0XBF,0X44,0X80,0X44,0X00,0X40,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, //()
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X40,0X02,0X21,0X22,0X13, //(系0XB2,0X09,0XAA,0X05,0X66,0X41,0X62,0X81,
0X22,0X7F,0X11,0X01,0X4D,0X05,0X81,0X09,
0X01,0X13,0X01,0X62,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, //()
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, //()
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X10,0X00,0X10,0X00,0X08, //(零)
0X00,0X08,0X30,0X0C,0X08,0X2A,0X50,0X69,
0XB0,0X1B,0X92,0X08,0X3A,0X0D,0X4E,0X02,
0X4A,0X06,0X2A,0X0C,0X08,0X0C,0X18,0X08,
0X00,0X20,0X00,0X20,0X00,0X10,0X00,0X10, //(八)
0X00,0X08,0X00,0X04,0X00,0X02,0X00,0X01,
0X90,0X00,0X60,0X00,0XC0,0X01,0X00,0X1E,
0X00,0X38,0X00,0X30,0X00,0X20,0X00,0X20,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, //(电)
0X00,0X00,0XE0,0X07,0X20,0X04,0X20,0X3E,
0XA0,0X25,0XF0,0X24,0XAE,0X24,0X20,0X22,
0XA0,0X21,0X70,0X30,0X20,0X0C,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X10,0X00,0X08, //(本)
0X00,0X08,0X00,0X04,0X20,0X52,0X20,0X31,
0XA0,0X0E,0XE0,0X09,0XF8,0X08,0X26,0X03,
0X10,0X06,0X10,0X0C,0X10,0X08,0X00,0X08,
0X00,0X00,0X00,0X00,0X00,0X10,0X00,0X10, //(二)
0X00,0X08,0X00,0X08,0X00,0X08,0X00,0X08,
0X20,0X08,0X20,0X08,0X10,0X08,0X10,0X08,
0X10,0X08,0X10,0X08,0X10,0X0C,0X10,0X08,
0X00,0X00,0X00,0X10,0X00,0X10,0X00,0X10, //(班)
0X00,0X4D,0X80,0X2B,0X70,0X29,0X90,0X18,
0X90,0X05,0X00,0X13,0XC0,0X10,0X38,0X11,
0X04,0X0F,0XD0,0X11,0XB0,0X08,0X10,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, //()
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X40,0X02,0X40,0X02,0X80,0X01,0XF0,0X0F, //()
0X80,0X01,0X40,0X02,0X40,0X02,0X00,0X00,
0X40,0X02,0X40,0X02,0X80,0X01,0XF0,0X0F, //()
0X80,0X01,0X40,0X02,0X40,0X02,0X00,0X00,
0X40,0X02,0X40,0X02,0X80,0X01,0XF0,0X0F, //()
0X80,0X01,0X40,0X02,0X40,0X02,0X00,0X00,
0X40,0X02,0X40,0X02,0X80,0X01,0XF0,0X0F, //()
0X80,0X01,0X40,0X02,0X40,0X02,0X00,0X00,
0X40,0X00,0X42,0X00,0XCC,0X3F,0X04,0X50, //(谢)
0X00,0X29,0XFC,0X11,0X56,0X4D,0X55,0X83,
0XFC,0X7F,0X50,0X00,0X90,0X41,0X10,0X80,
0XFF,0X7F,0X10,0X00,0X10,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, //()
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, //()
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X08,0X20,0X48,0X10,0X8A,0X09,0X0C,0X06, //(斌)
0XE8,0X19,0X18,0X20,0XD4,0X3F,0X14,0X20,
0XF4,0X1F,0X14,0X11,0X10,0X11,0XFF,0X07,
0X12,0X18,0X14,0X20,0X10,0X78,0X00,0X00,
0X40,0X02,0X40,0X02,0X80,0X01,0XF0,0X0F, //()
0X80,0X01,0X40,0X02,0X40,0X02,0X00,0X00,
0X40,0X02,0X40,0X02,0X80,0X01,0XF0,0X0F, //()
0X80,0X01,0X40,0X02,0X40,0X02,0X00,0X00,
0X40,0X02,0X40,0X02,0X80,0X01,0XF0,0X0F, //()
0X80,0X01,0X40,0X02,0X40,0X02,0X00,0X00,
0X40,0X02,0X40,0X02,0X80,0X01,0XF0,0X0F, //()
0X80,0X01,0X40,0X02,0X40,0X02,0X00,0X00};voidini() //始使化,开终断
{EA=1;EX0=1;IT0=1;EX1=1;IT1=1;}voiddelay() //延时
{uchari;
for(i=0;i<20;i++);}voidready() //输入数前的准备
{doi=0;wor=0;ena=0;
delay();
ena=1;}voidmodel() //输入函数
{P0=0x3f;
ready();P0=0xc0;
ready();P0=x;
ready();P0=y;
ready();}voidstart0() //开CS2,左半屏
{cs1=0;cs2=1;
model();}voidstart1() //开CS1,右半屏
{cs1=1;cs2=0;
model();}voiddisplay() //显示函数
{P0=d[i];
i++;doi=1;wor=0;ena=0;}voidz_d0()interrupt0 //外部中断0
{ a=0;}
voidz_d1()interrupt2 //外部中断1
{ b=0;}voidmain()
{uchart,n=0;
uintxi,jii,ji=64;
ini();
for(t=0;t<4;)
{if(b==0)
{biao=i; //滚动显示
for(y=128-(k+1)16,i=biao;y<=128;y++) //右半屏的滚动显示
{start1();
display();
x++;
start1();
display();
x--;n++;
if(n==(k+1)16)
{i-=(k+1)32;
k++;n=0;
if(k==4)
break;
y=128-(k+1)16-1;}}
for(xi=0,jii=128-(k-4+1)16-1;xi<=(k+1)16;xi++) //右半屏滚动显示
{if(xi<=(k+1)16-64)
{y=jii;
start0();
display();}
if(xi>(k+1)16-64)
{y=ji;
start1();
display();}
x++;
if(xi<=(k+1)16-64)
{start0();
display();
jii++;}
if(xi>(k+1)16-64)
{start1();
display();
ji++;}
x--;n++;
if(n==(k+1)16)
{i-=(k+1)32;
k++;n=0;
jii=128-(k-4+1)16-1;xi=0;ji=64;//重新赋值 if(k==8)//一行滚动显示完后跳出循环
{k=0;
break;}}}
b=1;
i=biao+256; //滚动显示后代码指向下一行
x+=2; //X方向指向下一行显示
t++;}
while(b)
{while(!a)
{for(y=64;y<128;y++) //直接显示
{start0();
display();
x++;
start0();
display();
x--;}
for(y=64;y<128;y++)
{start1();
display();
x++;
start1();
display();
x--;}
a=1;x+=2;t++;}
while(t==4); //屏目全部显示完后就按键就不再变化}}}附录C
表1元件 所属类型 规格 元件数量 AT89C51 MicroprocessorIcs U1 1 RES Resistors Rn AMPIRE12864LCD Optoelectronics LCD1 1 BUTTON Switches&relays 3 CAP capacitors Cn 2 CAP-ELEC capacitors C3 1 RESPACK-8 Resistors RP1 1 CRYSTAL miscellaneous 11.0592M 1
5
按上键,常规显示
按下键,滚动显示
单片机
LCD显示器
上按键
下按键
电源、晶振、复位等外设电路
空
结束
i<20?
i=0
开始
N
Y
结束
LCD使能,写指令
开始
结束
设制X和Y地址
打开LCD设制显示
开始
结束
读入字符代码
汉符代码指针加一
输入字符代码
开始
开始
图3.5主程序流程图
0中断
1中断
Y
Y
N
N
N
有中断?
常规显示一行
滚动显示一行
四行完了没?
中断0还是1?
显示不变,结束
|
|