|
/script> ;************************************** list p=16f84A include "P16F84A.INC" ;******************************************************************* LIST P=16F84A,R=DEC ;定义器件为16F84,默认数制为十进制 ;------------------------------------------------------- __CONFIG B'11111111110001';_CP_OFF&_WDT_OFF&_PWRITE_ON&_XT_OSC ;没有代码保护 ;看门狗关闭 ;上电廷时器开启 ;振荡器模式为XT ;----------RA4遥控输入 RA0开机按键 RA2功能键 RA1定时键----- ;************变量定义****************** YKSPBZ EQU 0 GNL EQU 1 ;RB1 GNH EQU 2;RB2 FLZ EQU 3;RA3 SW EQU 0;RB0 POWER_LED EQU 7;RB7 LED_SW EQU 6;RB6 LED_GNL EQU 5;RB5 LED_GNH EQU 4;RB4 RF EQU 3;RB3 SPEK EQU 2;RA2 KEY_ONOFF EQU 7;RB7 KEY_TIME EQU 6;RB6 KEY_SPEED EQU 5;RB5 KEY_SW EQU 4;RB4 ONOFFBZ EQU 0; XIANSHIBZ EQU 1; LFMBZ EQU 3; GNXIZI EQU 22H ;功能显值 TIMEXIZI EQU 45H SETTIME EQU 23H ; YUANXIZI EQU 26H ;原RB显示值 ;---------------------------- DSBZ EQU 30h ;定时打开标志 DSLANG EQU 31h ;累加长时间定时寄存器 DSMES1 EQU 32h ;定时秒寄存器1 DSMES2 EQU 33h ;定时秒寄存器2 DSMIN EQU 34h ;定时分寄存器 DSSET EQU 35h ;设置定时寄存器 ONBZ EQU 36h ;开机标志 LS1 EQU 38h ;临时寄存器 LS2 EQU 47H JSQ1 EQU 40H JSQ2 EQU 41H JSQ3 EQU 46H LFMBZJC EQU 47H RFSPEEK EQU 48H ;------------------------------------------------- YFML EQU 20H YFMH EQU 21H YFMLC EQU 24H YFMHC EQU 25H BZH1 EQU 28H BZH EQU 29H RFSJBZ EQU 44H ;-----------初始化------------------ LOOP ORG 00H GOTO LOOPTOP ;--------------连续码处理---------------- LXMCL BTFSS ONBZ, ONOFFBZ RETURN BTFSS LFMBZJC,LFMBZ RETURN MOVLW D'100' MOVWF JSQ3 BSF LFMBZJC,LFMBZ GOTO MAIN ZILXM MOVLW D'100' MOVWF JSQ3 BSF LFMBZJC,LFMBZ RETURN ;--------------开关机按键处理---------------------------- KEYONOFF btfsc PORTB,KEY_ONOFF RETURN ;RA0为1返回 NOP btfsc PORTB,KEY_ONOFF RETURN ; CALL LXMCL ;BDSK btfss PORTB,KEY_ONOFF ; goto BDSK ; ;-----------开关机执行----------------------- DOONOFF btfsc ONBZ,ONOFFBZ goto LOOP ;RA0为1返回 bsf ONBZ,ONOFFBZ ;置开机标志为1 BSF GNXIZI,POWER_LED BSF GNXIZI,LED_GNL BSF PORTB,GNL BSF YUANXIZI,GNL BSF PORTA,FLZ call SPEEK CALL ZILXM RETURN ;-------------摇头功能键处理--------- KEYSW btfsc PORTB,KEY_SW return ;RA0为1返回 nop btfsc PORTB,KEY_SW return ;RA2为1返回 CALL LXMCL ;bddsbz btfss DSBZ,0 ; goto PDSKSW ;------------等待松开------------ ;PDSKSW1 call OUTWAIT ; call SHIJI ; btfss PORTB,KEY_SW ; goto PDSKSW1 ;--------------功能执行----------- DOSW btfss PORTB,SW goto SWON bcf PORTB,SW BCF YUANXIZI,SW BCF GNXIZI,LED_SW call SPEEK CALL ZILXM return ;----------------RB5置高H-------- SWON bsf PORTB,SW BSF YUANXIZI,SW BSF GNXIZI,LED_SW call SPEEK CALL ZILXM return ;--------------判断按键是否检开--------------- ;PDSKSW ; btfss PORTB,KEY_SW ; goto PDSKSW ;RA2为0返回 ; goto DOSW ;-------------档位功能键处理--------- KEYSPEED btfsc PORTB,KEY_SPEED return ;RA0为1返回 nop btfsc PORTB,KEY_SPEED return ;RA2为1返回 CALL LXMCL ;PDDSBZ_1 btfss DSBZ,0 ; goto PDSKSPEED ;------------等待松开------------ ;PDSKSPEED1 call OUTWAIT ; call SHIJI ; btfss PORTB,KEY_SPEED ; goto PDSKSPEED1 ;--------------功能执行----------- DOSPEED BTFSC YUANXIZI,GNL goto DOGNH BSF YUANXIZI,GNL BSF PORTB,GNL BSF GNXIZI,LED_GNL BCF GNXIZI,LED_GNH BCF PORTB,GNH BCF YUANXIZI,GNH call SPEEK CALL ZILXM return ;----------------RB5置高H-------- DOGNH bsf YUANXIZI,GNH BSF PORTB,GNH BSF GNXIZI,LED_GNH BCF GNXIZI,LED_GNL BCF PORTB,GNL BCF YUANXIZI,GNL call SPEEK CALL ZILXM return ;--------------判断按键是否检开--------------- ;PDSKSPEED ; btfss PORTB,KEY_SW ; goto PDSKSPEED ;RA2为0返回 ; goto DOSPEED ;----------定时键处理--------------------- KEYTIME btfsc PORTB,KEY_TIME return ;RA0为1返回 nop btfsc PORTB,KEY_TIME return ;RA1为1返回 CALL LXMCL ;PDDSBZT btfss DSBZ,0 ; goto PDDSSKT1 ;------------等待松开------------ ;PDDSSKT call OUTWAIT ; call SHIJI ; btfss PORTB,KEY_TIME ; goto PDDSSKT ;------------执行定时---------- DOTIME CALL SPEEK movlw H'0F' andwf SETTIME,0 xorlw H'0F' btfsc STATUS,Z goto QINGTIMEBZ ;-------------------------- bsf DSBZ,0 incf SETTIME,1 ;---按键处理完后,要清原来计数的寄存器值------ qinyuanjs clrf DSLANG clrf DSMES1 clrf DSMES2 CALL ZILXM RETURN ;--------------判断按键是否检开--------------- ;PDDSSKT1 ; btfss PORTB,KEY_TIME ; goto PDDSSKT1 ;RA2为0返回 ; goto DOTIME ;-------------显示处理---------------------- XIANSHICL BANKSEL TRISB MOVLW H'08' MOVWF TRISB BANKSEL PORTB NOP BSF PORTA,0 BSF PORTA,1 BTFSC ONBZ,XIANSHIBZ GOTO XIANSHICL_TIME MOVF GNXIZI,0 MOVLW H'F0' ANDWF GNXIZI,1 MOVLW H'0F' ANDWF YUANXIZI,1 MOVF GNXIZI,0 IORWF YUANXIZI,1 MOVLW H'0F' ANDWF PORTB,1 MOVF YUANXIZI,0 MOVWF PORTB BSF PORTA,0 BCF PORTA,1 CALL XIANSHIYANSI BSF ONBZ,XIANSHIBZ BANKSEL TRISB MOVLW H'F8' MOVWF TRISB BANKSEL PORTB return XIANSHICL_TIME MOVF SETTIME,0 MOVWF TIMEXIZI MOVF TIMEXIZI,0 SWAPF TIMEXIZI,1 MOVLW H'F0' ANDWF TIMEXIZI,1 MOVLW H'0F' ANDWF YUANXIZI,1 MOVF TIMEXIZI,0 IORWF YUANXIZI,1 MOVLW H'0F' ANDWF PORTB,1 MOVF YUANXIZI,0 MOVWF PORTB BSF PORTA,1 BCF PORTA,0 CALL XIANSHIYANSI BCF ONBZ,XIANSHIBZ BANKSEL TRISB MOVLW H'F8' MOVWF TRISB BANKSEL PORTB return GNXIANSHICL BANKSEL TRISB MOVLW H'08' MOVWF TRISB BANKSEL PORTB NOP BSF PORTA,0 BSF PORTA,1 MOVF GNXIZI,0 MOVLW H'F0' ANDWF GNXIZI,1 MOVLW H'0F' ANDWF YUANXIZI,1 MOVF GNXIZI,0 IORWF YUANXIZI,1 MOVLW H'0F' ANDWF PORTB,1 MOVF YUANXIZI,0 MOVWF PORTB BSF PORTA,0 BCF PORTA,1 RETURN SJXIANSHICL MOVF SETTIME,0 MOVWF TIMEXIZI MOVF TIMEXIZI,0 SWAPF TIMEXIZI,1 MOVLW H'F0' ANDWF TIMEXIZI,1 MOVLW H'0F' ANDWF YUANXIZI,1 MOVF TIMEXIZI,0 IORWF YUANXIZI,1 MOVLW H'0F' ANDWF PORTB,1 MOVF YUANXIZI,0 MOVWF PORTB BSF PORTA,1 BCF PORTA,0 RETURN ;----------------专门为主程序用不要声音的------------- ;-----------清定时标志---当按键按超出定时时,溢出不定时---------- QINGTIMEBZ clrf SETTIME clrf DSBZ clrf DSLANG clrf DSMES1 clrf DSMES2 CALL ZILXM return ;----------------------------------------- XIANSHIYANSI MOVLW D'10' MOVWF JSQ1 CALL OUTWAITMAIN CALL SHIJI DECFSZ JSQ1,1 GOTO $-3 RETURN ;遥控处理2 ;*************************************** RFCL CALL LXMCL RF1 BTFSC PORTB,RF RETURN BTFSC PORTB,RF RETURN WAITL BTFSC PORTB,RF GOTO RFOUT ;----------------0.520MS--- CALL SHIJI CALL GNXIANSHICL CALL OUTWAIT ;--------------------------- CALL SHIJI ;----------------------- EB1 BTFSS PORTB,RF GOTO SETZERO1 BSF BZH1,0 ;-------------------- EA1 CALL OUTWAIT ;------------------- CALL SHIJI ;------------------- EB11 BTFSS PORTB,RF GOTO SETZERO2 BSF BZH1,1 ;---------判断BZH1的值,是00则为1,是11则为0--- PD MOVLW B'00000011' ANDWF BZH1,1 MOVLW B'00000011' XORWF BZH1,0 BTFSC STATUS,Z GOTO ZIL
;-----判是否为110=1--- GOTO ZIH ;---------用于判断时的置数------ ZIL BCF BZH,0 GOTO ZISUO ZIH BSF BZH,0 ;----------置数----------- ZISUO MOVLW D'5' XORWF YFMLC,0 BTFSC STATUS,Z GOTO YFMHXH BTFSS BZH,0 GOTO BZZER0 RLF YFML,1 BSF YFML,0 YFMLYW CLRF BZH CLRF BZH1 INCF YFMLC,1 GOTO WAIT ;------------------- BZZER0 RLF YFML,1 BCF YFML,0 GOTO YFMLYW ;----------------------- YFMHXH ;----------------------- MOVLW D'7' XORWF YFMHC,0 BTFSC STATUS,Z GOTO ZIXING BTFSS BZH,0 GOTO BZZER01 RLF YFMH,1 BSF YFMH,0 YFMHYW CLRF BZH CLRF BZH1 INCF YFMHC,1 GOTO WAIT BZZER01 RLF YFMH,1 BCF YFMH,0 GOTO YFMHYW ;----------读数时判断值-------- SETZERO1 BCF BZH1,0 GOTO EA1 SETZERO2 BCF BZH1,1 GOTO PD ;---------ZIXING------- ZIXING PD1 MOVLW B'00011111' ANDWF YFML,1 MOVLW B'00011011' XORWF YFML,0 BTFSS STATUS,Z GOTO RFOUT BSF RFSPEEK,YKSPBZ keyzi ;------------------- MOVLW B'01111111' ANDWF YFMH,1 ;--------------------------- MOVLW B'00000001' XORWF YFMH,0 BTFSC STATUS,Z GOTO KEY0 ;---------------判是否开机---------- btfss ONBZ,0 goto RFOUT ;------------------------------ MOVLW B'00000010' XORWF YFMH,0 BTFSC STATUS,Z GOTO KEY1 ;------------------------------ MOVLW H'08' XORWF YFMH,0 BTFSC STATUS,Z GOTO KEY2 ;------------------------------ MOVLW H'10' XORWF YFMH,0 BTFSC STATUS,Z GOTO KEY3 GOTO RFOUT ;------------------------------ KEY0 call DOONOFF goto RFOUT KEY1 CALL DOSPEED goto RFOUT KEY2 CALL DOTIME goto RFOUT KEY3 CALL DOSW goto RFOUT ;------------------------------- WAIT CALL OUTWAIT MOVLW H'0D' MOVWF LS2 CF CALL SHIJI WAITH1 BTFSC PORTB,RF ;先判断为H GOTO WAITHH ;为H待L BTFSS INTCON,2 GOTO WAITH1 GOTO ZD ;指定周期内没有H中断一下,再判到到指定时间到 WAITHH BTFSS PORTB,RF ;等待L GOTO WAITL BTFSS INTCON,2 GOTO WAITHH ZD BTFSS DSBZ,0 GOTO JIAN INCF DSLANG,1 JIAN DECFSZ LS2,1 ;指定的时间内没有H L变化 则重新开始检测一下 GOTO CF CALL RFOUT1 MOVLW H'0D'; H'26' MOVWF LS2 ;------------------------- CF1 CALL SHIJI WAITH12 BTFSC PORTB,RF ;先检测有没有L,并等待H,在一个时苦内没有变化跳出,如果有变化则跳到H,如果是高, 说明已经复位了,则接收L GOTO WAITHH1 BTFSS INTCON,2 GOTO WAITH12 GOTO OUT WAITHH1 BTFSS PORTB,RF ;如果真为L 则认为是开始遥控值,一段时间仍为H,则跳出 GOTO WAITL BTFSS INTCON,2 GOTO WAITHH1 OUT BTFSS DSBZ,0 GOTO JIA2 INCF DSLANG,1 JIA2 DECFSZ LS2,1 GOTO CF1 ;--------------------------- RFOUT1 CLRF YFML CLRF YFMH CLRF YFMLC CLRF YFMHC CLRF BZH CLRF BZH1 RETURN RFOUT CLRF YFML CLRF YFMH CLRF YFMLC CLRF YFMHC CLRF BZH CLRF BZH1 BSF ONBZ,XIANSHIBZ CALL XIANSHICL CALL ZILXM RETURN ;------------0.52MS时基----4*(256-126)----------------- SHIJI bcf INTCON,2 movlw D'126' movwf TMR0 return ;------------中断等待-------------------------------- OUTWAIT btfss INTCON,2 goto OUTWAIT btfss DSBZ,0 return incf DSLANG,1 return ;--------------主中断---------------------------- OUTWAITMAIN btfss INTCON,2 goto TEXTRF BTFSC LFMBZJC,LFMBZ CALL LFMCL btfss DSBZ,0 return incf DSLANG,1 return TEXTRF btfss PORTB,RF call RFCL goto OUTWAITMAIN LFMCL DECFSZ JSQ3,1 RETURN BCF LFMBZJC,LFMBZ RETURN ;---------------------------------- SPEEK BTFSC RFSPEEK,YKSPBZ RETURN movlw H'5' movwf JSQ1 ys1a movlw d'30' movwf JSQ2 ys2a call spak decfsz JSQ2 goto ys2a decfsz JSQ1 goto ys1a return spak bsf PORTA,SPEK call SHIJI call SJXIANSHICL call OUTWAIT bcf PORTA,SPEK call SHIJI call GNXIANSHICL call OUTWAIT return ;-------------------- LOOPTOP CLRF PORTB BSF STATUS,5 MOVLW H'F8' MOVWF TRISB movlw H'00' movwf TRISA movlw H'01' movwf OPTION_REG bcf STATUS,5 ;-------------处理寄存器------------------- CLRF PORTB clrf PORTA BSF PORTA,0 BSF PORTA,1 clrf TMR0 clrf DSBZ clrf DSLANG clrf DSMES1 clrf DSMES2 clrf DSSET clrf ONBZ CLRF GNXIZI CLRF SETTIME CLRF YUANXIZI ;---------------------------------- CLRF YFML CLRF YFMH CLRF YFMLC CLRF YFMHC CLRF BZH CLRF BZH1 CLRF RFSJBZ CLRF LS2 clrf LS1 CLRF LFMBZJC CLRF JSQ3 CLRF RFSPEEK call SPEEK call SPEEK ;-----------主程序---------------------------- MAIN BSF PORTA,0 BSF PORTA,1 BANKSEL TRISB MOVLW H'F8' MOVWF TRISB BANKSEL PORTB NOP RFTOP btfss PORTB,RF call RFCL ;RA4遥控处理 ra0 btfss PORTB,KEY_ONOFF call KEYONOFF;RA0开关机处理 BZKBZ btfss ONBZ,ONOFFBZ ;开机标志为0则返回,开机标志为1往下执行 goto RFTOP ra2 btfss PORTB,KEY_SW call KEYSW ;RA2功能处理 ra1 btfss PORTB,KEY_SPEED call KEYSPEED ;RA1定时处理 TOPTIME BTFSS PORTB,KEY_TIME CALL KEYTIME CALL XIANSHICL CALL XIANSHICL BTFSC RFSPEEK,YKSPBZ CALL RFSPEEKCL PDDSBZ_TOP btfss DSBZ,0 goto MAIN ;------------等待中断-------------- call OUTWAITMAIN ;------------恢复定时------------ call SHIJI ;-----------判断是否到192 192*10*520=998400US=0.998S---- movlw d'148' ;D'192' subwf DSLANG,0 btfss STATUS,C goto MAIN ;---------判断是否到10*192--------------------------- btfss STATUS,Z NOP clrf DSLANG movlw d'10' ;本来为10 xorwf DSMES1,0 btfss STATUS,Z goto JIANDSMES1 ;---------------判断寄存器是否到了60S---------- clrf DSMES1 movlw d'60' ;本来为60 xorwf DSMES2,0 btfss STATUS,Z goto JIANDSMES2 ;--------------定时标志寄存器-1------------ clrf DSMES2 decfsz SETTIME,1 goto MAIN goto LOOP ;------------定时减去时的指示显示----------- ;-------------定时存贮1加1 (10)--------- JIANDSMES1 incf DSMES1,1 goto MAIN ;-------------定时存贮1加1(60s)--------- JIANDSMES2 incf DSMES2,1 goto MAIN RFSPEEKCL CALL GNXIANSHICL BCF RFSPEEK,YKSPBZ CALL SPEEK RETURN end
|