您好,欢迎来到年旅网。
搜索
您的当前位置:首页1303020207keilc程序设计课程报告

1303020207keilc程序设计课程报告

来源:年旅网


成绩评定表

学生姓名 专业 鹿蕾 班级学号 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 #include #define uint unsigned int #define uchar unsigned char

#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=/*开关显示,0x3f是开显示,0x3e是关显示*/ Void SetOnOff(ucharonoff) {

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; ifor(j = 0; j < 110; j++);

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

本站由北京市万商天勤律师事务所王兴未律师提供法律服务