list p=16F84,f=INHX8M include "p16f84.inc" ; __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC NIR equ 8 ;IRデータの個数(MAX) RXDLEN equ 6 ;rxdの長さ IROUT equ 0 IRIN equ 4 SW_T equ 3 SW_P equ 7 BZZport equ PORTA BZZ equ 02h TS equ 152 ;TS/152(sec)...6.5536ms(25.6us*256)*152=1s cblock 0ch cntr1,cntr2,cntr3,buf1,buf2,buf3,tonecnt,repcnt,ttlcnt,rxdcnt,rxdbuf irmode_pntr,irmode,nnir,opmode, TMR0h,irtab_pntr,r17,r18 rxd,rxd1,rxd2,rxd3,rxd4,rxd5, irdatai,irdataj irtab,_irtab1,_irtab2,_irtab3,_irtab4,_irtab5,_irtab6,_irtab7 endc org 0 goto reset org 04h incf TMR0h,F ;25.6us x 256=6.5536ms bcf INTCON,T0IF retfie include "piclib.asm" ledtab: clrf PCLATH addwf PCL,F retlw10 0x79,0x24,0x30,0x19,0x12,0x02,0x58,0x00,0x10,0x40 tonetab: clrf PCLATH addwf PCL,F retlw8 75, 67, 59, 56, 50, 44, 40, 37 ; 1911.1, 1702.6, 1516.8, 1431.7, 1275.5, 1136.4, 1012.4, 955.6(us) ; 523.25, 587.33, 659.26, 698.46, 783.99, 880.00, 987.77, 1046.50(Hz) include "picrxlib.asm" include "pictxlib.asm" include "pictxset.asm" reset: set_tris 0x1c,0x80,0x05 ;PORTA:xxxiiioo,PORTB:iooooooo,PBpu,64(25.6us) main0: bsf PORTA,0 ;IRout=1(off) bcf PORTA,1 ;BZZ=0 mvi PORTB,0x7f ;LED消灯 call t_100ms call irtab_restore ;プリセット情報を復元 bsf INTCON,GIE bcf INTCON,T0IE ;Disable TMR0 overflow int main: cbc PORTB,SW_P,irpreset ;SW_Pon~|_なら call irpreset jbc PORTA,SW_T,main clrf irdatai ;irdatai=0 irscantx1: cbs opmode,0,beep ;manual mode なら call beep call waitSW_Toff ;SW_T offを待つ mvi cntr2,3 ;manualの場合は3secで終了 clrf3 buf1,TMR0h,TMR0 ;(TMR0h TMR0)=0 bcf INTCON,T0IF ;Clear TMR0 overflow flag bsf INTCON,T0IE ;Enable TMR0 overflow int movf irdatai,W ;W=irdatai call ledtab movwf PORTB ;LED点灯 movf irdatai,W ;W=irdatai call tonetab movwf tonecnt ;set tonecnt movwf cntr1 ;set cntr1 irloop: movf TMR0,W ;W=TMR0 xorwf buf1,W jz irloop ;25.6us sync mov buf1,TMR0 ;TMR0buf=TMR0 djnz cntr1,irscantx2 mov cntr1,tonecnt movlw BZZ xorwf PORTA,F ;alternate BZZ irscantx2: jbc opmode,0,autoscan jbs PORTA,SW_T,irscantx3;if(SW_T on) goto irscantx3 jlt TMR0h,TS,irloop ;if(TMR0<1sec) goto irloop clrf TMR0h ;1sec sync djnz cntr2,irloop goto main0 ;3sec timeout irscantx3: mvi cntr2,250 ;750ms valid irscantx4: mvi cntr1,19 ;57ms irscantx5: call t_1ms call t_1ms call t_1ms djnz cntr2,irscantx6 irsend: ;750ms timeout call irdata_set ;データセット call irtime_set ;時定数セット mov cntr3,repcnt repsendn: call irdata_set ;データセット call irtx ;repcnt回リピート送信 djnz cntr3,repsendn call beep call waitSW_Toff ;SW_T offを待つ goto main0 irscantx6: jbs PORTA,SW_T,irscantx4 djnz cntr1,irscantx5 goto irnext ;57ms timeout autoscan: jbs PORTA,SW_T,irsend ;if(SW_T on) goto irsend jlt TMR0h,TS,irloop ;if(TMR0<1sec) goto irloop irnext: incf irdatai,F jltf irdatai,nnir,irscantx1 ;if(irdatai