📄 计时时钟.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 + -