;****************************************************************************************** ; PIC16F785 Sample Program ; Project : ; Program Name : ; Programer : ; Create date : Version 1.0 H22.10.02 ; History : ; Laungage : MPASM ;****************************************************************************************** ; (1)Description ; OSC : Internal Oscirator 8MHz ; IOPORT ; PORTA(0) ; Serial Comunication TX ; PORTA(1) ; Serial Comunication RX ;****************************************************************************************** LIST P=PIC16F785,ST=OFF,R=DEC INCLUDE "P16F785.inc" __CONFIG _FCMEN_OFF & _IESO_OFF & _BOD_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_OFF &_WDT_OFF & _INTRC_OSC_NOCLKOUT & _INTOSCIO & _EXTRCIO ; _INTOSC : The OSC1 pin is available for general purpose I/O. ; The OSC2/CLKOUT pin outputs the selected internal oscillator frequency divided by 4. ; The CLKOUT signal may be used to provide a clock for external circuitry, synchronization, calibration, test or other application requirements ; _INTOSCIO : the OSC1 and OSC2 pins are available for general purpose I/O IODAT EQU 20H RECWAT EQU 21H RECLP EQU 22H SENDWAT EQU 23H SENDLP EQU 24H LPWATA EQU 25H TMPCHAR EQU 26H INBIN EQU 27H OUTCHR2 EQU 28H OUTCHR1 EQU 29H CNT EQU 2AH CNT1 EQU 2BH CNT2 EQU 2CH TMP EQU 2DH DECCOU0 EQU 2EH DECCOU1 EQU 2FH DECCOU2 EQU 30H DECCOU3 EQU 31H INNUM2 EQU 32H INNUM1 EQU 33H OUTNUM2 EQU 34H OUTNUM1 EQU 35H ORG 0h GOTO START ORG 4h GOTO START START ; ********************************************** ; 1-1.初期化(1) ; ********************************************** ; (1)Bank0での設定 BCF STATUS,RP0 ; SET BANK0 BCF STATUS,RP1 ; SET BANK0 ; 1-1)PORTの設定 CLRF PORTA CLRF PORTB CLRF PORTC ; (2)Bank1での設定 BSF STATUS,RP0 ; SET BANK1 BCF STATUS,RP1 ; SET BANK1 ; 2-1)PORTの設定 MOVLW B'11111110' MOVWF TRISA MOVLW B'11111111' MOVWF TRISB MOVLW B'11111111' MOVWF TRISC ; 2-2)OSCの設定(内部8MHz/実測値:8.022912MHz) BSF OSCCON,IRCF2 BSF OSCCON,IRCF1 BSF OSCCON,IRCF0 ; 2-3)A/D Converterの設定(Degital Portにする) CLRF ANSEL0 CLRF ANSEL1 ; (3)Bank2での設定 BCF STATUS,RP0 ; SET BANK2 BSF STATUS,RP1 ; SET BANK2 ; (4)Bank3での設定 BSF STATUS,RP0 ; SET BANK3 BSF STATUS,RP1 ; SET BANK3 ; (5)Bank0に戻す BCF STATUS,RP0 ; SET BANK0 BCF STATUS,RP1 ; SET BANK0 ; ********************************************** ; 1-2.初期化(2) ; ********************************************** ; (1)シリアルポートの初期化 BSF PORTA,0 BSF PORTA,1 ; (2)A/D Converterの設定 CALL INTADC ; (3)OP-AMPの設定 BCF STATUS,RP0 ; SET BANK2 BSF STATUS,RP1 ; SET BANK2 BSF OPA1CON,OPAON ; OP-AMP(1)を使用する BCF STATUS,RP0 ; SET BANK0 BCF STATUS,RP1 ; SET BANK0 ; (4)Wait 0.1[S] MOVLW H'64' CALL WAT ; ********************************************** ; 2.プログラム ; ********************************************** ; (1)デモ表示 CALL DEMO01 MAIN ; (2)Get A/D Converter's data CALL GETADC ; (3)Data *2 CALL MULTW ; (4)Convert Hex Decimal to Decimal CALL HEXDEC ; (5)Output MOVLW ' ' CALL SEND ; MOVFW OUTNUM2 CALL CNVCHR MOVFW OUTCHR2 CALL SEND MOVFW OUTCHR1 CALL SEND ; MOVFW OUTNUM1 CALL CNVCHR MOVFW OUTCHR2 CALL SEND MOVFW OUTCHR1 CALL SEND ; MOVLW '[' CALL SEND MOVLW 'm' CALL SEND MOVLW 'A' CALL SEND MOVLW ']' CALL SEND ; (6)Wait 0.5[S] MOVLW D'250' CALL WAT MOVLW D'250' CALL WAT GOTO MAIN ;****************************************************************************************** ; Function Name : DEMO01 ; Title : ; Input : ; Output : ;****************************************************************************************** DEMO01 MOVLW 'P' CALL SEND MOVLW 'I' CALL SEND MOVLW 'C' CALL SEND MOVLW '1' CALL SEND MOVLW '6' CALL SEND MOVLW 'F' CALL SEND MOVLW '7' CALL SEND MOVLW '8' CALL SEND MOVLW '5' CALL SEND MOVLW ' ' CALL SEND MOVLW 'C' CALL SEND MOVLW 'o' CALL SEND MOVLW 'n' CALL SEND MOVLW 'n' CALL SEND MOVLW 'e' CALL SEND MOVLW 'c' CALL SEND MOVLW 't' CALL SEND MOVLW 'e' CALL SEND MOVLW 'd' CALL SEND MOVLW ' ' CALL SEND MOVLW 'O' CALL SEND MOVLW 'K' CALL SEND MOVLW '>' CALL SEND MOVLW ' ' CALL SEND RETURN ;****************************************************************************************** ; Function Name : DEMO02 ; Title : Binary/Decimal Counter ; Input : ; Output : ;****************************************************************************************** DEMO02 CLRF INNUM2 CLRF INNUM1 DEMO02S MOVLW D'001' ADDWF INNUM1,F MOVFW INNUM1 XORLW H'00' BTFSS STATUS,Z GOTO DEMO02S1 MOVLW D'001' ADDWF INNUM2,F DEMO02S1: MOVLW '[' CALL SEND MOVFW INNUM2 CALL CNVCHR MOVFW OUTCHR2 CALL SEND MOVFW OUTCHR1 CALL SEND ; MOVFW INNUM1 CALL CNVCHR MOVFW OUTCHR2 CALL SEND MOVFW OUTCHR1 CALL SEND ; MOVLW '/' CALL SEND ; CALL HEXDEC MOVFW OUTNUM2 CALL CNVCHR MOVFW OUTCHR2 CALL SEND MOVFW OUTCHR1 CALL SEND MOVFW OUTNUM1 CALL CNVCHR MOVFW OUTCHR2 CALL SEND MOVFW OUTCHR1 CALL SEND ; MOVLW ']' CALL SEND ; GOTO DEMO02S ;****************************************************************************************** ; Function Name : INTADC ; Title : ; Input : AN(7) ; Output : ; Description : Used OP-AMP(1) ; ==> Analog Selected AN(7-9) ;****************************************************************************************** INTADC ; ********************************************** ; 1.Initialized ANSEL0(ANALOG SELECT REGISTER) ; ANSEL0[7-0] : Analog Select bits ; Analog select between analog or digital function on pins AN<7:0>, respectively. ; 1 = Analog input. Pin is assigned as analog input. ; 0 = Digital I/O. Pin is assigned to port or special function. ; ********************************************** MOVLW B'10000000' BSF STATUS,RP0 ; SET BANK1 MOVWF ANSEL0 BCF STATUS,RP0 ; SET BANK0 ; ********************************************** ; 2.Initialized ANSEL1(ANALOG SELECT REGISTER) ; ANSEL1[7-4] : Unimplemented: Read as ‘0’ ; ANSEL1[3-0] : Analog Select bits ; Analog select between analog or digital function on pins AN<7:0>, respectively. ; 1 = Analog input. Pin is assigned as analog input. ; 0 = Digital I/O. Pin is assigned to port or special function. ; ********************************************** MOVLW B'00000011' ; Used OP-AMP(1) BSF STATUS,RP0 ; SET BANK1 MOVWF ANSEL1 BCF STATUS,RP0 ; SET BANK0 ; ********************************************** ; 3.Initialized ADCON0(A/D CONTROL REGISTER) ; ADCON0[7] ADFM: A/D Result Formed Select bit ; 1 = Right justified ; 0 = Left justified ; ADCON0[6] VCFG: Voltage Reference bit ; 1 = VREF pin ; 0 = VDD ; ADCON0[5-2] CHS<3:0>: Analog Channel Select bits ; 0000 = Channel 00 (AN0) ; 0001 = Channel 01 (AN1) ; 0010 = Channel 02 (AN2) ; 0011 = Channel 03 (AN3) ; 0100 = Channel 04 (AN4) ; 0101 = Channel 05 (AN5) ; 0110 = Channel 06 (AN6) ; 0111 = Channel 07 (AN7) ; 1000 = Channel 08 (AN8) ; 1001 = Channel 09 (AN9) ; 1010 = Channel 10 (AN10) ; 1011 = Channel 11 (AN11) ; 1100 = CVREF ; 1101 = VR ; 1110 = Reserved. Do not use. ; 1111 = Reserved. Do not use. ; ADCON0[1] GO/DONE: A/D Conversion Status bit ; 1 = A/D conversion cycle in progress. Setting this bit starts an A/D conversion cycle. ; This bit is automatically cleared by hardware when the A/D conversion has completed. ; 0 = A/D conversion completed/not in progress ; ADCON0[0] ADON: A/D Enable bit ; 1 = A/D converter module is enabled ; 0 = A/D converter is shut-off and consumes no operating current ; ********************************************** MOVLW B'10011101' MOVWF ADCON0 ;BANK0 ; ********************************************** ; 4.Initialized ADCON1(A/D CONTROL REGISTER 1) ; ADCON1[7] Unimplemented: Read as ‘0’ ; ADCON1[6-4] ADCS<2:0>: A/D Conversion Clock Select bits ; 000 = FOSC/2 ; 001 = FOSC/8 ; 010 = FOSC/32 ; x11 = FRC (clock derived from a dedicated internal oscillator = 500 kHz max) ; 100 = FOSC/4 ; 101 = FOSC/16 ; 110 = FOSC/64 ; ADCON1[3-0] Unimplemented: Read as ‘0’ ; ********************************************** MOVLW B'00100000' ; FOSC/32 [Used OSC:8MHz] ==> See. Manual P.80 BSF STATUS,RP0 ; SET BANK1 MOVWF ADCON1 BCF STATUS,RP0 ; SET BANK0 RETURN ;****************************************************************************************** ; Function Name : GETADC ; Title : ; Input : ; Output : INNUM2,INNUM1 ;****************************************************************************************** GETADC ; 1.Start A/D Converter BSF ADCON0,GO ;Start conversion BTFSC ADCON0,GO ;Is conversion done? GOTO $-1 ;No, test again ; 2.Set Data MOVFW ADRESH ;Read upper 2 bits MOVWF INNUM2 BSF STATUS,RP0 ;Bank 1 MOVFW ADRESL ;Read lower 8 bits BCF STATUS,RP0 ; SET BANK0 MOVWF INNUM1 RETURN ;****************************************************************************************** ; Function Name : MULTW ; Title : 2バイト変数の数値を2倍にする ; Input : INNUM2, INNUM1 ; Output : INNUM2, INNUM1 ;****************************************************************************************** MULTW ; 1.INNUM2の処理 RLF INNUM2,F BTFSC INNUM1,7 BSF INNUM2,0 BTFSS INNUM1,7 BCF INNUM2,0 ; 2.INNUM1の処理 RLF INNUM1,F BCF INNUM1,0 RETURN ;****************************************************************************************** ; Function Name : HEXDEC ; Title : 16進数 => 10進数 変換関数 ; Input : INNUM2, INNUM1 ; Output : OUTNUM2, OUTNUM1 ;****************************************************************************************** ; (1)16進数を10進数に変換する HEXDEC CLRF DECCOU0 CLRF DECCOU1 CLRF DECCOU2 CLRF DECCOU3 MOVFW INNUM2 XORLW H'00' BTFSC STATUS,Z GOTO HEXDEE ; MOVFW INNUM2 MOVWF CNT2 HEXDEC2 MOVLW H'FF' MOVWF CNT1 CALL CNTDEC HEXDEC1 CALL CNTDEC DECFSZ CNT1,F GOTO HEXDEC1 DECFSZ CNT2,F GOTO HEXDEC2 ; HEXDEE MOVFW INNUM1 XORLW H'00' BTFSC STATUS,Z GOTO HEXFMT MOVFW INNUM1 MOVWF CNT1 HEXDEE1 CALL CNTDEC DECFSZ CNT1,F GOTO HEXDEE1 ; (2)フォーマット変換する ; a)左変数 HEXFMT MOVFW DECCOU2 MOVWF OUTNUM2 MOVLW H'04' MOVWF CNT1 HEXFMT1 RLF DECCOU3,F DECFSZ CNT1,F GOTO HEXFMT1 MOVFW DECCOU3 ANDLW B'11110000' IORWF OUTNUM2,F ; b)右変数 MOVFW DECCOU0 MOVWF OUTNUM1 MOVLW H'04' MOVWF CNT1 HEXFMT2 RLF DECCOU1,F DECFSZ CNT1,F GOTO HEXFMT2 MOVFW DECCOU1 ANDLW B'11110000' IORWF OUTNUM1,F RETURN ;****************************************************************************************** ; Function Name : CNTDEC ; Title : 10進4桁 カウンタ ; Input : DECCOU3〜DECCOU0 ; Output : DECCOU3〜DECCOU0 ;****************************************************************************************** CNTDEC MOVLW H'01' ADDWF DECCOU0,F ; 1桁目(1分)は10進カウンタ(0aで桁上げ) MOVFW DECCOU0 XORLW H'0A' BTFSS STATUS,Z RETURN ; CLRF DECCOU0 MOVLW H'01' ADDWF DECCOU1,F ; 2桁目10進カウンタ(0aで桁上げ) MOVFW DECCOU1 XORLW H'0A' BTFSS STATUS,Z RETURN ; CLRF DECCOU1 MOVLW H'01' ADDWF DECCOU2,F ; 3桁目10進カウンタ(0aで桁上げ) MOVFW DECCOU2 XORLW H'0A' BTFSS STATUS,Z RETURN ; CLRF DECCOU2 MOVLW H'01' ADDWF DECCOU3,F ; 4桁目10進カウンタ(0aで桁上げ) MOVFW DECCOU3 XORLW H'0A' BTFSS STATUS,Z RETURN ; CLRF DECCOU3 RETURN ;****************************************************************************************** ; Function Name : CNVCHR ; Title : 8[bit]数値を16進キャラクターへ変換 ; Input : W-register(00〜FF) ; Output : OUTCHR2 : 上位4ビット(0〜F) ; OUTCHR1 : 下位4ビット(0〜F) ;****************************************************************************************** CNVCHR ; ************************************ ; 1.8[bit]数値をキャラクターへ変換 ; ************************************ MOVWF INBIN ; (1)上位ビット設定 MOVFW INBIN MOVWF OUTCHR2 MOVLW H'04' MOVWF CNT CNVCHR1 RRF OUTCHR2,F DECFSZ CNT,F GOTO CNVCHR1 MOVFW OUTCHR2 ANDLW B'00001111' IORLW B'00110000' MOVWF OUTCHR2 ; (2)下位ビット設定 MOVFW INBIN ANDLW B'00001111' IORLW B'00110000' MOVWF OUTCHR1 ; ************************************ ; 2.0xA〜0xFの文字変換 ; ************************************ ; (1)2桁目の処理 MOVFW OUTCHR2 XORLW H'3A' BTFSS STATUS,Z GOTO CNVCHR1B MOVLW 'A' MOVWF OUTCHR2 GOTO CNVCHR20 CNVCHR1B: MOVFW OUTCHR2 XORLW H'3B' BTFSS STATUS,Z GOTO CNVCHR1C MOVLW 'B' MOVWF OUTCHR2 GOTO CNVCHR20 CNVCHR1C: MOVFW OUTCHR2 XORLW H'3C' BTFSS STATUS,Z GOTO CNVCHR1D MOVLW 'C' MOVWF OUTCHR2 GOTO CNVCHR20 CNVCHR1D: MOVFW OUTCHR2 XORLW H'3D' BTFSS STATUS,Z GOTO CNVCHR1E MOVLW 'D' MOVWF OUTCHR2 GOTO CNVCHR20 CNVCHR1E: MOVFW OUTCHR2 XORLW H'3E' BTFSS STATUS,Z GOTO CNVCHR1F MOVLW 'E' MOVWF OUTCHR2 GOTO CNVCHR20 CNVCHR1F: MOVFW OUTCHR2 XORLW H'3F' BTFSS STATUS,Z GOTO CNVCHR20 MOVLW 'F' MOVWF OUTCHR2 ; (2)1桁目の処理 CNVCHR20: MOVFW OUTCHR1 XORLW H'3A' BTFSS STATUS,Z GOTO CNVCHR2B MOVLW 'A' MOVWF OUTCHR1 RETURN CNVCHR2B: MOVFW OUTCHR1 XORLW H'3B' BTFSS STATUS,Z GOTO CNVCHR2C MOVLW 'B' MOVWF OUTCHR1 RETURN CNVCHR2C: MOVFW OUTCHR1 XORLW H'3C' BTFSS STATUS,Z GOTO CNVCHR2D MOVLW 'C' MOVWF OUTCHR1 RETURN CNVCHR2D: MOVFW OUTCHR1 XORLW H'3D' BTFSS STATUS,Z GOTO CNVCHR2E MOVLW 'D' MOVWF OUTCHR1 RETURN CNVCHR2E: MOVFW OUTCHR1 XORLW H'3E' BTFSS STATUS,Z GOTO CNVCHR2F MOVLW 'E' MOVWF OUTCHR1 RETURN CNVCHR2F: MOVFW OUTCHR1 XORLW H'3F' BTFSS STATUS,Z RETURN MOVLW 'F' MOVWF OUTCHR1 RETURN ;****************************************************************************************** ; Function Name : WAT ; Title : ; Input : W-Reg ; n (Wait times = 0.001[S] * n) ; Output : ;****************************************************************************************** WAT MOVWF LPWATA WATA CALL WAIT001 DECFSZ LPWATA,F GOTO WATA RETURN ;************************************************************************************ ; Function Name : WAIT001 ; Title : Wait 0.001[S] ; Input : ; Output : ;************************************************************************************ WAIT001 ; ; 1.Set Register ; (1)T1CON Register ; T1CON[7] T1GINV: Timer1 Gate Invert bit(1) ; 1 = Timer1 gate is high true (see bit 6) ; 0 = Timer1 gate is low true (see bit 6) ; T1CON[6] TMR1GE: Timer1 Gate Enable bit(2) ; If TMR1ON = 0: This bit is ignored. ; If TMR1ON = 1: ; 1 = Timer1 is on if Timer1 gate is true (see bit 7) ; 0 = Timer1 is on independent of Timer1 gate ; T1CON[5-4] T1CKPS<1:0>: Timer1 Input Clock Prescale Select bits ; 11 = 1:8 Prescale Value ; 10 = 1:4 Prescale Value ; 01 = 1:2 Prescale Value ; 00 = 1:1 Prescale Value ; T1CON[3] T1OSCEN: LP Oscillator Enable Control bit ; If System Clock is INTOSC without CLKOUT or LP mode ; 1 = LP oscillator is enabled for Timer1 clock ; 0 = LP oscillator is off ; Else: This bit is ignored. ; T1CON[2] T1SYNC: Timer1 External Clock Input Synchronization Control bit ; TMR1CS = 1: ; 1 = Do not synchronize external clock input ; 0 = Synchronize external clock input ; TMR1CS = 0: ; This bit is ignored. Timer1 uses the internal clock. ; T1CON[1] TMR1CS: Timer1 Clock Source Select bit ; 1 = External clock from T1CKI pin (on the rising edge) ; 0 = Internal clock (FOSC/4) ; T1CON[0] TMR1ON: Timer1 On bit ; 1 = Enables Timer1 ; 0 = Stops Timer1 ; MOVLW B'00000101' MOVWF T1CON ; (2)Set TMR1 Value ; 8000000Hz(Int_OSC)/4/8(Prescale)/10(0.1[S]) => 0d25000(0x61A8) ; 0xFFFF(-)0xF424 => 0d40535(0x9E57) ; 8000000Hz(Int_OSC)/4/1(Prescale)/1000(0.001[S]) => 0d2000(0x7D0) ; 0xFFFF(-)0x07D0 => 0d63535(0xF82F) ; MOVLW H'F8' ; *TMR1 MOVWF TMR1H ; *TMR1 MOVLW H'2F' ; *TMR1 MOVWF TMR1L ; *TMR1 ; 2.Timer BCF PIR1,TMR1IF BTFSS PIR1,TMR1IF GOTO $-1 RETURN ;****************************************************************************************** ; Function Name : SEND ; Title : RS232C送信サブルーチン(PORTA,0) ; 9600BPS OSC;8.000MHz仕様 ; Input : W-register ; Output : ;****************************************************************************************** ; (1)送信開始 SEND MOVWF IODAT BCF PORTA,0 ; 送信開始 MOVLW H'42' ; 9600BPS,OSC;8MHz 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,0 BTFSC STATUS,C ; ビットデータが1の時, 1を立てる BSF PORTA,0 MOVLW H'42' ; パルス(9600BPS,OSC;8MHz) MOVWF SENDWAT SEND3 DECFSZ SENDWAT,F GOTO SEND3 DECFSZ SENDLP,F GOTO SEND2 ; (3)終了 BSF PORTA,0 ; フラグを戻す ; (4)送信後、少し待つ MOVLW H'0A' CALL WAT RETURN ;****************************************************************************************** ; Function Name : REC ; Title : RS232C受信サブルーチン(PORTA1) ; 9600BPS OSC;8.000MHz仕様 ; Input : ; Output : ;****************************************************************************************** REC ; (0)変数初期化 CLRF IODAT ; (1)受信データを待つ REC0 BTFSC PORTA,1 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,1 ; ビットデータが0の時, 0を立てる BCF STATUS,C BTFSC PORTA,1 ; ビットデータが1の時, 1を立てる BSF STATUS,C RRF IODAT,F ; 変数内でビットをシフトする DECFSZ RECLP,F GOTO REC2 NOP NOP ; (4)受信データをW-regにコピー MOVFW IODAT ; RETURN END