PIC_IRリモコンの実験

PICによる赤外線リモコンの実験

tomcatさんの”PIC16F84使用赤外線リモコン送信器”  http://www.interline.or.jp/user/tomcat/picrcn84.htm

を作ってみた。

100円電卓型

フリスク型(PIC16F684A)

プログラム by_tomcatさん

*一部16F648A用に変更

; TITLE "8モード赤外線リモコン" : Ver 0.14

; Processor (16F84)*16F648A (Clock 4MHz) by.Tomcat

;============================================================================
; 仕様
;
; 8種類(10メーカー)のコード方式に対応、35個のいずれのキーにも
; 自由にどのコード方式の割り付けが可能にした赤外線リモコン送信器です
; モード(メーカー)の切り替える事無く、いろいろなメーカーの機器の制
; 御をボタン操作でする事が可能になります。
; ただし、1つのメーカーに数種のコードが有るため、必ず動作するとは限り
; ません、予め設定して有るタイミングは各メーカーの代表的なTVリモコン
; のタイミングです、動作しない時はモードのタイミング設定のの変更が必要
; です。
; また目的のキーのコードは解析器で調べて説明に従って設定して下さい。
;
; 注意
; MPASM.EXE で、数値のデホルト(Radix)を10進数(Decimal)にしてアセンブル
; を行って下さい。
; 書き込み時のコンフィグレーションレジスタは XT, pw-up timer on,で書き
; 込んで下さい。(Clock 4MHz)
;
;============================================================================
;***********************************************************************
; **  送信データエリア  **

;================================================================
;
; Byt 0 モードデータ
; bit0 _mode_0 ; リモコンモードフラグ
; bit1 _mode_1
; bit2 _mode_2
;
; 000 モード0 (日立、東芝、NEC)
; 001 モード1 (松下)
; 010 モード2 (サンヨー)
; 011 モード3 (ビクター)
; 100 モード4 (パイオニア)
; 101 モード5 (三菱)
; 110 モード6 (ソニー)
; 111 モード7 (シャープ)
;
; bit3 _mode_rp ; リピート機能 1 = 有り 0 = 無し
; bit4 ~ bit7 ; リピート回数
;
; 0 = 制限無し
; 1 ~ F = 回数指定
;
; Byt 1 送信データ数  合計8Bytまで
; bit0 ~ bit3 ; 送信バイト数    最大8Byt
; bit4 ~ bit7 ; 送信端数ビット数  最大8bit
;
; 0x24 = 4Byt + 2bit
;
;
; Byt 2 ~ Byt 9 リモコンコード
;
; * 例 * No,03 キーボタンにモード4(パイオニア)をリピート有り(キー
; onの間出力しっぱなし)データ数が4BytでTVの電源onのコー
; ドを設定
;
; --- key 03 ---
; retlw b'00001100' ; モードデータ
; retlw 0x04 ; 送信データ数
; retlw 0xaa
; retlw 0x55
; retlw 0x1c
; retlw 0xe3
; retlw 0x00
; retlw 0x00
; retlw 0x00
; retlw 0x00
;
;
;===================================================================

;***********************************************************************

