本人编写了一段程序,求高手看看,咋就错误百出了呢。。。。。。。
DATAS SEGMENT
;此处输入数据段代码
DISPCODE DBC0H,F9H,A4H,B0H,99H
DB 92H,82H,F8H,80H,90H ;共阳数码管的段码表
BUFF DB 0,0
COUNT DB 0
FLAG DB 0
BIT DB 1
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:SSEG
START:
MOV AX,DATAS
MOV DS,AX
MOV AX,CODES
MOV SS,AX
SET_8255;调用8255初始化程序
NMI_TIMER;调用NMI初始化程序
SET_8253;调用8253初始化程序
NMI_TIMER PROC;NMI初始化
MOV AX,0
MOV DS,AX
MOV BX,0008H
MOV AX,OFFSET TIMER
MOV [BX],AX
INC BX
INC BX
MOV AX,SEG TIMER
MOV [BX],AX
NMI_TIMER ENDP
TIMER PROC;中断服务子程序
PUSH SI
PUSH DI
PUSH CX
PUSH BX
PUSH AX
PUSH DX
INC COUNT
INC BUFF
CMP COUNT,10
JNZ IEXIT
MOV COUNT,0
INC BUFF+1
CMP BUFF+1,10
JNZ IEXIT
MOV BUFF+1,0
CMP BUFF,10
JNZ IEXIT
MOV BUFF,0
AND FLAG,0FEH
IEXIT:
LEA BX,DISPCODE
LEA SI,BUFF
AGI:
MOV AL,[SI]
XLAT
MOV AH,AL
MOV DX,8004H
MOV AL,BIT
OUT DX,AL
CMP AL,04H
JNZ Q1
AND AH,7FH
Q1:
MOV DX,8002H
MOV AL,AH
OUT DX,AL
IRET
TIMER ENDP
SET_8255 PROC ;8255初始化
MOV DX,8006H
MOVAL,10000000B;PB工作在方式0,输出模式
;PC口低四位工作在方式0,输出模式
OUT DX,AL
RET
SET_8255 ENDP
SET_8253 PROC;8253初始化
MOV DX,0A006H
MOV AL,01110110B;计数器1,方式3,先送低8位、后送高8位,二进制
OUT DX,AL
MOV AL,00110100B;计数器0,方式2,先送低8位、后送高8位,二进制
OUT DX,AL
MOV DX,0A002H ;计数器1的地址
MOV AX,1000 ;计数器1的初值
OUT DX,AL
MOV AL,AH
OUT DX,AL ;由于输出数据用的中间寄存器必须为AL
MOV DX,0A000H ;计数器0占用设备的端口地址
MOV AX,200 ;计数器零的初值
OUT DX,AL
MOV AL,AH
OUT DX,AL
RET
SET_8253 ENDP
CODES ENDS
END START
DATAS SEGMENT
;此处输入数据段代码
DISPCODE DBC0H,F9H,A4H,B0H,99H
DB 92H,82H,F8H,80H,90H ;共阳数码管的段码表
BUFF DB 0,0
COUNT DB 0
FLAG DB 0
BIT DB 1
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:SSEG
START:
MOV AX,DATAS
MOV DS,AX
MOV AX,CODES
MOV SS,AX
SET_8255;调用8255初始化程序
NMI_TIMER;调用NMI初始化程序
SET_8253;调用8253初始化程序
NMI_TIMER PROC;NMI初始化
MOV AX,0
MOV DS,AX
MOV BX,0008H
MOV AX,OFFSET TIMER
MOV [BX],AX
INC BX
INC BX
MOV AX,SEG TIMER
MOV [BX],AX
NMI_TIMER ENDP
TIMER PROC;中断服务子程序
PUSH SI
PUSH DI
PUSH CX
PUSH BX
PUSH AX
PUSH DX
INC COUNT
INC BUFF
CMP COUNT,10
JNZ IEXIT
MOV COUNT,0
INC BUFF+1
CMP BUFF+1,10
JNZ IEXIT
MOV BUFF+1,0
CMP BUFF,10
JNZ IEXIT
MOV BUFF,0
AND FLAG,0FEH
IEXIT:
LEA BX,DISPCODE
LEA SI,BUFF
AGI:
MOV AL,[SI]
XLAT
MOV AH,AL
MOV DX,8004H
MOV AL,BIT
OUT DX,AL
CMP AL,04H
JNZ Q1
AND AH,7FH
Q1:
MOV DX,8002H
MOV AL,AH
OUT DX,AL
IRET
TIMER ENDP
SET_8255 PROC ;8255初始化
MOV DX,8006H
MOVAL,10000000B;PB工作在方式0,输出模式
;PC口低四位工作在方式0,输出模式
OUT DX,AL
RET
SET_8255 ENDP
SET_8253 PROC;8253初始化
MOV DX,0A006H
MOV AL,01110110B;计数器1,方式3,先送低8位、后送高8位,二进制
OUT DX,AL
MOV AL,00110100B;计数器0,方式2,先送低8位、后送高8位,二进制
OUT DX,AL
MOV DX,0A002H ;计数器1的地址
MOV AX,1000 ;计数器1的初值
OUT DX,AL
MOV AL,AH
OUT DX,AL ;由于输出数据用的中间寄存器必须为AL
MOV DX,0A000H ;计数器0占用设备的端口地址
MOV AX,200 ;计数器零的初值
OUT DX,AL
MOV AL,AH
OUT DX,AL
RET
SET_8253 ENDP
CODES ENDS
END START