EEPROMのDATAを読み出してLCDに表示する。
実験の続きです、前回のロータリエンコーダで書き込んだDATAを読み出して、LCDに表示させてみました。
これは楽勝と思っていましたが、やってみるとくせ玉と言うか一癖あってつまづきました。でも何とか表示出来るようになりました。
読み出しだけなら簡単ですが、連続読み出しとLCD表示の処理で少しプログラムは増えています。今回もBank切替えの思い違いがあって一度では作動しませんでした(まあ!一度で動くのはめったにありませんけど)。
さすがEEPROMに書き込むと電源を切っても記憶に残っており、毎回電源を入れる度に表示されます。これも実用化出来使えそうです。プログラムは、毎回MY CALL(=アマチュア無線用)を表示してましたが、これを消して画面に毎回出ます。
画面に0xffとすればそれをチエックし「MY CALLが生きてそれが表示される」ようにしました。何か書き込めばそれがスタート画面で表示されます。
LCDのアドレスと同じ0x80の所(EEPROM)に書き込んでいました、これをLCDの0xC0アドレス画面に移動して表示しています。コンフイグのBOD(Broun Out Detect=ON)設定で不安なく快調に表示させています。16F84AはリセットICが必要ですから819は便利になりました。
2007/MAY/2
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;--------------------------------
追加したプログラムは左の通りです。
読み出しのメインのプログラムは「EE_READ」でBank切り替えをチョコチョコやっています。
始めの「EE_RB」は全体のコントロール用です、EEPROMに何か書き込まれていれば、それを読み出してLCDに表示しています。
もし書き込みが無ければ、予め用意してある「MY CALL」を表示するようにしたものです。
[16F819用のプログラムです、読み込みは16F648A/16F84Aにはそれぞれ少しづつ変更が必要です。]
;--------------------------------以下メインプログラムの中で!(EE_RBの下に入れても同じです。) call EE_RB ;EEPROM check movlw 80H ; subwf EE_RST,W ;write ? btfsc STATUS,Z CALL MY_CALL ;LCD MY call
もどる [MAIN MENU]