|
/script> ;************************************** list p=16f84A include "P16F84A.INC" ;******************************************************************* LIST P=16F84A,R=DEC ;定義器件為16F84,默認(rèn)數(shù)制為十進(jìn)制 ;------------------------------------------------------- __CONFIG B'11111111110001';_CP_OFF&_WDT_OFF&_PWRITE_ON&_XT_OSC ;沒(méi)有代碼保護(hù) ;看門(mén)狗關(guān)閉 ;上電廷時(shí)器開(kāi)啟 ;振蕩器模式為XT ;----------RA4遙控輸入 RA0開(kāi)機(jī)按鍵 RA2功能鍵 RA1定時(shí)鍵----- ;************變量定義****************** 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 ;定時(shí)打開(kāi)標(biāo)志 DSLANG EQU 31h ;累加長(zhǎng)時(shí)間定時(shí)寄存器 DSMES1 EQU 32h ;定時(shí)秒寄存器1 DSMES2 EQU 33h ;定時(shí)秒寄存器2 DSMIN EQU 34h ;定時(shí)分寄存器 DSSET EQU 35h ;設(shè)置定時(shí)寄存器 ONBZ EQU 36h ;開(kāi)機(jī)標(biāo)志 LS1 EQU 38h ;臨時(shí)寄存器 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 ;--------------連續(xù)碼處理---------------- 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 ;--------------開(kāi)關(guān)機(jī)按鍵處理---------------------------- KEYONOFF btfsc PORTB,KEY_ONOFF RETURN ;RA0為1返回 NOP btfsc PORTB,KEY_ONOFF RETURN ; CALL LXMCL ;BDSK btfss PORTB,KEY_ONOFF ; goto BDSK ; ;-----------開(kāi)關(guān)機(jī)執(zhí)行----------------------- DOONOFF btfsc ONBZ,ONOFFBZ goto LOOP ;RA0為1返回 bsf ONBZ,ONOFFBZ ;置開(kāi)機(jī)標(biāo)志為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 ;------------等待松開(kāi)------------ ;PDSKSW1 call OUTWAIT ; call SHIJI ; btfss PORTB,KEY_SW ; goto PDSKSW1 ;--------------功能執(zhí)行----------- 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 ;--------------判斷按鍵是否檢開(kāi)--------------- ;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 ;------------等待松開(kāi)------------ ;PDSKSPEED1 call OUTWAIT ; call SHIJI ; btfss PORTB,KEY_SPEED ; goto PDSKSPEED1 ;--------------功能執(zhí)行----------- 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 ;--------------判斷按鍵是否檢開(kāi)--------------- ;PDSKSPEED ; btfss PORTB,KEY_SW ; goto PDSKSPEED ;RA2為0返回 ; goto DOSPEED ;----------定時(shí)鍵處理--------------------- KEYTIME btfsc PORTB,KEY_TIME return ;RA0為1返回 nop btfsc PORTB,KEY_TIME return ;RA1為1返回 CALL LXMCL ;PDDSBZT btfss DSBZ,0 ; goto PDDSSKT1 ;------------等待松開(kāi)------------ ;PDDSSKT call OUTWAIT ; call SHIJI ; btfss PORTB,KEY_TIME ; goto PDDSSKT ;------------執(zhí)行定時(shí)---------- DOTIME CALL SPEEK movlw H'0F' andwf SETTIME,0 xorlw H'0F' btfsc STATUS,Z goto QINGTIMEBZ ;-------------------------- bsf DSBZ,0 incf SETTIME,1 ;---按鍵處理完后,要清原來(lái)計(jì)數(shù)的寄存器值------ qinyuanjs clrf DSLANG clrf DSMES1 clrf DSMES2 CALL ZILXM RETURN ;--------------判斷按鍵是否檢開(kāi)--------------- ;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 ;----------------專(zhuān)門(mén)為主程序用不要聲音的------------- ;-----------清定時(shí)標(biāo)志---當(dāng)按鍵按超出定時(shí)時(shí),溢出不定時(shí)---------- 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 ;---------用于判斷時(shí)的置數(shù)------ ZIL BCF BZH,0 GOTO ZISUO ZIH BSF BZH,0 ;----------置數(shù)----------- 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 ;----------讀數(shù)時(shí)判斷值-------- 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 ;---------------判是否開(kāi)機(jī)---------- 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 ;指定周期內(nèi)沒(méi)有H中斷一下,再判到到指定時(shí)間到 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 ;指定的時(shí)間內(nèi)沒(méi)有H L變化 則重新開(kāi)始檢測(cè)一下 GOTO CF CALL RFOUT1 MOVLW H'0D'; H'26' MOVWF LS2 ;------------------------- CF1 CALL SHIJI WAITH12 BTFSC PORTB,RF ;先檢測(cè)有沒(méi)有L,并等待H,在一個(gè)時(shí)苦內(nèi)沒(méi)有變化跳出,如果有變化則跳到H,如果是高, 說(shuō)明已經(jīng)復(fù)位了,則接收L GOTO WAITHH1 BTFSS INTCON,2 GOTO WAITH12 GOTO OUT WAITHH1 BTFSS PORTB,RF ;如果真為L(zhǎng) 則認(rèn)為是開(kāi)始遙控值,一段時(shí)間仍為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時(shí)基----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開(kāi)關(guān)機(jī)處理 BZKBZ btfss ONBZ,ONOFFBZ ;開(kāi)機(jī)標(biāo)志為0則返回,開(kāi)機(jī)標(biāo)志為1往下執(zhí)行 goto RFTOP ra2 btfss PORTB,KEY_SW call KEYSW ;RA2功能處理 ra1 btfss PORTB,KEY_SPEED call KEYSPEED ;RA1定時(shí)處理 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 ;------------恢復(fù)定時(shí)------------ 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' ;本來(lái)為10 xorwf DSMES1,0 btfss STATUS,Z goto JIANDSMES1 ;---------------判斷寄存器是否到了60S---------- clrf DSMES1 movlw d'60' ;本來(lái)為60 xorwf DSMES2,0 btfss STATUS,Z goto JIANDSMES2 ;--------------定時(shí)標(biāo)志寄存器-1------------ clrf DSMES2 decfsz SETTIME,1 goto MAIN goto LOOP ;------------定時(shí)減去時(shí)的指示顯示----------- ;-------------定時(shí)存貯1加1 (10)--------- JIANDSMES1 incf DSMES1,1 goto MAIN ;-------------定時(shí)存貯1加1(60s)--------- JIANDSMES2 incf DSMES2,1 goto MAIN RFSPEEKCL CALL GNXIANSHICL BCF RFSPEEK,YKSPBZ CALL SPEEK RETURN end
|