;******************************************************************************************
;  4桁カウンタサンプル(微小電圧計)
;   Program Name : 
;   Programer    :
;   Create date  :  Version 1.0    H18.02.01
;   History      :
;******************************************************************************************
;  (0)Display
;     7 Segment Diode ( Anode common type )
;     内部オシレータを使用する(8MHz)
;  (1)Descript I/O 
;      B0～B7      : 7 Segment diode (a～h) 
;      A0,A1,A2    : I/O
;      A3,A4,A6,A7 : 7 Segment diode (1～4)
;      A5          : None
;******************************************************************************************
	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
PRIOD	EQU	32H

	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'00000001'	;AN0(RA0)をAnalog-Input, 他をDegitalに設定
	MOVWF	ANSEL	; Degital Inputに設定(Bank1)
	MOVLW	B'00100101'
	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を選択する
; デモ表示
MAIN
	CLRF	PRIOD	; 小数点を表示しない
	CALL	DEMO0	; 電源投入時に7-Segment Displayが正常に点灯するか確認する
	CALL	DEMO1	; デモを表示する
	CALL	INTCOU	; 変数初期化
MADIN
	BSF	PRIOD,1
	CALL	DSPA
	GOTO	MADIN

;******************************************************************************************
;   Function Name : DEC7SEG
;   Title         : DECデコーダと7セグメント表示(アノードコモン用)
;   Input         : W:ワーキングレジスタ
;   Output        : なし
;******************************************************************************************
DEC7SEG
	CALL	TBL7A
	MOVWF	PORTB
	RETURN
TBL7A
	ADDWF	PCL,F
	RETLW	B'10001000'		; 0(00)
	RETLW	B'11111100'		; 1(01)
	RETLW	B'10100010'		; 2(02)
	RETLW	B'11100000'		; 3(03)
	RETLW	B'11010100'		; 4(04)
	RETLW	B'11000001'		; 5(05)
	RETLW	B'10000001'		; 6(06)
	RETLW	B'11111000'		; 7(07)
	RETLW	B'10000000'		; 8(08)
	RETLW	B'11000000'		; 9(09)
	RETLW	B'10010000'		; A(0A)
	RETLW	B'10000101'		; B(0B)
	RETLW	B'10001011'		; C(0C)
	RETLW	B'10100100'		; D(0D)
	RETLW	B'10000011'		; E(0E)
	RETLW	B'10010011'		; F(0F)
	RETLW	B'00000000'		; G(10)
	RETLW	B'00000000'		; H(11)
	RETLW	B'00000000'		; I(12)
	RETLW	B'00000000'		; J(13)
	RETLW	B'00000000'		; K(14)
	RETLW	B'00000000'		; L(15)
	RETLW	B'00000000'		; M(16)
	RETLW	B'00000000'		; N(17)
	RETLW	B'00000000'		; O(18)
	RETLW	B'10010010'		; P(19)
	RETLW	B'00000000'		; Q(1A)
	RETLW	B'10110111'		; R(1B)
	RETLW	B'00000000'		; S(1C)
	RETLW	B'00000000'		; T(1D)
	RETLW	B'10001100'		; U(1E)
	RETLW	B'00000000'		; V(1F)
	RETLW	B'00000000'		; W(20)
	RETLW	B'00000000'		; X(21)
	RETLW	B'00000000'		; Y(22)
	RETLW	B'00000000'		; Z(23)
	RETLW	B'00000000'		; a(24)
	RETLW	B'10000101'		; b(25)
	RETLW	B'10100111'		; c(26)
	RETLW	B'10100100'		; d(27)
	RETLW	B'10000011'		; e(28)
	RETLW	B'10010011'		; f(29)
	RETLW	B'11000000'		; g(2A)
	RETLW	B'00000000'		; h(2B)
	RETLW	B'10111111'		; i(2C)
	RETLW	B'00000000'		; j(2D)
	RETLW	B'00000000'		; k(2E)
	RETLW	B'00000000'		; l(2F)
	RETLW	B'00000000'		; m(30)
	RETLW	B'00000000'		; n(31)
	RETLW	B'00000000'		; o(32)
	RETLW	B'10010010'		; p(33)
	RETLW	B'00000000'		; q(34)
	RETLW	B'10110111'		; r(35)
	RETLW	B'00000000'		; s(36)
	RETLW	B'00000000'		; t(37)
	RETLW	B'00000000'		; u(38)
	RETLW	B'10101101'		; v(39)
	RETLW	B'00000000'		; w(3A)
	RETLW	B'00000000'		; x(3B)
	RETLW	B'00000000'		; y(3C)
	RETLW	B'00000000'		; z(3D)
	RETLW	B'11111111'		;  (3E)
	RETLW	B'00000000'		; -(3F)
	RETLW	B'00000000'		; _(40)
	RETLW	B'00000000'		; 全(41)

