ORG 0000H ;
LJMP MAIN ;轉主程序
ORG 0003H ;INT0中斷服務入口地址
LJMP L1 ;轉INT0高優先級中斷服務程序
ORG 0013H ;INT1中斷服務入口地址
LJMP L2 ;轉INT1高優先級中斷服務程序
ORG 0100H ;設置主程序起始地址
MAIN: SETB EA ;CPU開放中斷
SETB EX0 ;允許外部中斷0中斷
SETB EX1 ;允許外部中斷1中斷
SETB PX0 ;外部中斷0設置為高優先級
SETB IT0 ;設置外部中斷0為跳沿觸發方式
SETB IT1 ;設置外部中斷1為跳沿觸發方式
MOV SP,#70H ;設置堆棧為70H
MOV A,#0FFH ;將0FFH賦值給累加器
FR: MOV P1,A ;將累加器的值給P1
ACALL DELAY1S ;調用1秒延時子程序
CPL A ;對累加器值取反
SJMP FR ;循環
L1: PUSH ACC ;將累加器的值暫時存于堆棧
MOV A,#80H ;將80H賦值給A
MOV P1,A ;將累加器的值給P1
ACALL DELAY1S ;調用1秒延時子程序
LOOP1:RR A ;累加器循環右移
MOV P1,A ;將累加器的值給P1
ACALL DELAY1S ;調用1秒延時子程序
JB P1.0,N2 ;P1.0判斷為1則跳轉N2
AJMP LOOP1 ;循環
L2: PUSH ACC ;將累加器的值暫時存于堆棧
MOV A,#7FH ;將7FH賦值給A
MOV P1,A ;將累加器的值給P1
ACALL DELAY1S ;調用1秒延時子程序
LOOP2:RR A ;累加器循環右移
MOV P1,A ;將累加器的值給P1
ACALL DELAY1S ;調用1秒延時子程序
JNB P1.0,N2 ;P1.0判斷不為1則跳轉N2
AJMP LOOP2 ;循環
N2:POP ACC ;從堆棧取出累加器的值
RETI ;中斷返回
DELAY1S:MOV R5,#10 ;1秒延時子程序
DELAY0 :MOV R6,#200
DELAY1 :MOV R7,#123
DELAY2:DJNZ R7,DELAY2
DJNZ R6,DELAY1
DJNZ R5,DELAY0
RET
END
以上程序全文,想知道最后的一秒延時子程序是怎么實現的,那個延時一秒的計算是怎么算出來的
|