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