code_table: macro
org 0x280
tabel_0:
addwf _pcl,F
; --- key 00 ---(ToshibaTV_ON/OFF)
retlw b'00000000' ; 送信モード
retlw 0x04 ; 送信データ数
retlw 0x40
retlw 0xbf
retlw 0x12
retlw 0xed
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
; --- key 01 ---(PAMA_Choukou)
retlw b'00011001' ; 送信モード
retlw 0x05 ; 送信データ数
retlw 0x2c
retlw 0x52
retlw 0x09
retlw 0x35
retlw 0x3c
retlw 0x00
retlw 0x00
retlw 0x00
; --- key 02 ---(PANA_Led)
retlw b'00011001' ; 送信モード
retlw 0x05 ; 送信データ数
retlw 0x2c
retlw 0x52
retlw 0x09
retlw 0x36
retlw 0x3f
retlw 0x00
retlw 0x00
retlw 0x00
; --- key 03 ---(HitachiTV_ON)
retlw b'00000000' ; 送信モード
retlw 0x04 ; 送信データ数
retlw 0x50
retlw 0xaf
retlw 0x12
retlw 0xed
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
; --- key 04 ---(NECTVon)
retlw b'00000000' ; 送信モード
retlw 0x04 ; 送信データ数
retlw 0x18
retlw 0xe7
retlw 0x08
retlw 0xf7
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
; --- key 05 ---(IoTv_KoON)
retlw b'00000000' ; 送信モード
retlw 0x04 ; 送信データ数
retlw 0x80
retlw 0xe8
retlw 0x80
retlw 0x7f
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
; --- key 06 ---(Hitachi_TvOn)
retlw b'00000000' ; 送信モード
retlw 0x04 ; 送信データ数
retlw 0x50
retlw 0xaf
retlw 0x12
retlw 0xed
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
; --- key 07 ---(松下CHup)
retlw b'00001001' ; 送信モード
retlw 0x62 ; 送信データ数
retlw 0x40
retlw 0xfc
retlw 0x1d
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
; --- key 08 ---(サンヨーTVon)
retlw b'00000010' ; 送信モード
retlw 0x04 ; 送信データ数
retlw 0x30
retlw 0xcf
retlw 0x00
retlw 0xff
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
; --- key 09 ---(サンヨーCHup)
retlw b'00000010' ; 送信モード
retlw 0x04 ; 送信データ数
retlw 0x30
retlw 0xcf
retlw 0x59
retlw 0xa6
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
;--------------------------
org 0x300
tabel_1:
addwf _pcl,F
; --- key 10 ---(ビクターTVon)
retlw b'00001011' ; 送信モード
retlw 0x02 ; 送信データ数
retlw 0x03
retlw 0x17
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
; --- key 11 ---(ビクターCHup)
retlw b'00001011' ; 送信モード
retlw 0x02 ; 送信データ数
retlw 0x03
retlw 0x19
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
; --- key 12 ---(パイオニアTVon)
retlw b'00001100' ; 送信モード
retlw 0x04 ; 送信データ数
retlw 0xaa
retlw 0x55
retlw 0x1c
retlw 0xe3
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
; --- key 13 ---(パイオニアCHup)
retlw b'00001100' ; 送信モード
retlw 0x04 ; 送信データ数
retlw 0xaa
retlw 0x55
retlw 0x10
retlw 0xef
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
; --- key 14 ---(三菱TVon)
retlw b'00001101' ; 送信モード
retlw 0x02 ; 送信データ数
retlw 0x47
retlw 0x02
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
; --- key 15 ---(三菱CHup)
retlw b'00001101' ; 送信モード
retlw 0x02 ; 送信データ数
retlw 0x47
retlw 0x0a
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
; --- key 16 ---(ソニーTVon)
retlw b'00001110' ; 送信モード
retlw 0x41 ; 送信データ数
retlw 0x95
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
; --- key 17 ---(ソニーCHup)
retlw b'00001110' ; 送信モード
retlw 0x41 ; 送信データ数
retlw 0x90
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
; --- key 18 ---(シャープTVon)
retlw b'00001111' ; 送信モード
retlw 0x71 ; 送信データ数
retlw 0xc1
retlw 0x22
retlw 0x21
retlw 0x5d
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
; --- key 19 ---(シャープCHup)
retlw b'00001111' ; 送信モード
retlw 0x71 ; 送信データ数
retlw 0x21
retlw 0x22
retlw 0xc1
retlw 0x5d
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
; --- key 20 ---(シャープCHdu)
retlw b'00001111' ; 送信モード
retlw 0x71 ; 送信データ数
retlw 0x41
retlw 0x22
retlw 0xa1
retlw 0x5d
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
; --- key 21 ---(シャープVRup)
retlw b'00001111' ; 送信モード
retlw 0x71 ; 送信データ数
retlw 0x81
retlw 0x22
retlw 0x61
retlw 0x5d
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
; --- key 22 ---(シャープVRdu)
retlw b'00001111' ; 送信モード
retlw 0x71 ; 送信データ数
retlw 0xa1
retlw 0x22
retlw 0x41
retlw 0x5d
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
; --- key 23 ---(シャープVTRon)
retlw b'00001111' ; 送信モード
retlw 0x71 ; 送信データ数
retlw 0xc3
retlw 0x22
retlw 0x23
retlw 0x5d
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
; --- key 24 ---(シャープVTRCHup)
retlw b'00001111' ; 送信モード
retlw 0x71 ; 送信データ数
retlw 0x23
retlw 0x22
retlw 0xc3
retlw 0x5d
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
; --- key 25 ---
retlw b'00000000' ; 送信モード
retlw 0x03 ; 送信データ数
retlw 0x25
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
; --- key 26 ---
retlw b'00000000' ; 送信モード
retlw 0x03 ; 送信データ数
retlw 0x26
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
; --- key 27 ---
retlw b'00000000' ; 送信モード
retlw 0x03 ; 送信データ数
retlw 0x27
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
; --- key 28 ---
retlw b'00000000' ; 送信モード
retlw 0x03 ; 送信データ数
retlw 0x28
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
; --- key 29 ---
retlw b'00000000' ; 送信モード
retlw 0x03 ; 送信データ数
retlw 0x29
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
; --- key 30 ---
retlw b'00000000' ; 送信モード
retlw 0x03 ; 送信データ数
retlw 0x30
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
; --- key 31 ---
retlw b'00000000' ; 送信モード
retlw 0x03 ; 送信データ数
retlw 0x31
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
; --- key 32 ---
retlw b'00000000' ; 送信モード
retlw 0x03 ; 送信データ数
retlw 0x32
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
; --- key 33 ---
retlw b'00000000' ; 送信モード
retlw 0x03 ; 送信データ数
retlw 0x33
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
; --- key 34 ---
retlw b'00000000' ; 送信モード
retlw 0x03 ; 送信データ数
retlw 0x34
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
; ********************************
endm
;***********************************************************************
; モードタイミング設定

; --- モード0設定値(日立、東芝、NEC) --- (1 = 0.1ms)
vl_0_start_h equ 90 ; スタート信号 on 時間
vl_0_start_l equ 42 ; スタート信号 off 時間
vl_0_data_0h equ 7 ; データ0信号 on 時間
vl_0_data_1h equ 7 ; データ1信号 on 時間
vl_0_data_0l equ 5 ; データ0信号 off 時間
vl_0_data_1l equ 16 ; データ1信号 off 時間
vl_0_stop_h equ 7 ; ストップ信号 on 時間
vl_0_rptwait equ 0 ; リピート待ち時間 (1 = 10ms)

