;****************************************************************************************** ; 16文字*1桁 LCD表示器サンプル(周波数カウンタ;内部OSCで1秒の割り込みを行なう) ; Program Name : ; Programer : ; Create date : Version 1.0 H18.07.03 ; 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 INTWRG EQU 20H INTSTS EQU 21H INTFLG EQU 22H ITRCOU EQU 23H DN0 EQU 24H DN1 EQU 25H DN2 EQU 26H DN3 EQU 27H LPDSP EQU 28H LPDSP1 EQU 29H COU0 EQU 2AH COU1 EQU 2BH COU2 EQU 2CH COU3 EQU 2DH CNT1 EQU 30H CNT2 EQU 31H LP1 EQU 32H LP2 EQU 33H LPWAT1 EQU 34H LPWT1B EQU 35H LPWAT1S0 EQU 36H LPWAT01S0 EQU 37H LPWAT001S0 EQU 38H LPWAT001S1 EQU 39H LCDDSPIO EQU 39H OVRFLG EQU 3AH ; ORG 0 ; プログラムスタート GOTO START ORG 4 ; 割込み処理 MOVWF INTWRG ; W-REGの値を保存 SWAPF STATUS,W ; STATUSレジスタの値を保存 MOVWF INTSTS ; STATUSレジスタの値を保存 ; CALL FNCITR ; MOVLW H'0B' ; *TMR1 MOVWF TMR1H ; *TMR1 MOVLW H'DB' ; *TMR1 MOVWF TMR1L ; *TMR1 ; SWAPF INTSTS,W ; STATUSレジスタの値を復元 MOVWF STATUS ; STATUSレジスタの値を復元 MOVFW INTWRG ; W-REGレジスタの値を復元 BCF PIR1,TMR1IF ; *割込みフラグをリセット RETFIE 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'00000000' ;Degitalに設定 MOVWF ANSEL ; Degital Inputに設定(Bank1) MOVLW B'01100011' 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を選択する ; ; 1.デモ表示 CALL INTLCD ; LCDの初期化 ; CALL DEMO1 ; デモを表示する ; 2.処理開始 ; (1)カウンタを初期化 CALL INTCOU ; 周波数カウンタを初期化 CLRF ITRCOU ; 割込みカウンタを初期化 ; (2)割込み処理設定 CALL SETTIM ; 割込み処理設定 ; 3.処理 MAIN ; (1)Hを待つ BTFSS PORTA,0 ; ビットデータがLの時 GOTO $-1 ; (2)Lを待つ BTFSC PORTA,0 ; ビットデータがHの時 GOTO $-1 ; (3)カウントアップ CALL CNTDEC ; ; GOTO MAIN ;****************************************************************************************** ; Function Name : FNCITR ; Title : タイマー1割込み処理 ; Input : ; Output : ;****************************************************************************************** FNCITR ; 1.タイマー割込み処理 MOVLW H'01' ADDWF ITRCOU,F ; 4進カウンタ(1S <= 250mS * 4) MOVFW ITRCOU XORLW H'04' BTFSS STATUS,Z RETURN ; 2.1秒毎に次の処理を行なう ; (1)カウンタの数値を文字型に変換 CALL SETHEX ; (2)LCDの表示 BTFSS OVRFLG,0 CALL WATDSP BTFSC OVRFLG,0 CALL ERRDSP ; 3.カウンタを初期化 CALL INTCOU ; 周波数カウンタを初期化 CLRF ITRCOU ; 割込みカウンタを初期化 RETURN ;****************************************************************************************** ; Function Name : SETTIM ; Title : 割込みタイマーを設定 ; Input : ; Output : ; Description :割り込みの設定(250mS毎) ; OSC:8MHz/4=(8*62500[F424])=>4Hz ; FFFF(-)F424=>0BDB ;****************************************************************************************** SETTIM BANKSEL PORTA ;(Bank0) MOVLW B'00110101' ; *Bit7(0):None ; *Bit6(0): ; *Bit5,4(11):1:8 Prescale Value ; *Bit3(0):OSC is shut off ; *Bit2(1):ASyncronize ; *Bit1(0):Internal clock(Fosc/4) ; *Bit0(1):Enable Timer1 MOVWF T1CON ; * MOVLW H'0B' ; *TMR1 MOVWF TMR1H ; *TMR1 MOVLW H'DB' ; *TMR1 MOVWF TMR1L ; *TMR1 BCF PIR1,TMR1IF ; *割込みフラグをリセット BSF INTCON,GIE ; *Grobal Interrupt Ebable (->1) ※Total BSF INTCON,PEIE ; *Peripheral Interrupt Ebable (->1) ※Timer etc. BANKSEL ANSEL ; (Bank1) BSF PIE1,TMR1IE ; *Timer1 Interrupt Ebable (->1) ※Timer1 BANKSEL PORTA ;(Bank0) RETURN ;****************************************************************************************** ; 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 : INTCOU ; Title : カウンター変数を初期化 ; Input : COU0〜COU3 ;****************************************************************************************** INTCOU CLRF COU0 CLRF COU1 CLRF COU2 CLRF COU3 CLRF OVRFLG 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 BSF OVRFLG,0 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 'F' CALL LCDDSP MOVLW 'r' CALL LCDDSP MOVLW 'e' CALL LCDDSP MOVLW 'q' CALL LCDDSP MOVLW ' ' CALL LCDDSP ; (3)領域1を選択 CALL INTPOS1 ; (4)表示 MOVFW DN3 CALL LCDDSP MOVLW ',' CALL LCDDSP MOVFW DN2 CALL LCDDSP MOVFW DN1 CALL LCDDSP MOVFW DN0 CALL LCDDSP MOVLW ' ' CALL LCDDSP MOVLW 'H' CALL LCDDSP MOVLW 'z' CALL LCDDSP ; (5)少し待つ ; CALL WAT1S RETURN ; ;****************************************************************************************** ; Function Name : ERRDSP ; Title : エラーを表示する ; Input : ;****************************************************************************************** ERRDSP ; (0)表示クリア CALL LCDCLR ; (1)領域0を選択 CALL INTPOS0 ; (2)表示 MOVLW ' ' CALL LCDDSP MOVLW ' ' CALL LCDDSP MOVLW ' ' CALL LCDDSP MOVLW 'F' CALL LCDDSP MOVLW 'r' CALL LCDDSP MOVLW 'e' CALL LCDDSP MOVLW 'q' CALL LCDDSP MOVLW ' ' CALL LCDDSP ; (3)領域1を選択 CALL INTPOS1 ; (4)表示 MOVLW '*' CALL LCDDSP MOVLW ',' CALL LCDDSP MOVLW '*' CALL LCDDSP MOVLW '*' CALL LCDDSP MOVLW '*' CALL LCDDSP MOVLW ' ' CALL LCDDSP MOVLW 'H' CALL LCDDSP MOVLW 'z' CALL LCDDSP ; (5)少し待つ ; CALL WAT1S RETURN ; END