;******************************************************************************************
;  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         : タイマー１割込み処理
;   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)カウンタの数値を文字型に変換	
	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
	MOVFW	DN2
	CALL	LCDDSP
	MOVLW	','
	CALL	LCDDSP
	MOVFW	DN1
	CALL	LCDDSP
	MOVFW	DN0
	CALL	LCDDSP
	MOVLW	'M'
	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	'M'
	CALL	LCDDSP
	MOVLW	'H'
	CALL	LCDDSP
	MOVLW	'z'
	CALL	LCDDSP

;  (5)少し待つ
;	CALL	WAT1S
	RETURN
;
	END