optset_0: macro
bcf _ScnStatus,_carri40 ; キャリア38kHz
bcf _ScnStatus,_carri33
bcf _ScnStatus,_sharp ; 通常モード
endm
; --- モード1設定値(松下) --- (1 = 0.1ms)
vl_1_start_h equ 33 ; スタート信号 on 時間
vl_1_start_l equ 17 ; スタート信号 off 時間
vl_1_data_0h equ 5 ; データ0信号 on 時間
vl_1_data_1h equ 5 ; データ1信号 on 時間
vl_1_data_0l equ 4 ; データ0信号 off 時間
vl_1_data_1l equ 12 ; データ1信号 off 時間
vl_1_stop_h equ 5 ; ストップ信号 on 時間
vl_1_rptwait equ 5 ; リピート待ち時間 (1 = 10ms)

optset_1: macro
bcf _ScnStatus,_carri40 ; キャリア38kHz
bcf _ScnStatus,_carri33
bcf _ScnStatus,_sharp ; 通常モード
endm
; --- モード2設定値(サンヨー) --- (1 = 0.1ms)
vl_2_start_h equ 94 ; スタート信号 on 時間
vl_2_start_l equ 44 ; スタート信号 off 時間
vl_2_data_0h equ 7 ; データ0信号 on 時間
vl_2_data_1h equ 7 ; データ1信号 on 時間
vl_2_data_0l equ 5 ; データ0信号 off 時間
vl_2_data_1l equ 16 ; データ1信号 off 時間
vl_2_stop_h equ 7 ; ストップ信号 on 時間
vl_2_rptwait equ 10 ; リピート待ち時間 (1 = 10ms)

optset_2: macro
bcf _ScnStatus,_carri40 ; キャリア38kHz
bcf _ScnStatus,_carri33
bcf _ScnStatus,_sharp ; 通常モード
endm
; --- モード3設定値(ビクター) --- (1 = 0.1ms)
vl_3_start_h equ 85 ; スタート信号 on 時間
vl_3_start_l equ 40 ; スタート信号 off 時間
vl_3_data_0h equ 7 ; データ0信号 on 時間
vl_3_data_1h equ 7 ; データ1信号 on 時間
vl_3_data_0l equ 5 ; データ0信号 off 時間
vl_3_data_1l equ 15 ; データ1信号 off 時間
vl_3_stop_h equ 7 ; ストップ信号 on 時間
vl_3_rptwait equ 2 ; リピート待ち時間 (1 = 10ms)

optset_3: macro
bcf _ScnStatus,_carri40 ; キャリア38kHz
bcf _ScnStatus,_carri33
bcf _ScnStatus,_sharp ; 通常モード
endm
; --- モード4設定値(パイオニア) --- (1 = 0.1ms)
vl_4_start_h equ 85 ; スタート信号 on 時間
vl_4_start_l equ 40 ; スタート信号 off 時間
vl_4_data_0h equ 7 ; データ0信号 on 時間
vl_4_data_1h equ 7 ; データ1信号 on 時間
vl_4_data_0l equ 4 ; データ0信号 off 時間
vl_4_data_1l equ 15 ; データ1信号 off 時間
vl_4_stop_h equ 7 ; ストップ信号 on 時間
vl_4_rptwait equ 3 ; リピート待ち時間 (1 = 10ms)

optset_4: macro
bsf _ScnStatus,_carri40 ; キャリア40kHz
bcf _ScnStatus,_carri33
bcf _ScnStatus,_sharp ; 通常モード
endm
; --- モード5設定値(三菱) --- (1 = 0.1ms)
vl_5_start_h equ 0 ; スタート信号 on 時間
vl_5_start_l equ 0 ; スタート信号 off 時間
vl_5_data_0h equ 3 ; データ0信号 on 時間
vl_5_data_1h equ 3 ; データ1信号 on 時間
vl_5_data_0l equ 9 ; データ0信号 off 時間
vl_5_data_1l equ 21 ; データ1信号 off 時間
vl_5_stop_h equ 3 ; ストップ信号 on 時間
vl_5_rptwait equ 2 ; リピート待ち時間 (1 = 10ms)

optset_5: macro
bcf _ScnStatus,_carri40 ; キャリア33kHz
bsf _ScnStatus,_carri33
bcf _ScnStatus,_sharp ; 通常モード
endm
; --- モード6設定値(ソニー) --- (1 = 0.1ms)
vl_6_start_h equ 25 ; スタート信号 on 時間
vl_6_start_l equ 6 ; スタート信号 off 時間
vl_6_data_0h equ 6 ; データ0信号 on 時間
vl_6_data_1h equ 12 ; データ1信号 on 時間
vl_6_data_0l equ 6 ; データ0信号 off 時間
vl_6_data_1l equ 6 ; データ1信号 off 時間
vl_6_stop_h equ 0 ; ストップ信号 on 時間
vl_6_rptwait equ 2 ; リピート待ち時間 (1 = 10ms)

optset_6: macro
bsf _ScnStatus,_carri40 ; キャリア40kHz
bcf _ScnStatus,_carri33
bcf _ScnStatus,_sharp ; 通常モード
endm
; --- モード7設定値(シャープ) --- (1 = 0.1ms)
vl_7_start_h equ 0 ; スタート信号 on 時間
vl_7_start_l equ 0 ; スタート信号 off 時間
vl_7_data_0h equ 3 ; データ0信号 on 時間
vl_7_data_1h equ 3 ; データ1信号 on 時間
vl_7_data_0l equ 7 ; データ0信号 off 時間
vl_7_data_1l equ 17 ; データ1信号 off 時間
vl_7_stop_h equ 3 ; ストップ信号 on 時間
vl_7_rptwait equ 4 ; リピート待ち時間 (1 = 10ms)

