帮我做做,这是我的课程设计

gallop82 2003-06-12 05:41:59
课题设计要求: 利用计数器/定时器8253和中断控制器8259产生定时脉冲,显示时间的时针,分针,秒针。
课题设计说明: 通过修改实时时钟(中断类型号为8H)的中断向量使之指向用户的中断服务程序。程序中重新设置8253的计数器0,使它每10ms产生一次中断,100次中断后秒针加1,然后调整时,分,秒并显示之。程序从按下非空格键开始显示。数据区中存放时间值,然后每秒更新一次显示。运行中若按下空格键即退出程序返回DOS.
给我具体的思路,一定要具体,最好是一部分的代码,谢谢各位了
...全文
87 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
BraveHeart2222 2003-06-14
  • 打赏
  • 举报
回复
将新8号中断处理程序中从语句INC LHH开始至EXIT:IRET必为:
INC LHH
CMP LHH,'3'
JBE EXIT ;LHH<='3'
CMP HHH,'2' ;LHH>'3'
JE BB ;HHH='2' AND LHH>'3'
CMP LHH,'9'
JB EXIT ;'3'<LHH<'9' AND HHH<'2'
MOV LHH,'0' ;LHH>'9' AND HHH<'2'
INC HHH
JMP EXIT
BB:
MOV LHH,'0'
MOV HHH,'0'
EXIT :IRET
BraveHeart2222 2003-06-13
  • 打赏
  • 举报
回复
在PC中,8253的计数器的clk0是接一个1.193MHZ的时钟输入,1.193MH/655536=18.2,所以每秒就会产生18次中断请求;而8253的0号计数器的输出out0是接8259的irq0,这样,计数器的计数初值减到0时,out0就变为高电平,而out0是接8259的irq0,所以此时8259就会向处理器发出中断请求信号,从而处理器会暂停正执行的程序,转而去调用时钟中断处理程序;
  在你的题目中,已经给出了0号计数器的clk0为1KHz,精度为秒,这就是要求你算出计数初值,以达到每秒产生一次中断,每执行一次1ch中断处理程序,就增一秒,当秒增加到60时,就增加分,分增加到60时就增加小时。

1、通过修改实时时钟(中断类型号为8H)的中断向量使之指向用户的中断服务程序:
这是说用你的中断处理程序代替原来的中断处理程序,在地址0000:0000至0000:0400H之间存放的是各中断对应的中断处理程序的地址,各占4个字节,如0000:0000-0000:0003存放的是0号中断对应的中断处理程序的地址;只要用你的程序地址取代它,以后该中断发生时调用的就是你的程序;当然可不用这种方式,而是采用int 21h中的确25H子功能
2、程序中重新设置8253的计数器0,使它每10ms产生一次中断:
在PC中,8253的计数器0的初值是65536,8253的计数器的clk0是接一个1.193MHZ的时钟输入,故1.193MH/655536=18.2,所以每秒就会产生18次中断请求
你的设计要求每10ms产生一次中断,也就是要每秒产生100次中断,所以其初值应为:
1.193MH/100=??,这与PC中的默认初值65536不同,故应在你的程序中重新设置8253的计数器0

3、100次中断后秒针加1,然后调整时,分,秒并显示之:
因为每秒产生100次中断,换句话说就是该中断发生100次时,时间刚好为1秒,后面不用说了吧!
BraveHeart2222 2003-06-13
  • 打赏
  • 举报
回复
;下面是我写的代码,不过还未经调试
;我想知道:如此程序退出后,计算机的时钟是否会正常,也就是说程序退出后,
;在dos下键入命令time,显示的时间是否正常,麻烦将结果告诉我一下,谢谢!

COUNT_VAL=100

