;****************************************************************************************** ; 直流安定化電源基板サンプル ; Program Name : ; Programer : ; Create date : 2005/10/14 ; History : ; Discription : ;****************************************************************************************** ; (1)Description I/O ; B0〜B7 : A/D Converter ; A3 : Serial Port(RX) ; A4 : Serial Port(TX) ; A5 : Mode SW ;****************************************************************************************** ; LIST P=PIC16F88,ST=OFF,R=DEC INCLUDE "P16F88.inc" __CONFIG _CONFIG1 , _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_OFF & _WDT_OFF & _INTRC_IO ; __CONFIG _CONFIG1 , _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_OFF & _WDT_OFF & _HS_OSC __CONFIG _CONFIG2 , _IESO_OFF & _FCMEN_OFF ; IODAT EQU 20H SENDLP EQU 21H SENDWAT EQU 22H RECLP EQU 23H RECWAT EQU 24H INC0 EQU 25H INC1 EQU 26H INC2 EQU 27H INSUM EQU 28H IND EQU 29H TMP1 EQU 2AH TMP2 EQU 2BH CNT EQU 2CH CNT1 EQU 2DH ; ORG 0 GOTO START ORG 4 GOTO START START ; Bank0での設定 BANKSEL PORTA ; CLRF PORTA ; PortAの初期化(Bank0) CLRF PORTB ; PortBの初期化 ; Bank1での設定 BANKSEL ANSEL ; MOVLW B'01111110' ;内部OSC選択,内部OSCに8MHzを選択 MOVWF OSCCON MOVLW B'00000000' ; 全てをDegitalに設定 MOVWF ANSEL ; Degital Inputに設定(Bank1) MOVLW B'11101111' MOVWF TRISA ; PortAのI/O設定(Bank1) MOVLW B'00000000' MOVWF TRISB ; PortBのI/O設定(Bank1) ; Bank0に戻す BANKSEL PORTA ; ; CLRF PORTB MAIN ; ********************************************************************* ; MODE0 ; バイナリー16進数8ビット仕様(マザーボード/制御ボード用) ; ********************************************************************* ; CALL MODE0 ; ********************************************************************* ; MODE1 ; キャラクタ10進数3桁入力仕様(ハイパワーターミナルでのテスト用) ; ********************************************************************* CALL MODE1 ; GOTO MAIN ;****************************************************************************************** ; Function Name : MODE0 ; Disctiption : 16進バイナリーで使用するモード ; 入力フォーマット:HEX ; Input : ; Output : ;****************************************************************************************** MODE0 CALL REC MOVFW IODAT MOVWF PORTB GOTO MODE0 ;****************************************************************************************** ; Function Name : MODE1 ; Disctiption : 10進データで使用するモード ; 入力フォーマット:D2/D1/D0 ; Input : ; Output : ;****************************************************************************************** MODE1 CALL MESCON MODE1A CALL REC CALL SEND MOVFW IODAT XORLW 'D' ; 'D'なら10進データ(Decimal)入力 BTFSC STATUS,Z CALL SETDEC GOTO MODE1A ;****************************************************************************************** ; Function Name : SETDEC ; Disctiption : 10進データで使用する ; 入力フォーマット:D2/D1/D0 ; Input : ; Output : ;****************************************************************************************** SETDEC ; 1.10進データ(キャラクタ)を変数に設定 ; (1)3桁めを設定 CALL REC CALL SEND MOVFW IODAT MOVWF INC2 ; 数値型以外なら抜ける ANDLW B'11110000' XORLW H'30' ; 数値型(3X)以外なら処理しないで抜ける BTFSS STATUS,Z RETURN ; (2)2桁めを設定 CALL REC CALL SEND MOVFW IODAT MOVWF INC1 ; 数値型以外なら抜ける ANDLW B'11110000' XORLW H'30' ; 数値型(3X)以外なら処理しないで抜ける BTFSS STATUS,Z RETURN ; (3)1桁めを設定 CALL REC CALL SEND MOVFW IODAT MOVWF INC0 ; 数値型以外なら抜ける ANDLW B'11110000' XORLW H'30' ; 数値型(3X)以外なら処理しないで抜ける BTFSS STATUS,Z RETURN ; 2.キャラクタをバイナリーに変換 CALL CNVDEC ; 3.出力確認 CALL REC CALL SEND MOVFW IODAT XORLW 'E' ; 'E'以外なら出力しないで抜ける BTFSS STATUS,Z RETURN ; 5.ポートBへ出力 MOVFW INSUM MOVWF PORTB ; 6.完了メッセージ出力 CALL MESOK RETURN ;****************************************************************************************** ; Function Name : CNVDEC ; Disctiption : 10進キャラクタを16進バイナリーに変換 ; INC2/INC1/INC0 => INSUM ; Input : ; Output : ;****************************************************************************************** CNVDEC ; 0.変数初期化 CLRF INSUM ; 1.3桁目の処理 ; (1)キャラクタを数値に変換 MOVFW INC2 ANDLW B'00001111' MOVWF IND ; (2)10進バイナリーを16進バイナリーに変換 XORLW H'00' BTFSC STATUS,Z GOTO CNVDEC2S MOVFW INSUM CNVDEC1 ADDLW H'64' DECFSZ IND,F GOTO CNVDEC1 MOVWF INSUM ; ; 2.2桁目の処理 CNVDEC2S ; (1)キャラクタを数値に変換 MOVFW INC1 ANDLW B'00001111' MOVWF IND ; (2)10進バイナリーを16進バイナリーに変換 XORLW H'00' BTFSC STATUS,Z GOTO CNVDEC3S MOVFW INSUM CNVDEC2 ADDLW H'0A' DECFSZ IND,F GOTO CNVDEC2 MOVWF INSUM ; 3.1桁目の処理 CNVDEC3S ; (1)キャラクタを数値に変換 MOVFW INC0 ANDLW B'00001111' MOVWF IND ; (2)10進バイナリーを16進バイナリーに変換 MOVFW INSUM ADDWF IND,W MOVWF INSUM RETURN ;****************************************************************************************** ; Function Name : MESCON ; Disctiption : CONNECT OKメッセージ ; Input : ; Output : ;****************************************************************************************** MESCON MOVLW ' ' MOVWF IODAT CALL SEND MOVLW ' ' MOVWF IODAT CALL SEND MOVLW 'P' MOVWF IODAT CALL SEND MOVLW 'I' MOVWF IODAT CALL SEND MOVLW 'C' MOVWF IODAT CALL SEND MOVLW ' ' MOVWF IODAT CALL SEND ; MOVLW 'C' MOVWF IODAT CALL SEND MOVLW 'o' MOVWF IODAT CALL SEND MOVLW 'n' MOVWF IODAT CALL SEND MOVLW 'n' MOVWF IODAT CALL SEND MOVLW 'e' MOVWF IODAT CALL SEND MOVLW 'c' MOVWF IODAT CALL SEND MOVLW 't' MOVWF IODAT CALL SEND MOVLW 'e' MOVWF IODAT CALL SEND MOVLW 'd' MOVWF IODAT CALL SEND MOVLW ' ' MOVWF IODAT CALL SEND MOVLW 'O' MOVWF IODAT CALL SEND MOVLW 'K' MOVWF IODAT CALL SEND MOVLW '>' MOVWF IODAT CALL SEND RETURN ;****************************************************************************************** ; Function Name : MESOK ; Disctiption : OKメッセージ ; Input : ; Output : ;****************************************************************************************** MESOK MOVLW ' ' MOVWF IODAT CALL SEND MOVLW 'O' MOVWF IODAT CALL SEND MOVLW 'U' MOVWF IODAT CALL SEND MOVLW 'T' MOVWF IODAT CALL SEND MOVLW 'P' MOVWF IODAT CALL SEND MOVLW 'U' MOVWF IODAT CALL SEND MOVLW 'T' MOVWF IODAT CALL SEND MOVLW ' ' MOVWF IODAT CALL SEND MOVLW 'O' MOVWF IODAT CALL SEND MOVLW 'K' MOVWF IODAT CALL SEND MOVLW '>' MOVWF IODAT CALL SEND RETURN ;****************************************************************************************** ; Function Name : REC ; Disctiption : RS232C受信サブルーチン(PORTA3) ; 9600BPS OSC;8.000MHz仕様 ; Input : ; Output : ;****************************************************************************************** REC ; (0)変数初期化 CLRF IODAT ; (1)受信データを待つ REC0 BTFSC PORTA,3 GOTO REC0 ; (2)1/2ビット分待つ MOVLW H'21' ; 9600BPS OSC;8.000MHz仕様 MOVWF RECWAT REC1 DECFSZ RECWAT,F GOTO REC1 ; (3)データ受信(8ビット分) MOVLW 8 MOVWF RECLP NOP REC2 MOVLW H'42' ; 9600BPS OSC;8.000MHz仕様 MOVWF RECWAT REC3 DECFSZ RECWAT,F GOTO REC3 NOP BTFSS PORTA,3 ; ビットデータが0の時, 0を立てる BCF STATUS,C BTFSC PORTA,3 ; ビットデータが1の時, 1を立てる BSF STATUS,C RRF IODAT,F ; 変数内でビットをシフトする DECFSZ RECLP,F GOTO REC2 NOP NOP ; RETURN ;****************************************************************************************** ; Function Name : SEND ; Disctiption : RS232C送信サブルーチン(PORTA4) ; 9600BPS OSC;8.000MHz仕様 ; Input : ; Output : ;****************************************************************************************** ; (1)送信開始 SEND MOVFW IODAT MOVWF TMP1 ; BCF PORTA,4 ; 送信開始 MOVLW H'42' ; 9600BPS OSC;8.000MHz仕様 MOVWF SENDWAT SEND1 DECFSZ SENDWAT,F GOTO SEND1 ; ; (2)データ送信(8ビット) MOVLW 8 ; 8ビットデータ分、送信する MOVWF SENDLP NOP SEND2 RRF IODAT,F NOP BTFSS STATUS,C ; ビットデータが0の時, 0を立てる BCF PORTA,4 BTFSC STATUS,C ; ビットデータが1の時, 1を立てる BSF PORTA,4 MOVLW H'42' ; 9600BPS OSC;8.000MHz仕様 MOVWF SENDWAT SEND3 DECFSZ SENDWAT,F GOTO SEND3 DECFSZ SENDLP,F GOTO SEND2 ; (3)終了 BSF PORTA,4 ; フラグを戻す ; (4)少し待つ CALL TIMER ; (5)退避変数を戻す MOVFW TMP1 MOVWF IODAT RETURN ; ;****************************************************************************************** ; Function Name : TIMER ; Disctiption : タイマー(1000回ループ) ; Input : ; Output : ;****************************************************************************************** TIMER MOVLW H'0A' MOVWF CNT1 TIMER1 MOVLW H'64' MOVWF CNT TIMER2 DECFSZ CNT,F GOTO TIMER2 DECFSZ CNT1,F GOTO TIMER1 RETURN END