optset_7: macro
bcf _ScnStatus,_carri40 ; キャリア38kHz
bcf _ScnStatus,_carri33
bsf _ScnStatus,_sharp ; シャープモード
endm
;============================================================================
; バージョン履歴
;
; Ver014
; 最大35キーに拡張
;
; Ver013
; クロック4MHz、割り込み未使用、キャリア38kHz以外に33
; kHzと40kHzを追加
;
; Ver012
; Key数25個、スリープ対応、8種類のコード対応
;
; Ver0.11
; A,B独立リピート機能、Bシャープ仕様
;
; Ver0.10
; 最大35キーに対応(A,B自由仕様),リピート機能追加
;
; Ver0.02
; 送信データ部をA,Bモードを自由仕様に変更
;
; Ver0.01
;  テストスタートバージョン 2キー仕様(A,B標準仕様)
;
;============================================================================

LIST p=16F648A ; *hh PIC16F844 is the target processor

#include "P16F648A.INC" ; *hh Include header file

__CONFIG _CP_OFF & _DATA_CP_OFF & _LVP_OFF & _BOREN_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTOSC_OSC_NOCLKOUT ; *hh
; レジスタファイルのアドレス設定
; --- (_rp0 = 0) ----
_ind0 equ 0x00
_rtcc equ 0x01
_pcl equ 0x02
_status equ 0x03
_fsr equ 0x04
_porta equ 0x05
_portb equ 0x06
_portc equ 0x07
;_eedata equ 0x08 ; *hh
;_eeadr equ 0x09 ; *hh
_pclath equ 0x0a
_intcon equ 0x0b
_cmcon equ 0x1f ; *hh
; --- (_rp0 = 1) ----
_option equ 0x01
_trisa equ 0x05
_trisb equ 0x06
_eedata equ 0x9a ; *hh
_eeadr equ 0x9b ; *hh
_eecon1 equ 0x9c ; *hh
_eecon2 equ 0x9d ; +hh
;------------------------------------------------------------------------------
; 汎用レジスタ設定

cblock 0x20 ; *hh_0c* Temporary storage
_SaveWReg ; 割り込み時Wレジスタ退避
_SaveStatus ; 割り込み時ステータス退避
; _Savefsr ; 割り込み時fsrレジスタ退避

_keyscan ; key スキャンデータ
_keyscan_b ; key スキャンデータB
_keydata ; key 入力データ
_clmdata ; key カラムデータ
_keydata1 ; key 入力データ1
_clmdata1 ; key カラムデータ1
_keydata2 ; key 入力データ2
_clmdata2 ; key カラムデータ2
_keyflag ; key 入力フラグ
_wi_check_cn ; 2重打ちチェックカウンター
_offcount ; チャタリング除去カウンタ
_rptwait ; リピート待ち時間
_ch ; 変換データ

_IntStatus ; 制御用ユーザーステータス
_ScnStatus ; 制御用ユーザーステータス2

_rmcbyt ; 送信バイト数
_rmcbit ; 送信端数ビット数
_rptcount ; リピート回数
_mode_no ; モードナンバー
_start_h ; スタート信号 on 時間
_start_l ; スタート信号 off 時間
_data_0h ; データ0信号 on 時間
_data_1h ; データ1信号 on 時間
_data_0l ; データ0信号 off 時間
_data_1l ; データ1信号 off 時間
_stop_h ; ストップ信号 on 時間
_rptwait_bf ; リピート待ち時間

_count1 ; 汎用カウンター1
_count2 ; 汎用カウンター2
_buffer1 ; 汎用バッファー1

_cntBF0 ; 遅延時間カウンタ0
_cntBF1 ; 遅延時間カウンタ1
_cntBF2 ; 遅延時間カウンタ2

endc

_tx_data equ 0x44 ; 送信データバッファー(8byt)

;------------------------------------------------------------------------------
; _status: ステータスの操作するビット名設定
_c equ 0
_dc equ 1
_z equ 2
_rp0 equ 5
; _intcon: 割り込み命令の設定
_rbif equ 0
_rintf equ 1
_rtimf equ 2
_rbie equ 3
_rinte equ 4
_rtime equ 5
_eeie equ 6
_gie equ 7
; _eecon1: EE-PROMデータの操作するビット名設定
_rd equ 0 ; 読みだし制御
_wr equ 1 ; 書き込み制御
_wren equ 2 ; 書き込み許可
_wrerr equ 3 ; 書き込みエラー
_eeif equ 4 ; 書き込み終了
; _porta: Aポートの操作するビット名設定
_keycom0 equ 0
_keycom1 equ 1
_keycom2 equ 2
_keycom3 equ 3
_keycom4 equ 4
; _portb: Bポートの操作するビット名設定
_keyout0 equ 0
_led equ 1 ; 赤外線Led
_keycom5 equ 2
_keycom6 equ 3
_keyout1 equ 4
_keyout2 equ 5
_keyout3 equ 6
_keyout4 equ 7
; _IntStatus: ユーザーステータスの操作ビット名設定
_mode_0 equ 0 ; リモコンモードフラグ
_mode_1 equ 1
_mode_2 equ 2
_mode_rp equ 3 ; リピート機能有無
; _ScnStatus: ユーザーステータス2の操作ビット名設定
_carri40 equ 0 ; キャリア周波数40kHzフラグ
_carri33 equ 1 ; キャリア周波数33kHzフラグ
_sharp equ 2 ; 特殊モード(シャープ)フラグ
_tabel1 equ 3 ; コードテーブル1フラグ
; _keyscan: ループエンドビット
_sc_end equ 7
; _keyflag: key入力のフラグのビット名設定
_kf0 equ 0 ; key入力有り
_kf1 equ 1 ; key入力有り1回目
_kf2 equ 2 ; key入力有り2回目
_kwf equ 3 ; keyデータ送信済み
_kwi equ 4 ; key二重打ち
_kch equ 5 ; key二重打ちチェックフラグ
_krp equ 6 ; keyリピートフラグ
_koff equ 7 ; keyオフフラグ

;*****************************************************************************
; --- 基準(クロック、測定値により変更する事)4MHz ---

vl_offtime equ 24 ; off時間基本タイマー
vl_ontime equ 4 ; on時間基本タイマー (1 = 26us)
vl_keywait equ 100 ; key 待ち時間基本タイマー
vl_offcount equ 10 ; チャタリング除去カウンタセット (1 = 10ms)
;=============================================================================
; *** コードエリア ***
;=============================================================================
org 0

goto start

;=============================================================================
; *** メインルーチン ***
;=============================================================================
org 8

start:
bsf _status,_rp0
clrf _trisa ; ポートAの出力設定
movlw b'11110001'
movwf _trisb ; ポートBの設定
movlw 0x07 ; *hh_ cmconデジタル入出力設定
movwf _cmcon ; *hh

movlw b'00001000' ; ポートB内部プルアップ
movwf _option
bcf _status,_rp0
clrf _IntStatus
clrf _ScnStatus

keyread:
clrf _keyflag
clrf _porta ; ポートA 初期化
clrf _portb
clrf _intcon
bsf _intcon,_rinte
bsf _intcon,_rbie
sleep
;
clrf _intcon
keyread_00:
movlw b'11111110'
movwf _keyscan
clrf _keyscan_b
bcf _keyflag,_kf0 ; 0 = k_f0
keyread_01:
movlw b'00011111'
movwf _porta ; ra0 - ra4 high
bsf _portb,_keycom5
bsf _portb,_keycom6
movf _keyscan,W
movwf _porta ; _keyscan low (1 bit)
btfss _keyscan,5
bcf _portb,_keycom5
btfss _keyscan,6
bcf _portb,_keycom6
nop
nop
nop
comf _portb,W ; ローデータリード
andlw b'11110000'
movwf _keydata
swapf _keydata,F
bcf _status,_c
rlf _keydata,F
comf _portb,W ; ローデータリード
andlw b'00000001'
iorwf _keydata,F
btfss _status,_z
call keycheck ; key入力有り
;
incf _keyscan_b,F
bsf _status,_c
rlf _keyscan,F ; _keyscan L sifut
btfsc _keyscan,_sc_end ; keyサーチ1サイクル終了?
goto keyread_01
;
btfsc _keyflag,_kf2 ; key入力確定?
goto keyread_03 ; keyデータ送信へ
keyread_02:
btfsc _keyflag,_kf0 ; key入力無し?
goto keyread_00
goto keyread_05

keyread_03:
btfsc _keyflag,_kwi ; key2重打ち?
goto keyread_02
btfsc _keyflag,_kwf ; keyデータ送信済み?
goto keyread_06 ; リピートモード処理へ
movlw vl_offcount
movwf _offcount ; チャタリング除去カウンタセット
btfsc _keyflag,_krp ; keyリピートフラグチェック
goto keyread_04
call keycode_set ; Keyコードをナンバーに変換
call txdata_set ; 送信データ取得
call txtime_set ; 送信パルスタイミングセット
keyread_04:
call transmit ; データを送信する
bsf _keyflag,_kwf
movf _rptwait_bf,W
movwf _rptwait ; リピート待ち時間セット
btfsc _IntStatus,_mode_rp ; リピートモードチェック
bsf _keyflag,_krp ; keyリピートフラグセット
goto keyread_02

keyread_05:
btfss _keyflag,_kwf ; keyデータ送信済み?
goto keyread
movlw vl_keywait
call wait_lo
decfsz _offcount,F
goto keyread_00
goto keyread

keyread_06:
btfss _IntStatus,_mode_rp ; リピートモードチェック
goto keyread_02
movlw vl_keywait
call wait_lo
decfsz _rptwait,F
goto keyread_02
movf _rptcount,W ; リピート回数 0 チェック
btfsc _status,_z
goto keyread_02
movlw 0xff ; リピート回数 0xff チェック
subwf _rptcount,W
btfss _status,_z
decf _rptcount,F ; リピート回数 -1
bcf _keyflag,_kwf ; keyデータ送信済みリセット
goto keyread_02

;===========================================================================
; **  サブルーチン  **
;===========================================================================
;---------------------------------------------------------------------------
; key データチェック
;
keycheck:
bsf _keyflag,_kf0 ; 1 = k_f0
btfsc _keyflag,_krp
goto s_keycheck
btfss _keyflag,_kf1 ; k_f1 == 1 skip
goto f_keycheck
btfss _keyflag,_kf2 ; k_f2 == 1 skip
goto s_keycheck
btfss _keyflag,_kwf ; k_wf == 1 skip
bsf _keyflag,_kwi ; 2重打ちフラグセット
return

f_keycheck:
bsf _keyflag,_kf1
movf _keyscan_b,W
movwf _clmdata1 ; カラムセーブ
movf _keydata,W
movwf _keydata1 ; ローセーブ
call wi_check ; 桁2重打ちチェック
return

s_keycheck:
bsf _keyflag,_kf2
movf _keyscan_b,W
movwf _clmdata2 ; カラムセーブ
movf _keydata,W
movwf _keydata2 ; ローセーブ
call wi_check ; 桁2重打ちチェック
movf _clmdata1,W
xorwf _clmdata2,W ; 行2重打ちチェック
btfss _status,_z
bsf _keyflag,_kwi ; 2重打ちフラグセット
movf _keydata1,W
xorwf _keydata2,W ; 桁2重打ちチェックB
btfss _status,_z
bsf _keyflag,_kwi ; 2重打ちフラグセット
return
;----------------------------------------------------------------------------
; key 桁2重打ちチェック

wi_check:
movlw 5
movwf _wi_check_cn
bcf _keyflag,_kch ; 0 = _kch
wi_check_01:
bcf _status,_c ; 0 = _c
rlf _keydata,F ; keydata -> L shift
btfss _status,_c ; _c == 0 skip
goto wi_check_03
wi_check_02:
btfsc _keyflag,_kch ; k_ch == 0 skip
bsf _keyflag,_kwi ; 2重打ちフラグセット
bsf _keyflag,_kch ; 1 = k_ch
wi_check_03:
decfsz _wi_check_cn,F
goto wi_check_01
return
;----------------------------------------------------------------------------
; キーデータ変換 [ input key no(0~34) -> _ch ]

keycode_set:
movlw 0xff
movwf _ch
keycode_set_01:
incf _ch,F ; B port データを数値に変換
bcf _status,_c
rrf _keydata2,F
btfss _status,_c
goto keycode_set_01
movf _keydata1,W
movwf _keydata2 ; B port データを戻す
keycode_set_02:
movf _clmdata2,W
btfss _status,_z
goto keycode_set_03
bcf _ScnStatus,_tabel1 ; コードテーブル1フラグクリア
return
keycode_set_03:
movlw 5 ; A port データで掛ける
addwf _ch,F
decfsz _clmdata2,F
goto keycode_set_03
movf _clmdata1,W
movwf _clmdata2 ; A port データを戻す
movlw 10
subwf _ch,W
bcf _ScnStatus,_tabel1 ; コードテーブル1フラグクリア
btfss _status,_c ; ボローのチェック
return
bsf _ScnStatus,_tabel1 ; コードテーブル1フラグセット
movlw 10
subwf _ch,F
return
;----------------------------------------------------------------------------
; 送信データセット

txdata_set:
clrf _count1
movf _ch,W ; _ch = 0 かチェック
btfsc _status,_z
goto txdata_set_02
txdata_set_01:
movlw 10 ; テーブルスタートアドレス計算
addwf _count1,F
decfsz _ch,F
goto txdata_set_01
txdata_set_02:
movlw ((tabel_0 & 0x700) >> 8) & 0xff
btfsc _ScnStatus,_tabel1
movlw ((tabel_1 & 0x700) >> 8) & 0xff
movwf _pclath
movf _count1,W
btfss _ScnStatus,_tabel1
call tabel_0
btfsc _ScnStatus,_tabel1
call tabel_1
movwf _buffer1
andlw b'00001111'
movwf _IntStatus ; モードフラグ設定
movlw b'11110000'
andwf _buffer1,F
swapf _buffer1,W
iorlw 0
btfsc _status,_z
movlw 0xff
movwf _rptcount ; リピート回数セット

incf _count1,F
movf _count1,W
btfss _ScnStatus,_tabel1
call tabel_0
btfsc _ScnStatus,_tabel1
call tabel_1
movwf _buffer1
andlw b'00001111'
movwf _rmcbyt ; 送信バイト数設定
movf _buffer1,W
andlw b'11110000'
movwf _rmcbit ; 送信端数ビット数設定
swapf _rmcbit,F

movlw ( _tx_data - 1 )
movwf _fsr
movlw 8
movwf _count2
txdata_set_03:
incf _fsr,F
incf _count1,F
movf _count1,W
btfss _ScnStatus,_tabel1
call tabel_0
btfsc _ScnStatus,_tabel1
call tabel_1
movwf _ind0
decfsz _count2,F
goto txdata_set_03
return
;----------------------------------------------------------------------------
; 送信パルスタイミングセット

txtime_set:
movlw b'00000111'
andwf _IntStatus,W
movwf _mode_no
btfss _status,_z
goto txtime_set_01
movlw vl_0_start_h
movwf _start_h ; スタート信号 on 時間
movlw vl_0_start_l
movwf _start_l ; スタート信号 off 時間
movlw vl_0_data_0h
movwf _data_0h ; データ0信号 on 時間
movlw vl_0_data_1h
movwf _data_1h ; データ1信号 on 時間
movlw vl_0_data_0l
movwf _data_0l ; データ0信号 off 時間
movlw vl_0_data_1l
movwf _data_1l ; データ1信号 off 時間
movlw vl_0_stop_h
movwf _stop_h ; ストップ信号 on 時間
movlw vl_0_rptwait
movwf _rptwait_bf ; リピート待ち時間
optset_0 ; オプション設定
return

txtime_set_01:
decf _mode_no,F
btfss _status,_z
goto txtime_set_02
movlw vl_1_start_h
movwf _start_h ; スタート信号 on 時間
movlw vl_1_start_l
movwf _start_l ; スタート信号 off 時間
movlw vl_1_data_0h
movwf _data_0h ; データ0信号 on 時間
movlw vl_1_data_1h
movwf _data_1h ; データ1信号 on 時間
movlw vl_1_data_0l
movwf _data_0l ; データ0信号 off 時間
movlw vl_1_data_1l
movwf _data_1l ; データ1信号 off 時間
movlw vl_1_stop_h
movwf _stop_h ; ストップ信号 on 時間
movlw vl_1_rptwait
movwf _rptwait_bf ; リピート待ち時間
optset_1 ; オプション設定
return

txtime_set_02:
decf _mode_no,F
btfss _status,_z
goto txtime_set_03
movlw vl_2_start_h
movwf _start_h ; スタート信号 on 時間
movlw vl_2_start_l
movwf _start_l ; スタート信号 off 時間
movlw vl_2_data_0h
movwf _data_0h ; データ0信号 on 時間
movlw vl_2_data_1h
movwf _data_1h ; データ1信号 on 時間
movlw vl_2_data_0l
movwf _data_0l ; データ0信号 off 時間
movlw vl_2_data_1l
movwf _data_1l ; データ1信号 off 時間
movlw vl_2_stop_h
movwf _stop_h ; ストップ信号 on 時間
movlw vl_2_rptwait
movwf _rptwait_bf ; リピート待ち時間
optset_2 ; オプション設定
return

txtime_set_03:
decf _mode_no,F
btfss _status,_z
goto txtime_set_04
movlw vl_3_start_h
movwf _start_h ; スタート信号 on 時間
movlw vl_3_start_l
movwf _start_l ; スタート信号 off 時間
movlw vl_3_data_0h
movwf _data_0h ; データ0信号 on 時間
movlw vl_3_data_1h
movwf _data_1h ; データ1信号 on 時間
movlw vl_3_data_0l
movwf _data_0l ; データ0信号 off 時間
movlw vl_3_data_1l
movwf _data_1l ; データ1信号 off 時間
movlw vl_3_stop_h
movwf _stop_h ; ストップ信号 on 時間
movlw vl_3_rptwait
movwf _rptwait_bf ; リピート待ち時間
optset_3 ; オプション設定
return

txtime_set_04:
decf _mode_no,F
btfss _status,_z
goto txtime_set_05
movlw vl_4_start_h
movwf _start_h ; スタート信号 on 時間
movlw vl_4_start_l
movwf _start_l ; スタート信号 off 時間
movlw vl_4_data_0h
movwf _data_0h ; データ0信号 on 時間
movlw vl_4_data_1h
movwf _data_1h ; データ1信号 on 時間
movlw vl_4_data_0l
movwf _data_0l ; データ0信号 off 時間
movlw vl_4_data_1l
movwf _data_1l ; データ1信号 off 時間
movlw vl_4_stop_h
movwf _stop_h ; ストップ信号 on 時間
movlw vl_4_rptwait
movwf _rptwait_bf ; リピート待ち時間
optset_4 ; オプション設定
return

txtime_set_05:
decf _mode_no,F
btfss _status,_z
goto txtime_set_06
movlw vl_5_start_h
movwf _start_h ; スタート信号 on 時間
movlw vl_5_start_l
movwf _start_l ; スタート信号 off 時間
movlw vl_5_data_0h
movwf _data_0h ; データ0信号 on 時間
movlw vl_5_data_1h
movwf _data_1h ; データ1信号 on 時間
movlw vl_5_data_0l
movwf _data_0l ; データ0信号 off 時間
movlw vl_5_data_1l
movwf _data_1l ; データ1信号 off 時間
movlw vl_5_stop_h
movwf _stop_h ; ストップ信号 on 時間
movlw vl_5_rptwait
movwf _rptwait_bf ; リピート待ち時間
optset_5 ; オプション設定
return

txtime_set_06:
decf _mode_no,F
btfss _status,_z
goto txtime_set_07
movlw vl_6_start_h
movwf _start_h ; スタート信号 on 時間
movlw vl_6_start_l
movwf _start_l ; スタート信号 off 時間
movlw vl_6_data_0h
movwf _data_0h ; データ0信号 on 時間
movlw vl_6_data_1h
movwf _data_1h ; データ1信号 on 時間
movlw vl_6_data_0l
movwf _data_0l ; データ0信号 off 時間
movlw vl_6_data_1l
movwf _data_1l ; データ1信号 off 時間
movlw vl_6_stop_h
movwf _stop_h ; ストップ信号 on 時間
movlw vl_6_rptwait
movwf _rptwait_bf ; リピート待ち時間
optset_6 ; オプション設定
return

txtime_set_07:
movlw vl_7_start_h
movwf _start_h ; スタート信号 on 時間
movlw vl_7_start_l
movwf _start_l ; スタート信号 off 時間
movlw vl_7_data_0h
movwf _data_0h ; データ0信号 on 時間
movlw vl_7_data_1h
movwf _data_1h ; データ1信号 on 時間
movlw vl_7_data_0l
movwf _data_0l ; データ0信号 off 時間
movlw vl_7_data_1l
movwf _data_1l ; データ1信号 off 時間
movlw vl_7_stop_h
movwf _stop_h ; ストップ信号 on 時間
movlw vl_7_rptwait
movwf _rptwait_bf ; リピート待ち時間
optset_7 ; オプション設定
return
;----------------------------------------------------------------------------
; データを送信する

