求助可r以帮帮我吗!计算机接口实验虚拟仿真实验

1 篇文章 0 订阅
1 篇文章 0 订阅

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

  • 14
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值