;***** LCD.sub ************************************************************ ; ; LCD 制御サブルーチン ; ; (Lcd_Cmd, Lcd_Data, Lcd_Out, Lcd_Busy, Lcd_Init, Lcd_Data_Rd, Lcd_Disp) ; ; Copyright (C) 2011 by M.Yamamoto. All rights reserved. ; ; ( coding: Ver. 0.00 2011/11/13 by M.Yamamoto ) ; coding: Ver. 1.00 2011/11/13 サブルーチンファイルとして独立 ; update: Ver. x.xx ; bugfix: Ver. x.xx ; ;******************************************************* PicAsm 0232 ****** ;<定数の定義例> ;LCD equ PORTB ;LCD 制御用ポート ;TRIS_LCD equ TRISB ;LCD 制御用ポートの入出力切り替え ;_E equ 0 ;LCD E: 動作起動信号 ;_RW equ 1 ;LCD R/W: 読み出し/書き込み選択信号 ;_RS equ 2 ;LCD RS: レジスタ選択信号 ;_BF equ 7 ;LCD ビジーフラグ ;<使用レジスタ> ;lcdtmp ;LCD への入出力データの一時保存 ;addr_high ;読み出すデータの high アドレス ;addr_low ;読み出すデータの low アドレス ;========================================================================== ; LCD へコマンドを出力 ;========================================================================== ;入力: W reg: コマンド Lcd_Cmd bcf LCD,_RS ;RS = 0 (コマンドモードに設定) goto lcd01 ;========================================================================== ; LCD へデータを出力 ;========================================================================== ;入力: W reg: データ Lcd_Data bsf LCD,_RS ;RS = 1 (データモードに設定) nop lcd01 bcf LCD,_RW ;R/W = 0 (書き込みモードに設定) call Lcd_Out ;上位4ビットを転送 swapf lcdtmp,W ;一時保存データの上位下位入れ替え call Lcd_Out ;下位4ビットを転送 call Lcd_Busy ;LCD ビジーチェック return ;========================================================================== ; 4ビット一回の送出 ;========================================================================== ;使用レジスタ: lcdtmp Lcd_Out movwf lcdtmp ;コマンド/データを一時保存 movlw h'0f' ;下位4ビットの andwf LCD,F ;コントロールポートの内容を残し movlw h'f0' ;上位4ビットデータ andwf lcdtmp,W ;を取り出して iorwf LCD,F ;コントロールとOR bsf LCD,_E ;E = 1 (動作起動信号の設定:Hでストローブ) nop ;E のパルス幅を220ns以上確保するため bcf LCD,_E ;E = 0 (動作起動信号の設定:Lに戻す) return ;========================================================================== ; LCD ビジーチェック ;========================================================================== ;使用レジスタ: lcdtmp Lcd_Busy bsf STATUS,RP0 ;バンク 1 movlw b'11110000' ;上位4ビットを入力ポート iorwf TRIS_LCD,F bcf STATUS,RP0 ;バンク 0 bcf LCD,_RS ;RS = 0 (コマンドモードに設定) nop bsf LCD,_RW ;R/W = 1 (読み込みモードに設定) lcd_busy01 bsf LCD,_E ;E = 1 (動作起動信号の設定:Hでストローブ) movf LCD,W ;DDRAM からのデータ(上位4ビット)の読み出し bcf LCD,_E ;E = 0 (動作起動信号の設定:Lに戻す) ; andlw h'f0' ;上位4ビット movwf lcdtmp ;読み込みデータを一時保存 ; swapf lcdtmp,F ;下位4ビットに移動 bsf LCD,_E ;E = 1 (動作起動信号の設定:Hでストローブ) movf LCD,W ;DDRAM からのデータ(下位4ビット)の読み出し bcf LCD,_E ;E = 0 (動作起動信号の設定:Lに戻す) ; andlw h'f0' ;上位4ビット ; iorwf lcdtmp,F ;上位4ビット + 下位4ビット ; swapf lcdtmp,F ;上位4ビットと下位4ビットを入れ替え btfsc lcdtmp,_BF ;ビジーフラグのチェック (読み込みデータの7ビット目) goto lcd_busy01 ;_BF=0 になるまでループ bcf LCD,_RW ;R/W = 0 (書き込みモードに設定) bsf STATUS,RP0 ;バンク 1 movlw b'11110000' ;上位4ビットを出力ポートに戻す xorwf TRIS_LCD,F bcf STATUS,RP0 ;バンク 0 return ;========================================================================== ; LCD 初期設定 ;========================================================================== ;使用外部ルーチン: wait_xxms, wait_100us Lcd_Init bcf LCD,_RW ;R/W = 0 (書き込みモードに設定) nop bcf LCD,_RS ;RS = 0 (コマンドモードに設定) nop bcf LCD,_E ;E = 0 (動作起動信号の設定) movlw 15 call wait_xxms ;wait 15ms (15ms以上を確保) movlw b'00110000' ;ファンクションセット(8bitモードに設定) call Lcd_Out ;上位4ビットを転送 movlw 5 call wait_xxms ;wait 5ms (4.1ms以上を確保) movlw b'00110000' ;ファンクションセット(8bitモードに設定) call Lcd_Out ;上位4ビットを転送 call wait_100us movlw b'00110000' ;ファンクションセット(8bitモードに設定) call Lcd_Out ;上位4ビットを転送 call wait_100us movlw b'00100000' ;ファンクションセット(4bitモードに設定) call Lcd_Out ;上位4ビットを転送 call wait_100us ;ここから 4bitモード movlw b'00101000' ;ファンクションセット call Lcd_Cmd ;DL=0: 4bit, N=1: 2行, F=0: 5x7ドット movlw b'00001000' ;表示オン/オフコントロール call Lcd_Cmd ;D=0: 表示オフ, C=0: カーソル非表示, B=0: 非ブリンク movlw b'00000001' ;表示クリア call Lcd_Cmd ; movlw b'00000110' ;エントリーモードセット call Lcd_Cmd ;I/D=1: アドレスを+1しカーソルは右移動,S=0: 非シフト return ;========================================================================== ; LCD からデータを入力 ;========================================================================== ;使用外部ルーチン: wait_100us ;使用レジスタ: lcdtmp ;<使用例> movlw h'80' ;読み出す DDRAM のアドレスをセット ; call Lcd_Cmd ;LCD へコマンドを出力 ; : ; call Lcd_Data_Rd ;LCD からデータを入力 Lcd_Data_Rd bsf STATUS,RP0 ;バンク 1 movlw b'11110000' ;上位4ビットを入力ポート iorwf TRIS_LCD,F bcf STATUS,RP0 ;バンク 0 bsf LCD,_RS ;RS = 1 (データモードに設定) nop bsf LCD,_RW ;R/W = 1 (読み込みモードに設定) bsf LCD,_E ;E = 1 (動作起動信号の設定:Hでストローブ) movf LCD,W ;DDRAM からのデータ(上位4ビット)の読み出し bcf LCD,_E ;E = 0 (動作起動信号の設定:Lに戻す) andlw h'f0' ;上位4ビット movwf lcdtmp ;読み込みデータを一時保存 swapf lcdtmp,F ;下位4ビットに移動 bsf LCD,_E ;E = 1 (動作起動信号の設定:Hでストローブ) movf LCD,W ;DDRAM からのデータ(下位4ビット)の読み出し bcf LCD,_E ;E = 0 (動作起動信号の設定:Lに戻す) andlw h'f0' ;上位4ビット iorwf lcdtmp,F ;上位4ビット + 下位4ビット swapf lcdtmp,F ;上位4ビットと下位4ビットを入れ替え bcf LCD,_RW ;R/W = 0 (書き込みモードに設定) bsf STATUS,RP0 ;バンク 1 movlw b'11110000' ;上位4ビットを出力ポートに戻す xorwf TRIS_LCD,F bcf STATUS,RP0 ;バンク 0 call wait_100us movf lcdtmp,W ;読み出しデータを W に移動 return ;========================================================================== ; LCD 1行メッセージ表示 ;========================================================================== ;使用レジスタ: addr_low, addr_high ;<使用例> movlw h'80' ;表示位置の DDRAM のアドレスをセット ; call Lcd_Cmd ;LCD へコマンドを出力 ; movlw high st_msg ;メッセージデータの先頭アドレスの high アドレス ; movwf addr_high ; ; movlw low st_msg ;メッセージデータの先頭アドレスの low アドレス ; movwf addr_low ; ; call Lcd_Disp ;メッセージデータ1行表示 ; : ;st_msg dt " StopW",0,"atch ",0 Lcd_Disp call tbl_read ;テーブルデータの読み出し bcf PCLATH,3 ;ページ 0 に戻す bcf PCLATH,4 incf addr_low,F ;読み出すデータの low アドレスの更新 btfsc STATUS,Z ;オーバーフローした場合は incf addr_high,F ;読み出すデータの high アドレスの更新 addlw 0 btfsc STATUS,Z ;h'00' か? return ;yes call Lcd_Data ;LCD へデータを1文字出力 goto Lcd_Disp ; テーブルデータの1文字読み出し tbl_read movf addr_high,W ;読み出すデータの high アドレス movwf PCLATH movf addr_low,W ;読み出すデータの low アドレス movwf PCL ;=============================================================== end ======