irpreset: ;リモコンデータのプリセット clr irdatai irpreset1: lpmtab ledtab,irdatai sbrc r0,0 sbi PORTB,0 ;LED消灯 sbrs r0,0 cbi PORTB,0 ;LED点灯 mov acc,r0 cbr acc,1 ;bit0=0 out PORTD,acc ;LED点灯 mvi cntr1,200 irpreset3: rcall t_10ms jbis pSW_P,SW_P,irpreset4;~|__|~ SW_PoffならIR設定 djnz cntr1,irpreset3 mvi r17,NIR tst irdatai bnz irpreset0 ;SW_P 2sec on eori opmode,1 ;alternate MANUAL(0)/AUTO(1) mov acc,opmode goto irpreset6 irpreset0: mov nnir,irdatai ;nnir設定 inc nnir inc r17 mov acc,nnir irpreset6: rcall EEwrite rcall beep goto irpreset5 irpreset4: rcall t_50ms ;SW_P off時のチャタリング吸収 irpreset2: cbic pIRIN,IRIN,irsetrx ;IR入力なら rcall irsetrx jbis pSW_P,SW_P,irpreset2;~|__|~~|_ SW_P onまで待つ inc irdatai jlti irdatai,NIR,irpreset1 ;NIR個終了? irpreset5: outi PORTD,0x07e ;LED消灯 sbi PORTB,0 ;LED消灯 rcall t_50ms ;SW_P on時のチャタリング吸収 wbc pSW_P,SW_P ;~|__|~ SW_Poffまで待つ rcall t_50ms ;SW_Poff時のチャタリング吸収 ret irsetrx: rcall irrxj sbrc ttlcnt,7 ;エラーなら ret ret ldiw X,irtab add XL,irdatai brcc PC+2 inc XH st X,irdataj ;[irtab+irdatai]=irdataj mov r17,irdatai mov acc,irdataj rcall EEWrite rcall t_500ms ret irtab_restore: ldiw X,irtab clr r17 irtab_restore1: rcall EERead mov acc,r0 blti acc,(irtab_end-irtab_start)/5*2,irtab_restore2 mov r0,r17 irtab_restore2: st X+,r0 inc r17 blti r17,NIR,irtab_restore1 rcall EERead mov opmode,r0 mov acc,r0 beqi acc,1,flagset clr opmode ;if(opmode!=1) opmode=0 flagset: inc r17 rcall EERead mov acc,r0 beqi acc,0,irtab_restore3 bgti acc,8,irtab_restore3 mov nnir,acc ret irtab_restore3: mvi nnir,NIR ;if(nnir==0 || nnir>NIR) nnir=NIR ret EEWrite: ;write acc at address r17 wbs EECR,EEWE ;while(EEWE==1); out EEAR,r17 ;EEAR=r17(address) out EEDR,acc ;EEDR=acc(data) sbi EECR,EEMWE ;EECR.EEMWE=1 sbi EECR,EEWE ;EECR.EEWE=1 ret EERead: wbs EECR,EEWE ;while(EECR.EEWE==1); out EEAR,r17 ;EEAR=r17(address) sbi EECR,EERE ;EECR.EERE=1 in r0,EEDR ;r0=EEDR(data) ret EEWrite_seq: ;inc address and write wbs EECR,EEWE ;while(EECR.EEWE==1); incio EEAR ;EEAR++ out EEDR,acc ;EEDR=acc(data) sbi EECR,EEMWE ;EECR.EEMWE=1 sbi EECR,EEWE ;EECR.EEWE=1 ret EERead_seq: ;inc address stored in EEAR and reads into r0 wbs EECR,EEWE ;while(EECR.EEWE==1); incio EEAR ;EEAR++ sbi EECR,EERE ;EECR.EERE=1 in r0,EEDR ;r0=EEDR(data) ret