1、?數碼管顯示演示程序:?在8個LED數碼管上依次顯示1,2,3,4,5,6,7,8。引用端口:數碼管數據p0,數碼管控制p2;
DIS_DIGIT?EQU40H;位選通值,?傳送到P2口用於選通當前數碼管的數值,
;?如等於0xfe時,?選通P2.0口數碼管
DIS_INDEX?DATA41H
;顯示索引,?用於標識當前顯示的數碼管和緩沖區的偏移量
DIS_BUF?DATA50H
;顯於緩沖區起始地址
ORG?0000H
AJMPMAIN
ORG000BH
AJMP?INTT0
ORG0100H
MAIN:MOV?P0,#0FFH;?初始化I/O口
MOV?P2,#0FFH
MOVTMOD,?#02H;定時器0在模式2下工作?
MOVTL0,?#38H;?每200μs產生壹次溢出
MOVTH0,?#38H;自動重裝初值
SETBET0?;使能定時器0中斷
SETB?TR0;啟動定時
SETB?EA?;使能總中斷
MOVDPTR,?#DIS_CODE;?設定顯示初值為1-8
MOVA,#1;初值為1,以後順序加1
MOVC?A,@A+DPTR
MOV?DIS_BUF,A
MOVA,#2
MOVCA,@A+DPTR
MOV?DIS_BUF+01H,A
MOVA,#3
MOVCA,@A+DPTR
MOV?DIS_BUF+02H,A
MOVA,#4
MOVCA,@A+DPTR
MOV?DIS_BUF+03H,A
MOVA,#5
MOVCA,@A+DPTR
MOV?DIS_BUF+04H,A
MOVA,#6
MOVCA,@A+DPTR
MOV?DIS_BUF+05H,A
MOVA,#7
MOVCA,@A+DPTR
MOV?DIS_BUF+06H,A
MOVA,#8
MOVCA,@A+DPTR
MOV?DIS_BUF+07H,A
DISPLAY:MOV?DIS_DIGIT,#0FEH;?初始從第壹個數碼管開始掃描
MOV?DIS_INDEX,#0
SETB?TR0;?啟動定時器0,開始動態掃描顯示
MAIN_LP:NOP
;?主程序循環,可增加其它代碼以改變50H-57H中的值以改變顯示內容
SJMP?MAIN_LP
;=====================================================
INTT0:
;?定時器0中斷服程序,?用於數碼管的動態掃描
PUSH?ACC
PUSH?PSW
MOV?P2,#0FFH;?先關閉所有數碼管
MOV?A,#DIS_BUF;?獲得顯示緩沖區基地址
ADD?A,DIS_INDEX;?獲得偏移量
MOV?R0,A;?R0?=?基地址?+?偏移量
MOV?A,@R0;?獲得顯示代碼
MOV?P0,A;?顯示代碼傳送到P0口
MOV?P2,DIS_DIGIT;?
MOVA,DIS_DIGIT
;?位選通值左移,?下次中斷時選通下壹位數碼管
RLA
MOVDIS_DIGIT,A
INCDIS_INDEX
;?DIS_INDEX加1,?下次中斷時顯示下壹位
ANLDIS_INDEX,#0x07
;?當DIS_INDEX等於8(0000?1000B)時,?清0
POP?PSW
POP?ACC
RETI?
DIS_CODE:?DB?28h,7eh,0a2h,62h,74h,61h,21h,7ah
DB?20h,60h,30h,25h,0a9h,26h,0a1h,0b1h
;0-9和ABCDEF的數碼管顯示代碼
END