.486
ADD0_8254 EQU 300H
ADD1_8254 EQU 304H
ADD2_8254 EQU 308H
ADDK_8254 EQU 30CH
PA EQU 340H
PB EQU 344H
PC EQU 348H
CTRL EQU 34CH
ADDR0 EQU 320H ;8259偶地址
ADDR1 EQU 328H ;8259奇地址
INTQ0 EQU 40H ;中断类型号
INTQ1 EQU 41H ;中断类型号
INTQ2 EQU 42H ;中断类型号
CODE SEGMENT USE16
ASSUME CS:CODE
ORG 1000H
BEG: JMP START
N DB 4
TBLED DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH
TBKEY DB 0EEH,0EDH,0EBH,0E7H,0DEH,0DDH,0DBH,0D7H,0BEH,0BDH,0BBH,0B7H
ZFC DB 00H,00H,00H,00H
JIBEN DB 0
YOUXIU DB 0
SEGPT DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH
SUDU DW ?
SUDU5 DW ?
SUDU1 DW ?
MAICHONG DW ?
START:
MOV DX,20CH ;3色LED清零
MOV EAX,80808080H
OUT DX,EAX
MOV DX,200H
MOV EAX,0C0C0C0C0H
OUT DX,EAX
MOV DX,204H
MOV EAX,0C0C0C0C0H
OUT DX,EAX
MOV DX,208H
MOV EAX,05050A0AH
OUT DX,EAX
;8254初始化
MOV DX,ADDK_8254
MOV AL,00110110B
OUT DX,AL
MOV AL,01010110B
OUT DX,AL
MOV AL,10110110B
OUT DX,AL
MOV DX,ADD0_8254
MOV AX,47000 ;定时一分钟
OUT DX,AL
MOV AL,AH
OUT DX,AL
MOV DX,ADD1_8254
MOV AL,60
OUT DX,AL
MOV DX,ADD0_8254
MOV AX,47000 ;定时五分钟
OUT DX,AL
MOV AL,AH
OUT DX,AL
MOV DX,ADD2_8254
MOV AX,300
OUT DX,AL
MOV AL,AH
OUT DX,AL
;8255初始化
MOV DX,CTRL
MOV AL,81H
OUT DX,AL
LEA DI,ZFC
MOV N,4
MOV DX,PB
MOV AL,0FFH
OUT DX,AL
;8259初始化
MOV DX,ADDR0 ;ICW1
MOV AL,00010011B
OUT DX,AL
MOV DX,ADDR1 ;ICW2
MOV AL,40H ;中断类型号 40H
OUT DX,AL
MOV DX,ADDR1 ;ICW4
MOV AL,00000001B
OUT DX,AL
CALL JIANPAN ;调用键盘扫描子程序
CALL K_DLY
ASD: MOV BX,0
MOV CX,0
CLI ;装填中断向量
PUSH DS
MOV AX,0
MOV DS,AX
LEA AX,JISHU
MOV DS:[INTQ2*4],AX
MOV AX,SEG JISHU
MOV DS:[INTQ2*4+2],AX
MOV AX,0
MOV DS,AX
LEA AX,DINGSHI
MOV DS:[INTQ1*4],AX
MOV AX,SEG DINGSHI
MOV DS:[INTQ1*4+2],AX
MOV AX,0
MOV DS,AX
LEA AX,DINGSHI5
MOV DS:[INTQ0*4],AX
MOV AX,SEG DINGSHI5
MOV DS:[INTQ0*4+2],AX
POP DS
STI
WT: NOP ;等待计数中断
JMP WT
CALL DLYS
CALL DLY_SS ;按键等待子程序调用
JISHU PROC ;计数中断服务子程序
PUSH AX
PUSH DX
CALL DLYS
INC BX
INC CX
MOV MAICHONG,BX ;脉冲计数
MOV SUDU,CX ;一分钟脉冲计数
MOV AX,MAICHONG
ADD AL,0 ;转换为十进制显示
DAA
MOV BL,AL
MOV AL,AH
ADC AL,0
DAA
MOV BH,AL
MOV MAICHONG,BX
CALL TOTAL ;调用脉冲数显示
MOV AL,20H
MOV DX,ADDR0 ;中断结束命令
OUT DX,AL
POP DX
POP AX
IRET
JISHU ENDP
DINGSHI PROC ;一分钟中断服务子程序
PUSH AX
PUSH BX
PUSH DX
MOV DX,ADD0_8254
MOV AX,47000 ;定时一分钟
OUT DX,AL
MOV AL,AH
OUT DX,AL
MOV DX,ADD1_8254
MOV AL,60
OUT DX,AL
MOV CX,SUDU
MOV SUDU1,CX
MOV CX,0
MOV BX,SUDU5
ADD BX,SUDU1
MOV SUDU5,BX ;五分钟脉冲计数
CALL ZHUANHUAN ;转换为十进制显示
CALL SPEED ;调用速度显示子程序
MOV AL,20H ;中断结束命令
MOV DX,ADDR0
OUT DX,AL
POP DX
POP BX
POP AX
IRET
DINGSHI ENDP
DINGSHI5 PROC ;五分钟中断服务子程序
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV DX,ADD0_8254
MOV AX,47000 ;定时五分钟
OUT DX,AL
MOV AL,AH
OUT DX,AL
MOV DX,ADD2_8254
MOV AX,300
OUT DX,AL
MOV AL,AH
OUT DX,AL
MOV AX,SUDU5
MOV BL,5 ;计算最近五分钟平均脉冲数
DIV BL
CMP AL,JIBEN ;与基本速度比较
JNS TT1
CALL FENGMING ;小于基本速度则蜂鸣器鸣叫
TT1: CMP AL,YOUXIU ;与优秀速度比较
JB TT ;大于优秀速度则三色LED闪烁
CALL SHANSHUO
TT: MOV SUDU5,0
MOV AL,20H ;中断结束命令
MOV DX,ADDR0
OUT DX,AL
POP DX
POP CX
POP BX
POP AX
IRET
DINGSHI5 ENDP
TOTAL PROC ;脉冲总数显示子程序
PUSHA
MOV DX,20CH
MOV AX,8080H
OUT DX,AX ;初始化前2片8255
CALL ASK1
MOV DX,205H
MOV AL,CL
OUT DX,AL ;显示个位
CALL ASK2
MOV DX,201H
MOV AL,CL
OUT DX,AL ;显示十位
CALL ASK3
MOV DX,204H
MOV AL,CL
OUT DX,AL ;显示百位
CALL ASK4
MOV DX,200H
MOV AL,CL
OUT DX,AL ;显示千位
MOV DX,208H
MOV AX,0A0AH
OUT DX,AX ;设置颜色
;----------------------
LEA DI,ZFC ;按键值的闪烁显示
MOV N,4
MOV BH,10000001B ;蜂鸣器清零以及位选初始化
NXTB1:
MOV DX,PA
MOV AL,[DI] ;段选值
OUT DX,AL
MOV DX, PB ;位选
MOV AL,BH
OUT DX,AL
CALL DLY_SS
SHL BH,1
ADD BH,80H
INC DI
DEC N
CMP N,0
JA NXTB1 ;显示了四位数后跳出
;---------------
CALL SM1 ;调用有无键盘按下扫描子程序
POPA
RET
TOTAL ENDP
ASK1 PROC ;拆字个位
MOV AX,MAICHONG
AND AX,0FH
LEA BX,SEGPT
XLAT
MOV CL,AL
RET
ASK1 ENDP
ASK2 PROC ;拆字十位
MOV AX,MAICHONG
AND AX,0F0H
SHR AX,4
LEA BX,SEGPT
XLAT
MOV CL,AL
RET
ASK2 ENDP
ASK3 PROC ;拆字百位
MOV AX,MAICHONG
AND AX,0F00H
SHR AX,8
LEA BX,SEGPT
XLAT
MOV CL,AL
RET
ASK3 ENDP
ASK4 PROC ;拆字千位
MOV AX,MAICHONG
AND AX,0F000H
SHR AX,12
LEA BX,SEGPT
XLAT
MOV CL,AL
RET
ASK4 ENDP
SPEED PROC ;速度显示子程序
PUSHA
MOV DX,20EH
MOV AX,8080H
OUT DX,AX ;初始化后2片8255
CALL ASK_1
MOV DX,207H
MOV AL,CL
OUT DX,AL ;显示个位
CALL ASK_2
MOV DX,203H
MOV AL,CL
OUT DX,AL ;显示十位
CALL ASK_3
MOV DX,206H
MOV AL,CL
OUT DX,AL ;显示百位
CALL ASK_4
MOV DX,202H
MOV AL,CL
OUT DX,AL ;显示千位
MOV DX,20AH
MOV AX,0505H
OUT DX,AX ;设置颜色
POPA
RET
SPEED ENDP
ASK_1 PROC ;拆字个位
MOV AX,SUDU1
AND AX,0FH
LEA BX,SEGPT
XLAT
MOV CL,AL
RET
ASK_1 ENDP
ASK_2 PROC ;拆字十位
MOV AX,SUDU1
AND AX,0F0H
SHR AX,4
LEA BX,SEGPT
XLAT
MOV CL,AL
RET
ASK_2 ENDP
ASK_3 PROC ;拆字百位
MOV AX,SUDU1
AND AX,0F00H
SHR AX,8
LEA BX,SEGPT
XLAT
MOV CL,AL
RET
ASK_3 ENDP
ASK_4 PROC ;拆字千位
MOV AX,SUDU1
AND AX,0F000H
SHR AX,12
LEA BX,SEGPT
XLAT
MOV CL,AL
RET
ASK_4 ENDP
FENGMING PROC ;蜂鸣器子程序
PUSHA
MOV DX,PB
MOV AL,00H
OUT DX,AL
CALL DLY3L
MOV DX,PB
MOV AL,0FFH
OUT DX,AL
POPA
RET
FENGMING ENDP
SHANSHUO PROC ;三色LED闪烁子程序
PUSHA
MOV CX,3
PAPA:CALL SPEED
CALL DLYL
MOV DX,20AH
MOV AX,0F0FH
OUT DX,AX
CALL DLYL
LOOP PAPA
CALL SPEED
MOV SUDU5,0
POPA
SHANSHUO ENDP
ZHUANHUAN PROC ;三色LED装换为十进制子程序
PUSHA
MOV AX,SUDU1
MOV BL,10
DIV BL
SHL AL,4
ADD AL,AH
MOV AH,0
MOV CX,AX
MOV SUDU1,CX
POPA
RET
DLYS PROC ;按键延时
PUSH CX
MOV CX,8FH
DLYS1:
LOOP DLYS1
POP CX
RET
DLYS ENDP
DLYL PROC ;闪烁延时
PUSH ECX
MOV ECX,02FFFFH
DLYL_AGN:
NOP
LOOPD DLYL_AGN
POP ECX
RET
DLYL ENDP
DLY3L PROC ;3秒延时
PUSH ECX
MOV ECX,6FFFFH
DLY3L_AGN:
NOP
LOOPD DLY3L_AGN
POP ECX