微机课程设计.docx
《微机课程设计.docx》由会员分享,可在线阅读,更多相关《微机课程设计.docx(18页珍藏版)》请在冰豆网上搜索。
![微机课程设计.docx](https://file1.bdocx.com/fileroot1/2023-6/11/d07c588b-18a7-40f5-ba14-fb521ba20254/d07c588b-18a7-40f5-ba14-fb521ba202541.gif)
微机课程设计
PC机实时时钟的设计
利用PC机现有的硬件和软件资源设计程序,以实现在显示器上显示XX(时):
XX(分):
XX(秒)。
DATASEGMENT
COUNTDB100
;******************************初始的时间显示*********************
TENHDB'1'
HOURDB'2:
'
TENMDB'0'
MINUTEDB'0'
DB':
'
TENSDB'0'
SECONDDB'0',0DH,0DH,'$';初始显示12:
00:
00
;*****************************初始的界面显示内容********************
ENTER1DB"--------------------------WELCOME-----------------------------",0AH,0DH
DB"BaoYan120900931",0AH,0DH
DB"AllRightsReserved",0AH,0DH
ENTER2DB'TheTimeNowis',10DUP(0)
ENTER3DB'Doyouwanttochangethetime?
[Y/N]'
ENTER4DB'**--Whenfinishedchangingthetime,pleasepress"enter"tocontinue--**'
ENTER5DB'**--Youcanpresstheleftorrightbuttonforchangingthehour,minute--**'
ENTER6DB'**--orsecondthatyouwant--**'
DATAENDS
STACKSEGMENTPARASTACK'STACK'
DB256DUP(0)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
STARTPROCFAR
PUSHDS
MOVAX,0
PUSHAX;标准序返回DOS
MOVAH,07H
INT21H;初始时无显示,此时等待键盘输入,AL=字符的ASCII码,输入无回显
;***************************将中断矢量压入堆栈保存********************
CLI;关中断,防止有些硬件对中断的干扰
CLD;使DF=0
MOVAX,0000H
MOVDS,AX
MOVSI,0020H;DS:
SI指向08H中断向量
LODSW;取08中断入口的偏移地址
MOVBX,AX
LODSW;取08中断入口的段地址
PUSHAX
PUSHBX;压栈保护
MOVAX,DATA
MOVDS,AX;建立数据段的可寻址性
;************************将中断向量压入新地址************************
MOVAX,0000H
MOVES,AX
MOVDI,0020H;ES:
DS指向08中断向量存放地址
MOVAX,OFFSETTIMER
STOSW;写入偏移地址
MOVAX,CS
STOSW;写入段地址
MOVAL,00110110B;8253初始化,0通道,方式3,二进制计数
OUT43H,AL
MOVAX,11932;计数初值=11932
OUT40H,AL
MOVAL,AH
OUT40H,AL
INAL,21H;读8259的中断屏蔽寄存器IMR
PUSHAX;压栈保护,AL的值为0FCH
STI;开中断
MOVAH,1
MOVCH,30H
INT10H;置光标类型
CALLCLEAN_SCREEN;清屏
;******************************屏幕初始化***********************
PUSHAX
PUSHBX
MOVAX,0600H;AH=06(滚动)AL=00(全屏空白)
MOVBH,000CH;设置背景颜色(3)和前景颜色(e)
SUBCX,CX;从0行0列开始
MOVDX,8F8FH;到8F行8F列
INT10H
POPAX
POPBX
;************************显示ENTER1的内容***********************
MOVDH,1;行号
MOVDL,0;列号
MOVBH,0;页号
MOVAH,2;置光标位置
INT10H
MOVCX,199
MOVSI,OFFSETENTER1
SHOW:
MOVAH,0EH;显示字符(光标前移),al字符,bl前景色
MOVAL,[SI]
INT10H
INCSI
LOOPSHOW
;***********************显示ENTER2的内容************************
PUSHES
PUSHBP
PUSHBX
PUSHCX
PUSHDX;保护现场,让寄存器压栈(后同)
MOVBP,OFFSETENTER2;取ENTER2的偏移地址(后同)
MOVAX,SEGENTER2;取ENTER2的段地址(后同)
MOVES,AX;ES:
BP为欲显示的字符串地址(后同)
MOVCX,60;假设字符串长度为60(后同)
MOVBX,0007H;BH=00,为页号,BL=07H为显示的字符串属性,为银白色(后同)
MOVDX,0600H;起始行为06,起始列为00(后同)
MOVAL,1
MOVAH,13H
INT10H
POPDX
POPCX
POPBX
POPBP
POPES
;***********************显示ENTER3的内容************************
PUSHES
PUSHBP
PUSHBX
PUSHCX
PUSHDX
MOVBP,OFFSETENTER3
MOVAX,SEGENTER3
MOVES,AX
MOVCX,40
MOVBX,0007H
MOVDX,0C00H
MOVAL,1
MOVAH,13H
INT10H
POPDX
POPCX
POPBX
POPBP
POPES
;***********************显示ENTER4的内容************************
PUSHES
PUSHBP
PUSHBX
PUSHCX
PUSHDX
MOVBP,OFFSETENTER4
MOVAX,SEGENTER4
MOVES,AX
MOVCX,48H
MOVBX,0007H
MOVDX,0D00H
MOVAL,1
MOVAH,13H
INT10H
POPDX
POPCX
POPBX
POPBP
POPES
;***********************显示ENTER5的内容************************
PUSHES
PUSHBP
PUSHBX
PUSHCX
PUSHDX
MOVBP,OFFSETENTER5
MOVAX,SEGENTER5
MOVES,AX
MOVCX,4DH
MOVBX,0007H
MOVDX,0E00H
MOVAL,1
MOVAH,13H
INT10H
POPDX
POPCX
POPBX
POPBP
POPES
;***********************显示ENTER6的内容************************
PUSHES
PUSHBP
PUSHBX
PUSHCX
PUSHDX
MOVBP,OFFSETENTER6
MOVAX,SEGENTER6
MOVES,AX
MOVCX,1FH
MOVBX,0007H
MOVDX,0F00H
MOVAL,1
MOVAH,13H
INT10H
POPDX
POPCX
POPBX
POPBP
POPES
FOREVER:
MOVDL,0FFH
MOVAH,06H
INT21H;判断键盘是否有输入
MOVDL,AL
MOVAH,02H
INT21H;显示键盘输入的字符
JZDISP;无键按下则转显示DISP
CMPAL,20H;判断按键是否为空格
JZEXIT1;若为空格,则退出程序
CMPAL,'Y'
JZCHANGE
CMPAL,'y'
JZCHANGE;判断是否为“Y”或者“y”,若是则转到修改函数
;**********************************显示时间模块******************
DISP:
PUSHES
PUSHBP
PUSHBX
PUSHCX
PUSHDX
MOVBP,OFFSETTENH
MOVAX,SEGTENH
MOVES,AX
MOVCX,8;显示从TENH开始的八个字符串,即时间
MOVBX,000CH
MOVDX,0923H
MOVAL,1
MOVAH,13H
INT10H
POPDX
POPCX
POPBX
POPBP
POPES
MOVBH,0
MOVDX,0C2AH
MOVAH,02H
INT10H;将光标置于0CH行的2AH列
MOVAL,SECOND;取秒单元值
WAITCHA:
CMPAL,SECOND;判断秒的数值是否改变
JZWAITCHA;没有改变则继续等待
JMPFOREVER;改变则转FOREVER
EXIT1:
JMPEXIT
;****************************修改时间模块************************
CHANGE:
MOVDX,0923H;将光标位置锁定到时钟的第一位
CHANGE1:
MOVAH,02H
INT10H;锁定光标位置,DH为行,DL为列
MOVAL,0
MOVCX,DX
SUBCX,0923H;判定当前光标在时钟的第几位,存在CX里
LEASI,TENH
ADDSI,CX;将SI指向当前光标位置所显示存储单元,以便进行修改
MOVAH,0
INT16H;读取键盘按键信息,存在AL里,但并不回显
CMPAL,0DH;0DH为回车的ASCII码,当键盘敲入回车时,则继续显示时间
JZFOREVER
CMPAH,4DH;判断是否按了右方向键
JZWRI2;若按了右方向键则转WRI2
CMPAH,4BH;判断是否按了左方向键
JZMOVE2;若按了左方向键则转MOVE2
CMPAL,30H
JBCHANGE1;输入小于0作无效处理
;**************************对输入的时间值进行判断模块*******************
HOUR_H:
CMPCX,0;对小时高位输入判断
JNZHOUR_L;判断是否是小时的高位,若不是则指向小时的低位
CMPAL,'2';将输入小时的高位的值判断
JACHANGE1;若大于2,无效,转到CHANGE1
JMPWRI1;否则将其写入(后同)
HOUR_L:
CMPCX,1;对小时低位输入判断
JNZMINU_H;判断是否是小时的低位,若不是则指向分钟的高位
MOVBL,TENH
CMPBL,'2';判断高位是否为2
JZHOUR_2;高位是2则转向HOUR_2
CMPAL,'9'
JACHANGE1;高位不为2时,低位可以输入小于等于9的数
JMPWRI1
HOUR_2:
CMPAL,'3';高位为2时,低位只能输入小于等于3的数
JACHANGE1
JMPWRI1
MINU_H:
CMPCX,3;对分钟高位输入判断
JNZMINU_L;判断是否是分钟的高位,若不是则指向分钟的低位
CMPAL,'5';将输入的数与5比较
JACHANGE1;若大于5无效
JMPWRI1
MINU_L:
CMPCX,4;对分钟低位输入判断
JNZSEC_H;判断是否是分钟的低位,若不是则指向秒钟的高位
CMPAL,'9';将输入分钟的低位与9比较
JACHANGE1;大于9无效
JMPWRI1
SEC_H:
CMPCX,6;对秒钟高位输入判断
JNZSEC_L;判断是否是秒钟的高位,若不是则指向秒钟的低位
CMPAL,'5';将输入的数与5比较
JACHANGE1;若大于5无效
JMPWRI1
SEC_L:
CMPCX,7;对秒钟低位低位判断
JNZCHANGE1;光标不在时钟上时,输入不回显也不处理
CMPAL,'9';将输入分钟的低位与9比较
JACHANGE1;大于9无效
WRI1:
MOV[SI],AL;将输入的字符存到对应内存单元
MOVAH,0EH;同时将输入的字符显示在当前位置
INT10H
JMPWRI2
WRI2:
MOVAL,[SI+1];按下右方向键,则使偏移量加1
CMPAL,':
';当下一位为“:
”时,则对DX加两次,否则跳过它
JNZMOVE1
INCDX
MOVE1:
INCDX;每修改一位,把光标向后移一位
JMPCHANGE1
MOVE2:
MOVAL,[SI-1];当输入左方向键时,使偏移量减1
CMPAL,':
';当下一位为“:
”时,则对DX减两次,否则跳过它
JNZMOVE3
DECDX
MOVE3:
DECDX;每修改一位,把光标向前移一位
JMPCHANGE1
EXIT:
CLI;有空格键按下时退出,关中断
CLD;清方向标志位
POPAX
OUT21H,AL;恢复IMR
MOVAL,36H;8253初始化,55ms
OUT43H,AL
MOVAL,0
OUT40H,AL
OUT40H,AL
;**************************恢复中断向量**************************
MOVAX,0
MOVES,AX
MOVDI,4*8
POPAX
STOSW
POPAX
STOSW
STI
RET
STARTENDP
;*******************时间进位模块*********************************
TIMERPROCFAR
PUSHAX
DECCOUNT
JNZL2;不到一秒转L2
MOVCOUNT,100;到1秒,重置COUNT,并修改时间
INCSECOND
CMPSECOND,'9'
JLETIMEXT;如果小于等于9,转至TIMEXT(后同)
MOVSECOND,'0'
INCTENS
CMPTENS,'6'
JLTIMEXT
MOVTENS,'0'
INCMINUTE
CMPMINUTE,'9'
JLETIMEXT
MOVMINUTE,'0'
INCTENM
CMPTENM,'6'
JLTIMEXT
MOVTENM,'0'
JMPL3
L2:
JMPTIMEXT
L3:
MOVAL,HOUR
ANDAL,0FH
MOVAH,TENH
ANDAH,0FH
MOVCL,4
RORAH,CL
ORAL,AH;AH放到AL高四位
ADDAL,1
DAA
CMPAL,24
JLL1;小于24转L1,否则置0
MOVTENH,'0'
MOVHOUR,'0'
JMPTIMEXT
L1:
MOVAH,AL
ANDAL,0FH
ORAL,30H
MOVHOUR,AL
MOVCL,4
RORAH,CL
ANDAH,0FH
ORAH,30H
MOVTENH,AH
TIMEXT:
;中断结束
MOVAL,20H
OUT20H,AL
POPAX
IRET
TIMERENDP
;******************************************清屏函数**********************************
CLEAN_SCREENPROCNEAR
PUSHAX
PUSHBX
PUSHCX
PUSHDX
MOVAH,6;屏幕初始化或向上滚动
MOVAL,0;清屏
MOVBH,0;滚入行属性
MOVCH,0;左上角行号
MOVCL,0;左上角列号
MOVDH,50;右下角行号
MOVDL,90;右下角列号
INT10H
MOVDX,6100H
MOVAH,01H
INT10H
POPDX
POPCX
POPBX
POPAX
RET
CLEAN_SCREENENDP
CODEENDS
ENDSTART