成绩评定表
学生姓名 专业 鹿蕾 班级学号 1303020207 点阵式液晶上滚屏设计 测控技术与课程设计题目 仪器 评 语 组长签字: 成绩 日期 201 年 月 日
课程设计任务书
学 院 自动化与电气工程学院 学生姓名 课程设计题目 实践教学要求与任务: 1、熟悉所确定的题目,从问题需求、程序结构、难点及关键技术等方面进行分析,形成系统的设计方案; 2、根据方案设计硬件电路; 3、软件编程并调试; 4、完成课程设计报告,打印程序,给出运行结果。 专 业 测控技术与仪器 鹿蕾 班级学号 1303020207 点阵式液晶上滚屏设计 工作计划与进度安排: 第18周(12月28日-12月31日):根据设计要求和内容查阅参考文献或资料,提出设计方案,进行原理设计。 第20周(1月11日-1月15日):根据设计方案,完善设计,并进行硬件及软 件调试,测试,撰写课程设计报告,答辩。 指导教师: 201 年 月 日 专业负责人: 201 年 月 日 学院教学副院长: 2015年 月 日
目录
一 设计要求„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„1 1.1设计要求„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„1 1.1.1 功能及技术指标要求„„„„„„„„„„„„„„„„„„„„„„1 1.1.2设计内容„„„„„„„„„„„„„„„„„„„„„„„„„„„.1 1.2 设计目的„„„„„„„„„„„„„„„„„„„„„„„„„„„„.1 二 系统整体设计方案„„„„„„„„„„„„„„„„„„„„„„„„.2 2.1总体方案„„„„„„„„„„„„„„„„„„„„„„„„„„„„..2 2.2系统方框图„„„„„„„„„„„„„„„„„„„„„„„„„„„„2 2.3 设计元器件连接说明„„„„„„„„„„„„„„„„„„„„„„„.2 三 点阵式液晶下滚屏的设计„„„„„„„„„„„„„„„„„„„„„..3 四 系统运行结果及分析„„„„„„„„„„„„„„„„„„„„„„„..7 4.1 程序调试及运行结果„„„„„„„„„„„„„„„„„„„„„„„„.7 4.2 结果分析„„„„„„„„„„„„„„„„„„„„„„„„„„„„.9 4.3 心得体会„„„„„„„„„„„„„„„„„„„„„„„„„„„„.9 五 参考文献„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„..9 六 附录„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„10 6.1 程序代码„„„„„„„„„„„„„„„„„„„„„„„„„„„...10 6.2 相应汉字的显示代码„„„„„„„„„„„„„„„„„„„„„„...18
一 设计要求 1.1设计要求
1.1.1 功能及技术指标要求
利用51单片机+128点阵液晶显示器设计汉字滚屏(上滚)系统,滚动周期小于5秒。
1.1.2 设计内容
完成以下设计环节:
1)(可选)使用Altium Desinger开发工具,设计电路原理图与PCB制板图。 2)使用Uvision2开发平台,采用C语言或汇编语言设计软件程序。
3)使用PROTEUS仿真软件,设计仿真原理图并运行软件程序,完成系统仿真。
1.2设计目的
(1)利用51单片机+128点阵液晶显示器设计汉字滚屏(上滚)系统,滚动周期小于5秒;
(2)熟悉51单片机的内部结构和功能,合理使用其内部寄存器,能够完成相关软件编程设计工作;
(3)对软件编程、排错调试、相关软件的使用技能等方面得到较全面的锻炼和提高; (4)本次课程设计从硬件和软件两个方面入手,全面具体地掌握设计思路、方法和过程,使理论与实际相结合,充分地锻炼了动手能力和思维扩展能力。
1
二 系统整体设计方案 2.1总体方案
点阵式LCD液晶显示,即在了解122*32A的内部结构,工作原理,编程方法,SED1250的特性,内部结构,时序特性,各个管教的功能,以及获取字模的方法后,编写一个完整的程序用HK-51仿真系统运行后确保无误,并要在122*32A液晶显示屏上显示所要求显示的内容。
2.2系统方框图
图1
2.3设计元器件连接说明:
点阵式液晶显示屏与8051单片机管脚连接如下: 第1脚:GND接地; 第2脚:VCC接5v电源;
第3脚:DB7~DB0接8051芯片的P0.7~P0.0口;
第4脚:CS1接8051芯片的P2.3;CS3接8051芯片的P2.4口;
第5脚:E端为使能端,当 E 端由高电平跳变成低电平时,液晶模块执行令(接
8051芯片的P2.0口)
第6脚:RS 为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
(接8051芯片的P2.1口)
第7脚:R/W 为读写信号线,高电平时进行读操作,低电平时进行写操作。当 RS
和 R/W共同为低电平时可以写入指令或者显示地址,当 RS 为低电平 R/W 为高电平时可以读忙信号,当 RS 为高电平 R/W为低电平时可以写入数
2
据。接8051芯片的P2.2口;
第8脚:/PES为复位信号,V0为可调;
三 点阵式液晶下滚屏的设计
如下图2所示即为判断当前LCD的状态,RS=0, 数据\\指令选择,D/I(RS)=\"L\" ,表示 DB7∽DB0 为显示指令数据,RW=1; R/W=\"H\" ,E=\"H\"数据被读到DB7∽DB0。EN=1;EN下降源,_nop_(); //一个短延时。一直进行 while循环,直到dat==0x00 。
图2 判断当前状态的LCD
3
如图3 所示即为液晶显示屏幕的选择函数,若CSI=0 CS2=0则显示全部,若CSI=0 CS2=1则显示左部,若CSI=1 CS2=0则显示右部,若CSI=1 CS2=1则液晶不显示。
图3 液晶显示屏幕的选择
4
如图4所示为延迟函数的显示过程,外层i<50,内层j<110,否则一直循环。
图4 延迟函数
主函数的实现过程如下图5所示,先判断LCD的当前状态,进行清屏操作,执行循
5
环,每行128列,每个汉字占有32个字节,通过全屏显示,将字模上输入的汉字在液晶屏上显示出来并实现上滚的效果。
开始
输入i;
LCD()=128
Clear Screen(0)
i=0 N
i<128?
Y i++
SetStartLine(i);
Display(2,0,0*16,0);
Display(2,0,0*16,1);
Display(2,0,0*16,2);
Display(2,0,0*16,3);
Display(2,0,0*16,4);
Display(2,0,0*16,5)
delay(50);
图4.4 主函数
6
四 系统运行结果及分析 4.1程序调试及运行结果
1打开Keil C51集成开发环境,新建工程,文件,输入代码保存名为“text1.c”
图6编译调试结果
2.右键单击source group1选中add file to group,选中“text1.c”文件单击add如图:
图7添加文件到组
7
3.选中文件夹target1右键单击 options for target,选中output勾选creat hex如图:
图8生成text1.hex文件
4.打开Proteus仿真系统,单击c51选中program file选择“text1.hex”文件,单
击ok
图9添加文件
8
5.单击运行,结果如下图:
图10运行结果
4.2结果分析
经过字模提取汉字后,得到各个汉字,将其输入到代码中,结果如图5.1所示如上图可看出输出结果出现了乱码现象,可能原因是在运用字模时可能设置的参数有问题。经过认真检验及调试,发现字模参数设置中字节倒序没有选中。经过重新设置字模参数,纵向取模,字节倒序,保留,任何时候都取0,设置完成后再进行一次运行,则出现了正确结果。
4.3 心得体会
通过这次课程设计,不仅让我了解了单片机的仿真设计和单片机程序设计,也让我真正的明白了LCD屏的显示功能的强大。从刚开始对实验不知所措,到老师上课认真讲解和同学的热情解答疑问让我有了大概的了解,当自己动手做的时候碰到很多问题,在老师的和同学的帮助下慢慢的接近答案,最后终于完成这个课设,我感到一种成就感油然而生。这次给我留下了很深刻的印象,因为课设给我的不单单是编程上的进步,
9
还提升我处理实际问题的能力以及沟通交流能力,总之十分感谢这次课设。
五 参考文献
[1]谢维成 杨加国主编《单片机原理与应用及C51程序设计》,清华大学出版社,
六 附录 6.1程序代码
#include #define DATA P0 //LCD128数据线 sbit RS=P2^2; // 数据\\指令 选择 sbit RW=P2^1; // 读\\写 选择 sbit EN=P2^0; // 读\\写使能 sbit cs1=P2^4; // 片选1 sbit cs2=P2^3; // 片选2 /**********定义中文字库************/ //字体取模时的选项设置为:点阵格式为阴码,取模方式为列行式,取模走向为逆向,文字大小为宽x高=16x16 uchar code Hzk[]={ /*-- 文字: 你 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x04,0x04,0x04,0x04,0x04,0xFC,0x44,0x44,0x44,0x44,0x44,0xC4,0x04,0x04,0x04,0x00, 0x80,0x40,0x20,0x18,0x06,0x01,0x00,0x00,0x40,0x80,0x40,0x3F,0x00,0x00,0x00,0x00, /*-- 文字: 若--*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 10 0x04,0x04,0x74,0x,0x,0x,0x,0xFF,0x,0x,0x,0x,0x74,0x04,0x04,0x00, 0x04,0x04,0x15,0x15,0x15,0x55,0x95,0x7F,0x15,0x05,0x15,0x15,0x1F,0x04,0x04,0x00, /*-- 文字: 安 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x10,0x10,0xF0,0x1F,0x10,0x10,0xF0,0x00,0x00,0xF8,0x08,0x08,0x08,0xF8,0x00,0x00, 0x80,0x41,0x22,0x14,0x08,0x16,0x61,0x00,0x00,0x7F,0x20,0x20,0x20,0x7F,0x00,0x00, /*-- 文字: 好 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x10,0x10,0x12,0xD2,0x56,0x5A,0x52,0x53,0x52,0x5A,0x56,0xD2,0x12,0x10,0x10,0x00, 0x40,0x30,0x00,0x77,0x85,0x85,0x8D,0xB5,0x85,0x85,0x85,0xE7,0x00,0x10,0x60,0x00, /*-- 文字: 便 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x40,0x44,0x,0x65,0xC6,0x,0x,0x44,0x00,0xFC,0x44,0x44,0xC4,0x42,0x40,0x00, 0x20,0x12,0x4A,0x82,0x7F,0x02,0x0A,0x92,0x60,0x1F,0x00,0x00,0xFF,0x00,0x00,0x00, /*-- 文字: 是 -- */ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0x20,0x18,0xC7,0x44,0x44,0x44,0x44,0xFC,0x44,0x44,0x44,0x44,0x04,0x00,0x00, 0x04,0x04,0x04,0x07,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x00, /*-- 文字: 晴 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0xE0,0x00,0xFF,0x10,0x20,0x08,0x08,0x08,0xFF,0x08,0x08,0xF8,0x00,0x00 11 ,0x00, 0x01,0x00,0x00,0xFF,0x00,0x81,0x41,0x31,0x0D,0x03,0x0D,0x31,0x41,0x81,0x81,0x00, /*-- 文字: 天 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0x00,0xE0,0x9C,0x84,0x84,0x84,0xF4,0x82,0x82,0x83,0x82,0x80,0x80,0x00,0x00, 0x00,0x20,0x10,0x08,0x06,0x40,0x80,0x7F,0x00,0x00,0x02,0x04,0x08,0x30,0x00,0x00, }; /*状态检查,LCD是否忙*/ voidCheckState() { Uchar dat;//状态信息(判断是否忙) RS=0; // 数据\\指令选择,D/I(RS)=\"L\" ,表示 DB7∽DB0 为显示指令数据 RW=1; //R/W=\"H\" ,E=\"H\"数据被读到DB7∽DB0 do{ DATA=0x00; EN=1; //EN下降源 _nop_(); //一个短延时 dat=DATA; EN=0; dat=0x80 &dat; //仅当第7位为0时才可操作(判别busy信号) }while(!(dat==0x00)); } /*写命令到LCD中*/ SendCommandToLCD(uchar com) { CheckState();//状态检查,LCD是否忙 RS=0; //向LCD发送命令。RS=0写指令,RS=1写数据 RW=0;//R/W=\"L\" ,E=\"H→L\"数据被写到 IR 或 DR 12 DATA=com; //com :命令 EN=1; _nop_(); _nop_(); EN=0; //EN下降源 } /*设置页 0xb8是页的首地址*/ Void SetLine(uchar page) { page=0xb8|page; //1011 1xxx 0<=page<=7 设定页地址--X 0-7,8行为一页/8=8,共8页 SendCommandToLCD(page); } /*设定显示开始行,0xc0是行的首地址*/ Void SetStartLine(uchar startline) { startline=0xc0|startline; //1100 0000 SendCommandToLCD(startline); //设置从哪行开始:0--63,一般从0 行开始显示 } /*设定列地址--Y 0-63 ,0x40是列的首地址*/ Void SetColumn(uchar column) { column=column &0x3f; //column最大值为,越出 0= onoff=0x3e|onoff; //0011 111x,onoff只能为0或者1 SendCommandToLCD(onoff); 13 } /*写显示数据 */ Void WriteByte(uchardat) { CheckState();//状态检查,LCD是否忙 RS=1; //RS=0写指令,RS=1写数据 RW=0;////R/W=\"L\" ,E=\"H→L\"数据被写到 IR 或 DR DATA=dat;//dat:显示数据 EN=1; _nop_(); _nop_(); EN=0;//EN下降源 } /*选择屏幕screen: 0-全屏,1-左屏,2-右屏*/ Void SelectScreen(uchar screen) { switch(screen) { case 0: cs1=0;//全屏显示 _nop_(); _nop_(); _nop_(); cs2=0; _nop_(); _nop_(); _nop_(); break; case 1: cs1=0;//左显示屏 _nop_(); _nop_(); _nop_(); cs2=1; _nop_(); _nop_(); _nop_(); break; case 2: cs1=1;//右显示屏 _nop_(); _nop_(); _nop_(); cs2=0; _nop_(); _nop_(); _nop_(); 14 break; } } /*清屏screen: 0-全屏,1-左屏,2-右*/ Void ClearScreen(uchar screen) { uchari,j; SelectScreen(screen); for { SetLine(i); SetColumn(0); for(j=0;j<;j++) //控制列数0-63,共列 { WriteByte(0x00); //写点内容,列地址自动加1 } } } /*延时程序*/ void { } /*初始化LCD*/ Void InitLCD() { delay(uint z) uinti,j; for(i=0; i CheckState(); SelectScreen(0); SetOnOff(0); //关显示 SelectScreen(0); 15 } SetOnOff(1); //开显示 SelectScreen(0); ClearScreen(0);//清屏 SetStartLine(0); //开始行:0 /*显示全角汉字*/ void Display(ucharss,ucharpage,ucharcolumn,uchar number) { (i=0;i<16;i++) //控制页数0-7,共8页 int i; //选屏参数,pagr选页参数,column选列参数,number选第几汉字输出 SelectScreen(ss); column=column&0x3f; SetLine(page); //写上半页 SetColumn(column); //控制列 for(i=0;i<16;i++) //控制16列的数据输出 { WriteByte(Hzk[i+32*number]); //i+32*number汉字的前16个数据输出 } SetLine(page+1); SetColumn(column); //写下半页 //控制列 //控制16列的数据输出 for(i=0;i<16;i++) } /*主函数*/ void main() { { WriteByte(Hzk[i+32*number+16]); //i+32*number+16汉字的后16个数据输出 } uint i; InitLCD();//初始128 16 ClearScreen(0);//清屏 while(1) { for(i=128;i>1;i--) //128有128列,显示开始行从0~128切换,因此 可以实现循环显示 { SetStartLine(i);//显示开始行 Display(2,0,0*16,0);//显示第一个字 Display(2,0,1*16,1);// 显示第二个字 int i; //选屏参数,pagr选页参数,column选列参数,number选第几汉字输出 SelectScreen(ss); column=column&0x3f; SetLine(page); //写上半页 SetColumn(column); //控制列 for(i=0;i<16;i++) //控制16列的数据输出 { WriteByte(Hzk[i+32*number]); //i+32*number汉字的前16个数据输出 } SetLine(page+1); SetColumn(column); //写下半页 //控制列 //控制16列的数据输出 for(i=0;i<16;i++) } /*主函数*/ void main() { { WriteByte(Hzk[i+32*number+16]); //i+32*number+16汉字的后16个数据输出 } uint i; InitLCD();//初始128 17 ClearScreen(0);//清屏 while(1) { for(i=128;i>1;i--) //128有128列,显示开始行从0~128切换,因此 可以实现循环显示 { SetStartLine(i);//显示开始行 Display(2,0,0*16,0);//显示第一个字 Display(2,0,1*16,1);// 显示第二个字 Display(2,0,2*16,2);// 显示第三个字 Display(2,0,3*16,3);// 显示第四个字 Display(1,0,4*16,4);// 显示第五个字 Display(1,0,5*16,5);// 显示第六个 Display(1,0,6*16,6);// 显示第七个 Display(1,0,7*16,7);// 显示第八个 SelectScreen(0);//选择全屏显示 delay(50); //延时 } } } .6.2相应汉字的显示代码 课设的几个汉字显示代码如下: /*-- 文字: 你 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x04,0x04,0x04,0x04,0x04,0xFC,0x44,0x44,0x44,0x44,0x44,0xC4,0x04,0x04,0x04,0x00, 0x80,0x40,0x20,0x18,0x06,0x01,0x00,0x00,0x40,0x80,0x40,0x3F,0x00,0x00,0x00,0x00, /*-- 文字: 若 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 18 0x04,0x04,0x74,0x,0x,0x,0x,0xFF,0x,0x,0x,0x,0x74,0x04,0x04,0x00, 0x04,0x04,0x15,0x15,0x15,0x55,0x95,0x7F,0x15,0x05,0x15,0x15,0x1F,0x04,0x04,0x00, /*-- 文字: 安 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x10,0x10,0xF0,0x1F,0x10,0x10,0xF0,0x00,0x00,0xF8,0x08,0x08,0x08,0xF8,0x00,0x00, 0x80,0x41,0x22,0x14,0x08,0x16,0x61,0x00,0x00,0x7F,0x20,0x20,0x20,0x7F,0x00,0x00, /*-- 文字: 好 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x10,0x10,0x12,0xD2,0x56,0x5A,0x52,0x53,0x52,0x5A,0x56,0xD2,0x12,0x10,0x10,0x00, 0x40,0x30,0x00,0x77,0x85,0x85,0x8D,0xB5,0x85,0x85,0x85,0xE7,0x00,0x10,0x60,0x00, /*-- 文字: 便--*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x40,0x44,0x,0x65,0xC6,0x,0x,0x44,0x00,0xFC,0x44,0x44,0xC4,0x42,0x40,0x00, 0x20,0x12,0x4A,0x82,0x7F,0x02,0x0A,0x92,0x60,0x1F,0x00,0x00,0xFF,0x00,0x00,0x00, /*-- 文字: 是 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0x20,0x18,0xC7,0x44,0x44,0x44,0x44,0xFC,0x44,0x44,0x44,0x44,0x04,0x00,0x00, 0x04,0x04,0x04,0x07,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x00, /*-- 文字: 晴 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 19 0x00,0xE0,0x00,0xFF,0x10,0x20,0x08,0x08,0x08,0xFF,0x08,0x08,0xF8,0x00,0x00,0x00, 0x01,0x00,0x00,0xFF,0x00,0x81,0x41,0x31,0x0D,0x03,0x0D,0x31,0x41,0x81,0x81,0x00, /*-- 文字: 天 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0x00,0xE0,0x9C,0x84,0x84,0x84,0xF4,0x82,0x82,0x83,0x82,0x80,0x80,0x00,0x00, 0x00,0x20,0x10,0x08,0x06,0x40,0x80,0x7F,0x00,0x00,0x02,0x04,0x08,0x30,0x00,0x00, 20 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- oldu.cn 版权所有 浙ICP备2024123271号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务