;RA-5故障対応+画面オフ対応+決定ボタン対応+マクロ実行中キャンセル対応版 ;------------------------------------------------------------------------ ; ; アクオス・シリアル/赤外線・コントローラ ; OFF-(ON)タイプ・スイッチ用 ; ボタン数14個 ; ;赤外線送信ルーチンの著作権はRUU氏(http://www.mars.dti.ne.jp/~ogura/)に帰属します ;------------------------------------------------------------------------ errorlevel -205 ; Suppress message 205 errorlevel -207 ; Suppress message 207 errorlevel -302 ; Suppress message 302 errorlevel -305 ; Suppress message 305 list p=PIC16F88 include CB = _CP_OFF CB &= _DEBUG_OFF CB &= _WRT_PROTECT_OFF CB &= _CPD_OFF CB &= _LVP_OFF CB &= _BODEN_OFF CB &= _MCLR_OFF CB &= _PWRTE_OFF CB &= _WDT_ON CB &= _INTRC_IO __CONFIG _CONFIG1,CB __CONFIG _CONFIG2,_IESO_OFF & _FCMEN_OFF ;--------------------------------------------------------------------------- ; PIN Assign ; RA-0 SelectPC PC選択 serial ;; RA-1 SelectTV TV選択 serial ; RA-1 Enter 決定 ; RA-2 GAna 地上A ; RA-3 GDigi 地上D ; RA-4 BS BS ;; RA-5 Power 電源 ; RA-5 nc(ポート故障の為) ; RA-6 (Software)USART TX ; RA-7 ChDown 選局Down ; RB-0 IR_OUT ; RB-1 ChUp 選局Up ; RB-2 VolUp 音量大 ;; RB-3 ProSche 番組表 ; RB-3 OffScreenSecond 電源ON後、2回目の画面オフ ; RB-4 Mute 消音 ;; RB-5 Okonomi2 Okonomi2(Bs hi) serial ; RB-5 Power 電源(RA-5故障の為、RA-5から引越し) ;; RB-6 Okonomi1 Okonomi1(QVC) serial ; RB-6 OffScreenFirst 電源ON後、1回目の画面オフ ; RB-7 VolDown 音量小 ; Sub Routines ; SubCmdSelectPC serial ;; SubCmdSelectTV serial ; SubCmdEnter ; SubCmdGAna ; SubCmdGDigi ; SubCmdBS ;; SubCmdPower ; SubCmdChDown ; SubCmdChUp ; SubCmdVolUp ;; SubCmdProSche ; SubCmdOffScreenSecond ; SubCmdMute ;; SubCmdOkonomi2 serial ; SubCmdPower ;; SubCmdOkonomi1 serial ; SubCmdOffScreenFirst ; SubCmdVolDown ; SubInitIR ; SEND_DATA RUUさんの学習リモコンから持ってきた上で小改造 ; SEND_BIT RUUさんの学習リモコンから持ってきた上で小改造 ; WAIT_CARRIER RUUさんの学習リモコンから持ってきた上で小改造 ; rs1tx ELECTRONICS SHELVESから入手 ; WAIT_15MS やまもっちのお部屋で入手したPICのWAIT計算機で自動生成 ; WAIT_75MS やまもっちのお部屋で入手したPICのWAIT計算機で自動生成 ;--------------------------------------------------------------------------- ; Declaration ;--------------------------------------------------------------------------- ;btime equ 53h ;9600bps 10MHz 時のウエイトタイム ;btime equ 1fh ;9600bps 4MHz 時のウエイトタイム btime equ 42h ;9600bps 8MHz 時のウェイトタイム ;btime equ 28h ;19200bps 10MHz 時のウエイトタイム ;btime equ 0eh ;19200bps 4MHz 時のウエイトタイム RA_PATN_0 equ b'11111110' RA_PATN_1 equ b'11111101' RA_PATN_2 equ b'11111011' RA_PATN_3 equ b'11110111' RA_PATN_4 equ b'11101111' ;RA_PATN_5 equ b'11011111' RA_PATN_7 equ b'01111111' RB_PATN_1 equ b'11111101' RB_PATN_2 equ b'11111011' RB_PATN_3 equ b'11110111' RB_PATN_4 equ b'11101111' RB_PATN_5 equ b'11011111' RB_PATN_6 equ b'10111111' RB_PATN_7 equ b'01111111' #define rs1txb PORTA,6 ;RS-232C データ出力用ポート (PORTA,6) #define IR_OUT PORTB,0 ; 赤外線出力ピン BUF_ADR SET H'24' ; バッファアドレス CBLOCK H'20' ;; データメモリ(SAVE/LOAD対象分) BIT_LEN ; データビット総数 START_HI ; 以下、リモコンデータ各Hi/Lo長カウンタ START_LO STOP_HI DATA_BUF ; リモコンデータ本体 (adr=24hから6bytes) DATA_BUF1,DATA_BUF2,DATA_BUF3,DATA_BUF4,DATA_BUF5 ;; データメモリ(その他) CNT ; カウンタ(汎用) WORK ; いろいろつかう WORK2 ; 〃 BIT_CNT ; リモコンデータbitカウンタ HI_1 ; 以下、ビット送信インタフェース HI_0 LO_1 LO_0 HI_TIME LO_TIME rs ;ビットタイムの作業用 cn ;8ビットシフトの作業用 txd ;送信データ IOBUFA IOBUFB TMPBUFA TMPBUFB FLGS ; (<0>flg_a, <1>flg_b, <2>flg_c) @WAIT1 @WAIT1_IN @WAIT2 @WAIT2_IN @WAIT3 @WAIT3_IN W_SAVE STATUS_SAVE ENDC #define flg_a FLGS,0 #define flg_b FLGS,1 #define flg_c FLGS,2 org h'0' goto Init ;--------------------------------------------------------------------------- ; Interrupt Routin ;--------------------------------------------------------------------------- org h'4' movwf W_SAVE ; Copy W to TEMP register swapf STATUS,W ; Swap status to be saved into W clrf STATUS ; bank 0, regardless of current bank, Clears IRP,RP1,RP0 movwf STATUS_SAVE ; Save status to bank zero STATUS_SAVE register movf PORTB,W ; PORTB変化割り込みの為に追加 bcf INTCON,RBIF ; PORTB 変化割込みフラグクリア ; ↓この辺はPIC16F84との互換性を重視したPIC16F88ならではの処理と言えるでしょう。 ; もっと新しいチップなら、変化割り込み対象ポートをマスクするレジスタが用意されていて、 ; このようにソフトウェアでフィルタリングする必要はありません。 ; あと、そもそも論を言えば、最初から変化割り込みを利用することを考慮してボタンとポート ; との関係を決めておけばPIC16F88でもソフトウェアでフィルタリングする必要はありません。 ; PORTB6は画面オフマクロに割り当てられているから除外する必要がある movlw b'10110000' movwf TMPBUFB ; PORTB<4-5,7>が何も押されていない状態と等しくなるように初期化 movf PORTB,W andlw b'10110000' ; WREGISTERをPORTB<4-5,7>だけにする xorwf TMPBUFB,W btfss STATUS,Z bsf flg_c ; 差異があり何か押されている場合 swapf STATUS_SAVE,W ; Swap STATUS_SAVE register into W movwf STATUS ; Move W into STATUS register swapf W_SAVE,F ; Swap W_SAVE swapf W_SAVE,W ; Swap W_SAVE into W retfie ;-------------------------------------------- ; Init ;-------------------------------------------- ;---------------------------- ; Initialize PIC16F88 ;---------------------------- Init bsf STATUS,RP0 ; Bank 1 movlw b'01110010' ; INT OSC 8Mhz movwf OSCCON ; movlw b'00000000' movwf ANSEL ; Digital I/O movlw b'00000111' movwf CMCON ; Comparator Off(Default) movlw b'01111111' ; Pull-up enabled movwf OPTION_REG movlw b'10111111' movwf TRISA movlw b'11111110' movwf TRISB bcf STATUS,RP0 ; Bank 0 bsf STATUS,RP1 ; Bank 2 movlw b'00010111' movwf WDTCON clrwdt bcf STATUS,RP1 ; Bank 0 ; Serial Port Initialize bsf rs1txb movlw b'11111111' movwf IOBUFA movwf IOBUFB ; bcf IR_OUT ; 吸込みへの変更に伴い下行を使用 bsf IR_OUT call SubInitIR bsf INTCON,GIE ; 全体割り込みの許可 ;----------------------------------- ; Main Loop ;----------------------------------- MAIN_LOOP clrwdt ; RA-5を使わなくなったので復活 clrf FLGS movf PORTA,W iorlw b'01000000' movwf TMPBUFA ; TMPBUFAに保存 xorwf IOBUFA,W btfss STATUS,Z bsf flg_a ; 前回と変わっていればフラグON movf PORTB,W iorlw b'00000001' movwf TMPBUFB ; TMPBUFBに保存 xorwf IOBUFB,W btfss STATUS,Z bsf flg_b ; 前回と変わっていればフラグON movf FLGS,F btfsc STATUS,Z goto MAIN_LOOP ; 前回と変わっていなければ戻る movf FLGS,W xorlw b'00000011' btfsc STATUS,Z goto MAIN_LOOP ; PORTA側,PORTB側双方で押下されていれば戻る call WAIT_15MS ; スイッチに合わせて調整の余地あり movf PORTA,W iorlw b'01000000' xorwf TMPBUFA,W btfss STATUS,Z goto MAIN_LOOP ; 違っていれば戻る movf PORTB,W iorlw b'00000001' xorwf TMPBUFB,W btfss STATUS,Z goto MAIN_LOOP ; 違っていれば戻る movf TMPBUFA,W movwf IOBUFA ; IOBUFAに保存 movf TMPBUFB,W movwf IOBUFB ; IOBUFBに保存 movf IOBUFA,W xorlw RA_PATN_0 btfss STATUS,Z goto $+3 call SubCmdSelectPC goto MAIN_LOOP movf IOBUFA,W xorlw RA_PATN_1 btfss STATUS,Z goto $+3 ; call SubCmdSelectTV call SubCmdEnter goto MAIN_LOOP movf IOBUFA,W xorlw RA_PATN_2 btfss STATUS,Z goto $+3 call SubCmdGAna goto MAIN_LOOP movf IOBUFA,W xorlw RA_PATN_3 btfss STATUS,Z goto $+3 call SubCmdGDigi goto MAIN_LOOP movf IOBUFA,W xorlw RA_PATN_4 btfss STATUS,Z goto $+3 call SubCmdBS goto MAIN_LOOP ; movf IOBUFA,W ; xorlw RA_PATN_5 ; btfss STATUS,Z ; goto $+3 ; call SubCmdPower ; goto MAIN_LOOP ; movf IOBUFA,W xorlw RA_PATN_7 btfss STATUS,Z goto $+3 call SubCmdChDown goto MAIN_LOOP movf IOBUFB,W xorlw RB_PATN_1 btfss STATUS,Z goto $+3 call SubCmdChUp goto MAIN_LOOP movf IOBUFB,W xorlw RB_PATN_2 btfss STATUS,Z goto $+3 call SubCmdVolUp goto MAIN_LOOP movf IOBUFB,W xorlw RB_PATN_3 btfss STATUS,Z goto $+3 ; call SubCmdProSche call SubCmdOffScreenSecond goto MAIN_LOOP movf IOBUFB,W xorlw RB_PATN_4 btfss STATUS,Z goto $+3 call SubCmdMute goto MAIN_LOOP movf IOBUFB,W xorlw RB_PATN_5 btfss STATUS,Z goto $+3 ; call SubCmdOkonomi2 call SubCmdPower goto MAIN_LOOP movf IOBUFB,W xorlw RB_PATN_6 btfss STATUS,Z goto $+3 ; call SubCmdOkonomi1 call SubCmdOffScreenFirst goto MAIN_LOOP movf IOBUFB,W xorlw RB_PATN_7 btfss STATUS,Z goto $+3 call SubCmdVolDown goto MAIN_LOOP goto MAIN_LOOP ;-------------------------------------------- ; Sub Routines ;-------------------------------------------- ;-------------------------------------------- ;PC選択 ;-------------------------------------------- SubCmdSelectPC movlw 'I' call rs1tx movlw 'A' call rs1tx movlw 'V' call rs1tx movlw 'D' call rs1tx movlw '5' call rs1tx movlw ' ' call rs1tx movlw ' ' call rs1tx movlw ' ' call rs1tx movlw h'0d' call rs1tx return ;-------------------------------------------- ;TV選択 ;-------------------------------------------- SubCmdSelectTV movlw 'I' call rs1tx movlw 'T' call rs1tx movlw 'V' call rs1tx movlw 'D' call rs1tx movlw ' ' call rs1tx movlw ' ' call rs1tx movlw ' ' call rs1tx movlw ' ' call rs1tx movlw h'0d' call rs1tx return ;-------------------------------------------- ;地上A ;-------------------------------------------- SubCmdGAna movlw b'01110001' movwf DATA_BUF4 movlw b'01001111' movwf DATA_BUF5 call SEND_DATA_SUB return ;-------------------------------------------- ;地上D ;-------------------------------------------- SubCmdGDigi movlw b'10010001' movwf DATA_BUF4 movlw b'01000001' movwf DATA_BUF5 call SEND_DATA_SUB return ;-------------------------------------------- ;BS ;-------------------------------------------- SubCmdBS movlw b'01010001' movwf DATA_BUF4 movlw b'01001101' movwf DATA_BUF5 call SEND_DATA_SUB return ;-------------------------------------------- ;電源(トグル) ;-------------------------------------------- SubCmdPower movlw b'01101000' movwf DATA_BUF4 movlw b'10001011' movwf DATA_BUF5 call SEND_DATA return ;-------------------------------------------- ;選局DOWN ;-------------------------------------------- SubCmdChDown movlw b'01001000' movwf DATA_BUF4 movlw b'10001001' movwf DATA_BUF5 call SEND_DATA_SUB return ;-------------------------------------------- ;選局UP ;-------------------------------------------- SubCmdChUp movlw b'10001000' movwf DATA_BUF4 movlw b'10000101' movwf DATA_BUF5 call SEND_DATA_SUB return ;-------------------------------------------- ;音量UP ;-------------------------------------------- SubCmdVolUp movlw b'00101000' movwf DATA_BUF4 movlw b'10001111' movwf DATA_BUF5 call SEND_DATA_SUB return ;-------------------------------------------- ;番組表(トグル) ;-------------------------------------------- SubCmdProSche movlw b'00000110' movwf DATA_BUF4 movlw b'01001111' movwf DATA_BUF5 call SEND_DATA_SUB return ;-------------------------------------------- ;消音(トグル) ;-------------------------------------------- SubCmdMute movlw b'11101000' movwf DATA_BUF4 movlw b'10000011' movwf DATA_BUF5 call SEND_DATA_SUB return ;-------------------------------------------- ;お好みチャンネル2 ;-------------------------------------------- SubCmdOkonomi2 movlw 'C' call rs1tx movlw 'B' call rs1tx movlw 'S' call rs1tx movlw 'D' call rs1tx movlw '1' call rs1tx movlw '0' call rs1tx movlw '3' call rs1tx movlw ' ' call rs1tx movlw h'0d' call rs1tx return ;-------------------------------------------- ;お好みチャンネル1 ;-------------------------------------------- SubCmdOkonomi1 movlw 'C' call rs1tx movlw 'B' call rs1tx movlw 'S' call rs1tx movlw 'D' call rs1tx movlw '2' call rs1tx movlw '2' call rs1tx movlw '2' call rs1tx movlw ' ' call rs1tx movlw h'0d' call rs1tx return ;-------------------------------------------- ;音量DOWN ;-------------------------------------------- SubCmdVolDown movlw b'10101000' movwf DATA_BUF4 movlw b'10000111' movwf DATA_BUF5 call SEND_DATA_SUB return ;-------------------------------------------- ;電源ON後、1回目の画面オフ ;-------------------------------------------- SubCmdOffScreenFirst call SubCmdMenu ; メニュー bsf INTCON,RBIE ; マクロ実行中キャンセル用にPORTBの変化割込みをenable call WAIT_900MS ; コマンドの連続を可能とする為に追加 bcf INTCON,RBIE ; PORTBの変化割込みをdisable btfss flg_c goto $+3 call SubCmdMenu ; メニュー(メニューを消す) return call SubCmdRight ; 右 bsf INTCON,RBIE ; マクロ実行中キャンセル用にPORTBの変化割込みをenable call WAIT_900MS ; コマンドの連続を可能とする為に追加 bcf INTCON,RBIE ; PORTBの変化割込みをdisable btfss flg_c goto $+5 call SubCmdLeft ; 左(メニュー・タブの位置を元に戻す為) call WAIT_900MS ; コマンドの連続を可能とする為に追加 call SubCmdMenu ; メニュー(メニューを消す) return call SubCmdRight ; 右 bsf INTCON,RBIE ; マクロ実行中キャンセル用にPORTBの変化割込みをenable call WAIT_900MS ; コマンドの連続を可能とする為に追加 bcf INTCON,RBIE ; PORTBの変化割込みをdisable btfss flg_c goto $+7 call SubCmdLeft ; 左(メニュー・タブの位置を元に戻す為) call WAIT_900MS ; コマンドの連続を可能とする為に追加 call SubCmdLeft ; 左(メニュー・タブの位置を元に戻す為) call WAIT_900MS ; コマンドの連続を可能とする為に追加 call SubCmdMenu ; メニュー(メニューを消す) return call SubCmdRight ; 右 bsf INTCON,RBIE ; マクロ実行中キャンセル用にPORTBの変化割込みをenable call WAIT_900MS ; コマンドの連続を可能とする為に追加 bcf INTCON,RBIE ; PORTBの変化割込みをdisable btfss flg_c goto $+9 call SubCmdLeft ; 左(メニュー・タブの位置を元に戻す為) call WAIT_900MS ; コマンドの連続を可能とする為に追加 call SubCmdLeft ; 左(メニュー・タブの位置を元に戻す為) call WAIT_900MS ; コマンドの連続を可能とする為に追加 call SubCmdLeft ; 左(メニュー・タブの位置を元に戻す為) call WAIT_900MS ; コマンドの連続を可能とする為に追加 call SubCmdMenu ; メニュー(メニューを消す) return call SubCmdRight ; 右 bsf INTCON,RBIE ; マクロ実行中キャンセル用にPORTBの変化割込みをenable call WAIT_900MS ; コマンドの連続を可能とする為に追加 bcf INTCON,RBIE ; PORTBの変化割込みをdisable btfss flg_c goto $+9 call SubCmdLeft ; 左(メニュー・タブの位置を元に戻す為) call WAIT_900MS ; コマンドの連続を可能とする為に追加 call SubCmdLeft ; 左(メニュー・タブの位置を元に戻す為) call WAIT_900MS ; コマンドの連続を可能とする為に追加 call SubCmdLeft ; 左(メニュー・タブの位置を元に戻す為) call WAIT_900MS ; コマンドの連続を可能とする為に追加 call SubCmdLeft ; 左(メニュー・タブの位置を元に戻す為) goto $+2 ; 中継(この記述法でジャンプできるのは最大9行の為) goto $+4 ; 中継 call WAIT_900MS ; コマンドの連続を可能とする為に追加 call SubCmdMenu ; メニュー(メニューを消す) return call SubCmdDown ; 下 bsf INTCON,RBIE ; マクロ実行中キャンセル用にPORTBの変化割込みをenable call WAIT_900MS ; コマンドの連続を可能とする為に追加 bcf INTCON,RBIE ; PORTBの変化割込みをdisable btfss flg_c goto $+9 call SubCmdMenu ; メニュー(メニューを消す) call WAIT_900MS ; コマンドの連続を可能とする為に追加 call SubCmdMenu ; メニュー(メニューを出す) call WAIT_900MS ; コマンドの連続を可能とする為に追加 call SubCmdLeft ; 左(メニュー・タブの位置を元に戻す為) call WAIT_900MS ; コマンドの連続を可能とする為に追加 call SubCmdLeft ; 左(メニュー・タブの位置を元に戻す為) goto $+2 ; 中継(この記述法でジャンプできるのは最大9行の為) goto $+8 ; 中継 call WAIT_900MS ; コマンドの連続を可能とする為に追加 call SubCmdLeft ; 左(メニュー・タブの位置を元に戻す為) call WAIT_900MS ; コマンドの連続を可能とする為に追加 call SubCmdLeft ; 左(メニュー・タブの位置を元に戻す為) call WAIT_900MS ; コマンドの連続を可能とする為に追加 call SubCmdMenu ; メニュー(メニューを消す) return call SubCmdEnter ; 決定 bsf INTCON,RBIE ; マクロ実行中キャンセル用にPORTBの変化割込みをenable call WAIT_900MS ; コマンドの連続を可能とする為に追加 bcf INTCON,RBIE ; PORTBの変化割込みをdisable btfss flg_c goto $+9 call SubCmdMenu ; メニュー(メニューを消す) call WAIT_900MS ; コマンドの連続を可能とする為に追加 call SubCmdMenu ; メニュー(メニューを出す) call WAIT_900MS ; コマンドの連続を可能とする為に追加 call SubCmdLeft ; 左(メニュー・タブの位置を元に戻す為) call WAIT_900MS ; コマンドの連続を可能とする為に追加 call SubCmdLeft ; 左(メニュー・タブの位置を元に戻す為) goto $+2 ; 中継(この記述法でジャンプできるのは最大9行の為) goto $+8 ; 中継 call WAIT_900MS ; コマンドの連続を可能とする為に追加 call SubCmdLeft ; 左(メニュー・タブの位置を元に戻す為) call WAIT_900MS ; コマンドの連続を可能とする為に追加 call SubCmdLeft ; 左(メニュー・タブの位置を元に戻す為) call WAIT_900MS ; コマンドの連続を可能とする為に追加 call SubCmdMenu ; メニュー(メニューを消す) return call SubCmdLeft ; 左 bsf INTCON,RBIE ; マクロ実行中キャンセル用にPORTBの変化割込みをenable call WAIT_900MS ; コマンドの連続を可能とする為に追加 bcf INTCON,RBIE ; PORTBの変化割込みをdisable btfss flg_c goto $+9 call SubCmdMenu ; メニュー(メニューを消す) call WAIT_900MS ; コマンドの連続を可能とする為に追加 call SubCmdMenu ; メニュー(メニューを出す) call WAIT_900MS ; コマンドの連続を可能とする為に追加 call SubCmdLeft ; 左(メニュー・タブの位置を元に戻す為) call WAIT_900MS ; コマンドの連続を可能とする為に追加 call SubCmdLeft ; 左(メニュー・タブの位置を元に戻す為) goto $+2 ; 中継(この記述法でジャンプできるのは最大9行の為) goto $+8 ; 中継 call WAIT_900MS ; コマンドの連続を可能とする為に追加 call SubCmdLeft ; 左(メニュー・タブの位置を元に戻す為) call WAIT_900MS ; コマンドの連続を可能とする為に追加 call SubCmdLeft ; 左(メニュー・タブの位置を元に戻す為) call WAIT_900MS ; コマンドの連続を可能とする為に追加 call SubCmdMenu ; メニュー(メニューを消す) return call SubCmdEnter ; 決定 return ;-------------------------------------------- ;電源ON後、2回目の画面オフ ;-------------------------------------------- SubCmdOffScreenSecond call SubCmdMenu ; メニュー bsf INTCON,RBIE ; マクロ実行中キャンセル用にPORTBの変化割込みをenable call WAIT_900MS ; コマンドの連続を可能とする為に追加 bcf INTCON,RBIE ; PORTBの変化割込みをdisable btfss flg_c goto $+3 call SubCmdMenu ; メニュー return call SubCmdDown ; 下 bsf INTCON,RBIE ; マクロ実行中キャンセル用にPORTBの変化割込みをenable call WAIT_900MS ; コマンドの連続を可能とする為に追加 bcf INTCON,RBIE ; PORTBの変化割込みをdisable btfss flg_c goto $+3 call SubCmdMenu ; メニュー return call SubCmdEnter ; 決定 bsf INTCON,RBIE ; マクロ実行中キャンセル用にPORTBの変化割込みをenable call WAIT_900MS ; コマンドの連続を可能とする為に追加 bcf INTCON,RBIE ; PORTBの変化割込みをdisable btfss flg_c goto $+3 call SubCmdMenu ; メニュー return call SubCmdLeft ; 左 bsf INTCON,RBIE ; マクロ実行中キャンセル用にPORTBの変化割込みをenable call WAIT_900MS ; コマンドの連続を可能とする為に追加 bcf INTCON,RBIE ; PORTBの変化割込みをdisable btfss flg_c goto $+3 call SubCmdMenu ; メニュー return call SubCmdEnter ; 決定 return ;-------------------------------------------- ; メニュー SubCmdMenu movlw b'00100011' movwf DATA_BUF4 movlw b'10000100' movwf DATA_BUF5 call SEND_DATA_SUB return ; 上 SubCmdUp movlw b'11101010' movwf DATA_BUF4 movlw b'10000001' movwf DATA_BUF5 call SEND_DATA_SUB return ; 左 SubCmdLeft movlw b'11101011' movwf DATA_BUF4 movlw b'10000000' movwf DATA_BUF5 call SEND_DATA_SUB return ; 右 SubCmdRight movlw b'00011011' movwf DATA_BUF4 movlw b'10001111' movwf DATA_BUF5 call SEND_DATA_SUB return ; 下 SubCmdDown movlw b'00000100' movwf DATA_BUF4 movlw b'10000001' movwf DATA_BUF5 call SEND_DATA_SUB return ; 決定 SubCmdEnter movlw b'01001010' movwf DATA_BUF4 movlw b'10001011' movwf DATA_BUF5 call SEND_DATA_SUB return ;-------------------------------------------- SubInitIR movlw b'00110000' movwf BIT_LEN movlw b'00000111' movwf HI_1 movwf HI_0 movlw b'00010111' movwf LO_1 movlw b'00001001' movwf LO_0 movlw b'00111110' movwf START_HI movlw b'00011110' movwf START_LO movlw b'00001000' movwf STOP_HI movlw b'01010101' movwf DATA_BUF movlw b'01011010' movwf DATA_BUF1 movlw b'11110001' movwf DATA_BUF2 movlw b'01001000' movwf DATA_BUF3 return ;;;;;;;;;;;; SEND_DATA ;;;;;;;;;;;; SEND_DATA ; データバッファ内容を赤外線LEDで送信する call SEND_DATA_SUB ; 2回送信の為に追加 call WAIT_75MS ; 2回送信の為に追加 call SEND_DATA_SUB ; 2回送信の為に追加 return ; 2回送信の為に追加 SEND_DATA_SUB ; 2回送信の為に追加 MOVF BIT_LEN,W MOVWF WORK2 MOVLW BUF_ADR MOVWF FSR MOVLW D'8' MOVWF BIT_CNT MOVF INDF,W MOVWF WORK SEND_MAIN MOVF START_HI,W MOVWF HI_TIME MOVF START_LO,W MOVWF LO_TIME CALL SEND_BIT SEND_LOOP BTFSC WORK,7 GOTO SEND_1 SEND_0 MOVF HI_0,W MOVWF HI_TIME MOVF LO_0,W MOVWF LO_TIME CALL SEND_BIT GOTO BYTE_E_CHK SEND_1 MOVF HI_1,W MOVWF HI_TIME MOVF LO_1,W MOVWF LO_TIME CALL SEND_BIT BYTE_E_CHK DECFSZ BIT_CNT,F GOTO SEND_SFT INCF FSR,F MOVF INDF,W MOVWF WORK MOVLW D'8' MOVWF BIT_CNT GOTO SEND_E_CHK SEND_SFT RLF WORK,F SEND_E_CHK DECFSZ WORK2,F GOTO SEND_LOOP NOP NOP MOVF STOP_HI,W MOVWF HI_TIME MOVF STOP_HI,W MOVWF LO_TIME CALL SEND_BIT SEND_END RETURN ;;;;;;;;;;;; SEND_BIT ;;;;;;;;;;;; SEND_BIT ; 1bit分のデータを送信する SEND_B_HI ; 'Hi'信号 ; BSF IR_OUT ; 吸込みへの変更に伴い下行を使用 bcf IR_OUT CALL WAIT_CARRIER ; BCF IR_OUT ; 吸込みへの変更に伴い下行を使用 bsf IR_OUT CALL WAIT_CARRIER ; BSF IR_OUT ; 吸込みへの変更に伴い下行を使用 bcF IR_OUT CALL WAIT_CARRIER ; BCF IR_OUT ; 吸込みへの変更に伴い下行を使用 bsf IR_OUT CALL WAIT_CARRIER DECFSZ HI_TIME,F GOTO SEND_B_HI SEND_B_LO ; 'Lo' CALL WAIT_CARRIER CALL WAIT_CARRIER CALL WAIT_CARRIER CALL WAIT_CARRIER NOP NOP NOP NOP DECFSZ LO_TIME,F GOTO SEND_B_LO RETURN ;;;;;;;;;;;; WAIT_CARRIER ;;;;;;;;;;;; WAIT_CARRIER ; 赤外線キャリアの半サイクル時間を消費 MOVLW D'6' MOVWF CNT NOP NOP NOP LOOP_CARR DECFSZ CNT,F GOTO LOOP_CARR RETURN ;--------------------------------------------------------------------- rs1tx ;RS-232C 1文字送信サブルーチン ;MAX232C を使用 ;--------------------------------------------------------------------- movwf txd bcf rs1txb ;rs1txb ビットクリア movlw btime ;スタートビット movwf rs r1tx10 decfsz rs,F goto r1tx10 movlw d'8' movwf cn ;ビット位置 nop r1tx11 rrf txd,F nop btfss STATUS,C ;ポートに出力 bcf rs1txb btfsc STATUS,C bsf rs1txb movlw btime movwf rs r1tx12 decfsz rs,F goto r1tx12 ;1ビットのウエイト decfsz cn,F goto r1tx11 ;8ビット分繰り返し nop nop nop nop nop nop bsf rs1txb ;rs1txb を1に ストップビット movlw btime movwf rs r1tx13 decfsz rs,F goto r1tx13 ;1ビットのウエイト return ;1文字送信終了、戻る WAIT_15MS ;(サイクル調整4) MOVLW D'19' MOVWF @WAIT1_IN MOVLW D'121' MOVWF @WAIT2_IN MOVLW D'2' MOVWF @WAIT3_IN CALL @WAIT_3LOOP NOP NOP RETURN WAIT_75MS ;(サイクル調整4) MOVLW D'172' MOVWF @WAIT1_IN MOVLW D'51' MOVWF @WAIT2_IN MOVLW D'3' MOVWF @WAIT3_IN CALL @WAIT_3LOOP NOP NOP RETURN WAIT_400MS ;(サイクル調整4) MOVLW D'27' MOVWF @WAIT1_IN MOVLW D'184' MOVWF @WAIT2_IN MOVLW D'39' MOVWF @WAIT3_IN CALL @WAIT_3LOOP NOP NOP RETURN WAIT_900MS ;(サイクル調整4) MOVLW D'246' MOVWF @WAIT1_IN MOVLW D'16' MOVWF @WAIT2_IN MOVLW D'113' MOVWF @WAIT3_IN CALL @WAIT_3LOOP NOP NOP RETURN ;****************** @WAIT_3LOOP MOVF @WAIT1_IN,W MOVWF @WAIT1 @WAIT3_T3 MOVF @WAIT2_IN,W MOVWF @WAIT2 @WAIT3_T2 MOVF @WAIT3_IN,W MOVWF @WAIT3 @WAIT3_T1 DECF @WAIT3 BTFSS STATUS,Z GOTO @WAIT3_T1 DECF @WAIT2 BTFSS STATUS,Z GOTO @WAIT3_T2 DECF @WAIT1 BTFSS STATUS,Z GOTO @WAIT3_T3 RETURN END