; ***************************************************************
; リスト 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