PIC 24:EEPROM の書き込みと読み出し


ここの所EEPROMなどの実験をして来ましたその全体のプログラムです。

 実験は細切れで発表して来ましたが、ここにパソコン内のプログラムを出しておきます。

1.文字の書き込み、これはロータリエンコーダで文字を選択してSWを押すと画面に出て確定するもの、同時にEEPROMに書き込まれる。
2.8文字しか画面に出ない(手持ちのLCDの関係)。
3.電源を入れると、書き込んだ文字がLCDのアドレス0xC0の所に出ます。
4.途中、0xffとすると読み出しは中止して、画面はそこまでしか出ません。
5.始めにそれを書き込んで中止すると、元々プログラム内にあるこの場合[MY CALL]が画面に出ます。

 あまり参考にはならないかも知れませんが一応公開しておきます。PIC-15/17/18/21/22/23までのプログラムで最終実験のプログラムです。
 ここの説明は各項目の所を見て下さい。写真はPIC 17と同じで、タクトSWを一つ付けているだけです。部品変更無しなので続けて実験をしていました。

2007/MAY/5

;-------------------------------------------------------
; LCD Display  A/D 2inputs
; 4MHz
; 2007/3/9	4/7	4/22		By M.Kikuchi
;-------------------------------------------------------
	list		P=PIC16F819
	include	"P16F819.inc"	
	__CONFIG	0x3f42
	ERRORLEVEL	-302
;-------------------------------------------------------
TEMP	EQU	20H	;tempolary work
LCD_D	EQU	22H	;LCD
CNT1	EQU	23H	;WAIT LOOP
CNT2	EQU	24H	;
CNT3	EQU	25H	;
WORK1	EQU	26H	;
EE_RST	EQU	27H	;
EE_REND	EQU	28H	;
LCD_ADR	EQU	30H	;1
FLAG	EQU	31H	;0=right 1=left for Rotary encoder
K_FLAG	EQU	32H	;For Key Control
TEMP2	EQU	71H	;tempolary

LCD_RS	set	2	;LCD Control RB2 PORTB 4-7=LCD
LCD_E	set	3	;LCD Control RB3
RE_S0	set	0	;RB0 Rotary encoder input
RE_S1	set	1	;RB1 Rotary encoder input
;-------------------------------------------------------
	ORG	0

BEGIN
	CALL	PORT_INI	;PORT Start
	CALL	LCD_INI		;LCD	(Low cost type)
	call	EE_RB		;EEPROM check
	movlw	80H		;
	subwf	EE_RST,W	;write ?
	btfsc	STATUS,Z
	CALL	MY_CALL		;LCD MY call
;mode of Datainput
	movlw	0x0e		;Cusor-brink mode
	CALL	LCD_CMD		;
	movlw	0x80		;LCD-Adrress
	movwf	LCD_ADR		;
	CALL	LCD_CMD		;
	clrf	K_FLAG

;-------------------------------------------------------
MAIN_0
	movlw	'0'		;input start DATA
	movwf	TEMP2		;
	CALL	LCD_DATA	;
	movf	LCD_ADR,W	;Address back
	CALL	LCD_CMD		;
MAIN
	clrf	FLAG
	call	RE_CHECK	;Rotary encoder
	movf	FLAG,F		;flag check
	btfsc	STATUS,Z	;activ on RE ?
	goto	M_KEY		;not to again
	btfss	FLAG,0		;
	goto	MAIN_3
	decf	TEMP2,W		;be for character
	sublw	' '
	btfsc	STATUS,C
	movlw	0xff
	btfss	STATUS,C
	decf	TEMP2,W
	movwf	TEMP2
MAIN_2
	movf	TEMP2,W
	CALL	LCD_DATA	;LCD_SET
	movf	LCD_ADR,W	;Address back
	CALL	LCD_CMD		;
	goto	M_KEY
MAIN_3
	incfsz	TEMP2,F		;next character
	goto	MAIN_2
	movlw	' '
	movwf	TEMP2
	goto	MAIN_2

;---------------------------------------------------
M_KEY
	call	KEY_SW		;check SW1
	btfss	K_FLAG,0	;bit0=SW1
	goto	MAIN		;not FLAG
; EEPROM Write
	movf	LCD_ADR,W	;EEPROM address
	call	EE_WR		;Write
	call	TIME05S		;
	bcf	K_FLAG,0	;FLAG clr
	incf	LCD_ADR,F
	movf	LCD_ADR,W	;Address
	CALL	LCD_CMD	
M_KEY2
	goto	MAIN_0
;-----------------------------------------------------------
;W > EEADR + TEMP2(EEDATA) + EE_WR
;2004/4/20
EE_WR
	banksel	EEADR		;bank 2
	movwf	EEADR
	movf	TEMP2,W
	movwf	EEDATA
	banksel	EECON1		;bank 3
	bcf	EECON1,EEPGD	;EEPROM
	bsf	EECON1,WREN	;write step 1
	movlw	0x55
	movwf	EECON2		;step 2
	movlw	0xAA
	movwf	EECON2		;step 3
	bsf	EECON1,WR	;start	step 4
	bcf	EECON1,WREN	;
EE_WRL
	btfsc	EECON1,WR	;WR clr?	step 5
	goto	$-1		;no to loop
	banksel	TEMP		;bank 0
	return
;-----------------------------------------------------------
;2007/4/23	EEROM READ and to LCD
;if data='ff'to end :end address to end
;if EE_RST=0x80 :not write
EE_RB
	movlw	0xc0		;LCD address
	call	LCD_CMD		;command
	movlw	0x80		;start
	movwf	EE_RST		;register	
	movlw	0x88		;end
	movwf	EE_REND		;register
EE_RM
	movf	EE_RST,W	;EE address set
	call	EE_READ		;read
	movwf	TEMP		;keep
	sublw	0xff		;no data
	btfsc	STATUS,Z	;=?
	goto	EE_EX		;yes to
	movf	TEMP,W		;retrun
	call	LCD_DATA	;display
	incf	EE_RST,F	;+1
	movf	EE_RST,W	;to W
	subwf	EE_REND,W	;end of datas
	btfss	STATUS,Z	;=
	goto	EE_RM		;again
EE_EX
		return
;-----------------------------------------------------------
EE_READ
	banksel	EEADR		;bank 2
	movwf	EEADR		;set
	banksel	EECON1		;bank 3
	bcf	EECON1,EEPGD	;EEPROM
	bsf	EECON1,RD	;read
	banksel	EEDATA		;bank 2
	movf	EEDATA,W	;data read
	banksel	TEMP		;bank 0
	return
;-----------------------------------------------------------
MY_CALL
	movlw	0xC1		;LCD Positin
	CALL	LCD_CMD
	movlw	'J'		;LCD TEST
	CALL	LCD_DATA
	movlw	'A'		;LCD TEST
	CALL	LCD_DATA
	movlw	'1'		;LCD TEST
	CALL	LCD_DATA
	movlw	'H'		;LCD TEST
	CALL	LCD_DATA
	movlw	'W'		;LCD TEST
	CALL	LCD_DATA
	movlw	'O'		;LCD TEST
	CALL	LCD_DATA
	call	TIME05S		;WAIT
	call	TIME05S		;WAIT
	RETURN
;-------------------------------------------------------
KEY_SW
 	BSF	STATUS,RP0	;Bank1
	bsf	TRISB,2		;RB2	input(1) 
 	BCF	STATUS,RP0	;Bank0
	call	TIME07M
	btfss	PORTB,2		;KEY1 check
	bsf	K_FLAG,0	;KEY data(bit0)
;
	BSF	STATUS,RP0	;Bank1
	bcf	TRISB,2		;RB2	output 
 	BCF	STATUS,RP0	;Bank0
	return
;-------------------------------------------------------
RE_CHECK
	clrf	FLAG		;set
	btfsc	PORTB,RE_S0
	return			;exit
	call	TIME07M
	btfsc	PORTB,RE_S0	;again
	return
RE_LOOP
	btfss	PORTB,RE_S0
	goto	RE_LOOP
	call	TIME07M
	btfss	PORTB,RE_S0	;again
	goto	RE_LOOP
	btfsc	PORTB,RE_S1	;
	goto	RE_DOWN
;-------------------------------------------------------
RE_UP
	bsf	FLAG,0		;right
	return
RE_DOWN
	bsf	FLAG,1		;left
	return

;-------------------------------------------------------
; LCD Data & LCD Command W=DATA
; LCD_E=LOW(unactive)	:LCD_D

LCD_DATA
	MOVWF	LCD_D
	ANDLW	0F0H		;mask
	MOVWF	PORTB
	BSF	PORTB,LCD_RS	;RS high
	goto	LCD_C2
;-------------------------------------------------------
LCD_CMD
	MOVWF	LCD_D
	ANDLW	0F0H		;hight 4bits
	MOVWF	PORTB		;
	BCF	PORTB,LCD_RS	;RS low
LCD_C2
	movf	PORTB,W		;RS keep
	andlw	4
	movwf	WORK1
	BSF	PORTB,LCD_E	;E high
	nop
	BCF	PORTB,LCD_E	;E low
	SWAPF	LCD_D,W		;low 4bits
	ANDLW	0F0H
	iorwf	WORK1,W
	MOVWF	PORTB		;
	BSF	PORTB,LCD_E	;E High
	nop
	BCF	PORTB,LCD_E	;E Low
	call	TIME40		;Wait 40uS over
	BCF	PORTB,LCD_RS	;for DATA
	return

;-------------------------------------------------------
; LCD start Programm
LCD_INI
	CALL	TIME5M		;5m sec*3
	CALL	TIME5M
	CALL	TIME5M
	MOVLW	030H		;Function set 8bits mode
	MOVWF	PORTB
	BCF	PORTB,LCD_RS	;RS
	BSF	PORTB,LCD_E	;E high
	nop
	BCF	PORTB,LCD_E	;E low
	CALL	TIME5M
	MOVLW	020H		;Function set 4bits mode
	MOVWF	PORTB
	BCF	PORTB,LCD_RS	;RS
	BSF	PORTB,LCD_E
	nop
	BCF	PORTB,LCD_E
	CALL	TIME100		;100usec
;from 4bit mode
	MOVLW	28H		;2 Lines
	CALL	LCD_CMD
	MOVLW	0CH		;Display on D=1 Cusor=0 Blink=0
	CALL	LCD_CMD
	MOVLW	06H		;Entry I/D(Increment)=1 S=0
	CALL	LCD_CMD
LCD_CLR				; LCD all clear
	MOVLW	01H
	CALL	LCD_CMD
	call	TIME1M6		;over 1.64mS
	RETURN

; PORT start Programm
;-------------------------------------------------------
PORT_INI
	BANKSEL	ADCON1
	MOVLW	0x2B		;00101011
	MOVWF	TRISA		;PORTA	input(1) out(0)
	MOVLW	0x03		;RB0
	MOVWF	TRISB		;PORTB
	movlw	B'00000011'
	movwf	ADCON1		;
;	:011x=Configure all pins as digital inputs
	bcf	OPTION_REG,7	;PULL UP
	BANKSEL	PORTB
	CLRF	PORTB
	RETURN      

;-------------------------------------------------------
; WAIT	4MHz	(1usec=1step)
;	TIME40  :40usec	TIME100 :100usec
;	TIME1M6  :1.6msec	TIME5M  :5msec
;-------------------------------------------------------

TIME100				;100usec
	MOVLW	D'31'		
	MOVWF	CNT1	
	GOTO	T_LP1		;(2+3*31-1+4)=98+call
;-------------------------------------------------------
TIME40				;40usec
	MOVLW	D'11' 		
	MOVWF	CNT1		
T_LP1
	DECFSZ	CNT1,F		;2+3*11-1=34		
	GOTO	T_LP1
	NOP	
	NOP	
	RETURN				;34+4 =38+call
;-------------------------------------------------------
TIME1M6
	MOVLW	11H		;17msec for LCD
	GOTO	TIME1M+1
TIME1M				;1msec(about)
	MOVLW	D'10'
	MOVWF	CNT2
T_LP2
	CALL	TIME100		;2+(100)*10-1=1001
	DECFSZ	CNT2,F
	GOTO	T_LP2
	RETURN			;2=1014+call
;-------------------------------------------------------
TIME5M				;5msec(about)
	MOVLW	D'50'
	GOTO	TIME1M+1
TIME07M
	MOVLW	D'7'		;0.7msec
	GOTO	TIME1M+1
;-------------------------------------------------------
TIME05S
	MOVLW	D'100' 		;5msec*100=0.5Sec
	MOVWF	CNT3		
T_LP3
	CALL	TIME5M
	DECFSZ	CNT3,F
	GOTO	T_LP3
	RETURN
;--------------------------------------------
		END

[もどる]もどる  [MAIN MENU

inserted by FC2 system