十年专注单片机方案开发的方案公司英锐恩,分享定时器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