#INCLUDE <P16F819.INC>
	__CONFIG 0x3F10
;
CBLOCK	0x20
COUNT1
COUNT2
COUNT3
CNT1
CNT2
CNT3
CNT4
CNT5
CHAR
TEMP
CHECK
E_ADRS
E_DATA
ENDC
;
#DEFINE	RS	PORTA,1	;Register Select
#DEFINE	RW	PORTA,2	;Read/Write
#DEFINE	E	PORTA,3	;Enable
;
	ORG	0x2100
	DE	"カキコミチェック",0
	ORG	0x2150
	DE	"I AM 7700.",0
	ORG	0
	GOTO	BOOT

BOOT	
	BSF	STATUS,RP0
	;
	;クロック設定
	MOVLW	0x70
	MOVWF	OSCCON		;8MHz
	;
	;ポート設定
	MOVLW	0x07		;全て入力
	MOVWF	ADCON1

	CLRF	TRISA		;未使用ピンは出力
	CLRF	TRISB		;PORTB全て出力
	BCF	STATUS,RP0

;LCD初期化
LCDINI
	MOVLW	0x64		;1.5ms待つ
	CALL	TIM50
	;
	MOVLW	0x30		;ファンクションセット
	MOVWF	PORTB
	BCF	RS
	BCF	RW
	BSF	E		;Eトグル
	BCF	E
	;
	MOVLW	0x5A		;5ms待つ
	CALL	TIM50
	;
	MOVLW	0x30		;ファンクションセット
	MOVWF	PORTB
	BSF	E		;Eトグル
	BCF	E
	;
	MOVLW	0x02		;100μs待つ
	CALL	TIM50
	
	MOVLW	0x30		;ファンクションセット
	MOVWF	PORTB
	BSF	E		;Eトグル
	BCF	E
	;
	MOVLW	0x02
	CALL	TIM50		;100usec Wait
	
	;------------------------------------

	MOVLW	0x20	 	;4bit通信に
	MOVWF	PORTB
	BSF	E		;Eトグル
	BCF	E
	;
	MOVLW	0x02
	CALL	TIM50		;100usec Wait
	;
	MOVLW	0x28		;ファンクションセット
				;4bit通信 25*7dot
	CALL	LCDCMD
	MOVLW	0x0C		;表示コントロール
				;表示ON カーソルOFF 点滅OFF
	CALL	LCDCMD
	MOVLW	0x01		;表示クリア
	CALL	LCDCMD
	MOVLW	0x06		;エントリーモードセット
				;カーソルインクリメント 表示シフトON
	CALL	LCDCMD

;***********************
;メインルーチン
;***********************
MAIN
	CALL	LCDCLR		;表示クリア
	;
	
	CLRF	E_ADRS
	CALL	MESS
	;
	MOVLW	0x15
	CALL	TIM10m
	CALL	LCD2L		;2行目に
	;
	CLRF	CHECK
	MOVLW	0x50
	MOVWF	E_ADRS
	CALL	TBL
	CLRF	E_DATA
	CALL	EEPROM_WRITE
	MOVLW	0x50
	MOVWF	E_ADRS
	;
	CALL	MESS
	;
	MOVLW	0xC8
	CALL	TIM10m		;Wait 2sec
	;
	GOTO	MAIN		;ループする


;**************************************************
;サブルーチン
;***********************
MESS	CALL	EEPROM_READ
	ADDLW	0
	BTFSC	STATUS,Z
	RETURN
	;
	CALL	LCDCHR
	INCF	E_ADRS,F
	GOTO	MESS
;
TBL	MOVF	CHECK,W
	CALL	HELLO
	ADDLW	0
	BTFSC	STATUS,Z
	RETURN
	;
	MOVWF	E_DATA
	CALL	EEPROM_WRITE
	INCF	E_ADRS,F
	INCF	CHECK,F
	GOTO	TBL

HELLO	ADDWF	PCL,F
	DT	"Hello",0

LCD2L				;2行目にカーソル移動
	MOVLW	0xC0		;2行目はアドレス40H(100000b)から始まるらしい
	CALL	LCDCMD
	RETURN

LCDCLR				;LCD画面クリア&ホームポジションに
	MOVLW	0x01
	CALL	LCDCMD
	RETURN