;******************************************************************************************
;   Function Name : PRG01
;   Title         : 16進(4桁)アップカウンター
;   Input         : COU0～COU3
;******************************************************************************************
PRG01
; 1.16進カウンタ
	CALL	HEXCOU
; 2.変数セット
	CALL	SETHEX
; 3.7セグメント表示
	CALL	WATDSP2

	RETURN

;******************************************************************************************
;   Function Name : PRG02
;   Title         : 10進(4桁)アップカウンター
;   Input         : COU0～COU3
;******************************************************************************************
PRG02
; 1.16進カウンタ
	CALL	CNTDEC
; 2.変数セット
	CALL	SETHEX
; 3.7セグメント表示
	CALL	WATDSP2

	RETURN

;******************************************************************************************
;   Function Name : DSPA
;   Title         : AN0端子の電圧を表示する
;   Input         : なし
;******************************************************************************************
DSPA
;    (1)A端子の電圧を得る
	CALL	GETVA
	CALL	GETVA

;    (2)10Bit-A/D-Converterの出力を4桁10進数に変換する
	CALL	HEXDEC

;    (3)7-Segment表示用変数に表示内容を設定する
	CALL	SETHEX

;    (4)7-Segment-Displayを表示する
	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)7-Segment表示用変数に表示内容を設定する
	CALL	SETHEX

;    (4)7-Segment-Displayを表示する
	CALL	WATDSP

	RETURN

;******************************************************************************************
;   Function Name : DSPC
;   Title         : AN2端子の電圧を表示する
;   Input         : なし
;******************************************************************************************
DSPC
;    (1)C端子の電圧を得る
	CALL	GETVC
	CALL	GETVC

;    (2)10Bit-A/D-Converterの出力を4桁10進数に変換する
	CALL	HEXDEC

;    (3)7-Segment表示用変数に表示内容を設定する
	CALL	SETHEX

;    (4)7-Segment-Displayを表示する
	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	; 上位２ビットデータ収集(Bank0)
	MOVWF	ADANSL	; 上位２ビットデータ代入
	BANKSEL	ANSEL	; Bank1を選択する
	MOVFW	ADRESL	; 下位８ビットデータ収集(Bank1)
	BANKSEL	PORTA	; BANK0を選択する
	MOVWF	ADANSR	; 下位８ビットデータ代入

	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	; 上位２ビットデータ収集(Bank0)
	MOVWF	ADANSL	; 上位２ビットデータ代入
	BANKSEL	ANSEL	; Bank1を選択する
	MOVFW	ADRESL	; 下位８ビットデータ収集(Bank1)
	BANKSEL	PORTA	; BANK0を選択する
	MOVWF	ADANSR	; 下位８ビットデータ代入

	RETURN

;******************************************************************************************
;   Function Name : GETVC
;   Title         : AN2端子の電圧を得る
;   Input         : なし
;   Output        : ADANSL,ADANSR
;******************************************************************************************
GETVC
	BANKSEL	PORTA	; BANK0を選択する
; ADCON0[7:6]  サンプリング周波数；Fosc/32(OSC周波数の1/32:最も遅い設定)
; ADCON0[5-3]  Chanel-6(AN2)を選択
; ADCON0[2]    Go/Done
; ADCON0[1]    None
; ADCON0[0]    A/D-Converter ON
	MOVLW	B'10010101'	
	MOVWF	ADCON0	;(Bank0)
GETVC1
	BTFSC	ADCON0,2; ADCの開始フラグが完了するまで待つ
	GOTO	GETVC1	; ADCの開始フラグが完了するまで待つ
	MOVFW	ADRESH	; 上位２ビットデータ収集(Bank0)
	MOVWF	ADANSL	; 上位２ビットデータ代入
	BANKSEL	ANSEL	; Bank1を選択する
	MOVFW	ADRESL	; 下位８ビットデータ収集(Bank1)
	BANKSEL	PORTA	; BANK0を選択する
	MOVWF	ADANSR	; 下位８ビットデータ代入

	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
;******************************************************************************************
SETHEX
	MOVFW	COU0
	MOVWF	DN0
	MOVFW	COU1
	MOVWF	DN1
	MOVFW	COU2
	MOVWF	DN2
	MOVFW	COU3
	MOVWF	DN3
	RETURN

