;****************************************************************************************** ; 16文字*1桁 LCD表示器サンプル(電圧計) ; Program Name : ; Programer : ; Create date : Version 1.0 H18.05.05 ; History : ;****************************************************************************************** ; (0)Display ; DCM16117A(8Bitモードで使用する) ; 内部オシレータを使用する(8MHz) ; (1)Descript I/O ; A0,A1,A6 : I/O Port ; A5 : Mode SW ; A2 : DCM16117A(RS) ; A3 : DCM16117A(R/W) ; A4 : DCM16117A(E) ; B0〜B7 : DCM16117A(DB0〜DB7) ;****************************************************************************************** LIST P=PIC16F88 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 _CONFIG2 , _IESO_OFF & _FCMEN_OFF DN0 EQU 20H DN1 EQU 21H DN2 EQU 22H DN3 EQU 23H LPDSP EQU 24H LPDSP1 EQU 25H COU0 EQU 26H COU1 EQU 27H COU2 EQU 28H COU3 EQU 29H ADANSL EQU 2AH ADANSR EQU 2BH CNT1 EQU 2CH CNT2 EQU 2DH LP1 EQU 2EH LP2 EQU 2FH LPWAT1 EQU 30H LPWT1B EQU 31H LPWAT1S0 EQU 32H LPWAT01S0 EQU 33H LPWAT001S0 EQU 34H LPWAT001S1 EQU 35H LCDDSPIO EQU 36H ORG 0 GOTO START ORG 4 GOTO START START ; Bank0での設定 BANKSEL PORTA ; PortAのBankを選択する CLRF PORTA ; PortAの初期化(Bank0) CLRF PORTB ; PortBの初期化(Bank0,1,2,3) ; Bank1での設定 BANKSEL ANSEL ; ANSELのBankを選択する(Bank1) MOVLW B'01111110' ;内部OSC選択,内部OSCに8MHzを選択 MOVWF OSCCON MOVLW B'00000011' ;AN0(RA0)〜AN1(RA1)をAnalog-Input, 他をDegitalに設定 MOVWF ANSEL ; Degital Inputに設定(Bank1) MOVLW B'00100011' MOVWF TRISA ; PortAのI/O設定(Bank1) MOVLW B'00000000' MOVWF TRISB ; PortBのI/O設定(Bank1) MOVLW B'10000000' ; 7:10Bitを右詰めで得る,6:?(どっちでも),5-4:ReferはVoltage-GND,3-0:None MOVWF ADCON1 ;(Bank1) ; Bank0に戻す BANKSEL PORTA ; PortAのBankを選択する ; デモ表示 CALL INTLCD ; LCDの初期化 ; CALL DEMO1 ; デモを表示する ; MAIN ; CALL DSPA ; 電圧測定・表示 ; GOTO MAIN ;****************************************************************************************** ; Function Name : DEMO1 ; Title : 電源投入時のデモ ; Input : なし ;****************************************************************************************** DEMO1 ; PicCPU 表示 ; (1)領域0を選択 CALL INTPOS0 ; (2)表示 MOVLW 'S' CALL LCDDSP MOVLW 't' CALL LCDDSP MOVLW 'a' CALL LCDDSP MOVLW 'r' CALL LCDDSP MOVLW 't' CALL LCDDSP MOVLW ' ' CALL LCDDSP MOVLW 'P' CALL LCDDSP MOVLW 'I' CALL LCDDSP ; ; (3)領域1を選択 CALL INTPOS1 ; (4)表示 MOVLW 'C' CALL LCDDSP MOVLW '1' CALL LCDDSP MOVLW '6' CALL LCDDSP MOVLW 'F' CALL LCDDSP MOVLW '8' CALL LCDDSP MOVLW '8' CALL LCDDSP MOVLW ' ' CALL LCDDSP MOVLW ' ' CALL LCDDSP ; (5)少し待つ CALL WAT1S CALL WAT1S ; RETURN ;****************************************************************************************** ; Function Name : INTPOS0 ; Title : LCDの1〜8に書き込む ; Input : ;****************************************************************************************** INTPOS0 MOVLW B'10000000' ; MOVWF PORTB BCF PORTA,2 ; RS BCF PORTA,3 ; R/W BSF PORTA,4 ; Enable-Signal NOP NOP BCF PORTA,4 ; Enable-Signal CALL WAT001S RETURN ;****************************************************************************************** ; Function Name : INTPOS1 ; Title : LCDの9〜16に書き込む ; Input : ;****************************************************************************************** INTPOS1 MOVLW B'11000000' ; MOVWF PORTB BCF PORTA,2 ; RS BCF PORTA,3 ; R/W BSF PORTA,4 ; Enable-Signal NOP NOP BCF PORTA,4 ; Enable-Signal CALL WAT001S RETURN ;****************************************************************************************** ; Function Name : INTLCD ; Title : インストラクションによるLCDの初期化 ; Input : ;****************************************************************************************** INTLCD ; 1.ファンクションセット ; (1)15mS以上待つ CALL WAT01S ; (2)ファンクションセット(1) MOVLW B'00110000' ; MOVWF PORTB BCF PORTA,2 ; RS BCF PORTA,3 ; R/W BSF PORTA,4 ; Enable-Signal NOP NOP BCF PORTA,4 ; Enable-Signal ; (3)4.1mS以上待つ CALL WAT001S ; (4)ファンクションセット(2) MOVLW B'00110000' ; MOVWF PORTB BCF PORTA,2 ; RS BCF PORTA,3 ; R/W BSF PORTA,4 ; Enable-Signal NOP NOP BCF PORTA,4 ; Enable-Signal ; (5)100μS以上待つ CALL WAT001S ; (6)ファンクションセット(3) MOVLW B'00110000' ; MOVWF PORTB BCF PORTA,2 ; RS BCF PORTA,3 ; R/W BSF PORTA,4 ; Enable-Signal NOP NOP BCF PORTA,4 ; Enable-Signal CALL WAT001S ; 2.表示設定 ; ; (1)ファンクションセット MOVLW B'00111000' ; MOVWF PORTB BCF PORTA,2 ; RS BCF PORTA,3 ; R/W BSF PORTA,4 ; Enable-Signal NOP NOP BCF PORTA,4 ; Enable-Signal CALL WAT001S ; ; (2)表示OFF MOVLW B'00001000' ; MOVWF PORTB BCF PORTA,2 ; RS BCF PORTA,3 ; R/W BSF PORTA,4 ; Enable-Signal NOP NOP BCF PORTA,4 ; Enable-Signal CALL WAT001S ; ; (3)表示クリア MOVLW B'00000001' ; MOVWF PORTB BCF PORTA,2 ; RS BCF PORTA,3 ; R/W BSF PORTA,4 ; Enable-Signal NOP NOP BCF PORTA,4 ; Enable-Signal CALL WAT001S ; ; (4)エントリーモードセット MOVLW B'00000110' ; MOVWF PORTB BCF PORTA,2 ; RS BCF PORTA,3 ; R/W BSF PORTA,4 ; Enable-Signal NOP NOP BCF PORTA,4 ; Enable-Signal CALL WAT001S ; ; (5)表示ON MOVLW B'00001100' ; MOVWF PORTB BCF PORTA,2 ; RS BCF PORTA,3 ; R/W BSF PORTA,4 ; Enable-Signal NOP NOP BCF PORTA,4 ; Enable-Signal CALL WAT001S ; ; ; (6)DD RAM アドレスセット MOVLW B'10000000' ; MOVWF PORTB BCF PORTA,2 ; RS BCF PORTA,3 ; R/W BSF PORTA,4 ; Enable-Signal NOP NOP BCF PORTA,4 ; Enable-Signal CALL WAT001S ; RETURN ;****************************************************************************************** ; Function Name : LCDDSP ; Title : LCDに文字を表示する ; Input : ; Output : ;****************************************************************************************** LCDDSP MOVWF PORTB BSF PORTA,2 ; RS BCF PORTA,3 ; R/W BSF PORTA,4 ; Enable-Signal NOP NOP BCF PORTA,4 ; Enable-Signal NOP CALL WAT001S ; RETURN ;****************************************************************************************** ; Function Name : LCDCLR ; Title : LCDの画面クリア ; Input : ;****************************************************************************************** LCDCLR ; (1)表示クリア BCF PORTA,2 ; RS BCF PORTA,3 ; R/W BSF PORTA,4 ; Enable-Signal MOVLW B'00000001' ; MOVWF PORTB NOP BCF PORTA,4 ; Enable-Signal NOP ; RETURN ;****************************************************************************************** ; Function Name : WAT5S ; Title : タイマー関数(5秒程度待つ) ; Input : ; Output : ;****************************************************************************************** WAT5S CALL WAT1S CALL WAT1S CALL WAT1S CALL WAT1S CALL WAT1S RETURN ;****************************************************************************************** ; Function Name : WAT1S ; Title : タイマー関数(1秒程度待つ) ; Input : ; Output : ;****************************************************************************************** WAT1S MOVLW H'0A' MOVWF LPWAT1S0 WAT1S0 CALL WAT01S DECFSZ LPWAT1S0,F GOTO WAT1S0 RETURN ;****************************************************************************************** ; Function Name : WAT01S ; Title : タイマー関数(0.1秒程度待つ) ; Input : ; Output : ;****************************************************************************************** WAT01S MOVLW H'0A' MOVWF LPWAT01S0 WAT01S0 CALL WAT001S DECFSZ LPWAT01S0,F GOTO WAT01S0 RETURN ;****************************************************************************************** ; Function Name : WAT001S ; Title : タイマー関数(0.01秒程度待つ) ; Input : ; Output : ; Description : 8/4MHz =(2000)=> 10000Hz =(10)=> 100Hz ;****************************************************************************************** WAT001S MOVLW H'0A' ; 10 MOVWF LPWAT001S1 WAT001S1 MOVLW H'C8' ; 200 MOVWF LPWAT001S0 WAT001S0 NOP NOP NOP NOP NOP NOP NOP DECFSZ LPWAT001S0,F GOTO WAT001S0 DECFSZ LPWAT001S1,F GOTO WAT001S1 RETURN ;****************************************************************************************** ; Function Name : DSPA ; Title : AN0端子の電圧を表示する ; Input : なし ;****************************************************************************************** DSPA ; (1)A端子の電圧を得る CALL GETVA CALL GETVA ; (2)10Bit-A/D-Converterの出力を4桁10進数に変換する CALL HEXDEC ; (3)表示用変数に表示内容を設定する CALL SETHEX ; (4)表示する CALL WATDSP RETURN ;****************************************************************************************** ; Function Name : DSPB ; Title : AN1端子の電圧を表示する ; Input : なし ;****************************************************************************************** DSPB ; (1)B端子の電圧を得る CALL GETVB CALL GETVB ; (2)10Bit-A/D-Converterの出力を4桁10進数に変換する CALL HEXDEC ; (3)表示用変数に表示内容を設定する CALL SETHEX ; (4)表示する CALL WATDSP RETURN ;****************************************************************************************** ; Function Name : GETVA ; Title : AN0端子の電圧を得る ; Input : なし ; Output : ADANSL,ADANSR ;****************************************************************************************** GETVA BANKSEL PORTA ; BANK0を選択する ; ADCON0[7:6] サンプリング周波数;Fosc/32(OSC周波数の1/32:最も遅い設定) ; ADCON0[5-3] Chanel-1(AN0)を選択 ; ADCON0[2] Go/Done ; ADCON0[1] None ; ADCON0[0] A/D-Converter ON MOVLW B'10000101' MOVWF ADCON0 ;(Bank0) GETVA1 BTFSC ADCON0,2; ADCの開始フラグが完了するまで待つ GOTO GETVA1 ; ADCの開始フラグが完了するまで待つ MOVFW ADRESH ; 上位2ビットデータ収集(Bank0) MOVWF ADANSL ; 上位2ビットデータ代入 BANKSEL ANSEL ; Bank1を選択する MOVFW ADRESL ; 下位8ビットデータ収集(Bank1) BANKSEL PORTA ; BANK0を選択する MOVWF ADANSR ; 下位8ビットデータ代入 RETURN ;****************************************************************************************** ; Function Name : GETVB ; Title : AN1端子の電圧を得る ; Input : なし ; Output : ADANSL,ADANSR ;****************************************************************************************** GETVB BANKSEL PORTA ; BANK0を選択する ; ADCON0[7:6] サンプリング周波数;Fosc/32(OSC周波数の1/32:最も遅い設定) ; ADCON0[5-3] Chanel-6(AN1)を選択 ; ADCON0[2] Go/Done ; ADCON0[1] None ; ADCON0[0] A/D-Converter ON MOVLW B'10001101' MOVWF ADCON0 ;(Bank0) GETVB1 BTFSC ADCON0,2; ADCの開始フラグが完了するまで待つ GOTO GETVB1 ; ADCの開始フラグが完了するまで待つ MOVFW ADRESH ; 上位2ビットデータ収集(Bank0) MOVWF ADANSL ; 上位2ビットデータ代入 BANKSEL ANSEL ; Bank1を選択する MOVFW ADRESL ; 下位8ビットデータ収集(Bank1) BANKSEL PORTA ; BANK0を選択する MOVWF ADANSR ; 下位8ビットデータ代入 RETURN ;****************************************************************************************** ; Function Name : HEXDEC ; Title : 10Bit-A/D-Converter の16進数を文字型10進数(4桁)に変換する ; Input : ADANSL,ADANSR (10Bit-A/D-Converterの出力形式) ; Output : COU0,COU1,COU2,COU3(4桁の10進数) ;****************************************************************************************** HEXDEC ; (1)10進数の出力変数を初期化  CLRF COU0 CLRF COU1 CLRF COU2 CLRF COU3 ; ; (2)16進数を10進数に変換する ; ※ Binary-16進数の値分だけ10進カウンタを回して、Binary-16進数を文字型10進数の ; COU0,COU1,COU2,COU3にカウントアップして10進数を作り出す ; MOVFW ADANSL XORLW H'00' BTFSC STATUS,Z GOTO HEXDEE ; MOVFW ADANSL 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 ADANSR XORLW H'00' BTFSC STATUS,Z GOTO HEXDECE MOVFW ADANSR MOVWF CNT1 HEXDEE1 CALL CNTDEC DECFSZ CNT1,F GOTO HEXDEE1 HEXDECE RETURN ;****************************************************************************************** ; Function Name : INTCOU ; Title : カウンター変数を初期化 ; Input : COU0〜COU3 ;****************************************************************************************** INTCOU CLRF COU0 CLRF COU1 CLRF COU2 CLRF COU3 RETURN ;****************************************************************************************** ; Function Name : CNTDEC ; Title : 10進(4桁)アップカウンタ ; Input : COU0,COU1,COU2,COU3 ; Output : COU0,COU1,COU2,COU3 ;****************************************************************************************** CNTDEC MOVLW H'01' ADDWF COU0,F ; 0桁目10進カウンタ(0aで桁上げ) MOVFW COU0 XORLW H'0A' BTFSS STATUS,Z RETURN ; CLRF COU0 MOVLW H'01' ADDWF COU1,F ; 1桁目10進カウンタ(0aで桁上げ) MOVFW COU1 XORLW H'0A' BTFSS STATUS,Z RETURN ; CLRF COU1 MOVLW H'01' ADDWF COU2,F ; 2桁目10進カウンタ(0aで桁上げ) MOVFW COU2 XORLW H'0A' BTFSS STATUS,Z RETURN ; CLRF COU2 MOVLW H'01' ADDWF COU3,F ; 3桁目10進カウンタ(0aで桁上げ) MOVFW COU3 XORLW H'0A' BTFSS STATUS,Z RETURN ; CLRF COU0 CLRF COU1 CLRF COU2 CLRF COU3 RETURN ;****************************************************************************************** ; Function Name : HEXCOU ; Title : 16進(4桁)アップカウンター ; Input : COU0〜COU3 ;****************************************************************************************** HEXCOU ; 0桁目 MOVLW H'01' ADDWF COU0,F BTFSS COU0,4 RETURN ; 1桁目 MOVFW COU0 ANDLW B'00001111' MOVWF COU0 MOVLW H'01' ADDWF COU1,F BTFSS COU1,4 RETURN ; 2桁目 MOVFW COU1 ANDLW B'00001111' MOVWF COU1 MOVLW H'01' ADDWF COU2,F BTFSS COU2,4 RETURN ; 3桁目 MOVFW COU2 ANDLW B'00001111' MOVWF COU2 MOVLW H'01' ADDWF COU3,F BTFSS COU3,4 RETURN ; 桁上がり CLRF COU0 CLRF COU1 CLRF COU2 CLRF COU3 RETURN ;****************************************************************************************** ; Function Name : SETHEX ; Title : 16進カウンター変数の表示変数設定 ; Input : COU0 - COU3 ; Output : DN0 - DN3 ;****************************************************************************************** SETHEX MOVFW COU0 IORLW H'30' MOVWF DN0 ; MOVFW COU1 IORLW H'30' MOVWF DN1 ; MOVFW COU2 IORLW H'30' MOVWF DN2 ; MOVFW COU3 IORLW H'30' MOVWF DN3 ; RETURN ;****************************************************************************************** ; Function Name : WATDSP ; Title : 表示する ; Input : DN0〜DN3 ;****************************************************************************************** WATDSP ; (0)表示クリア CALL LCDCLR ; (1)領域0を選択 CALL INTPOS0 ; (2)表示 MOVLW ' ' CALL LCDDSP MOVLW ' ' CALL LCDDSP MOVLW ' ' CALL LCDDSP MOVLW 'V' CALL LCDDSP MOVLW 'o' CALL LCDDSP MOVLW 'l' CALL LCDDSP MOVLW 't' CALL LCDDSP MOVLW ' ' CALL LCDDSP ; (3)領域1を選択 CALL INTPOS1 ; (4)表示 MOVFW DN3 CALL LCDDSP MOVFW DN2 CALL LCDDSP MOVLW '.' CALL LCDDSP MOVFW DN1 CALL LCDDSP MOVFW DN0 CALL LCDDSP MOVLW '[' CALL LCDDSP MOVLW 'V' CALL LCDDSP MOVLW ']' CALL LCDDSP ; (5)少し待つ CALL WAT1S RETURN ; END