; Copyright 2005 Doi Shigeki ;list0808.asm PIC16F873Aテスト・プログラム ; シリアル通信のテスト 9600ボー@20MHz LIST P=16F873A #INCLUDE P16F873A.inc ;コンフィグレーション・ワード __CONFIG _BODEN_OFF & _WDT_OFF & _HS_OSC ; _CP_OFF,_DEBUG_OFF,_WRT_PROTECT_OFF,_CPD_OFF,_LVP_ON,_MCLR_ON,_PWRTE_OFFはデフォルト 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'11001111' ;Cポート7(RX),6(TX),3,2,1,0ビットは入力 MOVWF TRISC MOVLW B'00100100' ;TXEN=1,BRGH=1 MOVWF TXSTA MOVLW D'128' ;20/(16(128+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 MOVF PORTC,W ;スイッチ読み込み ANDLW B'00001111' ;スイッチ部分の取り出し 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 ;チャタリング対策 RETURN ; ;時間待ち 10ミリ秒/20MHzクロック ; WAIT10 MOVLW D'50' ;50回 MOVWF CNT1 WAIT102 CALL WAIT02 ;0.2ms待ち DECFSZ CNT1,F GOTO WAIT102 RETURN ; ;時間待ち 0.2ミリ秒/20MHzクロック ; 全体で999サイクル WAIT02 MOVLW D'249' ;249回 MOVWF CNT0 ;2サイクル WAIT022 NOP DECFSZ CNT0,F GOTO WAIT022 ;4×248+3サイクル RETURN ;999サイクル(2+995+2) END