📄 compare.asm
字号:
;********************COMPARE********************
;本程序实现用比较器模块输出方波。
;入口参数:正脉冲宽度在SOUH:SOU中,负脉冲宽度在RLTH:RLT中。
;出口参数:正脉冲宽度为(SOUH:SOU)*4TOSC,负脉冲宽度为(RLTH:RLT)*4TOSC。
;占用资源:W,STATUS,INT,TMR1,023H,024H,025H,028H,029H,二重堆栈。
;说明: 1.使用该程序需在中断入口程序中填入如下两条指令
; BTFSC PIR1,CCP1IF
; GOTO CMPINT
; 2.正负脉冲宽度均要求在30*4TOSC~65536*4TOSC之间
IFNDEF COMPARE1
#DEFINE COMPARE1
SAVEW EQU 07FH ;现场保护中保存W的地址
SAVES EQU 07EH
COMPARE MOVLW 03H
SUBWF SOU,F
BTFSS STATUS,C
DECF SOUH,F
SUBWF RLT,F
BTFSS STATUS,C
DECF RLTH,F ;脉宽补偿,提高精度
MOVF SOUH,W
MOVWF CCPR1H
MOVF SOU,W
MOVWF CCPR1L
CLRF TMR1H
CLRF TMR1L ;TMR1清0
BSF INTCON,PEIE
BSF INTCON,GIE
BSF STATUS,RP0
BCF PIE1,CCP1IE ;关中断
BCF PIE1,TMR1IE
BCF TRISC,2 ;RC2输入
BCF STATUS,RP0
MOVLW B'00000000' ;T1定时器方式,1:1分频
MOVWF T1CON
MOVLW B'00001000' ;设置CCP1为比较工作方式,输出高电平
MOVWF CCP1CON
BCF PIR1,CCP1IF
BSF STATUS,RP0
BSF PIE1,CCP1IE ;开中断
BCF STATUS,RP0
BSF T1CON,TMR1ON ;开始定时
RETURN
;*******************比较中断************************
CMPINT CLRF TMR1L
CLRF TMR1H
MOVWF SAVEW
SWAPF STATUS,W
CLRF STATUS
MOVWF SAVES ;保护现场
BTFSC CCP1CON,CCP1M0
GOTO NEXT59
MOVF SOUH,W
MOVWF CCPR1H
MOVF SOU,W
MOVWF CCPR1L ;加载正脉冲宽度
BSF CCP1CON,CCP1M0 ;比较输出1
GOTO DONE14
NEXT59 MOVF RLTH,W
MOVWF CCPR1H
MOVF RLT,W
MOVWF CCPR1L ;加载负脉冲宽度
BCF CCP1CON,CCP1M0 ;比较输出0
DONE14 BCF PIR1,CCP1IF
SWAPF SAVES,W
MOVWF STATUS
SWAPF SAVEW,F
SWAPF SAVEW,W ;恢复现场
RETFIE
ENDIF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -