200-400,但是还能商量,啊啊啊啊截止时间12.25的下午4点的作业球球
使用软件emu8086和proteus8.13_jb51,汇编语言
以下代码求助,帮我纠正一下错误使其能运行并添加一个新功能(是个新功能就行),同时需要详细的解释与运行指导,有意者请立即立刻我1q5q1q4q6q4q16912去字母
C13N01(电子秒表)
代码如下:
A8255 EQU 0000H ;8255各端口地址
B8255 EQU 0002H
C8255 EQU 0004H
CTR8255 EQU 0006H
CH0 EQU 0200H ;8253计数器0端口地址
CTR8253 EQU 0206H ;8253控制端口地址
AD245 EQU 0100H ;74245地址
CODE SEGMENT 'CODE'
ASSUME DS:DATA,CS:CODE,SS:SSEG
START: MOV AX,SSEG ;初始化堆栈段
MOV SS,AX
MOV AX,TOP
MOV SP,AX
MOV AX,DATA ;初始化数据段
MOV DS,AX
CLI ;设中段向量
MOV AX,0
MOV ES,AX
MOV BX,2*4 ;NMI为2号中断
MOV AX,OFFSET INTR_KEY
MOV WORD PTR ES:[BX],AX
MOV AX,SEG INTR_KEY
MOV WORD PTR ES:[BX+2],AX
STI
MOV AX,DATA
MOV ES,AX
MOV AL,10001001B ;8255初始化
MOV DX,CTR8255
OUT DX,AL
RUN: CALL RUNNING ;循环等待中断
JMP RUN
INTR_KEY PROC ;中断服务子程序
PUSH AX ;现场保护
PUSH BX
PUSHF
CALL KEY
TEST AL,1H ;检测开始键
JZ K1
TEST AL,2H ;检测暂停键
JZ K2
TEST AL,4H ;检测复位键
JZ K3
K1: MOV KEYST,1 ;计时
JMP FIN
K2: MOV KEYST,2 ;暂停
INC PAUSEKEY
JMP FIN
K3: MOV KEYST,3 ;复位
JMP FIN
FIN: POPF ;恢复现场
POP BX
POP AX
IRET
INTR_KEY ENDP
RUNNING PROC ;根据当前的中断触发类型,转入不同的显示方法
AGAIN: CMP KEYST,1
JZ T1
CMP KEYST,2
JZ T2
CMP KEYST,3
JZ T3
JMP E0
T1: CALL TIME
JMP E0
T2: TEST PAUSEKEY,1
JZ T1
JMP E0
T3: CALL RESET
E0: CALL DISP
RET
RUNNING ENDP
TIME PROC ;计时子程序,按时间进位规则
PUSH AX
PUSH SI
LEA SI,TIMEBUF ;10毫秒
MOV AH,[SI]
INC AH
CMP AH,100
JZ S1
MOV [SI],AH
JMP S5
S1: MOV AH,0 ;秒
MOV [SI],AH
MOV AH,[SI+1]
INC AH
CMP AH,60
JZ S2
MOV [SI+1],AH
JMP S5
S2: MOV AH,0 ;分
MOV [SI+1],AH
MOV AH,[SI+2]
INC AH
CMP AH,60
JZ S3
MOV [SI+2],AH
JMP S5
S3: MOV AH,0
MOV [SI+2],AH
MOV AH,[SI+3]
INC AH
CMP AH,24
JZ S4
MOV [SI+3],AH
JMP S5
S4: MOV AL,0
LEA DI,TIMEBUF
MOV CX,4
CLD
REP STOSB
S5: CALL DIGIT ;将时间转换数位值
CALL DELAY8253
POP SI
POP AX
RET
TIME ENDP
DIGIT PROC ;将时间转换为数位值
PUSH AX
PUSH BX
PUSH CX
PUSH SI
PUSH DI
MOV BL,4 ;4个时间单位,依次转换
LEA DI,LEDBUF
LEA SI,TIMEBUF
NEXT: LODSB ;依次取出时间值
MOV AH,0
MOV CL,10 ;除以10,分离出时间的个位和十位
DIV CL
XCHG AH,AL
STOSB
MOV AL,AH
STOSB
DEC BL
JNZ NEXT
POP DI
POP SI
POP CX
POP BX
POP AX
RET
DIGIT ENDP
DISP PROC ;显示LEDBUF中的值
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
LEA BX,LEDTAB
LEA SI,LEDBUF
MOV CX,8
MOV AH,7FH
LOOP1: MOV AL,[SI]
XLAT ;换码,数位值换成LED显示段码
MOV DX,A8255 ;段码值送8255 A口
OUT DX,AL
MOV AL,AH ;LED位选送8255 B口
MOV DX,B8255
OUT DX,AL
CALL DELAY
ROR AH,1
INC SI
CALL CLRLED ;LED清屏
LOOP LOOP1
POP SI
POP DX
POP CX
POP BX
POP AX
RET
DISP ENDP
CLRLED PROC ;清屏子程序
PUSH AX
PUSH DX
MOV AL,0FFH
MOV DX,B8255
OUT DX,AL
POP DX
POP AX
RET
CLRLED ENDP
DELAY8253 PROC ;8253延时子程序
PUSH AX
PUSH DX
MOV DX,CTR8253 ;设置8253控制字,使用通道0计数,方式0
MOV AL,00010000B
OUT DX,AL
MOV DX,CH0
MOV AX,1600
OUT DX,AL
MOV AL,AH
OUT DX,AL
MOV DX,AD245
W1: IN AL,DX
TEST AL,01H ;检测8253计时是否结束,通道0输出高电平
JZ W1
POP DX
POP AX
RET
DELAY8253 ENDP
DELAY PROC ;软延时
PUSH CX
MOV CX,50
WAIT1: LOOP WAIT1
POP CX
RET
DELAY ENDP
RESET PROC ;计数复位子程序,数据缓冲区全部清0
PUSH AX
PUSH CX
PUSH DI
MOV AL,0
LEA DI,TIMEBUF
MOV CX,13
CLD
REP STOSB
POP DI
POP CX
POP AX
RESET ENDP
KEY PROC ;读开关子程序
MOV DX,C8255
IN AL,DX
RET
KEY ENDP
CODE ENDS
DATA SEGMENT
LEDTAB DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H
TIMEBUF DB 0,0,0,0 ;时间暂存区,ms,s,m,h
LEDBUF DB 0,0,0,0,0,0,0,0 ;数位暂存区
PAUSEKEY DB 0 ;暂停开关计数,奇数:暂停,偶数:恢复计数
KEYST DB 0 ;按键分类,1:开始键,2:暂停键,3:复位键
DATA ENDS
SSEG SEGMENT PARA STACK 'STACK' ;定义堆栈段,实现子程序调用必备
SDAT DB 1000 DUP(?)
TOP EQU LENGTH SDAT
SSEG ENDS
END START