;******************************************************************************************
;   Function Name : DEMO0
;   Title         : 7-Segment-LEDの点灯状態確認用関数
;   Input         : なし
;******************************************************************************************
DEMO0
	MOVLW	H'41'
	MOVWF	DN3
	MOVLW	H'41'
	MOVWF	DN2
	MOVLW	H'41'
	MOVWF	DN1
	MOVLW	H'41'
	MOVWF	DN0
	CALL	WATDSP

	RETURN

;******************************************************************************************
;   Function Name : DEMO1
;   Title         : 電源投入時のデモ
;   Input         : なし
;******************************************************************************************
DEMO1
; PicCPU 表示
	MOVLW	H'19'	;P
	MOVWF	DN3
	MOVLW	H'2C'	;i
	MOVWF	DN2
	MOVLW	H'26'	;c
	MOVWF	DN1
	MOVLW	H'3E'	;
	MOVWF	DN0
	CALL	WATDSP

; 16F88 表示
	MOVLW	H'01'	;1
	MOVWF	DN3
	MOVLW	H'06'	;6
	MOVWF	DN2
	MOVLW	H'08'	;8
	MOVWF	DN1
	MOVLW	H'08'	;8
	MOVWF	DN0
	CALL	WATDSP

	RETURN


;******************************************************************************************
;   Function Name : WATDSP
;   Title         : WAITする（1秒程度、7Segmentを表示する）
;   Input         : DN0～DN3
;******************************************************************************************
WATDSP
	MOVLW	H'05'	; 1秒程度点灯
	MOVWF	LPDSP1
WATDP1A
	MOVLW	H'CF'	; 表示時間調整
	MOVWF	LPDSP
WATDSP1
	CALL	C1DSP7
	DECFSZ	LPDSP,F
	GOTO	WATDSP1
	DECFSZ	LPDSP1,F
	GOTO	WATDP1A
	RETURN

;******************************************************************************************
;   Function Name : WATDSP2
;   Title         : 0.05秒程度、7Segmentを表示する
;   Input         : DN0～DN3
;******************************************************************************************
WATDSP2
	MOVLW	H'1B'	; 表示時間調整
	MOVWF	LPDSP
WATDP2A
	CALL	C1DSP7
	DECFSZ	LPDSP,F
	GOTO	WATDP2A
	RETURN

;******************************************************************************************
;   Function Name : C1DSP7
;   Title         : ４桁の数字を設定し、7Segmentを点灯する
;   Input         : DN0～DN5
;   Output        : 
;******************************************************************************************
C1DSP7
;  (0)全ての桁を初期化する
	CALL	DEC7OFF
;  (1)0桁目の処理
;    1)数字をドットパターンに変換して表示する
	MOVFW	DN0
	CALL	DEC7SEG
	BTFSC	PRIOD,0
	BCF	PORTB,7
	BSF	PORTA,3
;    2)Wait
	CALL	WAT1
	BCF	PORTA,3
;  (2)1桁目の処理
;    1)数字をドットパターンに変換して表示する
	MOVFW	DN1
	CALL	DEC7SEG
	BTFSC	PRIOD,1
	BCF	PORTB,7
	BSF	PORTA,4
;    2)Wait
	CALL	WAT1
	BCF	PORTA,4
;  (3)2桁目の処理
;    1)数字をドットパターンに変換して表示する
	MOVFW	DN2
	CALL	DEC7SEG
	BTFSC	PRIOD,2
	BCF	PORTB,7
	BSF	PORTA,6
;    2)Wait
	CALL	WAT1
	BCF	PORTA,6
;  (4)3桁目の処理
;    1)数字をドットパターンに変換して表示する
	MOVFW	DN3
	CALL	DEC7SEG
	BTFSC	PRIOD,3
	BCF	PORTB,7
	BSF	PORTA,7
;    2)Wait
	CALL	WAT1
	BCF	PORTA,7

	RETURN

;******************************************************************************************
;   Function Name : DEC7OFF
;   Title         : 7セグメント表示の全桁を初期化
;   Input         : 
;   Output        : 
;******************************************************************************************
DEC7OFF
	BCF	PORTA,3
	BCF	PORTA,4
	BCF	PORTA,6
	BCF	PORTA,7
	RETURN

;******************************************************************************************
;   Function Name : WAT1
;   Title         : タイマー関数(7 Segment表示機の桁間WAIT)
;   Input         : 
;   Output        : 
;******************************************************************************************
WAT1
	MOVLW	H'7F'
	MOVWF	LPWAT1
	BSF	PORTA,1
WAT1A
	DECFSZ	LPWAT1,F
	GOTO	WAT1A
;
	BCF	PORTA,1
	MOVLW	H'7F'
	MOVWF	LPWAT1
WAT1B
	DECFSZ	LPWAT1,F
	GOTO	WAT1B

	RETURN

	END
