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

📄 pcclkled.asm

📁 汇编程序
💻 ASM
字号:
;FILENAME: PCCLKLED.ASM   
;内容: LED时间显示
INTA00  	EQU 20H
INTA01  	EQU 21H
PORTSEG 	EQU 211H
PORTBIT	EQU 210H
TIMER0  EQU 200H  
TIMER1  EQU 201H
TIMECT 	EQU 203H
MOD03  	EQU 37H
MOD13  	EQU 77H
STACK 	SEGMENT STACK 'STACK'
    	DW 50 DUP(?)
STACK 	ENDS
DATA  	SEGMENT
MIN1    DB 0
MIN2    DB 0
GAP1 	DB 10
GAP2    DB 10
SEC1    DB 0
SEC2    DB 0
INTMASK DB ?
CSREG  DW ?
IPREG  DW ?
COUNT  DB 0
LED  	DB 3FH,06,5BH,4FH, 66H, 6DH,7DH,07,7FH, 6FH,40H
MES  	DB 'DISPLAY THE LEDS,PRESS ANY KEY TO DOS!'
      	DB 0AH, 0DH,' $'
DATA   	ENDS
CODE  	SEGMENT
       	ASSUME CS:CODE, DS: DATA, SS:STACK
START:	MOV AX,DATA
       	MOV DS, AX
       	CLI
      	MOV AL,MOD03       		;8253初始化
       	MOV DX, TIMECT
       	OUT DX, AL            		;TIMER0, MODE 3, BCD
       	MOV AL ,MOD13
       	OUT DX, AL             		;TIMER1, MODE 3, BCD
       	MOV AL,00H         		;初值均为400
       	MOV DX,TIMER0
       	OUT DX, AL
       	INC DX
      	OUT DX, AL
       	MOV AL, 04H
       	OUT DX, AL
       	DEC DX
       	OUT DX, AL
       	MOV AX,350AH       		;读取0AH中断矢量送ES:BX 
       	INT 21H
       	MOV AX, ES
       	MOV CSREG, AX       		;保存
       	MOV IPREG, BX
       	PUSH BX
       	PUSH DS
       	MOV AX, CS
       	MOV DS, AX
       	MOV DX,OFFSET INT_PROC
       	MOV AX, 250AH       		;写0AH新的中断矢量
       	INT 21H
       	POP DS
       	MOV DX ,INTA01
       	IN AL , DX             		;读IMR
       	MOV INTMASK, AL     		;保存IMR
       	AND AL, 0FBH         		;开放IRQ2
      	OUT DX ,AL
       	LEA DX, MES
       	MOV AH, 09
       	INT 21H
 AGAIN:MOV DX,INTA01
       	IN AL, DX
       	OR AL, 04H
       	OUT DX,AL          		;屏蔽IRQ2
       	STI
       	PUSH DX
       	MOV DL, 0FFH
       	MOV AH, 06
		INT 21H              	;读键盘缓冲区,判断有无键按下	
       	POP DX
       	PUSHF                		;保护ZF
       	IN AL ,DX 
       	AND AL,0FBH         		;开放IRQ2
       	OUT DX, AL
       	POPF                    	;恢复ZF
	JZ AGAIN           		;ZF = 1 (无键按下)转AGAIN,等待中断
        CLI                 		;有键按下,准备返回
       	POP BX
       	MOV DX ,INTA01
       	MOV AL ,INTMASK
       	OUT DX,AL           		;恢复IMR
       	MOV DX, IPREG
       	MOV AX, CSREG
       	MOV DS, AX
       	MOV AX, 250AH
       	INT 21H             		;恢复原中断矢量
       	STI                  		;开中断
       	MOV AX, 4C00H 			;返回DOS
       	INT 21H
INT_PROC:
       	PUSH AX           		;中断服务程序
       	PUSH CX
       	PUSH DX
       	PUSH DI
       	MOV AL,00           		;LED全灭
      	MOV DX ,PORTBIT
       	OUT DX, AL
       	MOV DI,OFFSET MIN1  		;DI指向显示缓冲区_
     	MOV CL,01          		;CL位码,指向第一位
DIS1: 	MOV AL, [DI]
       	MOV BX,OFFSET LED  		;BX指向七段码表
      	XLAT               		;AL得七段码
     	MOV DX, PORTSEG
      	OUT DX,AL           		;送段码
      	MOV AL,CL
       	MOV DX, PORTBIT       		;送位码
      	OUT DX, AL
       	PUSH CX
       	MOV CX, 0B00H
DELAY:	LOOP DELAY              	;延时
       	CMP CL,20H          		;是第六位吗?
       	JZ CHG              		;是转CHG
       	INC DI              		;不是,DI指向下一位
       	SHL CL, 1
       	JMP DIS1
CHG:  	INC COUNT
       	CMP COUNT,50        		;到1秒?
       	JL QUIT             		;没到,退出
      	MOV COUNT,0        		;到,COUNT置0
       	INC SEC2            		;秒个位加1
       	CMP SEC2,10
       	JL QUIT            		;秒个位<10转QUIT
     	MOV SEC2,0
       	INC SEC1
       	CMP SEC1,6            		;60秒?
       	JL QUIT
      	MOV SEC1,0          		;是,秒清0
      	INC MIN2             		;分加l
       	CMP MIN2,10
       	JL QUIT
      	MOV MIN2,0
      	INC MIN1
      	CMP MIN1 ,6           		;60分?
      	JL QUIT
      	MOV MIN1 ,0         		;是,分清0
QUIT: 	MOV DX,PORTBIT       		;LED全灭
       	MOV AL, 00
       	OUT DX, AL
       	MOV DX,INTA00      		;发EOI命令
       	MOV AL, 20H
       	OUT DX, AL
       	POP DI              		;恢复寄存器
       	POP DX
       	POP CX
       	POP AX
       	IRET                    	;返回
CODE  ENDS
       	END START

⌨️ 快捷键说明

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