transmit:
movlw _tx_data
movwf _fsr
btfss _ScnStatus,_sharp ; シャープモード判定
goto data_tx_a
goto data_tx_b

;******************************************************************************
; 送信方式に合わして作成
;******************************************************************************
;-----------------------------------
; A = 家電標準 + ソニー

data_tx_a:
call start_tx
movf _rmcbyt,W
call byt_tx
movf _rmcbit,W
call bit_tx
call stop_tx
return
;-----------------------------------
; B=シャープ方式

data_tx_b:
movf _rmcbyt,W ; 第1ブロック送信
call byt_tx
movf _rmcbit,W
call bit_tx
call stop_tx

movf _rptwait_bf,W ; リピート待ち時間
movwf _rptwait
data_tx_b_01:
movlw vl_keywait
call wait_lo
decfsz _rptwait,F
goto data_tx_b_01

movf _rmcbyt,W ; 第2ブロック送信
call byt_tx
movf _rmcbit,W
call bit_tx
call stop_tx
return
;******************************************************************************
;---------------------------------------
; スタートビット送信

start_tx:
movf _start_h,W ; スタート信号 on 時間
btfsc _status,_z ; スタートビット有りチェック
return

movf _start_h,W ; スタート信号 on 時間セット
call wait_hi
movf _start_l,W ; スタート信号 off 時間セット
call wait_lo
return
;---------------------------------------
; バイトデータ送信
byt_tx:
movwf _count2
byt_tx_01:
movlw 8
movwf _count1
movf _ind0,W
movwf _buffer1
byt_tx_02:
bcf _status,_c
rrf _buffer1,F
btfsc _status,_c
goto byt_tx_04

; --- ビットデータ0 ---
byt_tx_03:
movf _data_0h,W ; データ0信号 on 時間セット
call wait_hi
movf _data_0l,W ; データ0信号 off 時間セット
call wait_lo
goto byt_tx_05

; --- ビットデータ1 ---
byt_tx_04:
movf _data_1h,W ; データ1信号 on 時間セット
call wait_hi
movf _data_1l,W ; データ1信号 off 時間セット
call wait_lo

byt_tx_05
decfsz _count1,F
goto byt_tx_02
incf _fsr,F
decfsz _count2,F
goto byt_tx_01
return
;----------------------------------------
; ビットデータ送信

bit_tx:
movwf _count1
movf _count1,W
btfsc _status,_z
return

movf _ind0,W
movwf _buffer1
bit_tx_01:
bcf _status,_c
rrf _buffer1,F
btfsc _status,_c
goto bit_tx_03

; --- ビットデータ0 ---
bit_tx_02:
movf _data_0h,W ; データ0信号 on 時間セット
call wait_hi
movf _data_0l,W ; データ0信号 off 時間セット
call wait_lo
goto bit_tx_04

; --- ビットデータ1 ---
bit_tx_03:
movf _data_1h,W ; データ1信号 on 時間セット
call wait_hi
movf _data_1l,W ; データ1信号 off 時間セット
call wait_lo

bit_tx_04:
decfsz _count1,F
goto bit_tx_01
incf _fsr,F
return
;---------------------------------------
; ストップ部送信

stop_tx:
movf _stop_h,W
btfsc _status,_z ; ストップビット有りチェック
return
movf _stop_h,W ; ストップ信号 on 時間セット
call wait_hi
return
;----------------------------------------------------------------------------
; 待ち時間

; --- LED発光待ち時間(割り込み不要タイプ4MHz) ---
; キャリア30μs(33kHz),キャリア26μs(38kHz)
; キャリア25μs(40kHz)

wait_hi:
movwf _cntBF1 ; パルス幅(1 = 0.1ms)
wait_hi_01:
movlw vl_ontime ; 1
movwf _cntBF0 ; 1
wait_hi_02:
bsf _portb,_led ; (LED on)
btfsc _ScnStatus,_carri33 ; 1 | 2
goto wait_hi_05 ; 5 | 0
goto $ + 1 ; 0 | 2
wait_hi_03:
goto $ + 1 ; 2
goto $ + 1 ; 2
nop ; 1
btfss _ScnStatus,_carri40 ; 1 | 2
goto $ + 1 ; 2 | 0
bcf _portb,_led ; 15|13 | 12 (LED off)
btfsc _ScnStatus,_carri33 ; 1 | 2
goto wait_hi_06 ; 5 | 0
goto $ + 1 ; 0 | 2
wait_hi_04:
nop ; 1
decfsz _cntBF0,F ; 1 | 2
goto wait_hi_07 ; 6 | 0
decfsz _cntBF1,F ; 1 | 2
goto wait_hi_01 ; 4
return ;;; 15|13 15|13 (LED on)

wait_hi_05:
nop ; 1
goto wait_hi_03 ; 2

wait_hi_06:
nop ; 1
goto wait_hi_04 ; 2

wait_hi_07:
goto $ + 1 ; 2
goto wait_hi_02 ; 2

; --- LED消灯待ち時間 ---
wait_lo:
movwf _cntBF1 ; パルス幅(1 = 0.1ms)
wait_lo_01:
movlw vl_offtime
movwf _cntBF0
wait_lo_02
nop
decfsz _cntBF0,F
goto wait_lo_02
decfsz _cntBF1,F
goto wait_lo_01
return

code_table

end


シェアする

  • このエントリーをはてなブックマークに追加

フォローする