LIST P=16F84A,R=HEX ; ; MUTLI-FUNCTION CONTROLOR FOR R/C MODEL ; SUN, PU-NENG ; JULY/17/2003 ; ; VERSION 1.02 (AUGEST/20/2003) ; fix one bug, to make sure when alarm off, the freq is low ; ; VERSION 1.0 ; USE A SPARE CHANNEL ON R/C RECEIVER, ; TO CONTROL ANYTHING YOU WANT,MISSLE,CAMERA, ; HEAD LIGHT,LANDING FLASH,AND BUZZER FOR LOCATE THE PLANE ; ; CAUTION : THIS PROGRAM WILL BE TRANS TO 12C508A, SO i USE PA EQU 6 ; INSTEAD OF EQU 5, FOR 16F84A TO TEST ; ; DEFINE RAM ;----- SYSTEM --------- __CONFIG H'3FF1' TMR0 EQU 1 ;TIMER 0 PC EQU 2 ;PROGRAM COUNTER STATUS EQU 3 FSR EQU 4 ;BUFFER OF INDIRECT ADDR PB EQU 5 ;CAUTION PA EQU 6 ;CAUTION TRISB EQU 5 ;0X85 TRISA EQU 6 ;0X86 ; ; ;---- USER DEFINE ------ ; CNTA EQU H'10' ;PLUSE WIDTH COUNTER CNTB EQU H'11' ;DOUBLE CLICK TIMER CNTC EQU H'12' ;ROUND RUNNING CNTD EQU H'13' ;ROUND RUNNING *256 HPASS EQU H'14' ;HIGH PASS COUNTER LPASS EQU H'15' ;LOW PASS COUNTER FLAGR EQU H'16' ;FLAG REGISTER STA EQU 0 ;STATUS ,FLAG REGISTER BIT 0 HFLAG EQU 1 LFLAG EQU 2 ; ; ; DEFINE BIT ; RP0 EQU 5 ;BANK SELECT FOR 16F84A W EQU 0 ;d VALUE FOR INCF...... F EQU 1 ;d VALUE OFF EQU 0 ;FLAG BIT 0 ON EQU 1 ;FLAG BIT 1 INPUT EQU 0 ;RB0 AS INPUT PORT SHOOT EQU 1 ;FOR MISSLE OR CAMERA PUSH ON , RELEASE OFF LIGHT EQU 2 ;ONE PUSH ON, ANOTHER PUSH OFF FLASH EQU 3 ;WHEN LIGHT ON, ON/OFF EVERY 0.5 SEC BUZZER EQU 4 ;DOUBLE CLICK ON, ONE PUSH OFF FREQ EQU 5 ;WHEN BUZZER ON, OUT TWO TONES ALARM ; ; DEFINE VARIABLES ; NOISE EQU H'20' ;*20uS= 0.7 mS, PULSE < 0.6 DEFINE AS NOISE ACTION EQU H'50' ;80 *20uS= 1.6 mS, PULSE > 1.6 DEFINE AS VALID DOUBLE EQU H'15' ;*2.0mS= .5 SEC, DOUBLE CLICK INTERVAL ; ;========== MAIN PROGRAM ========= ; ; ORG 0 GOTO START ; ;========================================== ORG 6 SUB1 INCFSZ CNTC,F GOTO SUB2 INCF CNTD,F SUB2 BTFSC CNTD,6 ;CNTD BIT 2 = 0.5 SEC ON, 0.5 SEC OFF GOTO ON1 OFF1 NOP NOP BCF PA,FLASH OFF2 BTFSS PA,BUZZER GOTO OFF4 BTFSC CNTC,4 ;0.5 SEC 800 Hz FREQ FOR ALARM GOTO OFF3 BCF PA,FREQ NOP RETURN ;----------------------- OFF3 BSF PA,FREQ RETURN ;----------------------- OFF4 NOP NOP NOP RETURN ;----------------------- ON1 BTFSC PA,LIGHT BSF PA,FLASH ON2 BTFSS PA,BUZZER GOTO ON4 BTFSC CNTC,5 ;0.5 SEC 400 Hz FREQ FOR ALARM GOTO ON3 BCF PA,FREQ NOP RETURN ;----------------------- ON3 BSF PA,FREQ RETURN ;----------------------- ON4 NOP NOP NOP RETURN ;================================================ ;------------------------------------------ START BSF STATUS,RP0 ;BANK SELECT 1 MOVLW 1 ;PA0=INPUT, 1~5 =OUTPUT MOVWF TRISA ;CAUTION THIS MEAN REGISTER 0X86 CLRW MOVWF TRISB ;ALL PB=OUTPUT 0X85 BCF STATUS,RP0 ;BANK SELECT 0 MOVWF PA MOVWF CNTB MOVWF FLAGR ;SET STATUS= 0 HFALG & LFALG =0 MAIN CLRF CNTA MAIN1 NOP BTFSC PA,INPUT GOTO MAIN2 CALL SUB1 GOTO MAIN1 MAIN2 INCF CNTA,F BTFSS PA,INPUT GOTO MAIN3 CALL SUB1 GOTO MAIN2 MAIN3 MOVLW NOISE SUBWF CNTA,W SKPC ;IF f > w, C= 1,SKIP GOTO MAIN ;ELSE IT'S NOISE MAIN4 MOVLW ACTION SUBWF CNTA,W SKPC ;IF f > w, C=1, SKIP TO HIGH GOTO LOW1 ;ELSE IT'S LOW HIGH1 BTFSC FLAGR,STA ;IS STATUS HIGH OR LOW ? GOTO MAIN ;IF HIGH THE BUTTON NO RELEASE YET HIGH2 BTFSC FLAGR,HFLAG ; GOTO HIGH3 BSF FLAGR,HFLAG GOTO MAIN HIGH3 BCF FLAGR,LFLAG ;RESET LOW PASS COUNTER BCF FLAGR,HFLAG BSF FLAGR,STA ;SET STATUS FLAG AS HIGH MOVF CNTB,F SKPZ GOTO BUZZER1 ;CNTB NO ZERO MOVLW DOUBLE MOVWF CNTB ;SET CNTB = DOUBLE INTERVAL TIME BSF PA,SHOOT BCF PA,BUZZER BCF PA,FREQ ;TURN BUZZER OFF BTFSC PA,LIGHT GOTO HIGH4 ;LIGHT IS ON , TURN IT OFF BSF PA,LIGHT GOTO MAIN ;--------------------------------------------------------- HIGH4 BCF PA,LIGHT BCF PA,FLASH GOTO MAIN ;--------------------------------------------------------- BUZZER1 BSF PA,BUZZER CLRF CNTB GOTO MAIN ;--------------------------------------------------------- LOW1 MOVF CNTB,F SKPZ DECF CNTB,F BTFSS FLAGR,STA GOTO MAIN LOW2 BTFSC FLAGR,LFLAG ; GOTO LOW3 BSF FLAGR,LFLAG GOTO MAIN LOW3 BCF FLAGR,HFLAG BCF FLAGR,LFLAG BCF FLAGR,STA ;SET STATUS FLAG AS LOW BCF PA,SHOOT ;SHOOT OFF GOTO MAIN ;--------------------------------------------------------- END