⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clock.asm

📁 改程序通过使用8254和8255以及其他一些辅助芯片实现了一个简单但功能比较完善的电子钟
💻 ASM
字号:
;***************根据CHECK配置信息修改下列符号值*******************
INTR_IVADD   EQU   01C8H          ;INTR对应的中断矢量地址
INTR_OCW1    EQU   0A1H           ;INTR对应PC机内部8259的OCW1地址
INTR_OCW2    EQU   0A0H           ;INTR对应PC机内部8259的OCW2地址
INTR_IM      EQU   0FBH           ;INTR对应的中断屏蔽字
PCI_INTCSR   EQU   0C438H          ;PCI卡中断控制寄存器地址
IOY0         EQU   0BC00H          ;片选IOY0对应的端口始地址
IOY1         EQU   0BC40H
IOY2         EQU   0BC80H
;*****************************************************************
;MY8259_ICW1  EQU   IOY0+00H       ;实验系统中8259的ICW1端口地址
;MY8259_ICW2  EQU   IOY0+04H       ;实验系统中8259的ICW2端口地址
;MY8259_ICW3  EQU   IOY0+04H       ;实验系统中8259的ICW3端口地址
;MY8259_ICW4  EQU   IOY0+04H       ;实验系统中8259的ICW4端口地址
;MY8259_OCW1  EQU   IOY0+04H       ;实验系统中8259的OCW1端口地址
;MY8259_OCW2  EQU   IOY0+00H       ;实验系统中8259的OCW2端口地址
;MY8259_OCW3  EQU   IOY0+00H       ;实验系统中8259的OCW3端口地址
;*****************************************************************
MY8254_COUNT0  EQU   IOY0+00H*4   ;8254计数器0端口地址
MY8254_COUNT1  EQU   IOY0+01H*4   ;8254计数器1端口地址
MY8254_COUNT2  EQU   IOY0+02H*4   ;8254计数器2端口地址
MY8254_MODE    EQU   IOY0+03H*4   ;8254控制寄存器端口地址
;*****************************************************************
MY8255_A       EQU   IOY1+00H*4      ;8255的A口地址
MY8255_B       EQU   IOY1+01H*4      ;8255的B口地址
MY8255_C       EQU   IOY1+02H*4      ;8255的C口地址
MY8255_MODE    EQU   IOY1+03H*4      ;8255的控制寄存器地址
;*****************************************************************
STACK1 SEGMENT STACK
        DW 256 DUP(?)
STACK1 ENDS


DATA SEGMENT 
CS_BAK   DW  ?                    ;保存INTR原中断处理程序入口段地址的变量
IP_BAK   DW  ?                    ;保存INTR原中断处理程序入口偏移地址的变量
IM_BAK   DB  ?                    ;保存INTR原中断屏蔽字的变量
CSC      DW  0                    ;厘秒计时变量
SEC      DW  0                    ;秒计时变量
CSCG     DW  ?                    ;保存的厘秒个位数
CSCS     DW  ?                    ;保存的厘秒十位数
SECG     DW  ?                    ;保存的秒个位数
SECS     DW  ?                    ;保存的秒十位数
;TIME     DB  30H,31H,32H,33H,34H,35H,36H,37H,38H,39H  ;
TIME1    DB  3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,67H  ;没有点的十个数的七段显示
TIME2    DB  0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0E7H  ;有点的十个数的七段显示
DATA ENDS


CODE SEGMENT
        ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA
       MOV DS,AX
       CLI

       MOV DX,PCI_INTCSR
       SUB DX,19H
       IN  AL,DX 
       MOV DX,PCI_INTCSR          ;初始化PCI卡中断控制寄存器
       MOV AX,1F00H               ;向PCI_INTCSR中写入003F1F00H
       OUT DX,AX
       ADD DX,2
       MOV AX,003FH
       OUT DX,AX

       MOV AX,0000H               ;替换INTR的中断矢量
       MOV ES,AX
       MOV DI,INTR_IVADD          
       MOV AX,ES:[DI]
       MOV IP_BAK,AX              ;保存INTR原中断处理程序入口偏移地址
       MOV AX,OFFSET MYISR
       MOV ES:[DI],AX             ;设置当前中断处理程序入口偏移地址

       ADD DI,2
       MOV AX,ES:[DI]
       MOV CS_BAK,AX              ;保存INTR原中断处理程序入口段地址
       MOV AX,SEG MYISR
       MOV ES:[DI],AX             ;设置当前中断处理程序入口段地址

       MOV DX,INTR_OCW1           ;设置中断屏蔽寄存器,打开INTR的屏蔽位
       IN  AL,DX
       MOV IM_BAK,AL              ;保存INTR原中断屏蔽字
       AND AL,INTR_IM
       OUT DX,AL

       
        
       MOV DX,MY8254_MODE         ;初始化8254工作方式
       MOV AL,36H                 ;计数器0,方式3
       OUT DX,AL
                
       MOV DX,MY8254_COUNT0       ;装入计数初值
       MOV AX,2E9CH               ;2E9C=0010 1110 1001 1100B=11932D=1.19318M/100 
       OUT DX,AL
       MOV AL,AH
       OUT DX,AL
  
       MOV DX,MY8255_MODE         ;初始化实验系统中的8255           
       MOV AL,80H                 ;定义8255工作方式 
       OUT DX,AL                  ;工作方式0,A口,B口输出,C口任意 

       MOV DI,5555H               ;用于标识开始/暂停键的状态 

       STI

       
       ;CALL SCREENSHOW
       ;MOV AX,0E0DH               ;回车,置光标到行首
       ;INT 10H      

