微机课程设计.docx

上传人:b****9 文档编号:25716536 上传时间:2023-06-11 格式:DOCX 页数:18 大小:18.99KB
下载 相关 举报
微机课程设计.docx_第1页
第1页 / 共18页
微机课程设计.docx_第2页
第2页 / 共18页
微机课程设计.docx_第3页
第3页 / 共18页
微机课程设计.docx_第4页
第4页 / 共18页
微机课程设计.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

微机课程设计.docx

《微机课程设计.docx》由会员分享,可在线阅读,更多相关《微机课程设计.docx(18页珍藏版)》请在冰豆网上搜索。

微机课程设计.docx

微机课程设计

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1