微机原理课程设计数字时钟程序.docx
《微机原理课程设计数字时钟程序.docx》由会员分享,可在线阅读,更多相关《微机原理课程设计数字时钟程序.docx(29页珍藏版)》请在冰点文库上搜索。
微机原理课程设计数字时钟程序
河北科技大学
课程设计报告
学生姓名:
学号:
专业班级:
电子信息科学与工程
课程名称:
微型计算机原理与应用
学年学期:
2011—2012学年第1学期
指导教师:
20011年12月
课程设计成绩评定表
学生姓名
学号
成绩
专业班级
起止时间
2011/12/26—2011/12/30
设计题目
数字时钟程序
指
导
教
师
评
语
指导教师:
年月日
一、课设题目与目的………………………………….4
二、设计任务………………………………………….4
三、总框图与设计流程……………………………….4
四、源程序清单……………………………………….6
五、调试结果与显示………………………………….19
六、个人贡献………………………………………….19
七、课程设计总结与体会…………………………….21
一、课设题目与目的
实习题目:
数字时钟程序
实习目的:
通过实习,使我们进一步弄懂所学到的课本知识,巩固和深化对8086系统的指令系统、中断系统、键盘/显示系统、程序设计、应用开发等基本理论知识的理解,提高汇编语言应用于技术的实践操作技能,掌握汇编语言应用系统设计、研制的方法,培养利用科技革新、开发和创新的基本能力,为毕业后从事与其相关的工作打下一定的基础。
二、课设任务
本课题为利用汇编语言设置时钟程序,其显示效果为:
截取系统时间,能以时、分、秒(其中时为24小时制)的形式显示,并且通过合理的操作能修改时和分的内容来修改时间。
再有,可以给它设定一个ALARM时间,到这个时间它就能产生信号,起到定时作用,。
除此之外还能显示日期,日期分为年、月、日,其显示方式为xxxx年xx月xx日。
三、总框图与流程
四.源程序清单
DATASEGMENT;数据段开始
MESS1DB'****************ASMASSIGNMENT*******************',0AH,0DH
DB'***************ELECTRONICCLOCK******************',0AH,0DH
DB'*******PressCorctoEDITtheALARMtime*******',0AH,0DH
DB'*******PRESSMORmTOCHANGESOUND!
*************',0AH,0DH
DB’****PRESSSORsTOSETTHETIME**************',0AH,0DH;显示功能菜单
DB'***********PRESSESCBUTTONTOEXIT**************',0AH,0DH,'$'
TNDB'PLEASEINPUTTHENEWTIME(hh:
mm:
ss):
',0DH,0AH,'$'
TMDB'PLEASEINPUTTHEALARMTIME(hh:
mm:
ss):
',0DH,0AH,'$'
MUSICMESSDB'PLEASECHOOSETHETYPEOFMUSIC:
1(FAST)2(MIDDLE)3(SLOW)',0DH,0AH,'$'
MESS2DB'Timeis:
',0AH,0DH,'$'
MESS3DB'TODAYIS:
',0AH,0DH,'$'
DBUFFER1DB20DUP('')
T_BUFFDB40;在数据段开一段时间显示缓冲区
DB?
DB40DUP(?
)
HORDB?
MINDB?
SECDB?
TEMPHORDB?
TEMPMINDB?
TEMPSECDB?
MUSICDW800;存放音乐的频率数
DATAENDS
STACKSEGMENT
DB100DUP(?
)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,SS:
STACK,DS:
DATA
START:
CALLCLEAR;调用清屏子程序
DISPLAY:
;时间显示部分
MOVAX,DATA
MOVDS,AX
MOVBX,OFFSETT_BUFF;送T_BUFF的偏移地址到BX
MOVAH,2CH;调用DOS时间调用功能,功能号:
2CH,小时,分钟,秒数分别保存在CH,CL,DH中
INT21H
;判断时间是否相等
SUBDH,1;秒数+1修正
CALLCHECK
;.........................................................................
MOVAL,CH;小时数设定
MOVAH,0
CALLBCTD;调用进制转换子程序二进制BCD码子程序
PUSHAX
ANDAL,0F0H;选取AL高四位
MOVCL,4;设置右循环的次数
RORAL,CL;右循环
ORAL,30H;加30H得到ACSII码
MOV[BX],AL;将得到的结果送到T_BUFF缓冲区
INCBX;BX自加1,指针指向下一个缓冲区的下一个地址
POPAX
ANDAL,0FH;选取低四位
ORAL,30H
MOV[BX],AL;将转换后的低四位值送入缓冲区的下一个地址
INCBX
;........................................................................
MOVAL,':
';显示分隔符号
MOV[BX],AL
INCBX
;........................................................................
MOVAH,2CH;取时间
INT21H
;.......................................................................
MOVAL,CL;分钟数设定
MOVAH,0
CALLBCTD;调用进制转换子程序二进制BCD码子程序
PUSHAX
ANDAL,0F0H;选取AL高四位
MOVCL,4;设定循环次数
rolal,cl;循环左移4次
oral,30h;加30H得到ACSII码
mov[bx],al;将得到的结果送到T_BUFF缓冲区
incbx;BX自加1,指针指向下一个缓冲区的下一个地址
popax
andal,0fh;选取低四位
oral,30h
mov[bx],al;将转换后的低四位值送入缓冲区的下一个地址
incbx
;.....................................................................
moval,':
';显示分隔符号
mov[bx],al
incbx
;.....................................................................
movah,2ch;秒设定
int21h
moval,dh
movah,0
callbctd;调用进制转换子程序二进制BCD码子程序
pushax
andal,0f0h;选取AL高四位
movcl,4
rolal,cl
oral,30h;加30H得到ACSII码
mov[bx],al;将得到的结果送到T_BUFF缓冲区
incbx
popax
andal,0fh;选取低四位
oral,30h
mov[bx],al;将转换后的低四位值送入缓冲区的下一个地址
incbx
;..........................................................
moval,'$';将字符串的结束位送至显示缓冲区的最后一位
mov[bx],al
;..........................................................
calldate
pushbx;置光标位置,AH=2,BH=0,DH跟DL分别为行号与列号,并入栈保护BX
movah,2;0~1用于此程序最下边的在下面的两个置光标位置
movbh,0
movdh,17;行
movdl,41;列
int10h
popbx
leadx,t_buff;送T_BUFF偏移地址到DX,并调用DOS显示功能,功能号为9
movah,9
int21h;至此当前时间的显示功能结束!
pushbx;置光标位置
movah,2
movbh,0
movdh,16
movdl,41
int10h;日期
popbx
leadx,DBUFFER1
movah,9
int21h
pushbx;置光标位置
movah,2
movbh,0
movdh,16
movdl,21
int10h
popbx
leadx,mess3
movah,9
int21h;显示MESS3
pushbx;置光标位置
movah,2
movbh,0
movdh,0
movdl,0
int10h
popbx
leadx,mess1
movah,9
int21h;显示MESS1
pushbx;置光标位置
movah,2
movbh,0
movdh,17
movdl,21
int10h
popbx
leadx,mess2
movah,9
int21h;显示MESS2
;.............................................
calldelay1
movah,1;调用键盘I/O中断功能号1,获取键值到AL
int16h
cmpal,'M'
jeeditmusic
cmpal,'m'
jeeditmusic
cmpal,'c';是c键,转移闹钟时间修改程序
jeedittime
cmpal,'C';是C键,转移闹钟时间修改程序
jeedittime
cmpal,'s';是s键,转移时间修改程序
jecor
cmpal,'S';是S键,转移时间修改程序
jecor
cmpal,1bh
jzquit;是ESC键,退出程序
jmpdisplay
quit:
movah,4ch
int21h
ret
Cor:
callsettime;设置时间
;..........................................
editmusicproc
pushax;入栈保护数据
pushbx
pushcx
pushdx
pushf
movdx,offsetmusicmess;显示修改音乐的种类提示
movah,09h
int21h
movdx,offsett_buff;数据缓冲区的数据输入
movah,0ah
int21h
anddx,0h
leabx,t_buff
incbx
incbx
incbx
moval,[bx]
cmpal,'1'
jem800to
cmpal,'2'
jem1600to
cmpal,'3'
jem3200to
m800to:
movmusic,800
jmpt
m1600to:
movmusic,1600
jmpt
m3200to:
movmusic,3200
t:
popf;出栈恢复数据
popdx
popcx
popbx
popax
jmpstart
ret;返回DOS
editmusicendp;结束
bctdprocnear;二进制BCD码子程序
;AX输入参数
;AX输出参数,存放调整过的BCD码
movdx,ax
movax,0
movcx,16;设置循环次数
bctd1:
clc;清进位标志C
rcldx,1;通过进位的循环左移
adcal,al;带进位加法
daa;加法的十进制调整
xchgal,ah;交换高,低8位
adcal,al
daa
xchgal,ah
loopbctd1;循环次数保存在CX里
ret
bctdendp
;.....................................
edittimeproc;时间修改程序
pushax;入栈保护数据
pushbx
pushcx
pushdx
pushf
movdx,offsettm;显示修改时间的格式提示
movah,09h
int21h
movdx,offsett_buff;数据缓冲区的数据输入
movah,0ah
int21h
anddx,0h
leabx,t_buff
incbx
incbx
incbx
movdh,[bx]
subdh,30h
incbx
MOVDL,[BX]
SUBDL,30H
MOVCL,10
MOVAL,DH
MULCL
ADDAL,DL
MOVCH,AL
MOVHOR,AL
MOVTEMPHOR,AL
INCBX
INCBX
MOVDH,[BX]
SUBDH,30H
INCBX
MOVDL,[BX]
SUBDL,30H
MOVCL,10
MOVAL,DH
MULCL
ADDAL,DL
MOVCL,AL
MOVMIN,AL
MOVTEMPMIN,AL
INCBX
INCBX
MOVDH,[BX]
SUBDH,30H
INCBX
MOVDL,[BX]
SUBDL,30H
MOVCL,10
MOVAL,DH
MULCL
ADDAL,DL
MOVDH,AL
MOVTEMPSEC,AL
POPF;出栈恢复数据
POPDX
POPCX
POPBX
POPAX
JMPSTART
RET
EDITTIMEENDP
;......................................
CLEARPROCNEAR
PUSHAX;入栈保护现场
PUSHBX
PUSHCX
PUSHDX
MOVAX,0600H;AH=06(滚动)AL=00(全屏空白)
MOVBH,1FH;设置背景颜色(1蓝色)和前景颜色(F白色)
SUBCX,CX
MOVDX,5F5FH
INT10H
POPDX;出栈恢复现场
POPCX
POPBX
POPAX
RET
CLEARENDP
;....................
DATEPROCNEAR
MOVAH,2AH;取日期CX:
DH:
DL=年:
月:
日AL=星期
INT21H
MOVSI,0
MOVAX,CX
MOVBX,100
DIVBL
MOVBL,AH
CALLBCDASC1;日期数值转换成相应的ASCII码字符
MOVAL,BL
CALLBCDASC1
INCSI
MOVAL,DH
CALLBCDASC1
INCSI
MOVAL,DL
CALLBCDASC1
MOVAL,'$'
MOVDBUFFER1[SI],AL
RET
DATEENDP
;..................
BCDASC1PROCNEAR
PUSHBX
CBW
MOVBL,10
DIVBL
ADDAL,'0'
MOVDBUFFER1[SI],AL
INCSI
ADDAH,'0'
MOVDBUFFER1[SI],AH
INCSI
POPBX
RET
BCDASC1ENDP
;........................................
SETTIMEPROC;时间修改子程序
CALLINPUT;调用键盘输入子程序输入数据
MOVCH,HOR
MOVCL,MIN
MOVDH,SEC
ANDDL,0H
MOVAH,2DH
INT21H
JMPSTART
RET
SETTIMEENDP
;........................................
DELAY1PROC;精确延迟时间子程序
MOVDX,04FFH;循环次数
UP:
XORCX,CX
A:
NOP
LOOPA
DECDX
JNZUP
RET
DELAY1ENDP
;.......................................
INPUTPROC;输入子程序
PUSHAX;入栈保护数据
PUSHBX
PUSHCX
PUSHDX
PUSHF
MOVDX,OFFSETTN;显示修改时间的格式提示
MOVAH,09H
INT21H
MOVDX,OFFSETT_BUFF;数据缓冲区的数据输入
MOVAH,0AH
INT21H
ANDDX,0H
LEABX,T_BUFF
INCBX
INCBX
MOVDH,[BX]
SUBDH,30H
INCBX
MOVDL,[BX]
SUBDL,30H
MOVCL,10
MOVAL,DH
MULCL
ADDAL,DL
MOVCH,AL
MOVHOR,AL
INCBX
INCBX
MOVDH,[BX]
SUBDH,30H
INCBX
MOVDL,[BX]
SUBDL,30H
MOVCL,10
MOVAL,DH
MULCL
ADDAL,DL
MOVCL,AL
MOVMIN,AL
INCBX
INCBX
MOVDH,[BX]
SUBDH,30H
INCBX
MOVDL,[BX]
SUBDL,30H
MOVCL,10
MOVAL,DH
MULCL
ADDAL,DL
MOVDH,AL
MOVSEC,AL
POPF;出栈恢复数据
POPDX
POPCX
POPBX
POPAX
RET
INPUTENDP
;..................................................
CHECKPROC
PUSHAX
PUSHBX
CMPCH,TEMPHOR;设置定点报时
JNECF1
CMPCL,TEMPMIN
JNECF1
CMPDH,TEMPSEC
JEXIANG
CF1:
CMPCL,0;设置整点报时
JNECF
CMPDH,0
JNECF
XIANG:
CALLOPEN
PUSHDX
PUSHCX
MOVDX,12H
MOVAX,34DEH
MOVCX,MUSIC
DIVCX
OUT42H,AL
MOVAL,AH
OUT42H,AL
MOVAH,1
INT21H
POPCX
POPDX
CALLCLOSE
CF:
POPBX
POPAX
RET
CHECKENDP
OPENPROC
PUSHAX
INAL,61H
ORAL,03H
OUT61H,AL
POPAX
RET
OPENENDP
CLOSEPROC
PUSHAX
INAL,61H
ANDAL,0FCH
OUT61H,AL
POPAX
RET
CLOSEENDP
;................
CODEENDS
ENDSTART
五.调试结果与显示
六.个人贡献
在本次课设实现过程中,我主要负责程序校正,和一部分程序的解释,主要有以下程序:
MOVAL,CH;小时数设定
MOVAH,0
CALLBCTD;调用进制转换子程序二进制BCD码子程序
PUSHAX
ANDAL,0F0H;选取AL高四位
MOVCL,4;设置右循环的次数
RORAL,CL;右循环
ORAL,30H;加30H得到ACSII码
MOV[BX],AL;将得到的结果送到T_BUFF缓冲区
INCBX;BX自加1,指针指向下一个缓冲区的下一个地址
POPAX
ANDAL,0FH;选取低四位
ORAL,30H
MOV[BX],AL;将转换后的低四位值送入缓冲区的下一个地址
INCBX
;........................................................................
MOVAL,':
';显示分隔符号
MOV[BX],AL
INCBX
;........................................................................
MOVAH,2CH;取时间
INT21H
;.......................................................................
MOVAL,CL;分钟数设定
MOVAH,0
CALLBCTD;调用进制转换子程序二进制BCD码子程序
PUSH