⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hcs635.asm

📁 source for the microchip transponder for LF 125KHz.
💻 ASM
📖 第 1 页 / 共 5 页
字号:
; DESCRIPTION	: SWITCH RF OUT ON AND CONTINUE TO WAIT FOR ONE RF Te
;
; PAGE		: 0
;
;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
RFOUT_ON
	INCF	COMP,F		; SHORTEN PULSE WIDTH
RFOUT_ON3
	BSF	RFOUT	; SET RF OUTPUT HIGH
	GOTO	TE_DELAY	; DO TE DELAY TIME

;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
;
; FUNCTION	: TE_DELAY ()
;		  
; PARAMETER	: CNT2 EQUAL TO NUMBER OF 5US STEPS TO REMOVE FROM DELAY
;
; DESCRIPTION	: WAIT FOR 1 TE CYCLE AND FLASH LED AS REQUIRED
;
; RETURN	: SET ZERO FLAG IF ALL BUTTON RELEASED
;
;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
TE_DELAYL
	INCF	COMP,F		; REMOVE 4 US COMPENSATION TIME
TE_DELAY
	CALL	TST_CLK		; UPDATE 50MS CLOCK
TE_DEL03
	CALL	TST_LED		; CHANGE LED PIN IF REQUIRED, RETURNS BAUD RATE AND C=0
TE_DEL05
	nop
	nop
	MOVWF	CNT2		; STORE BAUD RATE
	BTFSC	BSL0		; CHECK IF BSL0 BIT IS SET
	ADDWF	CNT2,F		; ... YES, THEN MULTIPLY BY 2

	MOVLW	D'14'		; MINIMUM COMPENSATION
	ADDWF	COMP,W		; ADD COMPENSATION FOR CALCULATION OVERHEAD
	SUBWF	CNT2,F		; SHORTEN BIT WIDTH BY COMPENSATION AMOUNT

	BTFSS	STATUS,C	; CHECK IF COMPENSATION IS MORE THAN LOOP COUNTER
	RETLW	0H		; ... YES, THEN SKIP TE DELAY LOOP
	CLRF	COMP		; CLEAR FOR NEXT BIT
TE_DEL10
	nop
	nop
	DECFSZ	CNT2,F		; [2/1] MORE LOOPS TO DO?
	GOTO	TE_DEL10	; [0/2] ... YES

; ***** CHECK BUTTONS ******************

TE_DEL30
IFDEF pullup
	comf	PORTA,w
ELSE
	MOVFW	PORTA		; [1/1] READ GENERAL I/O PORT
ENDIF
	ANDWF	B_MASK,W	; [1/1] MASK OUT THE BUTTON BITS
	movwf	ButtonImage
	BTFSC	STATUS,Z	; [2/1] CHECK ALL BUTTONS RELEASED ??
	DECFSZ	CSR5,F		; DEBOUNCE FALLING BUTTON EDGE
	GOTO	TE_DEL90
	BSF	FLAGS,BUT_REL	; [0/1] ... YES, THEN SET BUTTON RELEASED BIT
TE_DEL90
	COMF	BUTTON,W	; [1] INVERT BUTTON CODE
	ANDWF	ButtonImage,W	; [1] AND WITH WHATS ON THE PORT
	BTFSC	FLAGS,BUT_REL	; [2/1] CHECK IF BUTTON WAS RELEASED
IFDEF pullup
	comf	PORTA,w
ELSE
	MOVFW	PORTA		; [1/1] READ GENERAL I/O PORT
ENDIF
	ANDWF	B_MASK,W	; [1/1] MASK OUT THE BUTTON BITS
	movwf	ButtonImage
	BTFSC	STATUS,Z	; IF NO BUTTON WAS ADDED
	RETLW	0H		; ... THEN RETURN
	XORWF	BUTTON,W	; COMPARE THE NEW BUTTON PRESSED TO PREVIOUS ONE
	ANDWF	B_MASK,W	; ELIMINATE EXTRA BITS
	BTFSC	STATUS,Z	; IF IT WAS THE SAME
	BSF	BUTTON,7	; ... THEN SET THE DOUBLE BUTTON PRESS FLAG
	BTFSS	STATUS,Z	; OTHERWISE
	goto	NEWBUTTON

;T	GOTO	MAIN		; ... RESTART WITH NEW TRANSMISSION
VLOW_DELAY
	RETLW	1H

;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
;
; FUNCTION	: TST_LED ()
;
; DESCRIPTION	: CHECK IF LED NEEDS TO TOGGLE, THEN TOGGLE IT, 20/21 CYCLES
;
;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
TST_LED
	MOVFW	CLK_LED		; [1] GET NEXT LED TRANSITION TIME
	SUBWF	CLK_50,W	; [1] COMPARE WITH CURRENT TIME
	MOVLW	T_100		; [1] SET LED ON TIME FOR 100MS
	BTFSS	LEDH		; [1/2] IF LED BLINK SHOULD BLINK FASTER
	MOVLW	T_50		; [1/0] ... THEN SET LED ON TIME FOR 50MS
	BTFSS	LED		; [1/2] IF LED IF OFF
	MOVLW	T_500		; [1/0] ... THEN SET LED OFF TIME
	BTFSS	STATUS,C	; [1/2] IF TIME TEST WAS LESS THAN TRIGGER
	GOTO	TST_LED2	; [2/0] ... THEN SKIP LED UPDATE

	ADDWF	CLK_50,W	; [1] CALCULATE NEXT TIME TO TOGGLE
	MOVWF	CLK_LED		; [1] STORE NEXT TIME TO TOGGLE
IFDEF P12F635
	MOVFW	PORTA		; [1] GET LED SETTING
	BTFSC	FLAGS,VLOWBAT	; [1/2] IF BATERY LEVEL IS LOW
	ANDLW	0FEH		; [1/0] THEN TURN LED OFF
	XORLW	1		; [1] ELSE TOGGLE LED
	MOVWF	PORTA		; [1] THEN UPDATE LED
ELSE
	MOVFW	PORTC		; [1] GET LED SETTING
	BTFSC	FLAGS,VLOWBAT	; [1/2] IF BATERY LEVEL IS LOW
	ANDLW	0FEH		; [1/0] THEN TURN LED OFF
	XORLW	1		; [1] ELSE TOGGLE LED
	MOVWF	PORTC		; [1] THEN UPDATE LED
ENDIF
TST_LED1
	BTFSS	BSL1		; [1/2] CHECK IF BSL1 BIT IS SET
	RETLW	D'20'		; [2] RETURN BAUD=100USEC AND CARRY=0
	RETLW	D'80'		; [2] RETURN BAUD=400USEC AND CARRY=0
				; TOTAL = [20] CYCLES WITH CALL

TST_LED2
	GOTO	$+1		; WASTE TIME TO KEEP BOTH PATHS EQUAL TIME
	GOTO	$+1		; CANNOT USE CALL BECAUSE STACK IS FULL
	GOTO	TST_LED1

;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
;
; FUNCTION	: TST_CLK ()
;
; DESCRIPTION	: UPDATE 50MS CLOCK AS REQUIRED, 19 CYCLES
;
;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
TST_CLK
	MOVLW	18H		; 24x256x8 = 6144 x 8 = 49152 => 50MS
	BTFSC	CLK_50,0	; EVERY OTHER TEST DITHERS THE ERROR
	MOVLW	19H		; 24x256x8 = 6144 x 8 = 49152 => 50MS
	SUBWF	TMR1H,W		; COMPARE WITH REAL TIMER COUNTER
	BTFSC	STATUS,C	; IF TIMEOUT REACHED
	MOVWF	TMR1H		; ... THEN STORE RESULT IN RTCC
	BTFSC	STATUS,C	; IF TIMEOUT REACHED
	INCF	CLK_50,F	; ... THEN INCREMENT THE 50MS EVENT COUNTER
	BTFSS	CLK_50,7	; [2/1] CHECK IF MSB SET 
	GOTO	TST_CLK5	; [0/2] ... NO, THEN WASTE 2 CYCLES AND RETURN
	INCF	CLK_HI,F	; ... THEN INCREMENT 50MS OVERFLOW COUNTER
	BCF	CLK_50,7	; CLEAR MSB OF 50MS CLOCK COUNTER
	BCF	CLK_LED,7	; CLEAR MSB OF LED CLOCK COUNTER
	RETLW	D'54'		; RETURN START VALUE 200US DELAY
TST_CLK5
	RETLW	D'54'		; RETURN START VALUE 200US DELAY

;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
;
; FUNCTION	: DLY_200US ()
;
; DESCRIPTION	: WAIT FOR CNT1 x 200us DELAY, WHILE CHECKING BUTTON
;
; PAGE		: 0
;
;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
DLY_200US
	MOVWF	CNT1		; STORE THE NUMBER OF MS DELAY REQUIRED
DLY_US2
	CALL	TST_LED		; UPDATE LED STATUS
	CALL	TST_CLK		; UPDATE 50MS CLOCK, RETURNS 120 FOR DELAY COUNTER 
DLY_3US
	MOVWF	CNT2		; LOAD INNER LOOP COUNTER
DLY_US3
	DECFSZ	CNT2,F		; ALL INNER LOOPS DONE ?
	GOTO	DLY_US3		; ... NO, THEN DO NEXT

	DECFSZ	CNT1,F		; ALL OUTER LOOPS DONE ?
	GOTO	DLY_US2		; ... NO, THE DO NEXT
	RETLW	0H

;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
;
; FUNCTION	: TX_BITS ()
;
; DESCRIPTION	: SEND TRANSMISSION BITS OUT ON RFOUT PIN
;
; NOTES		: USE DOUBLE COUNTER SIZE TO MAKE BYTE ROLLOVER TEST EASIER
;		: MODIFY WITH EXTREME CAUTION TO PRESERVE BIT CALIBRATION
;		: NOW ENTERING SPAGETTI CODE WITH TOO MANY FORKS AND NO SPOON
;
;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
TX_BITH
	MOVLW	1		; SEND A LOGIC 1 BIT
TX_1BIT
	BSF	CNT1,1		; SET LENGTH = 1 WITHOUT MODIFING W *2
TX_BITW
	NOP
	GOTO	TX_BITWW	; EXTRA 2 CYCLE DELAY BEFORE SENDING BITS IN W
TX_BITS
	MOVWF	CNT1		; STORE LENGTH
	MOVLW	NSR0-1		; POINT TO FIRST BIT OF BUFFER WITHOUT PAGE BITS
	MOVWF	FSR		; THE PAGE BITS WILL BE INSERTED LATER
	
TX_BITL
	MOVLW	0EH		; GET MASK FOR BYTE ROLLOVER
	ADDWF	CNT1,W		; SET DC FLAG IF ROLLOVER
	BTFSS	STATUS,DC	; IF FIRST FULL BYTE OR BYTE ROLLOVER
 	INCF	FSR,F		; ... THEN POINT TO BYTE
	MOVFW	INDF		; GET NEXT BYTE
	BTFSS	STATUS,DC	; IF FIRST FULL BYTE OR BYTE ROLLOVER
TX_BITWW
	MOVWF	CSR6		; ... THEN STORE BYTE IN WORKING SPACE
	DECF	CRC,W		; DECREMENT IS SHORTCUT FOR CRC ALGORITHM:
	BTFSC	CRC,1		;  CRC[0]n+1 = CRC[1]n XOR CRC[0]n XOR Dn
	XORLW	3		;  CRC[1]n+1 = CRC[0]n XOR Dn
	MOVWF	CRC		; STORE FIRST HALF OF CRC CALCULATION
	BTFSS	CSR6,0		; IF BIT = 0
	COMF	CRC,F		; THEN INVERT CRC

	BTFSS	MSEL0		; IF MANCHESTER/PPM MODULATION NOT SELECTED
	GOTO	TX_WM		; ... THEN DO PWM/VPWM

TX_PPM
	GOTO	$+1		; EQUALIZE TIME FOR PREVIOUS GOTO + PWM TEST
IFDEF P12F635
	MOVFW	PORTA		; GET THE OTHER OUTPUT LEVELS
	ANDLW	0FDH		; MAKE RFOUT GO LOW
	BTFSC	CSR6,0		; IF TRANSMITTING A ONE
	IORLW	2		; MAKE RFOUT GO HIGH
	MOVWF	PORTA		; START BIT NOW
	CALL	TE_DELAYL	; DO 1 TE DELAY

	MOVFW	PORTA		; GET OUTPUT LEVEL
	XORLW	2		; TOGGLE OUTPUT
	MOVWF	PORTA		; MAKE CHANGE NOW
ELSE
	MOVFW	PORTC		; GET THE OTHER OUTPUT LEVELS
	ANDLW	0DFH		; MAKE RFOUT GO LOW
	BTFSC	CSR6,0		; IF TRANSMITTING A ONE
	IORLW	020H		; MAKE RFOUT GO HIGH
	MOVWF	PORTC		; START BIT NOW
	CALL	TE_DELAYL	; DO 1 TE DELAY

	MOVFW	PORTC		; GET OUTPUT LEVEL
	XORLW	020H		; TOGGLE OUTPUT
	MOVWF	PORTC		; MAKE CHANGE NOW
ENDIF
	BTFSS	MSEL1		; IF MANCHESTER MODULATION
	GOTO	TX_MAN		; ... THEN SKIP LAST PPM TE

	CALL	TE_DELAYL	; DO 1 TE DELAY
	BCF	RFOUT		; SET LAST TE OF PWM LOW
	NOP
	GOTO	$+1
TX_MAN
	GOTO	$+1
	BSF	COMP,2
	CALL	TE_DEL03	; DO 1 TE DELAY
	GOTO	TX_ROTATE

TX_WM
	BTFSS	MSEL1		; IF VPWM MODULATION NOT SELECTED
	GOTO	TX_PWM		; ... THEN DO PWM
TX_VPWM	
	NOP			; EQUALIZE TIME FOR PREVIOUS GOTO
IFDEF P12F635
	MOVFW	PORTA		; READ PORTA
	XORLW	2		; TOGGLE RF DATA OUT BIT
	MOVWF	PORTA		; OUTPUT NEW BIT
	BSF	COMP,2
	CALL	TE_DEL03	; DO TE DELAY TIME
	RRF	PORTA,W		; GET OUTPUT LEVEL INTO BIT 0
ELSE
	MOVFW	PORTC		; READ PORTA
	XORLW	020H		; TOGGLE RF DATA OUT BIT
	MOVWF	PORTC		; OUTPUT NEW BIT
	BSF	COMP,2
	CALL	TE_DEL03	; DO TE DELAY TIME
	RRF	PORTC,W		; GET OUTPUT LEVEL INTO BIT 0
ENDIF
	XORWF	CSR6,W		; COMPARE TO THE TRANSMIT BIT
	ANDLW	1		; GET RID OF THE OTHER BITS
	BTFSS	STATUS,Z	; IF THE LEVEL IS OPPOSITE
	CALL	TE_DELAY	; ... THEN DO ANOTHER TE DELAY
	GOTO	TX_ROTATE	; IF NOT TOTALLY CONFUSED YET THEN ASK FOR A RAISE

TX_PWM
	GOTO	$+1
TX_PWM1
	BSF	RFOUT	; SET RF OUTPUT HIGH
	CALL	TE_DELAYL	; DO 1 TE DELAY
	NOP			; VERY CRITICAL TIME DELAYS TO MAKE ACCURATE PULSES
	BTFSC	CSR6,0		; IF TRANSMITTING A ONE
	BCF	RFOUT	; ... THEN SET MIDDLE TE OF PWM LOW
TX_PWM2
	GOTO	$+1
	CALL	TE_DELAYL	; DO 1 TE DELAY
TX_PWM3
	BCF	RFOUT	; SET LAST TE OF PWM LOW
	MOVLW	3
	MOVWF	COMP
	CALL	TE_DEL03	; DO 1 TE DELAY
	NOP
TX_ROTATE
	NOP
	RRF	CSR6,F		; ROTATE NEXT BIT INTO POSITION
	DECF	CNT1,F		; FIX FOR DOUBLED COUNT SIZE
	DECFSZ	CNT1,F		; ALL BITS TRANSMITTED? SET CLEAR PWM FLAG
	GOTO	TX_BITL		; ... NO, THEN DO NEXT BIT
	RETLW	0

;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
;
; FUNCTION     	: VLOW_LEVEL ()	      			
;
; DESCRIPTION  	: PICK THE VLOW LEVEL TO TEST BASED ON VTRIP FLAG AND LATCH
;
; PAGE		: 1
;
;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
VLOW_LEVEL
	MOVLW	EE_VLOWL	; POINT VLOW LATCH
	CALL	EEREAD0		; READ BYTE FROM EEPROM
	bsf	STATUS,RP0
	INCF	EEDATA,W	; SET Z FLAG IF VLOW LATCH SET @ 0FFH
	bcf	STATUS,RP0	; SELECT RAM BANK #0
	movlw	HIGH $+8
	movwf	PCLATH
	MOVLW	2H		; PRELOAD OFFSET FOR LATCHED 3V LEVEL
	BTFSC	VTRIP		; IF VTRIP OPTION IS SET
	MOVLW	3H		; ... THEN USE THE OFFSET FOR LATCHED 5V LEVEL
	BTFSC	VLOWL		; IF VLOW VALUE SHOULD NOT BE LATCHED
	BTFSS	STATUS,Z	; . OR IT WAS NOT YET LATCHED
	ANDLW	1H		; ... THEN USE LOWER TEST LEVELS
	ADDWF	PCL,F		; ADD TO PROGRAM COUNTER
	RETLW	11H		; LOW VOLTAGE LEVEL = 2.0V
	RETLW	14H		; LOW VOLTAGE LEVEL = 2.3V
	RETLW	15H		; LOW VOLTAGE LEVEL = 4.0V
	RETLW	17H		; LOW VOLTAGE LEVEL = 4.5V

;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
;
; FUNCTION     	: TRANSMIT ()	      			
;
; DESCRIPTION  	: SEND TRANSMISSION OUT ON RFOUT PIN
;
; PAGE		: 0
;
;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
TRANSMIT:
	CLRF	CRC		; CLEAR CRC HERE BECAUSE IT WAS A TIME WASTING NOP ANYWAY
	BTFSC	STRTSEL		; IF MANCHESTER/PPM START BIT REQUIRED
	BSF	CRC,0		; ... THEN BIAS CRC FOR START BIT

	BCF	FLAGS,TEMPBIT	; RESET LED STATE FLAG
	BTFSS	LED		; IF LED WAS SWITCHED ON
	BSF	FLAGS,TEMPBIT	; ... YES, THEN SET LED FLAG
	BSF	LED		; ALWAYS SWITCH LED OFF
		
	INCF	CLK_LED,F	; PREVENT NEXT LED TRANSITION TIME
	
	BSF	RFEN		; TURN ON RFEN FOR IN CASE WE ARE IN FSK MODE

	BTFSS	WSEL1		; IF EITHER OF THE WAKEUP SELECT
	BTFSC	WSEL0		; . BITS ARE SET FOR LONG WAKEUP
	GOTO	$+2		; ... THEN SKIP PREAMBLE ADJUSTMENT
	BSF	FLAGS,FIRST	; ... ELSE FORCE AS IF FIRST PREAMBLE SENT

; ***** SET NUMBER OF PREAMBLE PULSES AND VLOW THRESHOLD ***********

	MOVLW	D'15'		; LOAD THE NUMBER OF 16 PREAMBLE BITS - 1 = 15
	BTFSS	FLAGS,FIRST	; IF FIRST LONG PREAMBLE NOT YET SENT
	MOVLW	D'1'		; ... THEN DO NOT DO EXTRA PULSES AFTER TIMEOUT
	MOVWF	CNT1		; STORE NUMBER OF PULSES TO TRANSMIT

	BTFSC	FLAGS,FIRST	; IF FIRST PREAMBLE ALREADY SENT
	BCF	WSEL1		; ... THEN USE NORMAL 50% DUTY CYLCE PULSES

	MOVLW	0		; FOR 100MS PREAMBLE DO NOT USE OFFSET
	BTFSS	WSEL1		; IF 75MS WAKEUP PREAMBLE SELECTED
	MOVLW	D'12'		; ... GET CONSTANT FOR 24.6MS OFFSET
	BTFSS	WSEL0		; IF 50MS WAKEUP PREAMBLE SELECTED
	MOVLW	D'24'		; ... GET CONSTANT FOR 50MS OFFSET

	BTFSS	FLAGS,FIRST	; IF NOT FIRST WAKEUP PREAMBLE
	ADDWF	TMR1H,F		; ... THEN ADD OFFSET TO CLOCK AND TEST WHEN 100MS REACHED
	CLRF	COMP		; INITIALIZE COMPENSATION
	BSF	COMP,2		; OVERHEAD COMPENSATION FOR LOOKING UP VLOW TRIP POINT
	CALL	TST_CLK		; UPDATE 50MS CLOCK
	CALL	TST_LED		; CHANGE LED PIN IF REQUIRED, RETURNS BAUD RATE AND C=0
	BSF	RFOUT		; SET RF OUTPUT HIGH
	CALL	TE_DEL05	; DO 1 TE DELAY
	CALL	VLOW_LEVEL	; GET VLOW LEVEL FROM LOOKUP TABLE

