滨江学院学年论文题目基于单片机的液晶显示院系自动控制系专业电气工程与自动化学生姓名学号指导教师二零一三年十二月二十五号目录1.引言 (1)2.现状 (1)3.主要目的 (2)4.实现方案和步骤 (2)4.1 KS0108 (2)4.1.1 KS0108特点 (2)4.1.2 KS0108的引脚功能 (3)4.1.3 KS0108的指令系统 (4)4.2 图形点阵式液晶显示控制 (5)4.3汉字编码原则 (8)4.4程序实现流程 (9)5.实验结果及结果讨论 (10)6.结论 (11)7.参考文献 (11)8.附件 (12)南京信息工程大学滨江学院学年论文基于单片机的液晶显示南京信息工程大学滨江学院自动控制系,南京 210044摘要:本文围绕设计以单片机作为LCD液晶显示系统控制器为主线,基于单片机8051,采用的液晶显示控制器的芯片是SED1520,主要实现中文显示、滚屏以及左右移动功能。
同时也对部分芯片和外围电路进行了介绍和设计,并附以系统结构框图加以说明,着重介绍了本系统应用的各硬件接口技术和各个接口模块的功能及工作过程,并详细阐述了程序的各个模块。
关键字:单片机、液晶显示、8051、SED15201、引言单片机液晶显示系统主要是指单片机以及由单片机驱动的点阵式液晶显示屏所组成的一个显示系统[1]。
我们在许多地方可以看到LCD显示屏的应用,例如空调,车内广告,冰箱和显示仪表盘等等,它们都是一个小型的单片机控制液晶显示系统。
在日常生活中,我们也可以看到一些类似的由单片机控制的显示系统,如火车站售票大厅的候车信息显示屏,在这些屏幕上,可以显示各种不同的图形、汉字等,并且可以实现上下滚屏与左右移动等。
这就是在现代工业控制和一些智能化仪器仪表中,越来越多的场所需要用点阵图形显示器显示汉字,需要能够显示更丰富信息和通用性较强的显示器,便于开发和应用,并要求其体积小、重量轻、功耗小。
图形点阵式LCD不仅可以显示字符、数字,还可以显示各种图形、曲线及汉字,并且可以实现屏幕画面滚动等功能,是信息处理、信息输出的重要手段之一,具有广泛的应用前景[2]。
我选择的单片机液晶显示系统的开发,是基于KS0108液晶显示控制器,在C8051F020单片机实验系统上实现KS0108是点阵型液晶显示控制器,利用单片机控制液晶显示系统的原理,完成单片机液晶显示系统的设计。
2、现状液晶显示器具有功耗低、体积小、重量轻、超薄等许多其它显示器无法相比的优点。
近年来被广泛用于单片机控制的智能仪器、仪表和低功耗电子产品当中。
液晶显示器分为字符型LCD显示模块和点阵型LCD显示模块。
字符型LCD是一种用5×7点阵图形来显示字符的液晶显示器[3]。
点阵型液晶可显示用户自定义的任意符号和图形,并可卷动显示,它作为便携式单片机系统人机交互界面的重要组成部分被广泛应用于实时检测和显示的仪器仪表中。
支持汉字显示的点阵型液晶在现代单片机应用系统中是一种十分常用的显示设备,手机上的显示屏就是点阵型LCD。
点阵型LCD是现代单片机应用系统中最常用的人机交互界面之一。
3、主要目的本课题主要是实现显示汉字、位图静态显示、位图上下左右移动显示的功能,从而能够简单地模拟现实生活中的一些单片机控制的液晶显示系统的实现,现主要实现一些位图的静态显示和上下左右显示的功能,并且显示“单片机液晶显示系统设计”几个字。
4、实现方案和步骤4.1 KS0108液晶显示控制器KS0108是一种带有驱动输出的点阵型液晶显示控制器,它可直接与8位微处理器相连,它可与KS0107配合对液晶显示控制器进行行、列驱动,组成液晶显示驱动控制系统[4]。
首先是介绍液晶显示控制器KS0108的特点、外部部分引脚功能、复位时序、显示RAM地址结构及指令集等。
4.1.1 KS0108的特点如下:1、内藏64×64=4096位显示RAM,RAM中每位数据对应LCD屏上一个点的亮、暗状态;2、KS0108是列驱动器,具有64路列驱动输出;3、KS0108读、写操作时序与68系列微处理器相符,因此它可直接与68系列微处理器接口相连;4、可直接与8位微处理器相连;5、KS0108的占空比为1/48~1/64;6、具有专用指令集,可完成文本显示或图形显示的功能设置;7、具有实现画面滚动、光标、闪烁和位操作等功能;8、KS0108可管理64KB显示RAM。
其中,图形方式为64KB;字符方式为4KB.4.1.2 KS0108的引脚功能见表1:表1引脚功能[5]复位时序:复位后,KA0108显示关闭,显存地址归零。
复位条件如表2:表2 复位条件[6]4.1.3 KS0108的指令系统KS0108的指令系统比较简单,总共只有七种。
现分别介绍如下:(1)显示开/关指令见表3:表3显示开/关指令[7](2)显示起始行(ROW)设置指令见表4:表4显示起始行指令[7]变显示起始行,可以使LCD实现显示滚屏的效果。
(3)页设置(RAGE)指令见表5:表5页设置指令[7](4)列地址(Y Address)设置指令见表6:表6列地址设置指令[7]写指令读出该单元中的内容或向该单元写进一个字节数据。
(5)读状态指令见表7:表7读状态指令[7]BUSY:1-内部在工作 0-正常状态ON/OFF:1-显示关闭 0-显示打开REST: 1-复位状态 0-正常状态在BUSY和REST状态时,除读状态指令外,其它指令均不对KS0108产生作用。
在对KS0108操作之前要查询BUSY状态,以确定是否可以对KS0108进行操作。
(6)写数据指令见表8:表8写数据指令[7](7)读数据指令见表9:表9读数据指令[7]读、写数据指令每执行完一次读、写操作,列地址就自动增一,必须注意的是,进行读、写操作之前,必须有一次空读操作,紧接着再读才会读出所要读的单元中的数据。
4.2 图形点阵式液晶显示控制C8051F020实验板中使用的是内置液晶显示模块CGM12864B的液晶屏。
CGM12864B内部没有振荡器电路,它必须由外部提供一个时序发生器作为振荡源方可工作,它由两片带有64列驱动控制器KS0108和一片带有64行驱动控制器KS0107组合而成[8]。
另外还可以附加负压发生电路。
显示是以一128×64 个点的液晶屏显示。
图形液晶显示模块KS0108将显示区分为左右半屏,整个屏从上到下64 行分为8 页,每页8 行,页地址范围为:B8H~BFH。
列地址范围为:40H~7FH。
数据为纵向读写,即每页的第一行对应D0……第八行对应D7。
左、右半屏由CS1、CS2选择。
控制器KS0108 的指令相对简单,总共七条指令:显示开关设定(3EH/ 3FH),显示起始行设定(C0H /FFH),页地址设定(B8H/ BFH),列地址设定(40H/ 7FH)状态读取,写数据,读数据[9]。
128×64点阵式液晶模块的逻辑图见下图1:图1液晶模块逻辑图KS0108采用8位数据传送,间接控制方式。
所谓间接控制方式就是通过单片机的并行接口与液晶显示模块直接连接,单片机通过对这些接口的操作,实现对液晶显示模块的控制,完成相应的显示,可以显示数字、字母、图形符号及自定义符号。
使用LCD做数据显示,一旦数据写入LCD,数据就会一直显示在液晶屏上,不必像数码管显示那样要定时扫描才能将数据显示,其显示效果远远超过数码管显示。
外部接口信号见下表10:表10外部接口信号[10]4.3汉字编码原则一般地,常用点阵液晶显示模块的汉字字模是直接从中文系统汉字字库中提取的,然后经过格式上的调整和转换,可以得到欲显示的汉字字模。
在这次设计中,我用的汉字不是从字库中提取字模,而是采用了一个字模软件来取模(将图形点阵转换为计算机内部显示缓冲单元的数据)。
字模软件的界面如图2所示:图2字模软件界面图这个字模软件使用起来相当简单和方便。
LCD显示模块显示中文字符串中,显示汉字(16×16点阵)必须使用图形方式。
在使用KS0108图形方式时,显示缓冲区单元与显示屏的对应关系如下图所示:图3 显示缓冲区单元与显示屏的关系上图所示的显示格式与我们的习惯正好相反,如想在显示屏上显示10010110,则须向RAM中写入01101001。
这适应人们的习惯,在字模软件取模时设置“字节倒序”,字模软件在取模的参数设置见图4.5所示。
16×16汉字共有32个字节。
32字节存放方式见如表11所示:表11 32字节存放方式图4取模参数设置在取模时,须设置取模参数如图3所示:纵向取模、字节倒序。
在对字符取模时,可以根据个人需要设置不同字体和字号。
不同字体和字号,取模之后得到的对应字阵的宽和高不同,但建议最好用16×16字阵,这是为了在显示过程中便于控制写数据。
4.4程序实现流程见图4:图5主程序流程图[10]图6 LCD测试流程图实现方案和步骤[10]5、实验结果及结果讨论在C8051F020系统实验箱上的液晶显示屏上,实验设计的程序见如下附件8,我实现了这些动态显示功能,特设计了以下三个显示结果:(1)结果一:第一个场景是在液晶显示屏上静态显示位图,如图6所示:图7位图上下滚动(2)结果二:第二个场景显示的内容较少,只有几个字——“单片机液晶显示系统设计”是静态的显示效果,如图7所示:图8显示汉字(3)结果三第三个场景是图形动态显示模拟,它们是从左向右推出的,一直移动到显示屏最右端。
如图8所示:图9位图从左向右移动6、结论液晶显示器(LCD)具有图形显示功耗低、体积小、质量轻、超薄等诸多其它显示器无法比拟的优点,被广泛用于智能型仪器和低功耗电子产品中。
图形点阵式LCD不仅可以显示字符、数字,还可以显示各种图形、曲线及汉字,并且可以实现屏幕上下左右滚动、动画、闪烁、文本特征显示等功能,用途十分广泛。
本文介绍采用新华龙分司的内置两片KS0108驱动控制器的点阵型液晶显示模块CMG12864B与C8051F020接口的性能特点、硬件电路接口时序和接口软件编程思路及其接口调试。
DSP(数字信号处理)系统液晶模块的使用,在硬件方面,关键要满足液晶的接口时序:在软件方面,要正确进行初始化[11]。
这样就可以随心所欲显示信息了。
7、参考文献[1]李朝青.单片机原理及接口技术[M].北京航空航天大学出版,1999.3:11-67.[2]吴金戎.8051单片机实践与应用[M].清华大学出版社,2001.9:266-293.[3]李秉操.单片机接口技术及其在工业控制中的应用[M].陕西电子编辑部,1991.3:314-336.[4]薛栋梁.MCS-51/151/251单片机原理与应用[M].中国水利水电出版社,2001.6:177-202.[5]新华龙有限公司.C8051F020单片机实验系统使用说明书.[6]刘乐善.微型计算机接口技术及应用[M].武汉:华中科技大学出版社,2000.4:167-177.[7]应自炉.一种8031单片机控制的液晶汉字显示系统.自然科学版,1995第9卷.第3期.[8]童长飞.C8051F系列单片机开发与C语言编程[M].北京:北京航空航天大学出版社,2005:428-444.[9] 杨光友、朱宏辉,单片微型计算机原理及接口技术,中国水利水电出版社,北京,2002:55-60.[10]G.Edward Suh,Charles W.O’Donnell,Srinivas Devas ,Aegis:a single-chip secure processor ,IEEE Design and Test of Computer .2008.24(6) 510-520.[11] M.Morris Mano,Charles R.Kime . Logic and Computer Design Fundamentals Second Edition Updated.北京:电子工业出版社.2002.7:391-396.8、附件(1)LCD初始化:void InitLCD(void) //初始化LCD{ char i,j;LCD_RST=0;Delay1ms(1);LCD_RST=1;LCD_WriteCommand1(0xc0);LCD_WriteCommand2(0xc0);LCD_WriteCommand1(0x3f); //开显示LCD_WriteCommand2(0x3f);for (j=0;j<8;j++) //清屏{LCD_WriteCommand1(0xB8+j); //清左半屏LCD_WriteCommand1(0x40);for (i=0;i<64;i++)LCD_WriteData1(0x00);LCD_WriteCommand2(0xB8+j); //清右半屏LCD_WriteCommand2(0x40);for (i=0;i<64;i++)LCD_WriteData2(0x00);} }(2)静态显示一幅位图:void DispBmp(char *buf) //显示一幅位图{ int i,j;for (j=0;j<8;j++) //显示位图{ LCD_WriteCommand1(0xB8+j);LCD_WriteCommand1(0x40);for (i=0;i<64;i++)LCD_WriteData1(buf[(j*2)*64+i]);LCD_WriteCommand2(0xB8+j);LCD_WriteCommand2(0x40);for (i=0;i<64;i++)LCD_WriteData2(buf[(j*2+1)*64+i]);}}(3)位图从左到右移动实现:void DispBmp_Move(char *buf) //左右移动一幅位图{ int line,line0,row,eight; //显示位图for (row=0;row<128;row++){ Delay1ms(50);for (eight=0;eight<8;eight++){ if (row<64){ LCD_WriteCommand1(0xB8+eight);LCD_WriteCommand1(0x40+row);for (line=0;line+row<64;line++)LCD_WriteData1(buf[(eight*2)*64+line]);LCD_WriteCommand2(0xB8+eight);LCD_WriteCommand2(0x40);for (line0=0;line0+row<64;line0++)LCD_WriteData2(buf[(eight*2)*64+line+line0]);}else{ LCD_WriteCommand2(0xB8+eight);LCD_WriteCommand2(0x40+row-64);for (line0=0;line0+row-64<64;line0++)LCD_WriteData2(buf[(eight*2)*64+line0]);}}}(4)单个汉字显示:void LCD_Write_A_HZ(char x,char y,char *Dot) //显示16*16点阵汉字{ char i;for (i=0;i<32;i++){ if ((x+i%16)<64){ LCD_WriteCommand1(0xB8+y+i/16);LCD_WriteCommand1(0x40+x+i%16);LCD_WriteData1(Dot[i]);}else{ LCD_WriteCommand2(0xB8+y+i/16);LCD_WriteCommand2(0x40+x-64+i%16);LCD_WriteData2(Dot[i]);}。