DATA SEGMENT
COUNT DW COUNT_VAL
TIME_BUFF DB 9,0
HHH DB '?'
LHH DB '?:'
HMM DB '?'
LMM DB '?:'
HSS DB '?'
LSS DB '?',0DH,'$'
CURSOR DW ?
OLD8H DD ?
PROMPT db 'Input current time:$'
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA
NEW8H: ;新8号中断处理程序
CMP COUNT,0
JZ NEXT ;COUNT已从100减到0,已得1秒
DEC COUNT
IRET
NEXT:
MOV COUNT,COUNT_VAL
STI
INC LSS
CMP LSS,'9'
JBE EXIT
MOV LSS,'0'
INC HSS
CMP HSS,'6'
JB EXIT
MOV HSS,'0'
INC LMM
CMP LMM,'9'
JBE EXIT
MOV LMM,'0'
INC HMM
CMP HMM,'6'
JB EXIT
MOV HMM,'0'
INC LHH
CMP LHH,'3'
JBE EXIT
CMP HHH,'2'
JB EXIT ;HHH<'2' AND LHH>'3'
MOV LHH,'0' ;HHH>'2' AND LHH>'3'
MOV HHH,'0'
EXIT:
IRET
START:
MOV AX,DATA
MOV DS,AX
MOV AX,3508H ;取出原8号中断处理程序的地址
INT 21H
MOV WORD PTR OLD8H,BX ;保存原8号中断处理程序的地址
MOV WORD PTR OLD8H+2,ES
LEA DX,PROMPT ;按hh:mm:ss格式输入当前时间
MOV AH,09 ;不能是如2:1:3形式,而应是02:01:03形式
INT 21H
LEA DX,TIME_BUFF ;等待输入当前时间
MOV AH,0AH
INT 21H

MOV AL,36H ;设置8253的计数器0工作为模式3,16位计数值
OUT 43H,AL ;
MOV DX,12H ;12348ch是1.193MH的16进制
MOV AX,348CH
MOV DI,100
DIV DI ;12348ch/100=计数初值
OUT 40H,AL ;先写计数初值的低字节
MOV AL,AH
OUT 40H,AL ;再写高字节

LEA DX,NEW8H
MOV AX,SEG NEW8H
MOV DS,AX
MOV AX,2508H
INT 21H ;将我们的程序设置为新的中断处理程序

MOV BH,0
MOV AH,3
INT 10H ;取原光标位置
MOV CURSOR,DX ;保存原光标位置

MOV DX,1866H ;设置新的光标位置
MOV BH,0
MOV AH,2
INT 10H
LEA DX,TIME_BUFF ;显示时钟
MOV AH,09H
INT 21H

LOOP1: CALL KBR_STATUS ;等待按键
JNC LOOP1 ;没有键被按下,继续循环
READ_KEY:
CALL KBR_WAIT
CMP AX,011BH ;是否按下了'ESC'键
JE EXIT_P ;是则退出
JMP READ_KEY ;不是继续循环

EXIT_P:
MOV DX,WORD PTR OLD8H
MOV AX,WORD PTR OLD8H+2
MOV DS,AX
MOV AX,2508H
INT 21H

MOV AH,4CH
INT 21H
KBR_STATUS PROC
MOV AH,1
INT 16H
JNZ PRESSED
CLC
RET
PRESSED:
STC
RET
KBR_STATUS ENDP
KBR_WAIT PROC
MOV AH,0
INT 16H
RET
KBR_WAIT ENDP
CODE ENDS
END START
bluedodo 2003-06-13
  • 打赏
  • 举报
回复
等下来看
gallop82 2003-06-12
  • 打赏
  • 举报
回复
我以前问过你,我现在只是不知道一些8259的设置和整个程序的过程为什么要这么写,换句话说,就是不知道我的设计题目的每句话什么意思,你能不能帮我解释一下每句话,小弟是微机原理的初学者,帮帮忙把,谢谢!·
BraveHeart2222 2003-06-12
  • 打赏
  • 举报
回复
我想这个问题的关键就是要计算出8253的计数器0的初值,其它好办;
每10ms产生一次中断,也就是说每秒要产生100次中断,所以其初值应为:
1.19276MH/100=x
接下来的就是要对8253进行初始化设置,并用你新的中断处理程序取代原中断处理程序。
Tiangua 2003-06-12
  • 打赏
  • 举报
回复
说的太清楚了吧
你的说明不就是思路吗!!!
在清楚一点就要别人帮你做了~~~~~~

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