📄 hcs635.asm
字号:
; 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 + -