LCD12864液晶显示的设计_第1页
LCD12864液晶显示的设计_第2页
LCD12864液晶显示的设计_第3页
LCD12864液晶显示的设计_第4页
LCD12864液晶显示的设计_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、2009级电子信息工程单片机课程设计 电子技术课程设计报告书课题名称LCD12864液晶显示的设计姓 名 学 号 院、系、部物理与电信工程系专 业电子信息工程指导教师 2012年 06月 20日 一、设计任务及要求:设计任务:设计一种LCD12864点阵型液晶显示电路,能够显示出一般的图形、字符、汉字、等常用图形的界面,为移植其他GUI库建立底层接口。要 求: 1. 采用点阵型液晶(不带字库),显示出一般的图形、字符、汉字、等常用图形的界面;2. 为移植其他GUI库建立完整的底层接口;3. 能够显示出任意的字符、汉字、图形等;4. 采用Proteus进行仿真验证并且完善电路设计。指导教师签名:

2、 2012年06月20日 二、指导教师评语:指导教师签名: 2012 年 月 日 三、成绩 验收盖章 2012 年 月 日 LCD12864液晶显示的设计1 设计目的(1)熟悉模拟电路的应用与集成电路的引脚排列。(2)掌握单片机芯片80C5X系列的逻辑功能及使用方法。(3)熟悉电路仿真软件Proteus的使用。(4)了解点阵型LCD12864(不带字库)的组成及工作原理。(5)熟悉KEIL软件的编程,加强C语言的能力。2 设计思路(1)设计单片机最小系统电路。(2)设计LCD12864液晶外围电路。(3)设计LCD12864液晶与单片机的组成电路。 3 设计过程 3.1 方案论证 图3.1.1

3、 单片机与LCD液晶的工作原理框图 由于要实现点阵液晶的绘图等功能,而且对于51系列的单片机片内RAM都不大,要实现读操作的话只能使用可以并行方式的液晶,(只有并行方式可读)因为如果不使用并行方式而采用在51系列单片机内部开辟一片128*64大小的缓存用于对液晶的刷新从而实现读的功能显然不现实。本设计选用的12864是AMPIRE128X64,它的控制器是KS0138,采用并行方式与单片机通信。对于单片机的选用,采用程序存储空间较大的STC89C58,它有32K的flash,对于实现简单的GUI设计足够。图1是单片机与LCD液晶以及外围电路的总体框图。3.2电路设计图3.2.1 单片机最小系统

4、电路如图2所示,单片机的最小系统有复位电路和振荡电路组成,复位电路采用上电复位,振荡电路采用的内部方式,在XTAL1和XTAL2端外界石英晶体作定时元件,内部反相放大器自激振荡,产生时钟。P0口出外接4.7K上拉电阻,因为P0口是漏极开路,必须要接上拉才能输出高电平。5V直流稳压电源电路如图3所示,该电路由电源变压器、整流桥堆、滤波电容C6、C7、三端稳压集成电路LM7805、限流电阻器和电源指示发光二极管组成。工作原理及过程:当接通电源,交流220V电压经变压器降压,整流桥堆整流,C6滤波及C7稳压,经三端稳压集成电路LM7805后,产生5V直流电压,作为单片机和LCD12864液晶的工作电

5、源。经限流电阻限流降压后将发光二极管点亮。图3.2.2 5直流稳压电源电路12864液晶外围电路如图4所示, 工作原理及过程: R/W E D/I分别为读写控制,使能控制,和命令数据选择控制端口,将这三个管脚分别连接到单片机,从而实现单片机对LCD12864的控制,并口数据D0-D7连接到单片机的P0口,实现相互通信。 图4 12864外围电路图3.2.3 电路总图电路总图连接如图5所示。所有的管脚通过标好建立电气连接,由图可以看出LCD12864与单片机的数据通信是利用单片机的P0口,控制线连接到了单片机的P2口的前5个管脚,单片机通过这5个管脚与LCD12864通信,实现对LCD12864

6、的控制。4系统调试与仿真结果(1)按照图5在Proteus里连接电路。(2)仿真结果开机动画出现MCU51,然后画一个表框,然后依次画出正方形,圆形,矩形,三角形,和多边形,如图4-1所示。接着对正方形和矩形进行填充,如图4-2所示。接着对表框较小的进行填充,然后对表框较大的进行填充。然后清屏,显示出“课程设计:简单GUI的设计” ,如图4-3所示。接着显示出一幅图片,然后图片左边部分上下滚动,然后右边部分上下滚动,最后整个屏幕一起滚动,如图4-4。然后黑屏,简单GUI显示完成。 图4.1截图 图4.2截图 图4.3截图 图4.4截图5主要仪器与设备仿真软件 Proteus 7.6集成电路 L

7、M78051片电 阻 1002只,1.06K2只,1kl只,2k4只,2.7k3只,4.7K排阻1只,4.77k2只, 39kl只。 可调电位器 2K1只, 电 容 10nF1只,100nF2只,470nF1只,510nF1只, 100 uF1只,1mF1只,。其 它 发光二极管1只, 12V直流电压源各一个,整流桥堆1只6设计体会与建议 6.1设计体会通过这次对LCD液晶简单GUI的设计与制作,让我了解了设计电路的程序,也让我了解了关于LCD12864的基本原理与设计理念,要设计一个电路总要先用仿真仿真成功之后才实际接线的。但是最后的成品却不一定与仿真时完全一样,因为,在实际接线中有着各种各

8、样的条件制约着。而且,在仿真中无法成功的电路接法,在实际中因为芯片本身的特性而能够成功。所以,在设计时尽可能应考虑两者的差异,从中找出最适合的设计方法。此外,仿真时应注意相同元件的不同型号,往往存在差异性。通过这次学习,让我对各种电路都有了大概的了解,所以说,心动不如行动,对于这些电路还是应该自己动手实际操作才会有深刻理解。6.2对设计的建议我希望老师在我们动手制作之前应先告诉我们一些关于所做电路的参考资料、原理,以及如何检测电路的方法,提供一两天答疑的时间。这样会有助于我们进一步的进入状态,完成设计。参考文献1 梁明理 邓人清等. 电子线路. 北京:高等教育出版社,2000年2 马忠梅 籍顺

9、心等编. 单片机的的C语言应用程序设计 北京:北京航空航天大学出版社出版社,2001.13张俊谟单片机中级教程原理与应用M北京:北京航空航天大学出版社2006:66-67 4Carla Dente. Proteus技术应用. Ashgate Publishing, Limited 2005 年6月出版附件: 源程序的描述: 程序采用模块化编程,这样显得更加明了,而且便于移植和调试,部分源程序如下: #include "ku.h" #include "lcd12864.h" U8 min,max; extern unsigned char code asc

10、ii58; U8 code XY2= 103 ,20 , 103 ,50 , 123 ,50 , 113 ,40 , 110 ,35 , 103 ,20 ; void Delay_ms(U16 x) U16 i,j; for(i=x;i>0;i-) for(j=120;j>0;j-); void Write_Command(U8 com) / check_busy();/用了读不出来 RS_COM; RW_W; lcd_data=com; lcden_strobe; void Write_Date(U8 date) / check_busy(); RS_DATA; RW_W; lc

11、d_data=date; lcden_strobe; U8 Rdata(void) U8 rdata; RS_DATA; RW_R; lcd_data=0xff; lcden=1;_nop_();rdata=lcd_data;lcden=0; lcd_data=0xff;lcden=1;_nop_();rdata=lcd_data;lcden=0; return rdata; void Choice_RL(U8 a) switch(a) case 0:s1=0;s2=0;break;case 1:s1=0;s2=1;break;case 2:s1=1;s2=0;break;default:br

12、eak; void Set_Write_Addr(U8 x,U8 y) Write_Command(page+x); Write_Command(lined+y); void Clear_lcd(void) U8 i,j; for(i=0;i<8;i+) Choice_RL(1); for(j=0;j<64;j+)Set_Write_Addr(i,j);Write_Date(0); Choice_RL(2); for(j=0;j<64;j+)Set_Write_Addr(i,j);Write_Date(0); Choice_RL(0); void Black_lcd(void

13、) U8 i,j; for(i=0;i<8;i+) Choice_RL(1); for(j=0;j<64;j+)Set_Write_Addr(i,j);Write_Date(0xff); Choice_RL(2); for(j=0;j<64;j+)Set_Write_Addr(i,j);Write_Date(0xff); void W_Ascii(U8 date) U8 i; RS_DATA; RW_W; date=(date-0x20)*5; for(i=0;i<5;i+)Write_Date(ascii58date+i);Write_Date(0); void W_

14、Str(U8 x,U8 y,U8 *ff) U8 i; RW_W; RS_DATA; Write_Command(page+x); Write_Command(lined+y); while(ffi!='0')W_Ascii(ffi+); void W_dot(U8 x,U8 y) /X横坐标,Y纵坐标 U8 pag,ybit,dat; if(x<64) Choice_RL(1); else Choice_RL(2); x=x-64; pag=y>>3; ybit=y&0x07; Write_Command(page+pag); Write_Comma

15、nd(lined+x); dat=Rdata(); Write_Command(lined+x); Write_Date(1<<ybit)|dat); void Draw_Any_Line( U8 StartX, U8 StartY, U8 EndX, U8 EndY) /从任意点到任意点的直线 int t, distance; /*根据屏幕大小改变变量类型(如改为int型)*/ int x = 0 , y = 0 , delta_x, delta_y ; int incx, incy ; delta_x = EndX - StartX ; delta_y = EndY - Sta

16、rtY ; if( delta_x > 0 ) incx = 1; else if( delta_x = 0 ) Draw_Columeline(StartY, EndY, StartX ) ; return ; else incx = -1 ; if( delta_y > 0 ) incy = 1 ; else if(delta_y = 0 ) Draw_Line( StartX, EndX, StartY ) ; return ; else incy = -1 ; delta_x = incx*delta_x ; delta_y = incy*delta_y ; if( del

17、ta_x >=delta_y ) distance = delta_x ; else distance = delta_y ; W_dot( StartX, StartY) ; /* Draw Line*/ for( t = 0 ; t <= distance+1 ; t+ ) W_dot( StartX, StartY ) ; x += delta_x ; y += delta_y ; if( x > distance ) x -= distance ; StartX += incx ; if( y > distance ) y -= distance ; Start

18、Y += incy ; void Draw_Columeline(U8 y1,U8 y2,U8 x1)/ y1 y2 表示从哪里到哪里 X1表示横坐标 U8 i;/因为读函数还有问题,所有影响到纵向打点 for(i=y1;i<y2+1;i+) W_dot(x1,i); void Draw_Line(U8 x1,U8 x2,U8 y) /X1 X2 表示从哪里到哪里 Y表示纵坐标 U8 i; /通过打点函数来划线 for(i=x1;i<x2+1;i+) W_dot(i,y); void draw_map(U8 x,U8 y, U8 *aa) U8 pag,i,j; pag=(y-1)

19、>>3; if(x<=64) Choice_RL(1); for(i=0;i<pag;i+)Set_Write_Addr(i,0);for(j=0;j<x;j+)Write_Date(aaj+i*x); if(x>64) Choice_RL(1);for(i=0;i<pag;i+)Set_Write_Addr(i,0);for(j=0;j<x;j+)Write_Date(aaj+i*x);Choice_RL(2);for(i=0;i<pag;i+)Set_Write_Addr(i,0);for(j=0;j<x-64;j+)Write_

20、Date(aaj+i*x+64); void LCD12864_Init(void) Write_Command(0x3f); Write_Command(page); Write_Command(lined); Write_Command(row); Choice_RL(0); void plotC(int x,int y,int xc,int yc) W_dot(xc+x,yc+y); W_dot(xc+x,yc-y); W_dot(xc-x,yc+y); W_dot(xc-x,yc-y); W_dot(xc+y,yc+x); W_dot(xc+y,yc-x); W_dot(xc-y,yc

21、+x); W_dot(xc-y,yc-x); void GUI_Circle(int xc,int yc,int r) int x,y,d; y = r; d = 3 - (r + r); x = 0; while(x <= y) plotC(x,y,xc,yc); if(d < 0) d += (x + x + x + x) + 6; else d+=(x - y) + (x - y) + (x - y) + (x - y) + 10; y = y - 1; x = x + 1; void GUI_Triangle(U8 x0, U8 y0, U8 x1, U8 y1, U8 x

22、2, U8 y2) Draw_Any_Line(x0,y0,x1,y1); Draw_Any_Line(x1,y1,x2,y2); Draw_Any_Line(x2,y2,x0,y0); /*void compare_3(U8 x0, U8 x1, U8 x2) if(x0=x1=x2)min=max=x0;else if(x0=x1) if(x0<x2) min=x0;max=x2; else min=x2;max=x0; else if(x1=x2) if(x1<x0) min=x0;max=x0; else min=x0;max=x0; else if(x0=x2) if(x

23、0<x1) min=x0;max=x1; else min=x1;max=x0; else if(x0>x1) if(x0>x2) max=x0; if(x1>x2) min=x2; else min=x1; else max=x2; min=x1; else if(x1>x2) max=x1; if(x0>x2) min=x2; else min=x0; else max=x2; min=x0; */ /* void GUI_TriangleFill(U8 x0, U8 y0, U8 x1, U8 y1, U8 x2, U8 y2) U8 xmin,xma

24、x,ymin,ymax,y,i=0; compare_3(x0,x1,x2); xmin=min; xmax=max; compare_3(y0,y1,y2); ymin=min; ymax=max; for(y=ymax;y>=ymin;y-,i+) Draw_Line(xmin+i,xmax-i,y); */ void GUI_Polygon(U8 N ,U8 (*ap)2) U8 i,a=0,b=0,c=0,d=0; for(i=0;i<N;) a=api0; b=api1; c=ap+i0; d=api1; Draw_Any_Line(a,b,c,d); void GUI_

25、Rectangle(U16 x0, U16 y0, U16 x1, U16 y1) Draw_Line(x0,x1,y0 ); Draw_Line(x0,x1,y1 ); Draw_Columeline(y0, y1,x0 ); Draw_Columeline( y0, y1,x1); void GUI_Square(U16 x0, U16 y0, U16 length) if(length=0) return;if( (x0+length) > GUI_LCM_XMAX ) return;if( (y0+length) > GUI_LCM_YMAX ) return;GUI_Re

26、ctangle(x0, y0, x0+length, y0+length); void GUI_Rectangle_Full(U16 x0, U16 y0, U16 x1, U16 y1) U8 y,t; if(x0>x1)t=x0;x0=x1;x1=t;if(y0>y1)t=y0;y0=y1;y1=t;for(y=y0;y<y1;y+) Draw_Line(x0,x1, y ); void Write_HanZi(U8 x,U8 y,U8 (*ap)16) U8 i; /* if(rl=0) Choice_RL(1); else Choice_RL(2); */ Set_W

27、rite_Addr(x,y); for(i=0;i<16;i+)Write_Date(ap0i); Set_Write_Addr(x+1,y); for(i=0;i<16;i+)Write_Date(ap1i); 主函数如下: #include "lcd12864.h" extern U8 code XY2; extern U8 code gImage_aa; extern U8 code HANZI16; extern U8 code ascii58; void main(void) U8 t,tab11="51MCU" while(1) LCD12864_Init(); Clear_lcd(); Choice_RL(0);W_Str(6,28,tab11);Delay_ms(1000);GUI_Rectangle(0,0,124,62);Delay_ms(300); GUI_Rectangle(5,5,119,56);Delay_ms(600);GUI_Square(8,30,20);Delay_ms(300);GUI_Circle(43,40,10);Delay_ms(300); GUI_Rectangle(58,30,66,50);Delay_ms(300);GUI_Triangle(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论