WAIT1: 
       CALL SHOW
       MOV AH,08H                   ;判断是否有按键按下
       INT 21H
      ; JZ  WAIT1                  ;无按键则跳回继续等待,有则退出
       CMP AL,0DH
       JZ START_PAUSE
       CMP AL,'R'
       JZ  CLEAR
       CMP AL,'Q'
       JZ QUIT
       JMP WAIT1
        
START_PAUSE:
       ROR DI,1 
       JC OPEN
       MOV DX,MY8255_C
       MOV AL,00H
       OUT DX,AL;
       JMP WAIT1
OPEN:  MOV DX,MY8255_C
       MOV AL,03H
       OUT DX,AL;
       JMP WAIT1
CLEAR: 
       MOV DX,MY8255_C
       MOV AL,00H
       OUT DX,AL;
       MOV CSC,0                   ;厘秒计时变量清零
       ;MOV SEC,0                   ;秒计时变量清零
       ;MOV SECS,0                  ;秒十位清零
       ;MOV SECG,0                  ;秒个位清零
       ;MOV CSCS,0                  ;厘秒十位清零
       ;MOV CSCG,0                  ;厘秒个位清零
       CALL SHOW
       JMP WAIT1

       
QUIT:  CLI
       MOV DX,PCI_INTCSR          ;恢复PCI卡中断控制寄存器
       MOV AX,0000H
       OUT DX,AX

       MOV AX,0000H               ;恢复INTR原中断矢量
       MOV ES,AX
       MOV DI,INTR_IVADD  
       MOV AX,IP_BAK              ;恢复INTR原中断处理程序入口偏移地址
       MOV ES:[DI],AX
       ADD DI,2
       MOV AX,CS_BAK              ;恢复INTR原中断处理程序入口段地址
       MOV ES:[DI],AX

       MOV DX,INTR_OCW1           ;恢复INTR原中断屏蔽寄存器的屏蔽字
       MOV AL,IM_BAK
       OUT DX,AL
       STI

       MOV AX,4C00H               ;返回到DOS
       INT 21H
 




MYISR  PROC NEAR                   ;中断处理程序MYISR
             
      INC CSC
      CMP CSC,6000
      JNE OVER
      MOV CSC,0
      JMP OVER
           
OVER:  CALL SHOW
       MOV DX,PCI_INTCSR
       SUB DX,19H
       IN  AL,DX 
       MOV DX,PCI_INTCSR          ;清PCI卡中断控制寄存器标志位
       ADD DX,2
       MOV AX,003FH
       OUT DX,AX
       
       MOV DX,INTR_OCW2           ;向PC机内部8259发送中断结束命令
       MOV AL,20H
       OUT DX,AL
       MOV AL,20H
       OUT 20H,AL
       IRET

MYISR ENDP
 

       
SHOW PROC NEAR
       PUSH AX
       PUSH BX 
       PUSH DX
       
       MOV AX,CSC 
       MOV DX,0
       MOV BX,1000
       DIV BX
       MOV SI,AX
       OR  AL,30H
       PUSH DX
       MOV DL,AL
       MOV AH,02H
       INT 21H

       MOV DX,MY8255_A
       MOV AL,0FEH
       OUT DX,AL
       MOV DX,MY8255_B
       MOV AL,TIME1[SI];
       OUT DX,AL
       CALL DALLY
       POP DX

       MOV AX,CSC 
       MOV DX,0
       MOV BX,100
       DIV BX
       MOV SI,AX
       OR  AL,30H
       PUSH DX
       MOV DL,AL
       MOV AH,02H
       INT 21H

       MOV DX,MY8255_A
       MOV AL,0FDH
       OUT DX,AL
       MOV DX,MY8255_B
       MOV AL,TIME2[SI];
       OUT DX,AL
       CALL DALLY
       POP DX

       MOV AX,CSC 
       MOV DX,0
       MOV BX,10
       DIV BX
       MOV SI,AX
       OR  AL,30H
       PUSH DX
       MOV DL,AL
       MOV AH,02H
       INT 21H

       MOV DX,MY8255_A
       MOV AL,0FBH
       OUT DX,AL
       MOV DX,MY8255_B
       MOV AL,TIME1[SI];
       OUT DX,AL
       CALL DALLY
       POP DX

       MOV AX,DX
       MOV SI,AX
       OR AL,30H
       MOV DL,AL
       MOV AH,02H
       INT 21H
       MOV DL,0DH
       MOV AH,02H
       INT 21H
       MOV DX,MY8255_A
       MOV AL,0FBH
       OUT DX,AL
       MOV DX,MY8255_B
       MOV AL,TIME1[SI];
       OUT DX,AL
       CALL DALLY
       POP DX
      POP BX
      POP AX
     
      
  
      RET
SHOW ENDP

DALLY 	PROC NEAR                    ;软件延时子程序
        PUSH CX
        MOV CX,0FFH
D1:     MOV AX,0FFH
D2:     DEC AX
	JNZ D2
	LOOP D1
	POP CX
	RET
DALLY 	ENDP      

CODE ENDS
     END START

       


                                                                                                                                                                                                                                                                                                                                                                                                                     

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -