📄 timer.asm
字号:
;********************TIMER********************
;本程序实现用TMR0实现时钟功能。
;入口参数:无。
;出口参数:时RLT,分SOUH,秒SOU。
;占用资源:W,STATUS,TMR0,PORTD,024H,025H,026H,028H,07FH,17FH,07EH,1重堆栈。
;说明: 1.使用该程序需在中断入口程序中填入如下两条指令
; BTFSC INTCON,T0IF
; GOTO TIMERINT
; 2.要求主频为4MHZ
IFNDEF TIMER1
#DEFINE TIMER1
SAVEW EQU 07FH ;现场保护中保存W的地址
SAVES EQU 07EH
TIMER CLRF SOU ;秒
CLRF SOUH ;分
CLRF RLT ;时
MOVLW .18
MOVWF TEMP1 ;TEMP1记录TMR0溢出次数
MOVLW 0-D'217'
MOVWF TMR0
BSF STATUS,RP0 ;BANK1
MOVLW 17H
MOVWF OPTION_REG ;1:256
BCF STATUS,RP0 ;BANK0
BCF INTCON,T0IF
MOVLW 0E0H
IORWF INTCON,F
RETURN
;*******************中断程序*******************
TIMERINT MOVWF SAVEW
SWAPF STATUS,W
CLRF STATUS
MOVWF SAVES ;保护现场
MOVLW 0-D'217'
MOVWF TMR0
BSF STATUS,RP0
MOVLW 17H ;重新设定预分频值
MOVWF OPTION_REG
BCF STATUS,RP0
BCF INTCON,T0IF
DECFSZ TEMP1,F ;到1秒了吗?
GOTO DONE22
MOVLW .18
MOVWF TEMP1 ;重设溢出计数器
INCF SOU,F ;秒计数器加1
MOVLW .60
XORWF SOU,W
BTFSS STATUS,Z ;到60秒了吗?
GOTO DONE22
CLRF SOU ;秒计数器清0
INCF SOUH,F ;分计数器加1
MOVLW .60
XORWF SOUH,W
BTFSS STATUS,Z ;到60分了吗?
GOTO DONE22
CLRF SOUH ;分计数器清0
INCF RLT,F ;小时计数器加1
MOVLW .24
XORWF RLT,W ;到24小时了吗?
CLRF RLT ;小时计数器清0
DONE22 SWAPF SAVES,W
MOVWF STATUS
SWAPF SAVEW,F
SWAPF SAVEW,W ;恢复现场
RETFIE
ENDIF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -