|
;定義一個(gè)輸出專用的宏,PORT表示端口地址,DATA表示要輸出的數(shù)據(jù)(8位)
OUT_PORT MACRO PORT,DATA
MOV DX, PORT
MOV AL, DATA
OUT DX, AL
ENDM
;====================================================================
;中斷向量設(shè)置,X為中斷向量,Y為中斷子程序名
SET_INT MACRO X,Y
PUSH DS
MOV AX,0
MOV DS,AX
MOV DI,X*4
MOV AX,OFFSET Y
MOV [DI],AX
MOV AX,SEG Y
MOV [DI+2],AX
POP DS
ENDM
; INI_A為偶數(shù)口地址,ICW1,ICW2,ICW4為對(duì)于要寫(xiě)入的命令,適合與單片8259初始化
INIT_8259 MACRO INI_A,ICW1,ICW2,ICW4
OUT_PORT INI_A,ICW1
OUT_PORT INI_A+2,ICW2
OUT_PORT INI_A+2,ICW4
ENDM
;====================================================================
;8253初始化,INT8253C為命令口地址,X為命令內(nèi)容,A8253為計(jì)數(shù)器N的端口,Y為計(jì)數(shù)初值
INIT_8253 MACRO INT8253C,X,A8253,Y
OUT_PORT INT8253C,X ;命令口
MOV AX,Y
MOV DX,A8253
OUT DX,AL
MOV AL,AH
OUT DX,AL
ENDM
;====================================================================
;X用于表示當(dāng)前計(jì)數(shù)單元,NUM用于當(dāng)前計(jì)時(shí)最大值(60,24),Y表示下一計(jì)數(shù)單元,Z為轉(zhuǎn)換的LED編碼存儲(chǔ)單元
INT_PRO MACRO X,NUM,Y,Z
LOCAL AA
XOR BX,BX
MOV AX,BX ;
MOV AL,X
CMP AL,NUM ;比較秒計(jì)數(shù)是否到60
JNE AA ;不是,則轉(zhuǎn)AA
INC Y ;是,則分鐘加一
MOV AL,0 ;令秒=0
MOV X,AL
AA:
MOV BL,10
DIV BL
MOV BL,AL
MOV AL,LED[BX] ;轉(zhuǎn)換秒的高位
MOV Z,AL
MOV BL,AH
MOV AL,LED[BX] ;轉(zhuǎn)換秒的低位
MOV Z+1,AL
ENDM
;====================================================================
DATA SEGMENT
;4-16譯碼器輸出對(duì)應(yīng)端口
IO1 EQU 10H
IO2 EQU 20H ;8259端口
IO3 EQU 30H ;8255 A口地址
IO4 EQU 40H ;8253 計(jì)數(shù)器0端口地址
IO5 EQU 50H
IO6 EQU 60H
IO7 EQU 70H
;....
IOA EQU 0A0H
TIMERS EQU 1000 ;計(jì)數(shù)初值
LED DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H ;0--F對(duì)應(yīng)編碼,共陰極
;LED1 DB 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,90h,90h,90h,90h,90h
PORTA EQU IO3 ;8255 A口地址
PORTB EQU IO3+2
PORTC EQU IO3+4
PORT_CON EQU IO3+6
T_HOUR DB 0 ;用于小時(shí)計(jì)數(shù)
T_MIN DB 0 ;用于分計(jì)數(shù)
T_SEC DB 0 ;用于秒計(jì)數(shù)
TEMP DB 0
HOUR DB 0,0,40H ;用于存放LED顯示編碼/小時(shí)
MINTU DB 0,0,40H
SEC DB 0,0
DATA ENDS
STACK SEGMENT PARA STACK 'STACK' ;堆棧段
DW 1024 DUP (?)
STACK ENDS
CODE SEGMENT PUBLIC 'CODE'
ASSUME CS:CODE,DS:DATA,SS:STACK
START:
MOV AX, DATA
MOV DS, AX ;數(shù)據(jù)段設(shè)置
MOV AX,STACK
MOV SS,AX ;堆棧段設(shè)置
CLI ;關(guān)中斷
;設(shè)置中斷向量
SET_INT 80H,INT_0 ;接IR0,若要接其他引腳,注意修改中斷向量
;初始化8259,按次序?qū)慖CW1,ICW2,ICW4
INIT_8259 IO2,13H,80H,03H ;ICW1,邊沿觸發(fā),單片,需要ICW4,ICW2=80H,ICW4,自動(dòng)結(jié)束
OUT_PORT IO3+6,80H ;8255初始化
INIT_8253 IO4+6,36H,IO4,TIMERS ;8253初始化,方式3,計(jì)數(shù)器0
INIT_8253 IO4+6,76H,IO4+2,TIMERS ;8253初始化,方式3,計(jì)數(shù)器1
OUT_PORT IO2+2,00H ;OCW1,全開(kāi)放
STI ;開(kāi)中斷
L:
CALL DISPLAY ;
JMP L
NOP
INT_0 PROC ;中斷服務(wù)程序
CLI
PUSH AX
INC T_SEC
INT_PRO T_SEC,60,T_MIN,SEC ;秒
INT_PRO T_MIN,60,T_HOUR,MINTU ;分
INT_PRO T_HOUR,24,TEMP,HOUR ;小時(shí)
POP AX
STI
IRET
INT_0 ENDP
DISPLAY PROC NEAR ;LED顯示
MOV CX,7F08H ;CH用于控制,CL用于循環(huán)
LEA DI,HOUR
DISP_L:
OUT_PORT PORTA,[DI]
OUT_PORT PORTB,CH ;CH決定第幾位顯示
CALL DELAY
OUT_PORT PORTB,0FFH
INC DI
ROR CH,1
DEC CL
JNZ DISP_L
RET
DISPLAY ENDP
DELAY PROC NEAR
PUSH CX
MOV CX,100 ;延時(shí),根據(jù)需要調(diào)整
LP2:
LOOP LP2
POP CX
RET
DELAY ENDP
CODE ENDS
END START
放大的地方報(bào)錯(cuò),是為什么哦?
|
|