;----------------------------------
;LCD文字書き込み
LCDCHR
	MOVWF	CHAR
	CALL	LCDBUSYCK	;BUSYチェック
	MOVF	CHAR,W
	ANDLW	b'11110000'
	MOVWF	PORTB
	BCF	RW		;R/WWrite	BSF	RS		;RSData	BSF	E		;Eをトグル
	BCF	E
	
	SWAPF	CHAR,W
	ANDLW	b'11110000'
	MOVWF	PORTB
	BSF	E		;Eをトグル
	BCF	E
	RETURN
;----------------------------------
;LCD制御コード書き込み
LCDCMD                          
	MOVWF	CHAR
	CALL	LCDBUSYCK		;BUSYチェック
	MOVF	CHAR,W
	ANDLW	b'11110000'
	MOVWF	PORTB
	BCF	RW		;R/WW
	BCF	RS		;RSInstruction	BSF	E		;Eをトグル
	BCF	E
	
	SWAPF	CHAR,W
	ANDLW	b'11110000'
	MOVWF	PORTB
	BSF	E		;Eをトグル
	BCF	E
	RETURN
;----------------------------------
;LCD BUSYチェック
LCDBUSYCK
	BSF	STATUS,RP0	;バンク1へ切替
	MOVLW	b'11111111'	;ポートBを入力モードに
	MOVWF	TRISB
	BCF	STATUS,RP0	;バンク0に戻す
	BCF	RS
	BSF	RW		;読み込みモードに
	BSF	E		;Eをトグル
	BCF	E
	MOVF	PORTB,W
        
	ANDLW	b'11110000'
        MOVWF	TEMP
	BSF	E		;Eをトグル
	BCF	E

	SWAPF	PORTB,W
	
	ANDLW	b'00001111'
	IORWF	TEMP,F
	BTFSC	TEMP,7		;BUSYフラグチェック
	GOTO	LCDBUSYCK
	BCF	RW		;書き込みモードに戻す

	BSF	STATUS,RP0	;バンク1へ切替
	MOVLW	b'00000000'	;ポートB出力モードに
	MOVWF	TRISB
	BCF	STATUS,RP0	;バンク0に戻す
	RETURN
;
;-------EEPROM READ--------------
;
EEPROM_READ
	MOVF	E_ADRS,W
	;
	BSF	STATUS,RP1 	;BANK2
	BCF	STATUS,RP0
	;
	MOVWF	EEADR 		; Data Memory Address
	; to read
	;
	BSF	STATUS,RP1
	BSF	STATUS,RP0 	;BANK3
	;
	BCF 	EECON1,EEPGD 	; Point to Data memory
	BSF	EECON1, RD	; EE Read
	;
	BSF	STATUS,RP1
	BCF	STATUS,RP0	; BANK2
	;
	MOVF	EEDATA,W	; W = EEDATA
	;
	BCF	STATUS,RP1
	BCF	STATUS,RP0	
	RETURN
;
EEPROM_WRITE
	MOVF	E_ADRS,W	;データエリアのアドレス指定
	;
	BCF	STATUS,RP0	;BANK2
	BSF	STATUS,RP1
	MOVWF	EEADR		;Address set 
	;
	BCF	STATUS,RP1	;BANK0
	MOVF	E_DATA,W	;書き込むデータセット
	;
	BSF	STATUS,RP1	;BANK2
	MOVWF	EEDATA		;Data set 
	;
	BSF	STATUS,RP0	;BANK3
	BSF	EECON1,WREN	;Set WR Enable 
	MOVLW	55H		;Write Sequence 
	MOVWF	EECON2		;Start write 
	MOVLW	0AAH 
	MOVWF	EECON2 
	BSF	EECON1,WR	;Go write 
WR_LP				;書き込み確認待ちループ
	BTFSC	EECON1,WR	;Check Write end 
	GOTO	WR_LP
	BCF	STATUS,RP0	;BANK0
	BCF	STATUS,RP1
	RETURN
;
;------ 10mSタイマー ------------
;
TIM10m	MOVWF  COUNT1
T1	MOVLW  0xC8         ;W <-  200
	CALL   TIM50
	DECFSZ COUNT1,F
	GOTO   T1
	RETURN
;
;------ 50μSタイマー ----------
;
TIM50	MOVWF  COUNT2
T2	MOVLW  0x20
	MOVWF  COUNT3
T3	DECFSZ COUNT3,F
	GOTO   T3
	DECFSZ COUNT2,F
	GOTO   T2
	RETURN
	;
	END
SEO対策 ショッピングカート レンタルサーバー /テキスト広告 アクセス解析 無料ホームページ ライブチャット ブログ