十年專注單片機方案開發的方案公司英銳恩,分享定時器0的使用。英銳恩現提供服務產品涉及主控芯片:8位單片機、16位單片機、32位單片機及各類運算放大器等。
;========================================================== ;定時器實現流水燈 ;MCD-DEMO實驗版 ;========================================================== include
;======================================== ;變量定義 ;======================================== TMR0_TEMP EQU .0 ;軟件模擬使用230,編程為0,256*256=65536US=65.536MS W_TEMP EQU 7FH COUNT1 EQU 20H ;定時330MS記數變量 COUNT2 EQU 21H ;更長時間記數變量 STATUS_TEMP EQU 22H PORTC_TEMP EQU 23H FLAG EQU 24H ;330MS定時標志,時間到=1,未到=0 W EQU 0x00 F EQU 0x01 COUNT_TEMP EQU .4 ;軟件模擬使用2,編程為5,時間大約是330MS ;======================================== ; ;======================================== ORG 000H NOP GOTO MAIN ORG 004H GOTO TMR0SERC ;============================================= ;主程序開始 ;=============================================
MAIN call systeminit ;調用初始化 LOOP BTFSS FLAG,0 ;判斷定時是否到 GOTO LOOP1 RlF PORTC_TEMP,F ;循環左移 BCF FLAG,0 LOOP1 MOVF PORTC_TEMP,W MOVWF PORTC GOTO LOOP ;============================================= ;初始化各端口、變量及中斷特殊寄存器 ;============================================= systeminit BSF STATUS,RP0 ;選擇體1 MOVLW 0 MOVWF TRISC MOVLW 07H ;軟件模擬為08H,編程為07H,1:256 MOVWF OPTION_REG BCF STATUS,RP0 CLRF INTCON MOVLW 0A0H ;開總中斷和定時器0中斷 MOVWF INTCON MOVLW B'00000001' ;賦值 MOVWF PORTC_TEMP MOVLW COUNT_TEMP MOVWF COUNT1 BCF FLAG,0 ;清除標志 MOVLW TMR0_TEMP ;啟動定時器0 MOVWF TMR0 return ;============================================= ;定時器中斷程序,如果COUNT1為0,置標志FLAG為1 ;============================================= TMR0SERC MOVWF W_TEMP ;軟件入棧 SWAPF STATUS,W CLRF STATUS MOVWF STATUS_TEMP BCF INTCON,T0IF ;清中斷標志 DECFSZ COUNT1,F ;COUNT1減1,判斷是否為零 GOTO JUMP0 ;COUNT1不為零,軟件出棧,跳出中斷,啟動定時器0 MOVLW COUNT_TEMP ;為零,賦值,FLAG=1 MOVWF COUNT1 BSF FLAG,0 JUMP0 MOVLW TMR0_TEMP MOVWF TMR0 SWAPF STATUS_TEMP,W MOVWF STATUS SWAPF W_TEMP,F SWAPF W_TEMP,W RETFIE ;============================================= ;結束 ;============================================= END