irpreset: ;リモコンデータのプリセット clrf irdatai irpreset1: movf irdatai,W ;W=irdatai call ledtab movwf PORTB ;LED点灯 mvi cntr1,200 irpreset3: call t_10ms jbs PORTB,SW_P,irpreset4 ;~|__|~ SW_PoffならIR設定 djnz cntr1,irpreset3 mvi EEADR,NIR movf irdatai,W ;SW_P 2sec on jnz irpreset0 movlw 1 ;alternate MANUAL(0)/AUTO(1) xorwf opmode,F mov EEDATA,opmode goto irpreset6 irpreset0: movwf nnir ;nnir設定 incf nnir,F incf EEADR,F mov EEDATA,nnir irpreset6: call EEwrite call beep goto irpreset5 irpreset4: call t_50ms ;SW_P off時のチャタリング吸収 irpreset2: cbc PORTA,IRIN,irsetrx ;IR入力なら call irsetrx jbs PORTB,SW_P,irpreset2;~|__|~~|_ SW_P onまで待つ incf irdatai,F jlt irdatai,NIR,irpreset1 ;NIR個終了? irpreset5: mvi PORTB,0xff ;LED消灯 call t_50ms ;SW_P on時のチャタリング吸収 wbc PORTB,SW_P ;~|__|~ SW_Poffまで待つ call t_50ms ;SW_Poff時のチャタリング吸収 return irsetrx: call irrxj rbs ttlcnt,7 ;エラーなら return mvi FSR,irtab movf irdatai,W addwf FSR,F ;FSR=irtab+irdatai mov INDF,irdataj ;[FSR]=irdataj mov EEADR,irdatai mov EEDATA,irdataj call EEwrite call t_500ms return irtab_restore: mvi FSR,irtab clrf EEADR _irtab_restore1: call EEread movwf INDF jlt INDF,(irtab_end-irtab_start)/5,_irtab_restore2 mov INDF,EEADR _irtab_restore2: incf FSR,F incf EEADR,F jlt EEADR,NIR,_irtab_restore1 call EEread movwf opmode decfsz opmode,W clrf opmode ;if(opmode!=1) opmode=0 incf EEADR,F call EEread movwf nnir jz irtab_restore3 rle nnir,NIR irtab_restore3: mvi nnir,NIR ;if(nnir==0 || nnir>NIR) nnir=NIR return EEwrite: bsf STATUS,RP0 bcf EECON1,EEIF bsf EECON1,WREN ;enable write mvi EECON2,0x55 mvi EECON2,0xaa bsf EECON1,WR wbc EECON1,EEIF ;wait for write bcf EECON1,WREN ;disable write bcf STATUS,RP0 return EEread: bsf STATUS,RP0 bsf EECON1,RD ;EE read sequence bcf STATUS,RP0 movf EEDATA,W ;move data into W return