;******************************************************************************************
;PIC18F452ボード 赤外線受信サンプルプログラム
;    Project      :
;    Program name : 
;    Creater      :
;    Create date  :  Version 1.0    H17.12.06  
;    History      :  
;*******************************************************************************************
;
;----- 18F452の定義 ------
;
	LIST	P=18F452,ST=OFF,R=DEC
	INCLUDE	"P18F452.inc"

	__CONFIG    _CONFIG1H, _OSCS_OFF_1H & _HS_OSC_1H
	__CONFIG    _CONFIG2L, _BOR_OFF_2L & _PWRT_OFF_2L & _BORV_20_2L
	__CONFIG    _CONFIG2H, _WDT_OFF_2H & _WDTPS_128_2H
	__CONFIG    _CONFIG3H, _CCP2MX_OFF_3H
	__CONFIG    _CONFIG4L, _STVR_OFF_4L & _LVP_OFF_4L & _DEBUG_OFF_4L
	__CONFIG    _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & _CP3_OFF_5L 
	__CONFIG    _CONFIG5H, _CPB_ON_5H & _CPD_OFF_5H
	__CONFIG    _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L 
	__CONFIG    _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H
	__CONFIG    _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L
	__CONFIG    _CONFIG7H, _EBTRB_OFF_7H


COMWT1A	EQU	03H	
COMWP1A	EQU	04H
COMWP01A EQU	05H
COMWP001A EQU	06H
COMWP001B EQU	07H
COMWP000001A EQU 08H
COMBEEPLP EQU	09H
COMTERMTP EQU	0AH
COMATEEPAD0 EQU	0BH
COMATEEPAD1 EQU	0CH
COMATEEPDAT EQU	0DH
COMI2CRSLP EQU	0EH
COMI2CSDTMP EQU	0FH
COMI2CSDLP EQU	10H
COMI2CRSTMP EQU	11H
COMWRT24TMP EQU	12H
COMATEEPSEL EQU	13H	; AT24C-EEPのアドレス選択
COMRED24EEPWK EQU 14H
COMCOU0	EQU 	15H
COMCOU1	EQU 	16H
COMCOU2	EQU 	17H
COMCOU3	EQU 	18H
COMCOU4	EQU 	19H
COMCOU5	EQU 	1AH
COMCHRCOU0 EQU 	1BH
COMCHRCOU1 EQU 	1CH
COMCHRCOU2 EQU 	1DH
COMCHRCOU3 EQU 	1EH
COMCHRCOU4 EQU 	1FH
COMCHRCOU5 EQU 	20H
COMADANSL EQU 	21H
COMADANSR EQU 	22H
COMCNT1 EQU 	23H
COMCNT2 EQU 	24H
MSGCNT	EQU	25H
WK	EQU	26H
COMTRANALLWK EQU 27H
IODAT	EQU	29H
SENDLP	EQU	2AH
SENDWAT	EQU	2BH
RECLP	EQU	2CH
RECWAT	EQU	2DH
CNT	EQU	2EH
CNT1	EQU	2FH
COMDSPCTMP1 EQU 30H
COMDSPCTMP2 EQU 31H
COMDSPCBTMP1 EQU 32H
LPCNT16	EQU	33H
PRG02PR	EQU	34H
PRG02P1	EQU	35H
PRG02P2	EQU	36H
PRG02CH	EQU	3EH
PRG02CL	EQU	3FH

;
	ORG	0h
	GOTO	START
	ORG	8h
	GOTO	START
	ORG	18h
	GOTO	START
;*******************************************************************************************
;  メッセージテーブルエリア　　　　
;*******************************************************************************************
; 1.パワーオンデモ用(DEMOPON)
DEMOPONTBL
	ADDWF	PCL,F
	RETLW	' '
	RETLW	' '
	RETLW	' '
	RETLW	' '
	RETLW	'S'
	RETLW	'Y'
	RETLW	'S'
	RETLW	' '
	RETLW	'2'
	RETLW	'5'
	RETLW	'4'
	RETLW	'F'
	RETLW	'8'
	RETLW	'1'
	RETLW	'C'
	RETLW	'I'
	RETLW	'P'
	RETLW	' '
	RETLW	' '
	RETLW	'd'
	RETLW	'r'
	RETLW	'o'
	RETLW	'B'
	RETLW	' '
	RETLW	'U'
	RETLW	'P'
	RETLW	'C'
	RETLW	' '
	RETLW	't'
	RETLW	'r'
	RETLW	'a'
	RETLW	't'
	RETLW	'S'

;*******************************************************************************************
;  プログラムスタート　　　　
;*******************************************************************************************
START
; 1.Port設定
;  (1)PortAの定義
	;;PORTAはデフォルト設定で使用（Analog_Input）
	;CLRF	PORTA		; PORTAの初期化
	;CLRF	LATA		; データラッチレジスタの初期化
	;MOVLW	B'00111111'	; PORTAのIO設定(注意：PORTAは0-5までしかない)	
	;MOVWF	TRISA		; PORTAのIO設定
;  (2)PortBの定義
;	CLRF	PORTB		; PORTBの初期化
;	CLRF	LATB		; データラッチレジスタの初期化
;	MOVLW	B'00000000'	; PORTBのIO設定(0-7)	
;	MOVWF	TRISB		; PORTBのIO設定
;  (3)PortCの定義
	CLRF	PORTC		; PORTCの初期化
	CLRF	LATC		; データラッチレジスタの初期化
	MOVLW	B'10000111'	; PORTCのIO設定(0-7)	
	MOVWF	TRISC		; PORTCのIO設定
	BSF	PORTC,5
	BSF	PORTC,6
;  (4)PortDの定義
;	CLRF	PORTD		; PORTDの初期化
;	CLRF	LATD		; データラッチレジスタの初期化
;	MOVLW	B'00000000'	; PORTDのIO設定(0-7)	
;	MOVWF	TRISD		; PORTDのIO設定
;  (5)PortEの定義
	;;PORTEはデフォルト設定で使用（Analog_Input）
	;CLRF	PORTE		; PORTEの初期化
	;CLRF	LATE		; データラッチレジスタの初期化
	;MOVLW	B'00000111'	; PORTEのIO設定(注意：PORTEは0-2までしかない)	
	;MOVWF	TRISE		; PORTEのIO設定
;
	MOVLW	B'0000'		; Bank 0を設定
	MOVWF	BSR		; Bank 0を設定
;
; 2.Initialize設定
;  (1)LCD初期化待ちと電源ONデモ表示
	CALL	COMWATP5
	CALL	DEMOPON
;  (2)EEP_AT24Cのデフォルトをゼロ番ソケットにする
	CALL	COMSEL24EEP0
;  (3)A/D ConverterのデフォルトをAN0にする
	CALL	COMADCSEL0
;  (4)0.5秒間WAITする
	CALL	COMWATP5
MAIN
	CALL	PRG02
	GOTO	MAIN

;*******************************************************************************************
;   関数名    : DEMOPON　　　　
;   機能      : デモ表示(パワーオンデモ) 
;   引数      : 
;   変数      : 
;   注意      : 
;*******************************************************************************************	
DEMOPON
	CALL	COMLCDCLR		; LCD画面クリア
	MOVLW	H'40'
	MOVWF	MSGCNT
DEMOPONA
	CALL	COMWATP001
	MOVF	MSGCNT,W
	CALL	DEMOPONTBL
	CALL	COMLCD
	DECFSZ	MSGCNT,F		; DUMMY READ
	NOP
	DECFSZ	MSGCNT,F
	GOTO	DEMOPONA
	RETURN


;*******************************************************************************************
;   関数名    : PRG02
;   機能      : 赤外線リモコン解析プログラム
;   引数      : なし
;   変数      : なし　
;   注意      : なし
;*******************************************************************************************
PRG02
	CALL	COMWATP001
	CALL	COMLCDCLR
	CALL	COMWATP001
; 0.変数初期化			; BANK2(200-2FF)までを初期化する
	LFSR	FSR0,0x200	; BANK2(200)をアドレスに設定する
PRG02A
	CLRF	POSTINC0	; ファイルレジスタを初期化してアドレスをINC(加算)する
	BTFSS	FSR0H,0		; BANK2(2XX)なら処理を続ける
	GOTO	PRG02A		;
; 1.解析
	LFSR	FSR0,0x200	; BANK2(200)をアドレスに設定する
	CLRF	PRG02CH
	CLRF	PRG02CL
; (1)パルス1
;   H(0)を待つ
	BTFSC	PORTC,7
	GOTO	$-1
;   L(1)を待つ
PRG02L0
	CALL	CNT16	;16ビットカウンタ(処理速度;10μS)
	XORLW	H'01'
	BTFSC	STATUS,Z
	GOTO	PRG02PRT
	BTFSS	PORTC,7
	GOTO	PRG02L0
	MOVF	PRG02CH,W
	MOVWF	POSTINC0
	MOVF	PRG02CL,W
	MOVWF	POSTINC0
; (2)パルス2
;   H(0)を待つ
	CLRF	PRG02CH
	CLRF	PRG02CL
PRG02H
	CALL	CNT16	;16ビットカウンタ(処理速度;10μS)
	XORLW	H'01'
	BTFSC	STATUS,Z
	GOTO	PRG02PRT
	BTFSC	PORTC,7
	GOTO	PRG02H
	MOVF	PRG02CH,W
	MOVWF	POSTINC0
	MOVF	PRG02CL,W
	MOVWF	POSTINC0
;   L(1)を待つ
	CLRF	PRG02CH
	CLRF	PRG02CL
	GOTO	PRG02L0
PRG02PRT
; 2.表示
; (1)変数初期化
	CLRF	POSTINC0
	CLRF	POSTINC0
;
	CLRF	PRG02PR
	LFSR	FSR0,0x200	; BANK2(200)をアドレスに設定する
PRG02PRT1
; (2)Hを表示
	MOVF	PRG02PR,W
	CALL	COMDSPCHR
	CALL	COMWATP001
	MOVLW	'H'
	CALL	COMLCD
	CALL	COMWATP001
	MOVLW	'['
	CALL	COMLCD
	CALL	COMWATP001
	MOVF	POSTINC0,W
	CALL	COMDSPCHR
	CALL	COMWATP001
	MOVF	POSTINC0,W
	CALL	COMDSPCHR
	CALL	COMWATP001
	MOVLW	']'
	CALL	COMLCD
	CALL	COMWATP001
	CALL	COMLCDCR
	CALL	COMWATP001

; (3)Lを表示
	MOVLW	' '
	CALL	COMLCD
	CALL	COMWATP001
	MOVLW	' '
	CALL	COMLCD
	CALL	COMWATP001
	MOVLW	'L'
	CALL	COMLCD
	CALL	COMWATP001
	MOVLW	'['
	CALL	COMLCD
	CALL	COMWATP001
	MOVF	POSTINC0,W
	MOVWF	PRG02P1
	CALL	COMDSPCHR
	CALL	COMWATP001
	MOVF	POSTINC0,W
	MOVWF	PRG02P2
	CALL	COMDSPCHR
	CALL	COMWATP001
	MOVLW	']'
	CALL	COMLCD
	CALL	COMWATP001
	CALL	COMWATP1
	CALL	COMWATP1
	CALL	COMWATP1
;
	MOVF	PRG02P1,W
	XORLW	H'00'
	BTFSS	STATUS,Z
	GOTO	PRG02PRTN
	MOVF	PRG02P2,W
	XORLW	H'00'
	BTFSC	STATUS,Z
	GOTO	PRG02END
; (4)次のデータを表示
PRG02PRTN
	CALL	COMLCDCLR
	CALL	COMWATP001
	MOVLW	H'01'
	ADDWF	PRG02PR,F
	GOTO	PRG02PRT1
PRG02END
	RETURN
;*******************************************************************************************
;   関数名    : CNT16
;   機能      : 16ビットカウンタ(0000-FFFF;0-65025)
;   引数      : PRG02CH,PRG02CL
;   変数      : 
;   注意      : 10μS(-5 Step)
;     OSC20/4MHz(0.2nS/Step)=>50 -6 Step 
;*******************************************************************************************
CNT16
	MOVLW	H'01'
	ADDWF	PRG02CL,F
	MOVF	PRG02CL,W
	XORLW	H'00'
	BTFSC	STATUS,Z
	GOTO	CNT16B
	MOVLW	H'0C'	; 36=(3*12)
	MOVWF	LPCNT16
	DECFSZ	LPCNT16,F
	GOTO	$-1 
	RETLW	H'00'
CNT16B
	MOVLW	H'01'
	ADDWF	PRG02CH,F
	MOVF	PRG02CH,W
	XORLW	H'00'
	BTFSC	STATUS,Z
	GOTO	CNT16C
	MOVLW	H'09'	; 27=(3*9)
	MOVWF	LPCNT16
	DECFSZ	LPCNT16,F
	GOTO	$-1 
	NOP
	NOP
	RETLW	H'00'
CNT16C
	MOVLW	H'08'	; 24=(3*8)
	NOP
	RETLW	H'01'
;*******************************************************************************************
;   関数名    : COMDSPCHR　　　　
;   機能      : '1'バイトの変数を16進数でＬＣＤに表示する
;   引数      : Input  : W-Reg
;   変数      :
;   注意      :
;*******************************************************************************************
COMDSPCHR
; 1.変数設定
	MOVWF	COMDSPCTMP1
	MOVWF	COMDSPCTMP2
; 2.2桁めを表示
;  (1)4ビット右シフト
	RRCF	COMDSPCTMP2,F
	RRCF	COMDSPCTMP2,F
	RRCF	COMDSPCTMP2,F
	RRCF	COMDSPCTMP2,F
;  (2)文字コードに変換
	MOVF	COMDSPCTMP2,W
	CALL	COMDSPCHRB
;  (3)ＬＣＤに出力
	CALL	COMLCD
	CALL	COMWATP001
; 3.1桁めを表示
;  (1)文字コードに変換
	MOVF	COMDSPCTMP1,W
	CALL	COMDSPCHRB
;  (2)ＬＣＤに出力
	CALL	COMLCD
	CALL	COMWATP001	
	RETURN
;*******************************************************************************************
;   関数名    : COMDSPCHRB　　　　
;   機能      : '1'バイトの変数を16進数（文字コード）に変換する
;   引数      : Input  : W-Reg
;   変数      :
;   注意      :
;*******************************************************************************************
COMDSPCHRB
; 0.変数設定
	MOVWF	COMDSPCBTMP1
; 1.先頭4ビットをゼロにする
	MOVF	COMDSPCBTMP1,W
	ANDLW	B'00001111'	
	MOVWF	COMDSPCBTMP1
; 2.変換処理
; (1)'10'の場合
	MOVF	COMDSPCBTMP1,W
	XORLW	H'0A'
	BTFSC	STATUS,Z
	RETLW	'A'
; (2)'11'の場合
	MOVF	COMDSPCBTMP1,W
	XORLW	H'0B'
	BTFSC	STATUS,Z
	RETLW	'B'
; (3)'12'の場合
	MOVF	COMDSPCBTMP1,W
	XORLW	H'0C'
	BTFSC	STATUS,Z
	RETLW	'C'
; (4)'13'の場合
	MOVF	COMDSPCBTMP1,W
	XORLW	H'0D'
	BTFSC	STATUS,Z
	RETLW	'D'
; (5)'14'の場合
	MOVF	COMDSPCBTMP1,W
	XORLW	H'0E'
	BTFSC	STATUS,Z
	RETLW	'E'
; (6)'15'の場合
	MOVF	COMDSPCBTMP1,W
	XORLW	H'0F'
	BTFSC	STATUS,Z
	RETLW	'F'
; (7)それ以外の場合
	MOVF	COMDSPCBTMP1,W
	IORLW	H'30'
	RETURN
;*******************************************************************************************
;   関数名    : COMADCSEL0　　　　
;   機能      : A/D ConverterにAN0を選択する
;   引数      : Output : ADANSL,ADANSR
;   変数      :
;   注意      :
;*******************************************************************************************
COMADCSEL0
;  (1)ADCON1の設定
	MOVLW	B'10000000'
	MOVWF	ADCON1
;            ADCON1[7]   10Bitを右詰めで得る
;            ADCON1[6]    ?(どっちでも)
;            ADCON1[5-4]  None
;            ADCON1[3-0]  全PORTをA/D_Converterで使用する
;
;  (2)ADCON0の設定
	MOVLW	B'10000001'
	MOVWF	ADCON0
;            ADCON0[7:6]  サンプリング周波数；Fosc/32(OSC周波数の1/32:最も遅い設定)
;            ADCON0[5-3]  Chanel-0(AN0)を選択
;            ADCON0[2]    Go/Done
;            ADCON0[1]    None
;            ADCON0[0]    A/D-Converter ON
	RETURN
;*******************************************************************************************
;   関数名    : COMADCSEL1　　　　
;   機能      : A/D ConverterにAN1を選択する
;   引数      : Output : ADANSL,ADANSR
;   変数      :
;   注意      :
;*******************************************************************************************
COMADCSEL1
;  (1)ADCON1の設定
	MOVLW	B'10000000'
	MOVWF	ADCON1
;            ADCON1[7]   10Bitを右詰めで得る
;            ADCON1[6]    ?(どっちでも)
;            ADCON1[5-4]  None
;            ADCON1[3-0]  全PORTをA/D_Converterで使用する
;
;  (2)ADCON0の設定
	MOVLW	B'10001001'
	MOVWF	ADCON0
;            ADCON0[7:6]  サンプリング周波数；Fosc/32(OSC周波数の1/32:最も遅い設定)
;            ADCON0[5-3]  Chanel-1(AN1)を選択
;            ADCON0[2]    Go/Done
;            ADCON0[1]    None
;            ADCON0[0]    A/D-Converter ON
	RETURN
;*******************************************************************************************
;   関数名    : COMADCSEL2　　　　
;   機能      : A/D ConverterにAN2を選択する
;   引数      : Output : ADANSL,ADANSR
;   変数      :
;   注意      :
;*******************************************************************************************
COMADCSEL2
;  (1)ADCON1の設定
	MOVLW	B'10000000'
	MOVWF	ADCON1
;            ADCON1[7]   10Bitを右詰めで得る
;            ADCON1[6]    ?(どっちでも)
;            ADCON1[5-4]  None
;            ADCON1[3-0]  全PORTをA/D_Converterで使用する
;
;  (2)ADCON0の設定
	MOVLW	B'10010001'
	MOVWF	ADCON0
;            ADCON0[7:6]  サンプリング周波数；Fosc/32(OSC周波数の1/32:最も遅い設定)
;            ADCON0[5-3]  Chanel-2(AN2)を選択
;            ADCON0[2]    Go/Done
;            ADCON0[1]    None
;            ADCON0[0]    A/D-Converter ON
	RETURN
;*******************************************************************************************
;   関数名    : COMADCSEL3　　　　
;   機能      : A/D ConverterにAN3を選択する
;   引数      : Output : ADANSL,ADANSR
;   変数      :
;   注意      :
;*******************************************************************************************
COMADCSEL3
;  (1)ADCON1の設定
	MOVLW	B'10000000'
	MOVWF	ADCON1
;            ADCON1[7]   10Bitを右詰めで得る
;            ADCON1[6]    ?(どっちでも)
;            ADCON1[5-4]  None
;            ADCON1[3-0]  全PORTをA/D_Converterで使用する
;
;  (2)ADCON0の設定
	MOVLW	B'10001101'
	MOVWF	ADCON0
;            ADCON0[7:6]  サンプリング周波数；Fosc/32(OSC周波数の1/32:最も遅い設定)
;            ADCON0[5-3]  Chanel-3(AN3)を選択
;            ADCON0[2]    Go/Done
;            ADCON0[1]    None
;            ADCON0[0]    A/D-Converter ON
	RETURN
;*******************************************************************************************
;   関数名    : COMADCSEL4　　　　
;   機能      : A/D ConverterにAN4を選択する
;   引数      : Output : ADANSL,ADANSR
;   変数      :
;   注意      :
;*******************************************************************************************
COMADCSEL4
;  (1)ADCON1の設定
	MOVLW	B'10000000'
	MOVWF	ADCON1
;            ADCON1[7]   10Bitを右詰めで得る
;            ADCON1[6]    ?(どっちでも)
;            ADCON1[5-4]  None
;            ADCON1[3-0]  全PORTをA/D_Converterで使用する
;
;  (2)ADCON0の設定
	MOVLW	B'10100001'
	MOVWF	ADCON0
;            ADCON0[7:6]  サンプリング周波数；Fosc/32(OSC周波数の1/32:最も遅い設定)
;            ADCON0[5-3]  Chanel-4(AN4)を選択
;            ADCON0[2]    Go/Done
;            ADCON0[1]    None
;            ADCON0[0]    A/D-Converter ON
	RETURN
;*******************************************************************************************
;   関数名    : COMADCSEL5　　　　
;   機能      : A/D ConverterにAN5を選択する
;   引数      : Output : ADANSL,ADANSR
;   変数      :
;   注意      :
;*******************************************************************************************
COMADCSEL5
;  (1)ADCON1の設定
	MOVLW	B'10000000'
	MOVWF	ADCON1
;            ADCON1[7]   10Bitを右詰めで得る
;            ADCON1[6]    ?(どっちでも)
;            ADCON1[5-4]  None
;            ADCON1[3-0]  全PORTをA/D_Converterで使用する
;
;  (2)ADCON0の設定
	MOVLW	B'10101001'
	MOVWF	ADCON0
;            ADCON0[7:6]  サンプリング周波数；Fosc/32(OSC周波数の1/32:最も遅い設定)
;            ADCON0[5-3]  Chanel-5(AN5)を選択
;            ADCON0[2]    Go/Done
;            ADCON0[1]    None
;            ADCON0[0]    A/D-Converter ON
	RETURN
;*******************************************************************************************
;   関数名    : COMADCSEL6　　　　
;   機能      : A/D ConverterにAN6を選択する
;   引数      : Output : ADANSL,ADANSR
;   変数      :
;   注意      :
;*******************************************************************************************
COMADCSEL6
;  (1)ADCON1の設定
	MOVLW	B'10000000'
	MOVWF	ADCON1
;            ADCON1[7]   10Bitを右詰めで得る
;            ADCON1[6]    ?(どっちでも)
;            ADCON1[5-4]  None
;            ADCON1[3-0]  全PORTをA/D_Converterで使用する
;
;  (2)ADCON0の設定
	MOVLW	B'10110001'
	MOVWF	ADCON0
;            ADCON0[7:6]  サンプリング周波数；Fosc/32(OSC周波数の1/32:最も遅い設定)
;            ADCON0[5-3]  Chanel-6(AN6)を選択
;            ADCON0[2]    Go/Done
;            ADCON0[1]    None
;            ADCON0[0]    A/D-Converter ON
	RETURN
;*******************************************************************************************
;   関数名    : COMADCSEL7　　　　
;   機能      : A/D ConverterにAN7を選択する
;   引数      : Output : ADANSL,ADANSR
;   変数      :
;   注意      :
;*******************************************************************************************
COMADCSEL7
;  (1)ADCON1の設定
	MOVLW	B'10000000'
	MOVWF	ADCON1
;            ADCON1[7]   10Bitを右詰めで得る
;            ADCON1[6]    ?(どっちでも)
;            ADCON1[5-4]  None
;            ADCON1[3-0]  全PORTをA/D_Converterで使用する
;
;  (2)ADCON0の設定
	MOVLW	B'10111001'
	MOVWF	ADCON0
;            ADCON0[7:6]  サンプリング周波数；Fosc/32(OSC周波数の1/32:最も遅い設定)
;            ADCON0[5-3]  Chanel-7(AN7)を選択
;            ADCON0[2]    Go/Done
;            ADCON0[1]    None
;            ADCON0[0]    A/D-Converter ON
	RETURN
;*******************************************************************************************
;   関数名    : COMADCGET　　　　
;   機能      : A/D Converterから端子の電圧を得る
;               GND=>0000  VCC=>1023
;   引数      : Output1 : COMADANSL,COMADANSR    (16進バイナリー形式)
;               Output2 : COMCOU0～COMCOU3       (10進数値形式)
;               Output3 : COMCHRCOU0～COMCHRCOU3 (10進キャラクタ形式)
;   変数      :
;   注意      :
;*******************************************************************************************
COMADCGET
;  (1)開始
	BSF	ADCON0,2 	
COMADCGET1
	BTFSC	ADCON0,2	; ADCの開始フラグが完了するまで待つ
	GOTO	COMADCGET1	; ADCの開始フラグが完了するまで待つ
; 
	CALL	COMWATP001
	BSF	ADCON0,2 	
COMADCGET2
	BTFSC	ADCON0,2	; ADCの開始フラグが完了するまで待つ
	GOTO	COMADCGET2	; ADCの開始フラグが完了するまで待つ
;
	MOVF	ADRESH,W	; 上位２ビットデータ収集
	MOVWF	COMADANSL	; 上位２ビットデータ代入
	MOVF	ADRESL,W	; 下位８ビットデータ収集
	MOVWF	COMADANSR	; 下位８ビットデータ代入
;  (2)データ形式変換
	CALL	COMHEXDEC
;  (3)キャラクタ変換
	CALL	COMCNTCHR
	RETURN

;*******************************************************************************************
;   関数名    : COMSEL24EEP0　　　　
;   機能      : AT24C1024の0番ソケットのEEPを選択する
;   引数      : 
;   変数      :
;   注意      :
;*******************************************************************************************
COMSEL24EEP0
	MOVLW	B'10100000'
	MOVWF	COMATEEPSEL
	RETURN
;*******************************************************************************************
;   関数名    : COMSEL24EEP1　　　　
;   機能      : AT24C1024の1番ソケットのEEPを選択する
;   引数      : 
;   変数      :
;   注意      :
;*******************************************************************************************
COMSEL24EEP1
	MOVLW	B'10100100'
	MOVWF	COMATEEPSEL
	RETURN
;*******************************************************************************************
;   関数名    : COMRED24EEP　　　　
;   機能      : AT24C1024からデータを読み込む 
;   引数      : Input
;                  ATEEPAD1    アドレス2桁め
;		   ATEEPAD0    アドレス1桁め 
;             : Output : 
;                  ATEEPDAT,W  読込みデータ
;   変数      :
;   注意      :
;*******************************************************************************************
COMRED24EEP
; 1.Dummy Write
; (1)Start Condition
	CALL	COMI2CSTR
; (2)ヘッダー送信(1010,0000)
;	MOVLW	B'10100000'
	MOVF	COMATEEPSEL,W
	CALL	COMI2CSEND
; (3)アドレス送信
;   上位アドレス送信
	BCF	COMATEEPAD1,7	; 不定
;	BSF	COMATEEPAD1,6	; MSBセット   H17.07.07 Comment
	MOVF	COMATEEPAD1,W
	CALL	COMI2CSEND
;   下位アドレス送信
	MOVF	COMATEEPAD0,W
	CALL	COMI2CSEND
; 2.READ
; (1)Start Condition
	CALL	COMI2CSTR
; (2)ヘッダー送信(1010,0001)
;	MOVLW	B'10100001'
	MOVF	COMATEEPSEL,W
	MOVWF	COMRED24EEPWK
	BSF	COMRED24EEPWK,0
	MOVF	COMRED24EEPWK,W
	CALL	COMI2CSEND
; (3)読込み
	CALL	COMI2CRES

; (4)Stop Condition
	CALL	COMI2CSTP
	MOVF	COMATEEPDAT,W
	RETURN
;*******************************************************************************************
;   関数名    : COMWRT24EEP　　　　
;   機能      : AT24C1024にデータを書き込む 
;   引数      : Input
;                  ATEEPAD1  アドレス2桁め
;		   ATEEPAD0  アドレス1桁め 
;                  W         書き込みデータ
;               Output
;                  なし
;   変数      :
;*******************************************************************************************
COMWRT24EEP
	MOVWF	COMWRT24TMP
; (1)Start Condition
	CALL	COMI2CSTR
; (2)ヘッダー送信(1010,0000)
;	MOVLW	B'10100000'
	MOVF	COMATEEPSEL,W
	CALL	COMI2CSEND
; (3)アドレス送信
;   上位アドレス送信
	BCF	COMATEEPAD1,7	; 不定
;	BSF	COMATEEPAD1,6	; MSBセット  H17.07.07 Comment
	MOVF	COMATEEPAD1,W
	CALL	COMI2CSEND
;   下位アドレス送信
	MOVF	COMATEEPAD0,W
	CALL	COMI2CSEND
; (4)データ送信
	MOVF	COMWRT24TMP,W
	CALL	COMI2CSEND
; (5)Stop Condition
	CALL	COMI2CSTP

	RETURN
;*******************************************************************************************
;   関数名    : COMI2CSTR　　　　
;   機能      : I2Cプロトコルでスタートコンディションを与える 
;   引数      : Input  : なし
;             : Output : なし
;   変数      :
;*******************************************************************************************
COMI2CSTR
	BSF	PORTC,4		; SDA信号(1)
	BSF	PORTC,3		; SCL信号(1)
	CALL	COMWATP000001	; 0.6μS以上
	BCF	PORTC,4		; SDA信号(0)
	CALL	COMWATP000001	; 0.6μS以上
	BCF	PORTC,3		; SCL信号(0)
	CALL	COMWATP000001	; 0.6μS以上
	RETURN

;*******************************************************************************************
;   関数名    : COMI2CSTP　　　　
;   機能      : I2Cプロトコルでストップコンディションを与える 
;   引数      : Input  : なし
;             : Output : なし
;   変数      :
;*******************************************************************************************
COMI2CSTP
	BCF	PORTC,3		; SCL信号(0)
	BCF	PORTC,4		; SDA信号(0)
	CALL	COMWATP000001	; 0.6μS以上
	BSF	PORTC,3		; SCL信号(1)
	BCF	PORTC,4		; SDA信号(0)
	CALL	COMWATP000001	; 0.6μS以上
	BSF	PORTC,4		; SDA信号(1)
	CALL	COMWATP000001	; 0.6μS以上
	RETURN

;*******************************************************************************************
;   関数名    : COMI2CRES　　　　
;   機能      : I2Cプロトコルで8ビットのデータをバスから受ける 
;   引数      : Input  : なし
;             : Output : W
;   変数      :
;*******************************************************************************************
COMI2CRES
	MOVLW	B'10010111'	; PORTCのIO設定(0-7)	
	MOVWF	TRISC		; PORTCのIO設定
	BSF	PORTC,5
	BSF	PORTC,6
;1:8Bit受信
; 0)ループ変数設定
	MOVLW	H'08'
	MOVWF	COMI2CRSLP
COMI2CRES2
; 1)クロック設定(1)
	CALL	COMWATP000001
	BSF	PORTC,3
	CALL	COMWATP000001
; 2)データ設定
	BTFSS	PORTC,4		; 
	BCF	COMI2CRSTMP,0 	; 
	BTFSC	PORTC,4		; 
	BSF	COMI2CRSTMP,0 	;
; 3)クロック設定(0)
	BCF	PORTC,3
	MOVF	COMI2CRSTMP,W	; 1回分の余計なシフトを補正
	MOVWF	COMATEEPDAT	; 1回分の余計なシフトを補正
	RLCF	COMI2CRSTMP,F
	DECFSZ	COMI2CRSLP,F
	GOTO	COMI2CRES2
;2:NoAct
	CALL	COMI2CCLOK
	CALL	COMWATP000001
;3:元に戻す
	MOVLW	B'10000111'	; PORTCのIO設定(0-7)	
	MOVWF	TRISC		; PORTCのIO設定
	BSF	PORTC,5
	BSF	PORTC,6
;4:結果を返す
	MOVF	COMATEEPDAT,W
	RETURN

;*******************************************************************************************
;   関数名    : COMI2CSEND　　　　
;   機能      : I2Cプロトコルで8ビットのデータを与える 
;   引数      : Input  :  W 書き込みデータ
;             : Output : なし
;   変数      :
;*******************************************************************************************
COMI2CSEND
	MOVWF	COMI2CSDTMP
;1：8Bit送信
; 0)ループ変数設定
	MOVLW	H'08'
	MOVWF	COMI2CSDLP
COMI2CSEND2
; 1)データ設定
	BTFSS	COMI2CSDTMP,7	; 
	BCF	PORTC,4	 	; 
	BTFSC	COMI2CSDTMP,7	; 
	BSF	PORTC,4	 	;
; 2)クロック信号  
	CALL	COMI2CCLOK		;
; 3)ACTのリターンでデバイス衝突が起きないようにゼロにする 
	BCF	PORTC,4	 	;
; 4)シフト 
	RLCF	COMI2CSDTMP,F
	DECFSZ	COMI2CSDLP,F
	GOTO	COMI2CSEND2
;(2)ACT検知
	CALL	COMI2CACT
	RETURN

;*******************************************************************************************
;   関数名    : COMI2CACT　　　
;   機能      : I2CプロトコルでACT信号を検知する
;   引数      : Input  : なし
;             : Output : なし
;   変数      :
;*******************************************************************************************
COMI2CACT
	MOVLW	B'10010111'	; PORTCのIO設定(0-7)	
	MOVWF	TRISC		; PORTCのIO設定
	BSF	PORTC,5
	BSF	PORTC,6
	CALL	COMWATP000001	; 
	BSF	PORTC,3		; SCL信号(1)
	CALL	COMWATP000001	; 
COMI2CACT2
	BTFSC	PORTC,4		; 
	GOTO	COMI2CACT2	;
	BCF	PORTC,3		; SCL信号(0)
	CALL	COMWATP000001	; 
;
	MOVLW	B'10000111'	; PORTCのIO設定(0-7)	
	MOVWF	TRISC		; PORTCのIO設定
	BSF	PORTC,5
	BSF	PORTC,6

	RETURN
;*******************************************************************************************
;   関数名    : COMI2CCLOK　　　
;   機能      : I2Cプロトコルでクロックパルスを与える
;   引数      : Input  : なし
;             : Output : なし
;   変数      :
;*******************************************************************************************
COMI2CCLOK
	BCF	PORTC,3		; SCL信号(0)
	CALL	COMWATP000001	; 1.3μS以上
	CALL	COMWATP000001	; 1.3μS以上
	BSF	PORTC,3		; SCL信号(1)
	CALL	COMWATP000001	; 0.6μS以上
	BCF	PORTC,3		; SCL信号(0)
	NOP			; Actのため時間を長くすると危険
	NOP			; Actのため時間を長くすると危険
	RETURN
;*******************************************************************************************
;   関数名    : COMGETSW　　　　
;   機能      : 基板上のプッシュSWの判定
;   引数      :  W: 押されたプッシュSWの番号
;   変数      : 
;   注意      : 
;*******************************************************************************************
COMGETSW
	BTFSC	PORTC,0
	RETLW	'1'
	BTFSC	PORTC,1
	RETLW	'2'
	BTFSC	PORTC,2
	RETLW	'3'
	GOTO	COMGETSW
;*******************************************************************************************
;   関数名    : COMTERMA　　　　
;   機能      : ターミナルモード
;               入力 RS232C(ポート1)
;   引数      : 
;   変数      : 
;   注意      : 
;*******************************************************************************************
COMTERMA
	CALL	COMWATP001
	CALL	COMLCDCLR
	MOVLW	'O'
	CALL	COMLCD
	CALL	COMWATP001
	MOVLW	'K'
	CALL	COMLCD
	CALL	COMWATP001
	MOVLW	'>'
	CALL	COMLCD
	CALL	COMWATP001
	CALL	COMSERRA
	MOVWF	COMTERMTP
;	CALL	COMWATP001
COMTERMA1
	MOVF	COMTERMTP,W
	CALL	COMLCD
	MOVF	COMTERMTP,W
	CALL	COMSERTA
;
	CALL	COMSERRA
	MOVWF	COMTERMTP
	GOTO	COMTERMA1

;*******************************************************************************************
;   関数名    : COMTRANALL　　　　
;   機能      : LCD,Serlal①,RS232C①に同時に出力する
;   引数      : W
;   変数      : 
;   注意      : 
;*******************************************************************************************
COMTRANALL
; 1.LCDに出力
	MOVWF	COMTRANALLWK
	CALL	COMLCD
; 2.Serial Portに出力
	MOVF	COMTRANALLWK,W
	CALL	COMSERTA

	RETURN
;*******************************************************************************************
;   関数名    : COMLCDCLR　　　　
;   機能      : LCDの画面クリア
;   引数      : 
;   変数      : 
;   注意      : 
;*******************************************************************************************
COMLCDCLR
	MOVLW	H'80'
	CALL	COMLCD
	RETURN
;*******************************************************************************************
;   関数名    : COMLCDCR　　　　
;   機能      : LCDの2行目入力(改行)
;   引数      : 
;   変数      : 
;   注意      : 
;*******************************************************************************************
COMLCDCR
	MOVLW	H'81'
	CALL	COMLCD
	RETURN
;*******************************************************************************************
;   関数名    : COMLCD　　　　
;   機能      : LCDに文字を表示する(受信確認あり)
;   引数      : W : キャラクタコード
;   変数      : 
;   注意      : 
;*******************************************************************************************
COMLCD	
	CALL	COMLCDT
	CALL	COMRLCD
	RETURN
;*******************************************************************************************
;   関数名    : COMLCDT　　　　
;   機能      : LCD(PORTC5)に文字を表示する
;   引数      : W : キャラクタコード
;   変数      : 
;   注意      :
;*******************************************************************************************
COMLCDT
	MOVWF	IODAT
	BCF	PORTC,5	; 送信開始
	MOVLW	H'AA'	; 9600BPS,OSC;20MHz
	MOVWF	SENDWAT
COMLCDT1 DECFSZ	SENDWAT,F
	GOTO	COMLCDT1
;
; (2)データ送信(8ビット)
	MOVLW	8	; 8ビットデータ分、送信する
	MOVWF	SENDLP
	NOP
COMLCDT2 RRCF	IODAT,F
	NOP
	BTFSS	STATUS,C ; ビットデータが0の時, 0を立てる	
	BCF	PORTC,5
	BTFSC	STATUS,C ; ビットデータが1の時, 1を立てる
	BSF	PORTC,5

	MOVLW	H'AA'	; パルス(9600BPS,OSC;20MHz)
	MOVWF	SENDWAT
COMLCDT3 DECFSZ	SENDWAT,F
	GOTO	COMLCDT3

	DECFSZ	SENDLP,F
	GOTO	COMLCDT2
; (3)終了
	BSF	PORTC,5	; フラグを戻す
; (4)送信後、少し待つ
	CALL	TIMER

	RETURN

;*******************************************************************************************
;   関数名    : COMRLCD　　　　
;   機能      : シリアルLCD(PORTA4)のリターンを得る
;   引数      :
;   変数      : 
;   注意      : 
;*******************************************************************************************
COMRLCD
; (0)変数初期化
	CLRF	IODAT
COMRLCD0	
; (1)受信データを待つ
	BTFSC	PORTA,4
	GOTO	COMRLCD0
; (2)1/2ビット分待つ
	MOVLW	H'55'	; 9600BPS,OSC;20MHz
	MOVWF   RECWAT
COMRLCD1 DECFSZ	RECWAT,F
	GOTO	COMRLCD1
; (3)データ受信(8ビット分)
	MOVLW	8
	MOVWF	RECLP
	NOP
COMRLCD2 MOVLW	H'AA'	; 9600BPS,OSC;20MHz
	MOVWF	RECWAT
COMRLCD3 DECFSZ	RECWAT,F
	GOTO	COMRLCD3
	NOP
	BTFSS	PORTA,4	; ビットデータが0の時, 0を立てる
	BCF	STATUS,C
	BTFSC	PORTA,4	; ビットデータが1の時, 1を立てる
	BSF	STATUS,C
	RRCF	IODAT,F	; 変数内でビットをシフトする
	DECFSZ	RECLP,F
	GOTO	COMRLCD2
	MOVF	IODAT,W
	NOP
	NOP
;
	RETURN

;*******************************************************************************************
;   関数名    : COMSERTA　　　　
;   機能      : シリアルポート1(PORTC6)に文字を出力する
;   引数      : W : キャラクタコード
;   変数      : 
;   注意      :
;*******************************************************************************************
COMSERTA MOVWF	IODAT
	BCF	PORTC,6	; 送信開始
	MOVLW	H'AA'	; 9600BPS,OSC;20MHz
	MOVWF	SENDWAT
COMSERTA1 DECFSZ	SENDWAT,F
	GOTO	COMSERTA1
;
; (2)データ送信(8ビット)
	MOVLW	8	; 8ビットデータ分、送信する
	MOVWF	SENDLP
	NOP
COMSERTA2 RRCF	IODAT,F
	NOP
	BTFSS	STATUS,C ; ビットデータが0の時, 0を立てる	
	BCF	PORTC,6
	BTFSC	STATUS,C ; ビットデータが1の時, 1を立てる
	BSF	PORTC,6

	MOVLW	H'AA'	; パルス(9600BPS,OSC;20MHz)
	MOVWF	SENDWAT
COMSERTA3 DECFSZ	SENDWAT,F
	GOTO	COMSERTA3

	DECFSZ	SENDLP,F
	GOTO	COMSERTA2
; (3)終了
	BSF	PORTC,6	; フラグを戻す
; (4)送信後、少し待つ
	CALL	TIMER

	RETURN
;*******************************************************************************************
;   関数名    : COMSERRA　　　　
;   機能      : シリアルポート1(PORTC7)から文字を受信する
;   引数      : W
;   変数      : 
;   注意      : 
;*******************************************************************************************
COMSERRA
; (0)変数初期化
	CLRF	IODAT
COMSERRA0	
; (1)受信データを待つ
	BTFSC	PORTC,7
	GOTO	COMSERRA0
; (2)1/2ビット分待つ
	MOVLW	H'55'	; 9600BPS,OSC;20MHz
	MOVWF   RECWAT
COMSERRA1 DECFSZ	RECWAT,F
	GOTO	COMSERRA1
; (3)データ受信(8ビット分)
	MOVLW	8
	MOVWF	RECLP
	NOP
COMSERRA2 MOVLW	H'AA'	; 9600BPS,OSC;20MHz
	MOVWF	RECWAT
COMSERRA3 DECFSZ	RECWAT,F
	GOTO	COMSERRA3
	NOP
	BTFSS	PORTC,7	; ビットデータが0の時, 0を立てる
	BCF	STATUS,C
	BTFSC	PORTC,7	; ビットデータが1の時, 1を立てる
	BSF	STATUS,C
	RRCF	IODAT,F	; 変数内でビットをシフトする
	DECFSZ	RECLP,F
	GOTO	COMSERRA2
	MOVF	IODAT,W
	NOP
	NOP
;
	RETURN

;*******************************************************************************************
;   関数名    : COMSERTB　　　　
;   機能      : シリアルポート2(PORTC5)に文字を出力する
;   引数      : W : キャラクタコード
;   変数      : 
;   注意      : 
;*******************************************************************************************
COMSERTB MOVWF	IODAT
	BCF	PORTC,5	; 送信開始
	MOVLW	H'AA'	; 9600BPS,OSC;20MHz
	MOVWF	SENDWAT
COMSERTB1 DECFSZ	SENDWAT,F
	GOTO	COMSERTB1
;
; (2)データ送信(8ビット)
	MOVLW	8	; 8ビットデータ分、送信する
	MOVWF	SENDLP
	NOP
COMSERTB2 RRCF	IODAT,F
	NOP
	BTFSS	STATUS,C ; ビットデータが0の時, 0を立てる	
	BCF	PORTC,5
	BTFSC	STATUS,C ; ビットデータが1の時, 1を立てる
	BSF	PORTC,5

	MOVLW	H'AA'	; パルス(9600BPS,OSC;20MHz)
	MOVWF	SENDWAT
COMSERTB3 DECFSZ	SENDWAT,F
	GOTO	COMSERTB3

	DECFSZ	SENDLP,F
	GOTO	COMSERTB2
; (3)終了
	BSF	PORTC,5	; フラグを戻す
; (4)送信後、少し待つ
	CALL	TIMER

	RETURN

;*******************************************************************************************
;   関数名    : COMSERRB　　　　
;   機能      : シリアルポート2(PORTA4)から文字を受信する
;   引数      : 
;   変数      : 
;   注意      : 
;*******************************************************************************************
COMSERRB
; (0)変数初期化
	CLRF	IODAT
COMSERRB0	
; (1)受信データを待つ
	BTFSC	PORTA,4
	GOTO	COMSERRB0
; (2)1/2ビット分待つ
	MOVLW	H'55'	; 9600BPS,OSC;20MHz
	MOVWF   RECWAT
COMSERRB1 DECFSZ	RECWAT,F
	GOTO	COMSERRB1
; (3)データ受信(8ビット分)
	MOVLW	8
	MOVWF	RECLP
	NOP
COMSERRB2 MOVLW	H'AA'	; 9600BPS,OSC;20MHz
	MOVWF	RECWAT
COMSERRB3 DECFSZ	RECWAT,F
	GOTO	COMSERRB3
	NOP
	BTFSS	PORTA,4	; ビットデータが0の時, 0を立てる
	BCF	STATUS,C
	BTFSC	PORTA,4	; ビットデータが1の時, 1を立てる
	BSF	STATUS,C
	RRCF	IODAT,F	; 変数内でビットをシフトする
	DECFSZ	RECLP,F
	GOTO	COMSERRB2
	MOVF	IODAT,W
	NOP
	NOP
;
	RETURN
;******************************************************************************************
;   関数名    : COMHEXDEC　　　
;   機能      : 10Bit-A/D-Converter の16進数を文字型10進数(4桁)に変換する
;   引数      : 
;        In  COMADANSL,COMADANSR (10Bit-A/D-Converterの出力形式)
;        Out COMCOU0,COMCOU1,COMCOU2,COMCOU3(4桁の10進数)
;   変数      : 
;   注意      : 
;******************************************************************************************
COMHEXDEC
; (1)10進数の出力変数を初期化　
	CLRF	COMCOU0
	CLRF	COMCOU1
	CLRF	COMCOU2
	CLRF	COMCOU3
	CLRF	COMCOU4
	CLRF	COMCOU5
;
; (2)16進数を10進数に変換する
;   ※ Binary-16進数の値分だけ10進カウンタを回して、Binary-16進数を文字型10進数の
;      COMCOU0,COMCOU1,COMCOU2,COMCOU3にカウントアップして10進数を作り出す
;
	MOVF	COMADANSL,W
	XORLW	H'00'
	BTFSC	STATUS,Z
	GOTO	COMHEXDEE
;
	MOVF	COMADANSL,W
	MOVWF	COMCNT2
COMHEXDEC2
	MOVLW	H'FF'
	MOVWF	COMCNT1
	CALL	COMCNTDEC
COMHEXDEC1
	CALL	COMCNTDEC
	DECFSZ	COMCNT1,F
	GOTO	COMHEXDEC1 
	DECFSZ	COMCNT2,F
	GOTO	COMHEXDEC2
;
COMHEXDEE
	MOVF	COMADANSR,W
	XORLW	H'00'
	BTFSC	STATUS,Z
	GOTO	COMHEXDECE

	MOVF	COMADANSR,W
	MOVWF	COMCNT1
COMHEXDEE1
	CALL	COMCNTDEC
	DECFSZ	COMCNT1,F
	GOTO	COMHEXDEE1 
COMHEXDECE
	RETURN
;******************************************************************************************
;   関数名    : COMCNTDEC　　
;   機能      : 10進(6桁)アップカウンタ
;   引数      : COMCOU0～COMCOU5 
;   変数      : 
;   注意      : 
;******************************************************************************************
COMCNTDEC
	MOVLW	H'01'
	ADDWF	COMCOU0,F	; 0桁目10進カウンタ(0aで桁上げ)
	MOVF	COMCOU0,W
	XORLW	H'0A'
	BTFSS	STATUS,Z
	RETURN
;
	CLRF	COMCOU0
	MOVLW	H'01'
	ADDWF	COMCOU1,F	; 1桁目10進カウンタ(0aで桁上げ)
	MOVF	COMCOU1,W
	XORLW	H'0A'
	BTFSS	STATUS,Z
	RETURN
;
	CLRF	COMCOU1
	MOVLW	H'01'
	ADDWF	COMCOU2,F	; 2桁目10進カウンタ(0aで桁上げ)
	MOVF	COMCOU2,W
	XORLW	H'0A'
	BTFSS	STATUS,Z
	RETURN
;
	CLRF	COMCOU2
	MOVLW	H'01'
	ADDWF	COMCOU3,F	; 3桁目10進カウンタ(0aで桁上げ)
	MOVF	COMCOU3,W
	XORLW	H'0A'
	BTFSS	STATUS,Z
	RETURN
;
	CLRF	COMCOU3
	MOVLW	H'01'
	ADDWF	COMCOU4,F	; 4桁目10進カウンタ(0aで桁上げ)
	MOVF	COMCOU4,W
	XORLW	H'0A'
	BTFSS	STATUS,Z
	RETURN
;
	CLRF	COMCOU4
	MOVLW	H'01'
	ADDWF	COMCOU5,F	; 5桁目10進カウンタ(0aで桁上げ)
	MOVF	COMCOU5,W
	XORLW	H'0A'
	BTFSS	STATUS,Z
	RETURN
;
	CLRF	COMCOU0
	CLRF	COMCOU1
	CLRF	COMCOU2
	CLRF	COMCOU3
	CLRF	COMCOU4
	CLRF	COMCOU5
;
	RETURN
;******************************************************************************************
;   関数名    : COMCNTHEX　　　
;   機能      : 16進(6桁)アップカウンター
;   引数      : COMCOU0～COMCOU5 
;   変数      : 
;   注意      : 
;******************************************************************************************
COMCNTHEX
; 0桁目
	MOVLW	H'01'
	ADDWF	COMCOU0,F
	BTFSS	COMCOU0,4	 	
	RETURN
; 1桁目
	MOVF	COMCOU0,W
	ANDLW	B'00001111'	
	MOVWF	COMCOU0
	MOVLW	H'01'
	ADDWF	COMCOU1,F
	BTFSS	COMCOU1,4	 
	RETURN	
; 2桁目
	MOVF	COMCOU1,W
	ANDLW	B'00001111'	
	MOVWF	COMCOU1
	MOVLW	H'01'
	ADDWF	COMCOU2,F
	BTFSS	COMCOU2,4	 
	RETURN	
; 3桁目
	MOVF	COMCOU2,W
	ANDLW	B'00001111'	
	MOVWF	COMCOU2
	MOVLW	H'01'
	ADDWF	COMCOU3,F
	BTFSS	COMCOU3,4	 
	RETURN		
; 4桁目
	MOVF	COMCOU3,W
	ANDLW	B'00001111'	
	MOVWF	COMCOU3
	MOVLW	H'01'
	ADDWF	COMCOU4,F
	BTFSS	COMCOU4,4	 
	RETURN	
; 5桁目
	MOVF	COMCOU4,W
	ANDLW	B'00001111'	
	MOVWF	COMCOU4
	MOVLW	H'01'
	ADDWF	COMCOU5,F
	BTFSS	COMCOU5,4	 
	RETURN	
; 桁上がり
	CLRF	COMCOU0
	CLRF	COMCOU1
	CLRF	COMCOU2
	CLRF	COMCOU3
	CLRF	COMCOU4
	CLRF	COMCOU5
	RETURN	

;******************************************************************************************
;   関数名    : COMCNTINIT　　　
;   機能      : カウンター変数の初期化
;   引数      : COMCOU0～COMCOU5 
;   変数      : 
;   注意      : 
;******************************************************************************************
COMCNTINIT
	CLRF	COMCOU0
	CLRF	COMCOU1
	CLRF	COMCOU2
	CLRF	COMCOU3
	CLRF	COMCOU4
	CLRF	COMCOU5
	RETURN

;******************************************************************************************
;   関数名    : COMCNTCHR　　　
;   機能      : カウンター変数をキャラクタに変換
;   引数      : 
;               (I)COMCOU0～COMCOU5 
;               (O)COMCHRCOU0～COMCHRCOU5 
;   変数      : 
;   注意      : 
;******************************************************************************************
COMCNTCHR
	MOVF	COMCOU0,W
	IORLW	H'30'	
	MOVWF	COMCHRCOU0
;
	MOVF	COMCOU1,W
	IORLW	H'30'	
	MOVWF	COMCHRCOU1
;
	MOVF	COMCOU2,W
	IORLW	H'30'	
	MOVWF	COMCHRCOU2
;
	MOVF	COMCOU3,W
	IORLW	H'30'	
	MOVWF	COMCHRCOU3
;
	MOVF	COMCOU4,W
	IORLW	H'30'	
	MOVWF	COMCHRCOU4
;
	MOVF	COMCOU5,W
	IORLW	H'30'	
	MOVWF	COMCHRCOU5
;
	RETURN
;*******************************************************************************************
;   関数名    : COMWAT1　　　　
;   機能      : WAIT 1秒 
;   引数      : 
;   変数      : 
;   注意      :
;*******************************************************************************************
COMWAT1
	MOVLW	H'0A'	; 10分周(>10分周)
	MOVWF	COMWT1A
COMWA1A	CALL	COMWATP1
	DECFSZ	COMWT1A,F	
	GOTO	COMWA1A
	RETURN 

;*******************************************************************************************
;   関数名    : COMWATP5　　　　
;   機能      : WAIT 0.5秒 
;   引数      : 
;   変数      : 
;   注意      :
;*******************************************************************************************
COMWATP5
	CALL	COMWATP1
	CALL	COMWATP1
	CALL	COMWATP1
	CALL	COMWATP1
	CALL	COMWATP1
	RETURN
;*******************************************************************************************
;   関数名    : COMWATP1　　　　
;   機能      : WAIT 0.1秒 
;   引数      : 
;   変数      : 
;   注意      : 
;*******************************************************************************************
COMWATP1
	MOVLW	H'64'	; 100分周(>100分周)
	MOVWF	COMWP1A
COMWTP1A CALL	COMWATP001
	DECFSZ	COMWP1A,F	
	GOTO	COMWTP1A
	RETURN 

;*******************************************************************************************
;   関数名    : COMWATP01　　　　
;   機能      : WAIT 0.01秒 
;   引数      :
;   変数      : 
;   注意      :
;*******************************************************************************************
COMWATP01
	MOVLW	H'0A'	; 10分周(>10分周)
	MOVWF	COMWP01A
COMWTP01A CALL	COMWATP001
	DECFSZ	COMWP01A,F	
	GOTO	COMWTP01A
	RETURN 
;*******************************************************************************************
;   関数名    : COMWATP001　　　　
;   機能      : WAIT 0.001秒 
;   引数      :
;   変数      :
;   注意      : 20MHzのOSC用
;               20,000,000(Hz)  => 1,000(Hz)/20,000分周   
;*******************************************************************************************
COMWATP001
	MOVLW	H'64'	; 100分周(>100分周)
	MOVWF	COMWP001B
COMWTP001B	MOVLW	H'63'	;  99分周(200分周)
	MOVWF	COMWP001A
COMWTP001A	DECFSZ	COMWP001A,F
	GOTO	COMWTP001A
	DECFSZ	COMWP001B,F
	GOTO	COMWTP001B
	RETURN 

;*******************************************************************************************
;   関数名    : COMWATP000001　　　　
;   機能      : 0.000001秒(1μ秒[1000n秒])タイマー 
;   引数      : なし 
;   変数      :
;   注意      : 20MHz用
;*******************************************************************************************
COMWATP000001
	MOVLW	H'09' 
	MOVWF	COMWP000001A
COMWATP000001A 
	DECFSZ	COMWP000001A,F	
	GOTO	COMWATP000001A
	RETURN 
;
;******************************************************************************************
;   Function Name : TIMER
;   Disctiption   : タイマー(1000回ループ)
;   Input         : 
;   Output        :
;******************************************************************************************
TIMER
	MOVLW	H'0A'
	MOVWF	CNT1
TIMER1
	MOVLW	H'64'
	MOVWF	CNT
TIMER2
	DECFSZ	CNT,F
	GOTO	TIMER2 
	DECFSZ	CNT1,F
	GOTO	TIMER1

	RETURN

	END

