河北科技大学
课程设计报告
学生姓名学号:
专业班级:
课程名称:
学年学期:
指导教师:
课程设计成绩评定表
学生姓名学号成绩
专业班级起止时间
设计题目
字符串动画显示
指
导
教
师
评
语
指导教师:
年月日
目录
一、课程设计的目的和任务-------------------------3
二、设计题目--------------------------------------3
三、设计内容要求----------------------------------3
四、课程设计的主要步骤----------------------------3
五、设计原理及方案--------------------------------4
六、实现方法--------------------------------------5
七、实施结果--------------------------------------11
八、完成软件的关键技术---------------------------12
九、我写的部分-----------------------------------12
十、设计总结和心得体会--------------------------14
一、课程设计的目的和任务
课程设计是培养和锻炼学生在学习完本门课后综合应用所学理论知识解决实际工程设计和应用问题的能力的重要教学环节,它具有动手、动脑和理论联系实际的特点,是培养在校工科大学生理论联系实际、敢于动手、善于动手和独立自主解决设计实践中遇到的各种问题能力的一种较好方法。
《微机原理及应用》是一门应用性、综合性、实践性较强的课程,没有实际的有针对性的设计环节,学生就不能很好的理解和掌握所学的技术知识,更缺乏解决实际问题的能力。所以通过有针对性的课程设计,使学生学会系统地综合运用所学的理论知识,提高学生在微机应用方面的开发与设计本领,系统的掌握微机硬软件设计方法。
通过课程设计实践,不仅要培养学生的实际动手能力,检验学生对本门课学习的情况,更要培养学生在实际的工程设计中查阅专业资料、工具书或参考书,掌握工程设计手段和软件工具,并能用设计报告表达设计思想和结果的能力。培养学生事实求是和严肃认真的工作态度。
通过设计过程,要求学生熟悉和掌握微机系统的软件、硬件设计的方法、设计步骤,使学生得到微机开发应用方面的初步训练。让学生独立或集体讨论设计题目的总体设计方案、编程、软件硬件调试、编写设计报告等问题,真正做到理论联系实际,提高动手能力和分析问题、解决问题的能力,实现由学习知识到应用知识的初步过渡。通过本次课程设计使学生熟练掌握微机系统与接口扩展电路的设计方法,熟练应用8086汇编语言编写应用程序和实际设计中的硬软件调试方法和步骤,熟悉微机系统的硬软件开发工具的使用方法。
二.设计题目
字符串动画显示
三.设计内容要求
1、菜单
内容包括:①输入字符串;②字符串动画显示;③退出。
2、输入字符串
选择该项后,可以输入一个字符串。该字符串即为动画显示时所显示的字符串。
3、字符串动画显示
所显示字符串从无到有,从中间向两边伸展,直至出来完整的字符串。当按下R键后重复移动的动作,直到按下Q键,停止字符串动画显示返回到主菜单。
4、在主菜单中选择退出项,则结束程序返回DOS。
四、课程设计的主要步骤
课程设计可以分为硬件设计和软件设计两个部分,其设计过程可以归纳为以下所述的四个步骤:
1.总体设计
本阶段的任务是通过调查研究,查阅资料来初步确定系统结构的总体方案,其中主要涉及到硬件和软件的功能划分。
应用系统中硬件和软件具有一定的互换性,即某些功能既可以用硬件实现也可以用软件实现。一般说来,用硬件实现的优点是可以提高系统的工作速度,但会增加电路的复杂性和硬件成本;而用软件代替某些硬件的功能可以使电路简化,便于修改设计,降低硬件成本,但软件工作量增大。
总体设计时,必须在硬件和软件之间权衡,分工明确,然后分头开始设计。
2.硬件设计过程
利用实验箱的硬件资源,结合课程设计题目,设计硬件原理图,搭建硬件电路。
3.软件设计过程
(1)采用模块化程序结构设计软件,可将整个软件分成若干功能模块。
(2)画出程序流程图。
(3)根据流程图,编写源程序。
(4)上机调试程序。
4.软、硬件联调。
五.设计原理及方案
主程序流程图
开始
段地址初始化
进入DOS窗口
输出提示信息
输入字符串
字符串动态显示
数码管数据输出
R
按Q键
Y
六.实现方法
程序:
初始化程序:
CODE SEGMENT;定义代码段
ASSUME CS:CODE,DS:CODE
START: MOV AX,CODE;初始化代码段地址
MOV DS,AX
MOV AX,0B800H;彩色显示器缓冲区地址赋给附加段
MOV ES,AX
CLD;清方向标志,si和di自动加1
AGAIN: MOV AX,3;设置显示方式为彩色文本,80列25行,
INT 10H;调用bios功能10h,设置显示方式
LEA DX,MENU ;把menu的偏移地址赋给了dx
MOV AH,9;显示以dx首地址作为偏移地址,$作为结束标志的字符串,显示menu菜单。INT 21H
INPUT:;输入功能模块
MOV AH,0;0号功能调用,从键盘读一个字符送给al
INT 16H
CMP AL,'1';判断输入字符是否为1
JNZ CP2;输入不为1,调转到cp2,即判断输入是否为2,输入为1则跳过该语句
CALL SUB01 ;输入为1,则调用输入子程序sub01,完成输入字符
JMP INPUT;输入字符完成后,用户输入下一个命令
CP2:CMP AL,'2';判断输入是否为2号命令
JNZ CP3;输入不为2,调转到cp3,即判断输入是否为3,输入为2则跳过该语句
CALL SUB02 ;输入为2,则调用字符变换子程序sub02,完成字符变换
JMP AGAIN ;字符变换完成后,返回主菜单,提示用户输入下一个主菜单命令
CP3:CMP AL,'3' ;退出程序
JNZ INPUT;若输入命令不是1,2,3,则用户重新输入。
LEA DX,MESG
MOV AH,9;提示用户按任意键退出程序
INT 21H
MOV AH,1;键盘读入一个字符,用于暂停应用程序。
INT 21H
MOV AH,4CH
INT 21H
DELAY PROC ;延时1s子程序
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AH,2;读取时钟将秒数送到dh中
INT 1AH
MOV BL,DH;将秒数保存于bl中
@T:
MOV AH,2;再次读取时钟并将现在秒数送到dh中
INT 1AH
CMP DH,BL;判断当前秒数是否和bl中保存的前一秒数是否相同JZ @T;不同则跳出循环
POP DX
POP CX
POP BX
POP AX
RET
DELAY ENDP
SUB01:;完成字符串输入模块
LEA DX,TIPS;提示输入字符串
MOV AH,9
INT 21H
LEA DX,STR0;将要输入的字符串首地址送到dx中
MOV AH,0AH;将输入的字符串存入dx作为偏移地址的内存单元中,及存入str0中INT 21H ;
MOV AX,0E0AH;输入结束标志,换行
INT 10H
RET
SUB02:;完成字符串变换
CMP STR0+1,2;实际长度和2进行比较
JNB Y2;大于等于2则跳到y2
JMP QUIT;小于到quit
Y2:
CALL LINE ;
CALL ASDF
@INPUT:;qr功能输入
MOV AH,0;从键盘输入字符
INT 16H
CMP AH,10H ;'Q'
JZ SSS;等于q跳到sss,返回主菜单
CMP AH,13H ;'R'
JNZ @INPUT;不等于qr则用户重新输入
JMP Y2
SSS:MOV STR0+1,0;把实际长度清0
MOV FLAG,0;将标志清0
QUIT:
XOR DI,DI;将di清0
MOV CX,80*25;将整个屏幕的字符总数放入计数器cx
MOV AX,720H;用ah=07黑色,al=20h空格,将整个屏幕清空
REP STOSW ;重复填充直到cx=0为止,
RET
LINE: ;画框
MOV DI,(18*80+10)*2;从第19行的第十一个字符开始画框,di中为像素数,每个像素数为4位,一个字符对应4个像素
MOV AL,201 ;201对应横线左角,
MOV AH,3;左角的颜色
STOSW;以di作为偏移地址,以al中的字符作为输入字符,以ah为颜色,向缓冲区中填充字符,显示该字符
MOV CX,60-2;第60个为右脚
MOV AH,1;双横线为蓝色
MOV AL,205 ;
REP STOSW
MOV AH,3
MOV AL,187 ;右上角
STOSW
ADD DI,20*2;第20行的第十一个字符,10+60+20=90,下一行的第十一个字符
MOV AL,186 ;竖线
STOSW
MOV LEFT,DI;将竖线后第一个空格像素地址送给left
MOV CX,60-2;填充58个空格,
MOV AL,20H ;
REP STOSW
MOV AL,186 ;
STOSW
ADD DI,20*2;第21行的第10个数
MOV AL,200 ;左下角
STOSW
MOV CX,60-2;填充横线
MOV AL,205
REP STOSW
MOV AL,188 ;右下角
STOSW
RET
ASDF:
MOV DI,LEFT;将第一个空格地址,送到di
ADD DI,60-2 ;将矩形框的中间位置给di,di为像素值MOV POSI,DI
MOV AL,STR0+1;将实际输入的字符数送给al CBW;al中的字符扩展到ax,ah全为0
TEST AX,1;判断奇数和偶数
JZ OUSHU;偶数跳转
MOV FLAG,1;奇数flag=1
OUSHU:
MOV BP,AX ;
DEC BP;偶数实际长度减1
INC AX;实际长度加1
SHR AX,1,逻辑右移,实际长度除2.省略余数
LEA DX,BUF ;字符串实际位置首地址给dx
ADD BP,DX ;将字符串的最后一个字符位置给bp MOV BX,AX ;字符串一半的长度给bx
@REP:
MOV AH,50H ;字符的颜色
MOV CX,TIMES ;每次显示字符数送给cx
MOV SI,DX;字符串首地址给si
MOV DI,POSI;将矩形框中间位置送给di
@1: LODSB ;将字符串送al中
STOSW;将al中的字符写入到di对应的像素位置处LOOP @1
CALL DELAY;延时1s
CMP BX,1;判断是否为两个字符
JNZ CONT;不是两个字符跳转
CMP FLAG,0;判断字符长度是奇数和偶数
JNZ YYY;奇数跳转
CONT:
MOV SI,BP;最后一个字符地址给si
MOV CX,TIMES ;每次显示的字符数给cx
@2: LODSB ;
STOSW
LOOP @2
CALL DELAY
YYY:
DEC BX
JZ DONE
INC TIMES
SUB POSI,2
DEC BP
JMP @REP
DONE:
MOV TIMES,1
RET
TIMES DW 1 ;
FLAG DB 0
POSI DW 0
MENU DB 5 DUP(0AH)
DB 31 DUP(' '),6,'MAIN MENU',6,0DH,0AH
DB 25 DUP(' '),201,4,21 DUP(196),4,187,0DH,0AH
DB 25 DUP(' '),186,' 1.INPUT A STRING ...',20H,186,0DH,0AH
DB 25 DUP(' '),186,' 2.DISPLAY MODEL ... ',20H,186,0DH,0AH
DB 25 DUP(' '),186,' 3.RETURN TO DOS ... ',20H,186,0DH,0AH
DB 25 DUP(' '),200,4,21 DUP(196),4,188,0DH,0AH
DB 28 DUP(' '),'CHOICE(1,2,3):$'
TIPS DB 0DH,0AH,9,'INPUT A STRING ...',0DH,0AH,9,'$'
MESG DB 0DH,0AH,0DH,0AH,9,'PRESS ANY KEY TO EXIT ...$'
LEFT DW 0
STR0 DB 50;字符串的最大长度
DB 0;实际输入字符串长度
BUF DB 50 DUP(0);实际字符串的地址
CODE ENDS
END START
七.实施结果
选择输入字符串后,可以输入一个字符串。该字符串即为动画显示时所显示的字符串。字符串从无到有,从中间向两边伸展,直至出来完整的字符串。当按下R键后重复移动的动作,直到按下Q键,停止字符串动画显示返回到主菜单。
运行效果:
八、完成软件的关键技术
在本程序中,使用了9号,1号,10号DOS系统功能调用,分别用来实现显示字符串,键盘输入字符,输入字符串的功能;还使用了BIOS功能调用,其中有INT 16H中的0号,实现从键盘读字符的功能,INT 1AH中的2号,实现读实时钟的功能。
九、我写的部分
我主要负责矩形框和延时程序。
延时部分:
DELAY PROC ;1秒延时
PUSH AX
PUSH BX
PUSH DX
MOV AH,2 ;读取时钟将秒数送到DH
INT 1AH
MOV BL,DH ;把DH中的数给BL
@T:
MOV AH,2
INT 1AH
CMP DH,BL;判断当前秒数和BL中保存的秒数是否一致,不一致则跳出
JZ @T ;
POP DX
POP CX
POP BX
POP AX
RET
DELAY ENDP
画矩形框的部分:
LINE: ;画框
MOV DI,(18*80+10)*2;从第19行的第十个字符开始画框,di中为像素数,每个像素数为4位,
一个字符对应四个像素
MOV AL,201 ;201对应横线左角,
MOV AH,3;左角的颜色
STOSW;以di作为偏移地址,以al中的字符作为输入字符,以ah为颜色,向缓冲区中填充字符,显示该字符
MOV CX,60-2;第60个为右脚
MOV AH,1;双横线为蓝色
MOV AL,205 ;
REP STOSW
MOV AH,3
MOV AL,187 ;右拐叫,
STOSW
ADD DI,20*2;第20行的第十个字符,10+60+20=90,下一行的第十个字符
MOV AL,186 ;竖线
STOSW
MOV LEFT,DI;将竖线后第一个空格像素地址送给left
MOV CX,60-2;填充58个空格,
MOV AL,20H ;
REP STOSW
MOV AL,186 ;
STOSW
ADD DI,20*2;第21行的第10个数
MOV AL,200 ;左下角
STOSW
MOV CX,60-2;填充横线
MOV AL,205
REP STOSW
MOV AL,188 ;右下角
STOSW
RET
十.设计总结和心得体会
刚刚学完《微机计算机原理与应用技术》时,觉得自己学得还行,但拿到课设题目时却是一头雾水,不知从何下手。虽然我在课上学过那么多的指令,也读过不少的程序,但却从没有自己动手真正的编过程序。虽然能把别人的程序看懂,但自己写的时候还是不会。我们学的那些指令,光记住是没有用的,关键在于应用,会用了才是自己的东西。我们写程序,不能一开始就想着用什么指令去实现它,而应该先有一个思路,有一个框架,然后按照框架一步步去完成。
在以后的学习中,还应该多看一些程序,在自己的脑子里积累一些程序,只有这样,当你再遇到一些问题时才不会没有一点思路。遇到问题时,一定要学会查资料,要有针对性的去查,在最短的时间内找到自己需要的东西,查资料也是门学问。
在以后的学习中,我一定要保持一个好的态度,无论学习什么,都不能只是为了高分,更要注重应用,实践才是最重要的。我们必须为了提高自己的实践能力而有目的的去学,在学习理论的同时,更注重实践,真正做到把书本的东西变成自己的东西。