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

📄 hld.asm

📁 接口课程设计
💻 ASM
字号:
DATA	SEGMENT
		LEDTAL  DB  3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,0H
		var    DB   3,0,10,10
DATA    ENDS
STACK	SEGMENT
		DW	128  DUP(?)
STACK	ENDS
CODE	SEGMENT
	ASSUME CS:CODE, SS:STACK,DS:DATA
	START: 
	        ;初始化
	        ;----------------------------------------------------------      
	      	CLI
	      	;填中断向量表——计时中断              	      
	      	XOR   	AX,AX
	      	MOV   	DS,AX
	      	MOV   	AX,OFFSET SEV
	      	ADD   	AX,2000H
	      	MOV   	SI,003CH
	      	MOV   	[SI],AX
	      	MOV   	AX,00H
	      	MOV   	[SI+2],AX
	     	      	
	      		
	      
	      	;初始化8259 
	      	IN    	AL,21H			;不屏蔽IR7中断请求
	      	AND   	AL,7fH
	      	OUT   	21H,AL
	     
	      
	     	;初始化8255A
             	;A口输出段码,B口输出位码             
  	      	MOV   	AL,80H
	      	OUT   	63H,AL
	      
	      	;初始化8253A
              	;计数器2,方式3,每50毫秒一次中断
	      	MOV   	AL,0B6H                             
	      	OUT   	43H,AL
	      	MOV   	AX,59500
	      	OUT   	42H,AL
	      	MOV   	AL,AH
	      	OUT   	42H,AL
	      	;----------------------------------------------------------      
	      	
	      	
	      
	      	;主程序
              	;----------------------------------------------------------      	      
      	      	MOV   	AX,DATA
      	      	MOV   	DS,AX  
      	      	STI 
      	      	mov	CH,0
      	      	MOV	CL,20     	;中断20次更改一次时间      	      	
      	      	MOV	AL,11000011B
     		OUT	61H,AL
      	      	;循环显示时间    	      
      	      	    	
	LOP:  	CALL  	DISPLAY		;显示4位七段数码(子程序)
      	      	CMP   	Cl,0	
      	      	JNZ   	LOP    
      	      	MOV   	Cl,20      	          
      	      	CALL  	UPDATE		;一秒到达,修改分、秒(子程序)
      	      	
      	      	CMP	CH,0
      	      	JNZ	T1
      	      	MOV	AL,VAR
      	      	CMP	AL,0
      	      	JNZ	LOP
      	      	MOV	AL,VAR+1
      	      	CMP	AL,0
      	      	JNZ	LOP
      	      	JMP	REACH
      	T1:	MOV	AL,VAR+2
      	      	CMP	AL,0
      	      	JNZ	LOP
      	      	MOV	AL,VAR+3
      	      	CMP	AL,0
      	      	JNZ	LOP
      	REACH :	
     		CMP	CH,0
     		JNZ	N1
     		MOV	CH,1
     		;------------------
     		MOV	AL,3
     		MOV	VAR+2,AL
     		MOV	AL,0
     		MOV	VAR+3,AL
     		MOV	AL,10
     		MOV	VAR,AL     		
     		MOV	VAR+1,AL
     		;------------------
     		MOV	AL,00111100B
     		OUT	61H,AL
     		JMP   	LOP 
     	N1:	MOV	CH,0
     		;------------------
     		MOV	AL,3
     		MOV	VAR,AL
     		MOV	AL,0
     		MOV	VAR+1,AL
     		MOV	AL,10
     		MOV	VAR+2,AL     		
     		MOV	VAR+3,AL
     		;------------------
     		MOV	AL,11000011B
     		OUT	61H,AL
     		JMP   	LOP      	       
      	      	;----------------------------------------------------------  		
	
      	     
      	     
      	     
      	     	;中断服务子程序
  	     	;----------------------------------------------------------	
  	     	;功能:每50毫秒中断一次 , CX为传递参数
  	     	;20次中断后,CX为0,即一秒时间到达,主程序修改一次时间
       	SEV: 	CLI
                PUSH   	AX    	      	
     	      	DEC   	Cl
	      	mov 	al,20h
	        out 	20h,al
	        POP 	AX
	        STI
		IRET
	     	;----------------------------------------------------------


	     	;----------------------------------------------------------

;时间更新子程序

UPDATE        	PROC   	NEAR
		CLI
              	PUSH   	AX
              	push   	DI
              	CMP	CH,0
              	JNZ	U1
              	MOV	DI,OFFSET VAR
              	JMP	U2
          U1:	MOV	DI,OFFSET VAR+2
          U2:	MOV	AL,[DI+1]
          	CMP	AL,0
          	JZ	UP1
          	DEC	AL
          	MOV	[DI+1],AL
          	JMP	TEND
          UP1:	MOV	AL,9
          	MOV	[DI+1],AL
          	MOV	AL,[DI]
          	CMP	AL,0
          	JZ	UP2
          	DEC	AL
          	MOV	[DI],AL
          	JMP	TEND
          UP2:	MOV	AL,3
          	MOV	[DI],AL
	TEND: 	pop    	DI
              	pop    	AX
              	STI            
              	RET
UPDATE 		ENDP

	     	;---------------------------------------------------------- 
	     
	     
	     
	     
		;在led上显示时间的子程序
	     	;----------------------------------------------------------
DISPLAY  	PROC   	NEAR		
	      	PUSH   	AX
	      	PUSH   	BX
	      	PUSH   	DX
	      	PUSH	DI	      
	      
		MOV    	DI, OFFSET  var
	      	;显示部分
		MOV    	DL,0FEH			;初始化位码,先点亮最左边显示器
	ST1:  	MOV    	AL,DL
	      	TEST   	AL,10H			;最右边显示器亮?	
	      	JZ     	ED			;是,时间显示结束
	      	OUT    	62H,AL			;位码送B口
	      	ROL    	AL,01H			;改变位码
	      	MOV    	DL,AL		
	      	MOV    	AL,[DI]			;取要显示的字符
	      	MOV    	BX,OFFSET  LEDTAL	;七段码的首址送BX
	      	XLAT				;把显示字符转换成相应的7段码		           
	      	OUT    	60H,al			;显示字符的7段码送端口A
	      	CALL   	DELAY    		;调用延时子程序
	      	INC    	DI			;地址指针调整
	      	JMP    	ST1
	ED:	POP	DI
		POP    	DX
	      	POP    	BX
	      	POP    	AX	      	
	      	RET
DISPLAY      	ENDP
		;----------------------------------------------------------  

	     
	     
	     
           	;延时服务子程序
           	;---------------------------------------------------------- 
DELAY  	PROC 	NEAR
	    	PUSH   	BX
	    	PUSH   	AX
	    	MOV    	AX,10
	A1: 	MOV    	BX,20
	A2: 	DEC	BX
		JNZ	A2
	    	DEC    	AX
	    	JNZ    	A1
	    	POP    	AX
	    	POP    	BX
	    	RET	    	
DELAY  	ENDP
		;---------------------------------------------------------- 


CODE	  ENDS
	  END     START    

⌨️ 快捷键说明

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