目次>5章 第2ステップ(色々な実験)>EEPROMを使う>ソース

EEPROMを使う(ソース)
更新日2007.11.4

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

; ========================== ここから ==============================
;	clock:20MHz
;	PIC16F84A

;	PORTA:	2  PBS1	押す毎にPORTBを+1
;		3  PBS2	EEPROMの0番地の内容を読み込みPORTBに出力
;		4  PBS3	PORTBの内容をEEPROMの0番地に書き込む
;	PORTB:	0-7 LED
;
;
	LIST	P=PIC16F84A	;使用するPICを16F84Aと定義する
	INCLUDE	P16F84A.INC	;設定ファイルp16f84a.incを読み込む
	__CONFIG	_HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF


	CBLOCK	0Ch
	tm02cnt		;0.2mSカウンタ
	tm25cnt		;25mSカウンタ
	onoff
	ENDC

	ORG	0
; ============================== 初期処理 =======================
init
	BSF	STATUS,RP0	;■バンク1に切替え
	CLRF	TRISB		; ファイルレジスタTRISBをクリア(0)⇒PORTBは出力ビット
	MOVLW	0FFh		;
	MOVWF	TRISA		; RA0-4は入力
	BCF	STATUS,RP0	;■バンク0に切替え

	CLRF	PORTA		; PORTAをクリア(0)
	CLRF	PORTB		; PORTBをクリア(0)
	CLRF	onoff

; ============================== メイン =========================
main
	BTFSS	PORTA,2		;PBS1 on? (L)
	CALL	pbs1
	BTFSS	PORTA,3		;PBS2 on? (L)
	CALL	pbs2
	BTFSS	PORTA,4		;PBS3 on? (L)
	CALL	pbs3
	BTFSC	PORTA,2		;PBS1 off? (H)
	CALL	pbs1F
	BTFSC	PORTA,3		;PBS2 off? (H)
	CALL	pbs2F
	BTFSC	PORTA,4		;PBS3 off? (H)
	CALL	pbs3F
	GOTO	main

; ============================== PBS#1 on ========================
pbs1
	BTFSC	onoff,1		;押された状態が続いても何もしない
	GOTO	pbs19

	CALL	tim25		;25mS wait
	BTFSC	PORTA,2		;PBS1 on? (L)
	GOTO	pbs19		; no

	BSF	onoff,1		;ON確定
	INCF	PORTB,F		;PORTBに+1する

pbs19
	RETURN

; ============================== PBS#2 on ========================
pbs2
	BTFSC	onoff,2		;押された状態が続いても何もしない
	GOTO	pbs29

	CALL	tim25		;25mS wait
	BTFSC	PORTA,3		;PBS2 on? (L)
	GOTO	pbs29		; no

	BSF	onoff,2		;ON確定

	MOVLW	00h		;データエリアのアドレス指定
	MOVWF	EEADR		;アドレスをEEADRへセット
	BSF	STATUS,RP0	;■バンク1に切替え
	BSF	EECON1,RD	;読み出し開始
	BCF	STATUS,RP0	;■バンク0に切替え
	MOVF	EEDATA,W	;Wレジスタにデータ取り出し
	MOVWF	PORTB		;EEPROMの先頭の内容をPORTBに表示

pbs29
	RETURN

; ============================== PBS#3 on ========================
pbs3
	BTFSC	onoff,3		;押された状態が続いても何もしない
	GOTO	pbs39

	CALL	tim25		;25mS wait
	BTFSC	PORTA,4		;PBS3 on? (L)
	GOTO	pbs39		; no

	BSF	onoff,3		;ON確定

	MOVLW	00h		;データエリアのアドレス指定
	MOVWF	EEADR		;アドレスをEEADRへセット
	MOVF	PORTB,W		;PORTBの内容を
	MOVWF	EEDATA		; EEDATAにセット
	BSF	STATUS,RP0	;■バンク1に切替え
	BSF	EECON1,WREN	;EEPROM書き込み許可
	MOVLW	55H		;
	MOVWF	EECON2		;
	MOVLW	0AAH
	MOVWF	EECON2
	BSF	EECON1,WR	;EEPROM書き込み開始
pbs3_LP
	BTFSC	EECON1,WR	;EEPROM書き込み完了?
	GOTO	pbs3_LP
	BCF	STATUS,RP0	;■バンク0に切替え

pbs39
	RETURN

; ============================== PBS#1 off ========================
pbs1F
	BCF	onoff,1
	RETURN

; ============================== PBS#2 off ========================
pbs2F
	BCF	onoff,2
	RETURN

; ============================== PBS#3 off ========================
pbs3F
	BCF	onoff,3
	RETURN

; ============================== 25msタイマ =====================
tim25
	MOVLW	07ch
	MOVWF	tm25cnt
tim25lp	CALL	tim02
	DECFSZ	tm25cnt,F
	GOTO	tim25lp
	RETURN

; ============================== 0.2msタイマ =====================
tim02
	MOVLW	0f9h
	MOVWF	tm02cnt
tim02lp	NOP
	DECFSZ	tm02cnt,F
	GOTO	tim02lp
	RETURN

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