|
大二第二學(xué)期的微機(jī)原理實(shí)驗(yàn)課的期末考核項(xiàng)目之一是做一個(gè)以Intel 8086為主控、實(shí)現(xiàn)走時(shí)和時(shí)間(時(shí)、分、秒)調(diào)節(jié)的電子時(shí)鐘仿真。在前幾天就折騰好了,今天來做個(gè)記錄|・ω・`)。
方案設(shè)計(jì)
在我的方案中,使用8253的計(jì)數(shù)通道0作為計(jì)時(shí)部分,每隔0.8秒,8253發(fā)出中斷請(qǐng)求信號(hào),中斷服務(wù)程序執(zhí)行秒的自增,由于CPU(時(shí)鐘頻率設(shè)定為1MHz)的指令執(zhí)行時(shí)間不可忽略,因此實(shí)際顯示效果中秒的自增約為每秒一次,從而實(shí)現(xiàn)24小時(shí)制的走時(shí)。
顯示部分則使用3個(gè)兩位共陰數(shù)碼管來分別顯示時(shí)、分、秒,3個(gè)數(shù)碼管的段碼控制端均接在8255的PA端,片選端則通過74LS138接入8255;當(dāng)CPU輸出一個(gè)數(shù)碼管段碼時(shí),所有(6位)數(shù)碼管均收到該段碼,但只有被片選選中的數(shù)碼管才會(huì)顯示該段碼對(duì)應(yīng)的數(shù)值,CPU每隔一段時(shí)間輸出一個(gè)段碼,只要間隔時(shí)間足夠短,由于視覺暫留現(xiàn)象,就可以看到6位數(shù)碼管同時(shí)顯示。
控制部分由走時(shí)/暫停開關(guān)、'時(shí)'設(shè)置按鍵、'分'設(shè)置按鍵、'秒'設(shè)置按鍵組成,分別接入8255的PC0、PC1、PC2、PC3。
方案源碼
;8255的端口地址
AD8255PA EQU 08H
AD8255PB EQU 0AH
AD8255PC EQU 0CH
AD8255CON EQU 0EH
;8253的端口地址
AD82530 EQU 10H
AD8253CON EQU 16H
STACK SEGMENT STACK
DB 200 DUP(0)
STACK ENDS
DATA SEGMENT
LEDS DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H ;數(shù)碼管段碼
HOUR DB 0
MINUTE DB 0
SECOND DB 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
PUSH DS
MOV AX,DATA
MOV DS,AX
;設(shè)置中斷向量,8253非屏蔽中斷初始化
CLI
MOV AX,0
MOV ES,AX
MOV SI,08H
MOV AX,OFFSET TIME_INT
MOV ES:[SI],AX
MOV AX,CS
MOV ES:[SI+2],AX
;初始化8255,端口A和端口B輸出,端口C的低四位輸入
MOV AL,81H
OUT AD8255CON,AL
;初始化8253,每秒觸發(fā)一次中斷
MOV AL,36H
OUT AD8253CON,AL ;將方式控制字寫入控制端口
MOV AX,40000 ;計(jì)數(shù)初值40000,輸入頻率50k,定時(shí)時(shí)長0.8秒
OUT AD82530,AL ;將計(jì)數(shù)初值的低字節(jié)寫入計(jì)數(shù)通道0
MOV AL,AH
OUT AD82530,AL ;將計(jì)數(shù)初值的高字節(jié)寫入計(jì)數(shù)通道0
L:
CALL TIME_CHANGE ;更改時(shí)間
CALL DISPLAY_TIME ;顯示時(shí)間
JMP L
TIME_CHANGE:
PUSH AX
IN AL,AD8255PC ;讀取8255的PC端口數(shù)據(jù)
AND AL,0FH ;高四位清零
CMP AL,06H ;按下按鍵“秒”
JE ADD_SECOND
CMP AL,0AH ;按下按鍵“分”
JE ADD_MINUTE
CMP AL,0CH ;按下按鍵“時(shí)”
JE ADD_HOUR
JMP ADD_NULL
ADD_SECOND:
CALL INC_SECOND ;增加“秒”
CALL DELAY_KEY ;按鍵延時(shí)消抖
JMP ADD_NULL
ADD_MINUTE:
CALL INC_MINUTE ;增加“分”
CALL DELAY_KEY ;按鍵延時(shí)消抖
JMP ADD_NULL
ADD_HOUR:
CALL INC_HOUR ;增加“時(shí)”
CALL DELAY_KEY ;按鍵延時(shí)消抖
ADD_NULL:
POP AX
RET
INC_SECOND:
PUSH AX
INC SECOND
MOV AL,SECOND
CMP AL,60 ;判斷是否等于60
JNE END0
MOV AL,0
MOV SECOND,AL
CALL INC_MINUTE
END0:
POP AX
RET
INC_MINUTE:
PUSH AX
INC MINUTE
MOV AL,MINUTE
CMP AL,60 ;判斷是否等于60
JNE END1
MOV AL,0
MOV MINUTE,AL
CALL INC_HOUR
END1:
POP AX
RET
INC_HOUR:
PUSH AX
INC HOUR
MOV AL,HOUR
CMP AL,24 ;判斷是否等于24
JNE END2
MOV AL,0
MOV HOUR,AL
END2:
POP AX
RET
WRITE_LEDS: ;寫數(shù)碼管的某一位
MOV BP,SP
PUSH AX
PUSH DX
MOV AX,[BP+4]
OUT AD8255PB,AL
MOV BX,[BP+2]
LEA SI,LEDS
MOV AL,[BX+SI]
OUT AD8255PA,AL
POP DX
POP AX
RET 4
WRITE_TIME: ;寫“時(shí)”、“分”、“秒”
MOV BP,SP
PUSH AX
PUSH CX
PUSH DX
MOV AX,[BP+2]
MOV DL,10
DIV DL
MOV CL,AH
MOV DX,[BP+4]
PUSH DX
XOR AH,AH
PUSH AX
CALL WRITE_LEDS
CALL DELAY
INC DX
PUSH DX
XOR CH,CH
PUSH CX
CALL WRITE_LEDS
POP DX
POP CX
POP AX
RET 4
DISPLAY_TIME:
PUSH AX
;顯示“時(shí)”
MOV AX,0
PUSH AX
MOV AL,HOUR
XOR AH,AH
PUSH AX
CALL WRITE_TIME
CALL DELAY
;顯示“分”
MOV AX,2
PUSH AX
MOV AL,MINUTE
XOR AH,AH
PUSH AX
CALL WRITE_TIME
CALL DELAY
;顯示“秒”
MOV AX,4
PUSH AX
MOV AL,SECOND
XOR AH,AH
PUSH AX
CALL WRITE_TIME
CALL DELAY
POP AX
RET
DELAY:
PUSH BX
PUSH CX
MOV BX,2
DEL0:
MOV CX,100
DEL1:
DEC CX
CMP CX,0
JNE DEL1
DEC BX
CMP BX,0
JNE DEL0
POP CX
POP BX
RET
DELAY_KEY:
PUSH BX
PUSH CX
MOV BX,50
DEL_K0:
MOV CX,300
DEL_K1:
DEC CX
CMP CX,0
JNE DEL_K1
DEC BX
CMP BX,0
JNE DEL_K0
POP CX
POP BX
RET
TIME_INT: ;中斷處理函數(shù)
CALL INC_SECOND
IRET
CODE ENDS
END START
方案原理如下:
|
-
原理概況
-
CPU部分
-
定時(shí)器部分
-
8253激勵(lì)源
-
顯示&控制部分
評(píng)分
-
查看全部評(píng)分
|