资源描述:
《用8253定时器实现屏幕上的日历时.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、用8253定时器实现屏幕上的日历时钟设计要求:用8253定时器实现屏幕上的日历时钟,带有年月日时分秒。在DOS屏幕上右上角动态显示日期,时间,要求格式:年-月-日时:分:秒。要求采用8253定时器中断方式实现定时及显示刷新。设计方案:在计算机系统中,8253定时器内部有三个独立的计算器,其中计算器0作为定时器,为系统时钟提供一个恒定的时间基准,对时间基准信号进行记数,可以用来计算时间和日期。DOS中提供了用与读取和设置系统时间和日期的功能的调用。本程序设计首先调用DOS时间功能调用,读取系统当前时间:MOVAH,2CHINT21H执行后的返回结果:CH=小时(0~23)
2、CL=分钟(0~59)DH=秒(0~59)读取系统当前日期:MOVAH2AHINT21H执行后的返回结果:CX=年(1980~2099)DH=月(1~12)DL=日(1~31)然后再按照一定的格式显示出来,其中需要多次把返回的二进制数结果转换成十进制并显示出来,用子程序来实现这一功能。程序设计流程图主程序显示时间显示日期有按键?返回DOS结束显示时间子程序显示日期子程序获取当前时间把小时转化成ASC2码并显示显示分隔符把分钟转化成ASC2码并显示显示分隔符把秒数转化成ASC2码并显示结束获取当前日期把年份转化成ASC2码并显示显示分隔符把月份转化成ASC2码并显示显示分
3、隔符把日转化成ASC2码并显示结束设计程序:DATASEGMENTT_BUFFDB20DUP(0);在数据段开辟一时间显示缓冲区TIMEDB3DUP(0)DATAENDSSTACKSEGMENTDB100DUP(?)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKMAIN:DISPLAY:;时间显示部分MOVAX,SEGDATAMOVDS,AXLEABX,TIME;送t_buff的偏移地址到BXLEADI,T_BUFFMOVAH,2CH;调用DOS时间调用功能,功能号:2cH,小时,分钟,秒数分保存在CH,CL,DH中
4、INT21HMOV[BX],CHMOV[BX+1],CLMOV[BX+2],DHMOVAL,CH;小时数设定MOVAH,0CALLBCTD;调用进制转换子程序PUSHAXANDAL,0F0H;选取al高四位MOVCL,4;设置右循环的次数ROLAL,CL;右循环ORAL,30H;加30h得到ACSII码MOV[DI],AL;将得到的结果送到t_buff缓冲区INCDI;BX自加1,指针指向下一个缓冲区的下一个地址POPAXANDAL,0FH;选取alDI四位MOVCL,4;设置右循环的次数ROLAL,CL;右循环ORAL,30H;加30h得到ACSII码MOV[DI],
5、AL;将得到的结果送到t_buff缓冲区INCDIMOVAL,':';显示分隔符冒号MOV[DI],ALINCDIMOVCL,[BX+1]MOVAL,CL;分钟数设定MOVAH,0CALLBCTDPUSHAXANDAL,0F0HMOVCL,4ROLAL,CLORAL,30HMOV[DI],ALINCDIPOPAXANDAL,0FHORAL,30HMOV[DI],ALINCDIMOVAL,':';显示分隔符冒号MOV[DI],ALINCDIMOVDH,[BX+2]MOVAL,DH;秒钟数设定MOVAH,0CALLBCTDPUSHAXANDAL,0F0HMOVCL,4ROL
6、AL,CLORAL,30HMOV[DI],ALINCDIPOPAXANDAL,0FHORAL,30HMOV[DI],ALINCDIMOVAL,'$';将字符串的结束位送至显示缓冲区的最后一位MOV[DI],AL;置光标位置,AH=2,BH=0,DH跟DL分别为行号与列号MOVAH,2MOVBH,0MOVDH,0MOVDL,69INT10HLEADX,T_BUFF;送t_buff偏移地址到DX,并调用DOS显示功能,功能号为9MOVAH,9INT21HCALLDELAY1JMPDISPLAYBCTDPROCNEAR;二进制转BCD码子程序;AX输入参数;AX输出参数,存放
7、调整过的BCD码MOVDX,AXMOVAX,0MOVCX,16;设循环次数BCTD1:CLC;清进位标志CRCLDX,1;通过进位的循环右移ADCAL,AL;带进位加法DAA;加法的十进制调整XCHGAL,AH;交换高,低八位ADCAL,ALDAAXCHGAL,AHLOOPBCTD1;循环,次数保存在CX里RETBCTDENDPDELAY1PROC;精确延迟时间子程序MOVDX,04FFH;循环次数UP:XORCX,CXA:NOPLOOPADECDXJNZUPRETDELAY1ENDPCODEENDSENDMAIN程序说明:首先在数据段开