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

📄 计时时钟.asm

📁 计时时钟源代码
💻 ASM
字号:
.MODEL	TINY	
PCIBAR3		EQU	1CH	;8位I/O空间基地址(它就是实验仪的基地址, 也为DMA & 32 BIT RAM板卡上的8237提供基地址) 
Vendor_ID	EQU 	10EBH	;厂商ID号
Device_ID	EQU	8376	;设备ID号

		.STACK	100

		.DATA	
IO_Bit8_BaseAddress	DW	?
msg0		DB		'BIOS不支持访问PCI      $'
msg1		DB		'找不到Star PCI9052板卡 $'
msg2		DB		'读8位I/O空间基地址时出错$'
COM_ADD	DW	00F3H			;控制口偏移量
PA_ADD		DW	00F0H		;PA口偏移量
PB_ADD		DW	00F1H		;PB口偏移量
PC_ADD		DW	00F2H		;PC口偏移量

		.CODE		
	START:	MOV	AX,@DATA	
		MOV	DS,AX	
		NOP
		CALL	InitPCI	
		CALL	ModifyAddress	;根据PCI提供的基地址,将偏移地址转化为实地址
		
		MOV BX,OFFSET TAB	;LED数码管的换码的偏移地址
     		MOV DX,COM_ADD                 ;8255初始化
      		MOV AX,90H
      		OUT DX,AX           	;A口输入,B口输出,C口低位输出,且都工作于方式0
	A1:   	MOV CX,0199H        	;送一秒时间常数
	A2:  	MOV SI,OFFSET SECOND	;读入秒变量的偏移地址		
      		PUSH CX			;保存时间常数
		MOV CX,0002H		;分秒切换
      		MOV AH,0FEH		;位选码11111110
	D2: 	MOV AL,[SI]		;把时间常数放入AL中
      		AND AL,0FH		;取分/秒个位
      		XLAT			;换码
      		MOV DX,PB_ADD
      		OUT DX,AL		;送段选码
      		MOV AL,AH
     		MOV DX,PC_ADD
      		OUT DX,AL		;送位选码,显示低位
      		ROl AH,1
      		PUSH CX
      		MOV CX,0FFFH		;低位暂留时间
	DELAY:	NOP
         	NOP
      		LOOP DELAY		;延时子程序
      		MOV AL,0FFH		;位选码为11111111
      		OUT DX,AL     		;禁止显示
      		MOV CL,04H
      		MOV AL,[SI]
      		SHR AL,CL		;为了显示分/秒十位
      		XLAT			;换码:BX与AL相加,取出该地址中的内容送入AL中
      		MOV DX,PB_ADD
      		OUT DX,AL
      		MOV AL,AH
      		MOV DX,PC_ADD
      		OUT DX,AL		;显示高位
      		MOV CX,0FFFH		;高位暂留时间
	DELAY1:	NOP
     		NOP
     		LOOP DELAY1		;延时2毫秒
      		MOV AL,0FFH
     		MOV DX,PC_ADD
      		OUT DX,AL    		;禁止显示
      		POP CX
      		ROl AH,1
      		INC SI			;分秒替换
      		LOOP D2			;秒位和分位循环显示
      		POP CX
      		DEC CX
      		JNZ REM2
	MOD1:		
	        MOV SI,OFFSET SECOND  	;计时
      		MOV AL,[SI]
      		ADD AL,01H        	;秒位加1
      		DAA			;压缩BCD码调整指令
      		MOV [SI],AL
      		CMP AL,60H
      		JNZ REM
      		MOV AL,00H        	;秒位置00,分位加1
     		MOV [SI],AL
      		MOV AL,[SI+1]
      		ADD AL,01H
      		DAA
      		MOV [SI+1],AL
      		CMP AL,60H
      		JNZ REM
      		MOV AL,00H
      		MOV [SI+1],AL      	;重新计时
  	REM:	JMP A1
  	REM2:	JMP A2
     		JMP START
    		TAB DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H ;段码转换表
     		SECOND DB 00H   	;初始时间表
     		MINUTE DB 00H
  ;;;;;
	InitPCI	PROC	NEAR	
		MOV	AH,00H	
		MOV	AL,03H	
		INT	10H		;清屏
		MOV	AH,0B1H	
		MOV	AL,01H	
		INT	1AH	
		CMP	AH,0	
		JZ	InitPCI2	
		LEA	DX,msg0	
InitPCI1:	MOV	AH,09H	
		INT	21H	
		JMP	Exit	
InitPCI2:	MOV	AH,0B1H	
		MOV	AL,02H	
		MOV	CX,Device_ID	
		MOV	DX,Vendor_ID
		MOV	SI,0	
		INT	1AH	
		JNC	InitPCI3	;是否存在Star PCI9052板卡
		LEA	DX,msg1	
		JMP	InitPCI1	
InitPCI3:	MOV	DI,PCIBAR3	
		MOV	AH,0B1H	
		MOV	AL,09H	
		INT	1AH		;读取该卡PCI9052基地址
		JNC	InitPCI4	
		LEA	DX,msg2	
		JMP	InitPCI1	
InitPCI4:	AND	CX,0FFFCH	
		MOV	IO_Bit8_BaseAddress,CX
		RET		
InitPCI		ENDP

ModifyAddress	PROC	NEAR	
		ADD	COM_ADD,CX	
		ADD	PA_ADD,CX	
		ADD	PB_ADD,CX	
		ADD	PC_ADD,CX	
		RET		
ModifyAddress	ENDP
Exit:		MOV	AH,4CH	
		INT	21H
		END	START		




⌨️ 快捷键说明

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