; ***** TEST VLOW AFTER WAITING AT LEAST 10 INSTRUCTION CYCLES ***********

	bsf	STATUS,RP0	; select Bank 1
;	MOVWF	LVDCON		; (1) LOAD LOW VOLTAGE DETECT REGISTER
;	MOVWF	VLOWLEVEL	; (6) STORE VALUE FOR COMPARISON
;	btfss	LVDCON,IRVST
;	goto	$-1
	bcf	STATUS,RP0
;	BSF	FLAGS,VLOWBAT	; (11) FORCE VLOWBAT FLAG ON => ENSURE THAT LED DOESN'T SWITCH ON
;	XORWF	VLOWLEVEL,F	; CHECK IF BATTERY LEVEL CHANGED
;	RLF	VLOWLEVEL,F	; SET CARRY FLAG IF LEVEL CHANGED
;	MOVWF	VLOWLEVEL	; STORE VLOW LEVEL
;	BTFSS	VLOW		; IF VLOW NOT SET
	BCF	FLAGS,VLOWBAT	; ... THEN THE BATTERY IS OK, FLAG WAS SET EARLIER
	bcf	STATUS,RP0	; SELECT RAM BANK #0

	BTFSC	STATUS,C	; IF BATTERY LEVEL UNCHANGED
	BTFSS	VLOWL		; . OR VLOW LATCH DISABLED
	GOTO	TX_PRE1		; ... THEN SKIP VLOW LATCH UPDATE

; ***** UPDATE VLOW LATCH IN EEPROM ******************

	BCF	RFOUT		; STOP TRANSMITTER DURING EEWRITE
	bsf	STATUS,RP0	; SELECT RAM BANK #1
	MOVLW	EE_VLOWL	; GET OFFSET TO VLOW LATCH IN EEPROM
	MOVWF	EEADR		; SET EEPROM ADDRESS TO VLOW LATCH

	MOVLW	0FFH		; VALUE TO SET LATCH CHOOSEN TO BE SAME AS FAILED WRITE
	BTFSS	FLAGS,VLOWBAT	; IF NOT LOW BATTERY CONDITION	
	MOVLW	00H		; ... THEN CLEAR EEPROM LATCH
	CALL	EEWRITE		; UPDATE EEPROM LATCH
	bcf	STATUS,RP0	; SELECT RAM BANK #0

; ***** SEND TRANSMISSION'S PREAMBLE BITS ******************


TX_PRE1
	DECF	CLK_LED,F	; PERMIT NEXT LED TRANSITION TIME
	BTFSC	FLAGS,TEMPBIT	; IF THE LED WAS ON BEFORE THE VLOW CHECK
	BCF	LED		; ... THEN SWITCH LED ON
TX_PRE2
	BCF	RFOUT		; CLEAR RF OUTPUT LOW
	MOVWF	CNT3		; LOAD LOOP COUNTER BUT NOT ON FIRST ITERATION
	GOTO	$+1
	
	BTFSS	WSEL1	 	; IF 50% DUTY CYCLE
	BCF	WSEL0		; ... THEN MAKE SURE WE DO NOT DO 16.7% DUTY CYCLE

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -