目次 > 9章PIC18編 > PIC18F2320 > A/D変換を使う> ソース

A/D変換を使う

更新日2009.8.1

以下のソースを取り込んで、アセンブル→PIC書き込み→実行して下さい。

; ========================== ここから ==============================
;	ファイル名	2320AD_LCD.asm
;	作成日		2008.6.28
;	作成者		mit.ueno
;	バージョン	1.0
;
;	PIC		PIC18F2320
;	クロック	INTIO2 8MHz
;	概要
;		PIC18F2320でA/D変換,結果をLCDに表示
;		内部クロック8MHz
;	使用ポート
;		RA0	AN0(VR)
;
;		RC4	LCD DB4
;		RC5	LCD DB5
;		RC6	LCD DB6
;		RC7	LCD DB7
;
;		RC0	LCD E	(6:Enable Signal)
;		RC1	LCD R/W	(5:Read/Write) not used
;		RC2	LCD RS	(4:Register Select)
;

; =====================================================
	LIST	P=18F2320
	INCLUDE	P18F2320.INC

	CONFIG	OSC = INTIO2

; =====================================================
	CBLOCK	0x000
	CNT50us
	CNT05ms
	CNT5ms
	CNT1ms
	CNT01s
	CNT1s
	char		;LCD表示文字
	ENDC


E	EQU	0x00		;LCD Enable
RW	EQU	0x01		;LCD Read/Write
RS	EQU	0x02		;LCD Register Select

; ======== EEPROM ===========
; 16進変換テーブル
	ORG	0xF00000
	DE	"0123456789ABCDEF"


; ======== リセットベクタ =============================
	ORG	0x0000

; ======== 初期処理 ===================================
	MOVLW	0x7F
	MOVWF	OSCCON		;8MHz,INTOSC

	MOVLW	0x0E
	MOVWF	ADCON1		;AD:AN0
	MOVLW	0xA5
	MOVWF	ADCON2		;右詰,ACQT:8TAD,ADCS:FOSC/16
	MOVLW	0x01
	MOVWF	ADCON0		;AD有効,CHAN:0

	CLRF	EECON1

	CLRF	TRISC		;PORTC:Output(LCD)
	CLRF	PORTC

	CALL	wait5ms
	CALL	wait5ms
	CALL	wait5ms
	CALL	LCD_init	;LCD初期化
	CALL	LCD_init_disp	;LCD初期表示

; ======== メイン処理 =================================
main
	BSF	ADCON0,GO	;A/D変換開始
	MOVLW	0C4h
	CALL	LCD_command
main_AD
	BTFSC	ADCON0,GO	;A/D変換完了?
	GOTO	main_AD		; No

	MOVF	ADRESH,W
	CALL	bin2hex
	CALL	LCD_write

	SWAPF	ADRESL,W
	CALL	bin2hex
	CALL	LCD_write

	MOVF	ADRESL,W
	CALL	bin2hex
	CALL	LCD_write

	GOTO	main


;================= LCD初期表示 ===========================
LCD_init_disp
	MOVLW	'P'
	CALL	LCD_write
	MOVLW	'I'
	CALL	LCD_write
	MOVLW	'C'
	CALL	LCD_write
	MOVLW	'1'
	CALL	LCD_write
	MOVLW	'8'
	CALL	LCD_write
	MOVLW	'F'
	CALL	LCD_write
	MOVLW	'2'
	CALL	LCD_write
	MOVLW	'3'
	CALL	LCD_write
	MOVLW	'2'
	CALL	LCD_write
	MOVLW	'0'
	CALL	LCD_write

	CALL	LCD_2line
	MOVLW	'A'
	CALL	LCD_write
	MOVLW	'/'
	CALL	LCD_write
	MOVLW	'D'
	CALL	LCD_write
	MOVLW	'='
	CALL	LCD_write
	RETURN

;================= LCD表示をクリアする ===================
LCD_clear
	MOVLW	01h
	CALL	LCD_command
	CALL	wait5ms		;LCDのBFをチェックしないので1.53mS以上待つ
	RETURN

;================= LCDのカーソル位置を先頭に戻す =========
LCD_home
	MOVLW	080h
	CALL	LCD_command
	RETURN

;================= LCDのカーソル位置を2行目の先頭に =====
LCD_2line
	MOVLW	0C0h
	CALL	LCD_command
	RETURN

;================= LCDのディスプレイをONにする =========
LCD_on
	MOVLW	0Ch
	CALL	LCD_command
	RETURN

;================= LCDのディスプレイとカーソルをONにする ==
LCD_on_cur
	MOVLW	0Eh
	CALL	LCD_command
	RETURN

;================= LCDのディスプレイをOFFにする =======
LCD_off
	MOVLW	08h
	CALL	LCD_command
	RETURN

;================= LCDにデータを送る =====================
LCD_write
	MOVWF	char

	BSF	PORTC,RS	;RS=1(Data)

	MOVLW	00Fh		;PORTCの上位4ビットを
	ANDWF	PORTC,F		; クリア
	MOVF	char,W		;上位
	ANDLW	0F0h		;4ビットを
	IORWF	PORTC,F		;PORTC(4-7)にセット(PORTC(0-3)はそのまま)
	BSF	PORTC,E		;LCDにデータ書き込み
	NOP
	BCF	PORTC,E

	MOVLW	00Fh		;PORTCの上位4ビットを
	ANDWF	PORTC,F		; クリア
	SWAPF	char,W		;下位
	ANDLW	0F0h		;4ビットを
	IORWF	PORTC,F		;PORTC(4-7)にセット(PORTC(0-3)はそのまま)
	BSF	PORTC,E		;LCDにデータ書き込み
	NOP
	BCF	PORTC,E

	CALL	wait50us	;LCDのBFをチェックしないので50uS待つ

	RETURN

;================= LCDにコマンドを送る ===================
LCD_command
	MOVWF	char

	BCF	PORTC,RS	;RS=0(Command)

	MOVLW	00Fh		;PORTCの上位4ビットを
	ANDWF	PORTC,F		; クリア
	MOVF	char,W		;上位
	ANDLW	0F0h		;4ビットを
	IORWF	PORTC,F		;PORTC(4-7)にセット(PORTC(0-3)はそのまま)
	BSF	PORTC,E		;LCDにデータ書き込み
	NOP
	BCF	PORTC,E

	MOVLW	00Fh		;PORTCの上位4ビットを
	ANDWF	PORTC,F		; クリア
	SWAPF	char,W		;下位
	ANDLW	0F0h		;4ビットを
	IORWF	PORTC,F		;PORTC(4-7)にセット(PORTC(0-3)はそのまま)
	BSF	PORTC,E		;LCDにデータ書き込み
	NOP
	BCF	PORTC,E

	CALL	wait50us	;LCDのBFをチェックしないので50uS待つ

	RETURN

;================= LCD初期化 ================================
LCD_init
	BCF	PORTC,RS	;RS=0
	BCF	PORTC,E		;E=0

	MOVLW	030h		;上位4ビットに'3'をセット
	MOVWF	PORTC
	BSF	PORTC,E		;ファンクションセット(1回目)
	NOP
	BCF	PORTC,E
	CALL	wait5ms		;5mS待つ

	BSF	PORTC,E		;ファンクションセット(2回目)
	NOP
	BCF	PORTC,E
	CALL	wait5ms		;5mS待つ

	BSF	PORTC,E		;ファンクションセット(3回目)
	NOP
	BCF	PORTC,E
	CALL	wait5ms		;5mS待つ

	MOVLW	020h		;4ビットモード
	MOVWF	PORTC		;に
	BSF	PORTC,E		;設定
	NOP
	BCF	PORTC,E
	CALL	wait1ms		;1mS待つ

	MOVLW	028h		;4ビットモード,2行表示,7ドット
	CALL	LCD_command
	CALL	LCD_off		;ディスプレイOFF
	CALL	LCD_clear	;LCDクリア
	MOVLW	06h		;
	CALL	LCD_command	;カーソルモードセット (Increment)
	CALL	LCD_on		;ディスプレイON,カーソルOFF

	RETURN


; ======== タイマルーチン =============================

; ======== 1sタイマ ========
wait1s
	MOVLW	d'10'
	MOVWF	CNT1s
wait1sL
	CALL	wait01s
	DECFSZ	CNT1s
	GOTO	wait1sL
	RETURN

; ======== 100msタイマ ========
wait01s
	MOVLW	d'200'
	MOVWF	CNT01s
wait01sL
	CALL	wait05ms
	DECFSZ	CNT01s
	GOTO	wait01sL
	RETURN

; ======== 5msタイマ ========
wait5ms
	MOVLW	d'10'
	MOVWF	CNT5ms
wait5msL
	CALL	wait05ms
	DECFSZ	CNT5ms
	GOTO	wait5msL
	RETURN

; ======== 1msタイマ ========
wait1ms
	MOVLW	d'2'
	MOVWF	CNT1ms
wait1msL
	CALL	wait05ms
	DECFSZ	CNT1ms
	GOTO	wait1msL
	RETURN

; ======== 0.5msタイマ ========
wait05ms
	MOVLW	d'249'
	MOVWF	CNT05ms
wait05msL
	NOP
	DECFSZ	CNT05ms,F
	GOTO	wait05msL
	RETURN

; ======== 50usタイマ ========
wait50us
	MOVLW	d'25'
	MOVWF	CNT50us
wait50usL
	NOP
	DECFSZ	CNT50us,F
	GOTO	wait50usL
	RETURN

; ========= Wregの下位4ビットを16進表現に変換 =======
bin2hex
	ANDLW	0Fh		; Wregの下位4ビットを取り出す
	MOVWF	EEADR
	BSF	EECON1,RD
	MOVF	EEDATA,W	; 16進表現文字をセット

	RETURN


	END
; ========================== ここまで ==============================