; Copyright 2005 Doi Shigeki ;list080a.asm PIC16F628Aテスト・プログラム ; シリアル通信のテスト 9600ボー@4MHz LIST P=16F628A #INCLUDE P16F628A.inc ;コンフィグレーション・ワード 1 __CONFIG _BODEN_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT ; プログラム非プロテクト,データ非プロテクト,低電圧活き ; MCLRピン活き,パワーアップ・タイマ・オフはデフォルト値を使用 RXD0 EQU H'20' RXD1 EQU H'21' CNT0 EQU H'22' CNT1 EQU H'23' ORG 0 ;0番地より展開 MAIN NOP ;割り込みの場合も再スタート NOP NOP NOP START BSF STATUS, RP0 ;バンク1へ切替え MOVLW B'00000000' ;すべて出力に設定 MOVWF TRISA MOVLW B'00001011' ;RB3,RB1(RX),RB0を入力に設定 MOVWF TRISB BCF OPTION_REG,7 ;RBポート・プルアップ MOVLW B'00100100' ;TXEN=1,BRGH=1 MOVWF TXSTA MOVLW D'25' ;4/(16(25+1))=9600 MOVWF SPBRG BCF STATUS, RP0 ;バンク0へ切り替え MOVLW B'10010000' MOVWF RCSTA MOVLW 0 MOVWF RXD0 CHECK BTFSC PIR1,RCIF ;RCIF=0,受信なしならスキップ CALL GETCH CHECK2 COMF PORTB,W ;スイッチ読み込み,反転 ANDLW B'00001001' ;スイッチデータのみ有効 MOVWF RXD1 ;RXD1へ保存 SUBWF RXD0,W ;W=RXD0-W BTFSS STATUS,Z ;Z=0ならスキップ CALL PUTCH GOTO CHECK GETCH MOVF RCREG,W ;受信レジスタからデータ取り出し MOVWF PORTA ;LEDへ出力 RETURN PUTCH MOVF RXD1,W MOVWF RXD0 ;旧データを更新 ADDLW H'30' ;数字コードにする PUTCH2 BTFSS PIR1,TXIF GOTO PUTCH2 MOVWF TXREG ;PCへ送信 CALL WAIT10 ;10ms待ち,チャタリング対策 RETURN ; ;時間待ち 10ms/4MHzクロック ; WAIT10 MOVLW D'10' ;10回 MOVWF CNT1 WAIT102 CALL WAIT1 ;1ms待ち DECFSZ CNT1,F GOTO WAIT102 RETURN ; ;時間待ち 1ms/4MHzクロック ; 全体で999サイクル WAIT1 MOVLW D'249' ;249回 MOVWF CNT0 ;2サイクル WAIT12 NOP DECFSZ CNT0,F GOTO WAIT12 ;4*248+3サイクル RETURN ;999サイクル(2+995+2) END