#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通信 2桁 5*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/WをWriteに
BSF RS ;RSをDataに
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/WをW
BCF RS ;RSをInstructionに
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