; ***************************************************************
; リスト UART 3
; 送信プログラム
; RA5 LED
; RC5 SW
; ***************************************************************
	LIST		P=PIC16F18346	;  使用するPICを指定
	INCLUDE		"P16F18346.INC"	;  読み込む設定ファイルを指定

 __CONFIG _CONFIG1, _FEXTOSC_OFF & _RSTOSC_HFINT1 & _CLKOUTEN_OFF & _CSWEN_OFF & _FCMEN_OFF
 __CONFIG _CONFIG2, _MCLRE_ON & _PWRTE_OFF & _WDTE_OFF & _LPBOREN_OFF & _BOREN_OFF & _BORV_LOW & _PPS1WAY_OFF & _STVREN_ON & _DEBUG_OFF
 __CONFIG _CONFIG3, _WRT_OFF & _LVP_ON
 __CONFIG _CONFIG4, _CP_OFF & _CPD_OFF


; *********************** 共通RAMエリア **************************
       CBLOCK   0x70
       DATA_INDEX
       SWstate				;  タイマ2用カウント変数
       RxDATA
       dly_1
       dly_2
       ENDC
; ***************************************************************
       ORG    0
;void main() {
START  CLRF    SWstate  ; SWstate = 0;  SWの状態
       MOVLW   0x1F     ; TRISA = 0b 01 1111;
       MOVLB   0x1      ; BANK 1 を選択
       MOVWF   TRISA    ; RA5 出力 他は入力
       MOVLW   0xFF     ; TRISB = 0b 1111 1111;
       MOVWF   TRISB    ; Port すべて入力
       MOVLW   0xFF     ; TRISC = 0b 1111 1111;
       MOVWF   TRISC    ; Port すべて入力

       MOVLB   0x3      ; BANK 3 を選択
       CLRF    ANSELA   ;    ANSELA = 0; すべてデジタル
       CLRF    ANSELB   ;    ANSELB = 0; すべてデジタル
       CLRF    ANSELC   ;    ANSELC = 0; すべてデジタル
       MOVLW   0x8      ;    WPUA = 0b001000;  RA3 弱プルアップ ON
       MOVLB   0x4
       MOVWF   WPUA
       MOVLW   0x10
       MOVWF   WPUC     ;    WPUC   = 0b00010000; RC4 弱プルアップ ON

;//    RC4PPS = 20;                // RC4をTX出力とする
;//    RXPPS  = 0x15;              // RC5をRX入力とする

       MOVLW   0xD      ; RXPPS = 0x0D;
       MOVLB   0x1C     ; BANK 1C を選択
       MOVWF   RXPPS    ; RB5->EUSARTRX;
       MOVLW   0x14     ; RB7PPS = 0x14
       MOVLB   0x1D     ; BANK 1C を選択
       MOVWF   RB7PPS   ; RB7->EUSARTTX;
;//------------ Initialize UART ----------------------------------
       MOVLW   0x90     ; 8 bit 連続受信
       MOVLB   0x3
       MOVWF   RC1STA   ; RC1STA = 0b10010000;
       MOVLW   0x24     ; 非同期送受信 High Baud Rate選択
       MOVWF   TX1STA   ; TX1STA = 0b00100100;
       MOVLW   0x8
       MOVWF   BAUD1CON ; BAUD1CON = 0b00001000;
       CLRF    SP1BRGH  ;    SP1BRGH  = 0;
       MOVLW   0x0      ;    SP1BRG   = 25;
       MOVWF   SP1BRGH
       MOVLW   0x19
       MOVWF   SP1BRG

;    while(pushSW); SWが押されるのを待つ
CK_SW  MOVLB   0x0	    ; BANK 0 選択
       BTFSC   PORTC, 0x4   ; RCA  SWが押されるのを待つ
       GOTO    CK_SW

       MOVLW   8             ; MSG 1 番文字から
       CALL    PRINT_MSG     ;  シリアル送信

;==================================
;    // ----------- 繰返し --------------------------------------------
;    while(1){
;        // ------ 受信 ------------------------------------------------
;        if(RCIF){
LOOP   MOVLB 0x0
       BTFSS PIR1, RCIF  ; RCIF を CK
       GOTO TX_SW        ; 受信していない
       ; 受信した ---------------------------
       MOVLB 0x3         ; 受信した
       MOVF RC1REG, W    ; 受信データを取り込む
       MOVWF RxDATA
       MOVF RxDATA, W      ; 受信文字をロード
       XORLW 0xA           ; 0x0A か
       BTFSC STATUS, 0x2   ;   一致なら
       GOTO TxCRLF         ;   CRLF処理へ
       MOVF RxDATA, W      ; 受信文字をロード
       XORLW 0x0D          ; 0x0D か
       BTFSC STATUS, 0x2   ;   一致なら
       GOTO TxCRLF         ;     CRLF処理へ
       GOTO TxOTHR         ;   否なら OTHR

;              case 0x0A
;              case 0x0D
;                while (!TXIF);              //送信終了待ち
TxCRLF MOVLB 0x0
       BTFSS PIR1, TXIF    ; 送信可能か確認
       GOTO TxCRLF         ; 可能になるまで待つ
       MOVF RxDATA, W      ; 受信したデータをそのまま
       MOVLB 0x3           ; シリアル送信する
       MOVWF TX1REG
       GOTO TX_SW          ; SW 情報送信へ
;              default
TxOTHR MOVLB 0x0
       BTFSS PIR1, TXIF    ; 送信可能か確認
       GOTO TxOTHR         ; 可能になるまで待つ
;                TX1REG = RxData + 1;
;       MOVF RxData, W
       MOVF RxDATA, W      ; 受信したデータに
       ADDLW 0x1           ; + 1 して
       MOVLB 0x3           ; シリアル送信する
       MOVWF TX1REG
       GOTO TX_SW          ; SW 情報送信へ

;        // ------ 送信 ------------------------------------------------
;        if(pushSW != SWstate){          // SWの状態が変化したら
TX_SW
;       MOVLB 0x0
;       SWAPF PORTC, W
;       ANDLW 0x1

       CLRW              ;
       MOVLB 0x0
       BTFSC PORTC, 0x4
       MOVLW 0x1


       XORWF SWstate, W
       BTFSC STATUS, 0x2
       GOTO LOOP
       ; 1000 inst 遅延 --------------------------
       ;   W x 1000 inst     dly_1,dly_2
       ; ----------------------------------------
       MOVLW D'2'          ; 8ms 遅延
       ; -----------
       MOVWF dly_2
Loop1  MOVLW D'249'
       MOVWF dly_1
Loop2  NOP
       DECFSZ dly_1, F
       GOTO   Loop2
       DECFSZ dly_2, F
       GOTO   Loop1
       ; ----------------------------------------
;      SWの 新しい状態を記録
       CLRW               ;SWstate = pushSW;
       MOVLB 0x0
       BTFSC PORTC, 0x4
       MOVLW 0x1
       MOVWF SWstate
;            if(pushSW == 0){            // SWが押されたのなら
       BTFSC PORTC, 0x4      ; SWが押されたか
       GOTO LOOP             ;   離れてる LOOPへ
;//                          ;   押された
       MOVLW   0             ; MSG 0 番文字から
       CALL    PRINT_MSG     ; シリアル送信
       GOTO    LOOP

PG_END GOTO    PG_END


;--------------------------------------------------
; HELLO と送信
;   WREG に送信する文字の先頭番号を持ってCALL
;--------------------------------------------------
PRINT_MSG
       MOVLB   0x0	      ; BANK 0 選択
       MOVWF   DATA_INDEX     ; 文字INDEXを 設定
P_NEXT MOVF    DATA_INDEX,W   ; 文字INDEXを W に取得
       CALL    MSG_DT         ; 文字を W に取得
       MOVF    WREG,F         ; 文字終端かテスト
       BTFSC   STATUS,Z       ; 終端文字なら
       RETURN                 ;   リターン
       ; 送信する文字なら
       MOVLB   0x0            ; BANK 1 を選択
W_TXIF BTFSS   PIR1, TXIF     ; 送信終了待ち
       GOTO    W_TXIF
       MOVLB   0x3	      ; BANK 3 選択
       MOVWF   TX1REG         ; 文字出力
       ; 次の文字を準備
       MOVLB   0x0	      ;  BANK 0 選択
       INCF    DATA_INDEX,F   ;   文字INDEXを +1
       GOTO    P_NEXT         ;   次の文字へ
MSG_DT BRW
       DT      "SW ON\r\n",0x00
       DT      "Hello OK\r\n",0x00
;--------------------------------------------------

ENDPGM MOVLP   0x0

    END