CODE_SEG SEGMENT CODE
DATA_SEG SEGMENT DATA
RSEG DATA_SEG
dis_digit: DS 1 dis_index: DS 1 dis_buf: DS 8 stack: DS 20
;=========================================================== CSEG AT 00000H ; Reset向量 LJMP MAIN
CSEG AT 0000BH ; 定時(shí)器0中斷向量
LJMP TIMER0
;=========================================================== RSEG CODE_SEG org 040h MAIN: MOV SP,#(stack-1) ; 初始化堆棧指針 MOV P0,#0FFH ; 初始化I/O口 MOV P2,#0FFH MOV TMOD,#01H ; 初始化timer0 MOV TH0,#0FCH MOV TL0,#017H MOV IE,#082H
MOV DPTR, #DIS_CODE ; 設(shè)定顯示初值 MOV A,#1 MOVC A,@A+DPTR MOV dis_buf,A MOV A,#2 MOVC A,@A+DPTR MOV dis_buf+01H,A MOV A,#3 MOVC A,@A+DPTR MOV dis_buf+02H,A MOV A,#4 MOVC A,@A+DPTR MOV dis_buf+03H,A MOV A,#5 MOVC A,@A+DPTR MOV dis_buf+04H,A MOV A,#6 MOVC A,@A+DPTR MOV dis_buf+05H,A MOV A,#7 MOVC A,@A+DPTR MOV dis_buf+06H,A MOV A,#8 MOVC A,@A+DPTR MOV dis_buf+07H,A
MOV dis_digit,#0FEH ; 初始從第一個(gè)數(shù)碼管開(kāi)始掃描 MOV dis_index,A
SETB TR0 ; 啟動(dòng)定時(shí)器0,開(kāi)始動(dòng)態(tài)掃描顯示
MAIN_LP:
; 主程序循環(huán),增加其它代碼
SJMP MAIN_LP
; END OF main ;=========================================================== USING 0 TIMER0: ; 定時(shí)器0中斷服程序, 用于數(shù)碼管的動(dòng)態(tài)掃描 ; DIS_INDEX --- 顯示索引, 用于標(biāo)識(shí)當(dāng)前顯示的數(shù)碼管和緩沖區(qū)的偏移量 ; DIS_DIGIT --- 位選通值, 傳送到P2口用于選通當(dāng)前數(shù)碼管的數(shù)值, 如等于0xfe時(shí), ; 選通P2.0口數(shù)碼管 ; DIS_BUF --- 顯于緩沖區(qū)基地址
PUSH ACC PUSH PSW PUSH AR0
MOV TH0,#0FCH MOV TL0,#017H
MOV P2,#0FFH ; 先關(guān)閉所有數(shù)碼管
MOV A,#DIS_BUF ; 獲得顯示緩沖區(qū)基地址 ADD A,DIS_INDEX ; 獲得偏移量 MOV R0,A ; R0 = 基地址 + 偏移量 MOV A,@R0 ; 獲得顯示代碼 MOV P0,A ; 顯示代碼傳送到P0口
MOV P2,DIS_DIGIT ; MOV A,DIS_DIGIT ; 位選通值左移, 下次中斷時(shí)選通下一位數(shù)碼管 RL A MOV DIS_DIGIT,A
INC DIS_INDEX ; DIS_INDEX加1, 下次中斷時(shí)顯示下一位 ANL DIS_INDEX,#0x07 ; 當(dāng)DIS_INDEX等于8(0000 1000)時(shí), 清0
POP AR0 POP PSW POP ACC
RETI ; END OF timer0 ;===========================================================
RSEG CODE_SEG DIS_CODE: DB 0C0H DB 0F9H DB 0A4H DB 0B0H DB 099H DB 092H DB 082H DB 0F8H DB 080H DB 090H DB 0FFH
END
|
|