;********************************************************************
;                                  LCD表示器 DM12864A by PIC
;********************************************************************
;接続方法
;RST=VDD(68 SERIES INTERFACE)
;RA0=RS(LOW:command,HIGH:data)
;RA1=R/W(HIGH:Read,LOW:Write)
;RA2=E
;RA3=CS1
;RA4=CS2
;RB0=D0,RB1=D1,~~~,RB7=D7
;--------------------------------------------------------------------
LIST P=PIC16F84 
INCLUDE "P16f84.inc"    ;標準ヘッダ定義ファイル
;--------------------------------------------------------------------
TIMCNT EQU 0CH             ;タイマ用カウンタ
TIM5CNT EQU 0DH           ;タイマ用カウンタ
TIM1CNT EQU 0EH            ;タイマ用カウンタ
DAT EQU 0FH                     ;LCD表示データ格納

STUS EQU 10H                   ;LCDのステータス情報を格納
STORE EQU 11H                ;Wレジスタ情報を格納
LINECNT EQU 12H             ;カウンタ回数

YADCNT EQU 3FH             ;Yアドレスのカウント用

ORG 0                                   ;Reset Start

;--------------------------------------------------------------------
;                      メインルーチン
;--------------------------------------------------------------------
MAIN
   PIC_INITIALIZE                ;PICの初期化、ポート初期設定

   BSF STATUS,RP0           ;バンク1へ切替
   CLRF TRISA                    ;ポートAを出力モードに設定
   CLRF TRISB                      ;ポートBを出力モードに設定
   BCF STATUS,RP0           ;バンク0に戻す 
   MOVLW B'00000000'      ;PORTA初期設定
   MOVWF PORTA
   MOVLW B'00000000'      ;PORTB初期設定
   MOVWF PORTB
;LCDの初期化
   MOVLW B'11000000'    ;Display Start Line=0
   CALL CMD_IC1               ;IC1をDisplay Start Line=0に設定
   CALL CMD_IC2               ;IC2をDisplay Start Line=0に設定

   MOVLW B'00111111'    ;Display ON
   CALL CMD_IC1               ;IC1をDisplay ONに設定
   CALL CMD_IC2               ;IC2をDisplay ONに設定


   CALL CLEAR1                ;画面左側(IC1側)クリアー
   CALL CLEAR2                ;画面右側(IC2側)クリアー
   CALL EKIUE1                  ;画面左上の「液」の上半分
   CALL EKIST1                 ;画面左上の「液」の下半分
   CALL SHOUUE1            ;画面左上の「晶」の上半分
   CALL SHOUST1            ;画面左上の「晶」の下半分
   CALL EKIUE2                 ;画面中央の「液」の上半分
   CALL EKIST2                 ;画面中央の「液」の下半分
   CALL SHOUUE2             ;画面中央の「晶」の上半分 
   CALL SHOUST2            ;画面中央の「晶」の下半分
   CALL EKIUE3                  ;画面右下の「液」の上半分
   CALL EKIST3                 ;画面右下の「液」の下半分
   CALL SHOUUE3             ;画面右下の「晶」の上半分     
    CALL SHOUST3            ;画面右下の「晶」の下半分
LOOP
   NOP
   GOTO LOOP
;--------------------------------------------------------------------
;                                          サブルーチン
;--------------------------------------------------------------------
;Wレジスタの表示データー(8ドット分)をIC1又はIC2に書き込む
   WRITE_1                           ;IC1への書き込みコマンド
   MOVWF PORTB              ;Wレジスターの表示データーをPORTBへ出力 
   BSF PORTA,3                 ;IC1選択
   BCF PORTA,4
   BSF PORTA,0                 ;RS:HIGH
   BCF PORTA,1                 ;R/W:LOW
   BSF PORTA,2                 ;E:ACTIVE
   BCF PORTA,2                 ;E:NO ACTIVE
   BCF PORTA,3                 ;ICの非選択にする
   CALL BUSY1                  ;BUSYチェック
   RETURN

WRITE_2                               ;IC2への書き込みコマンド
   MOVWF PORTB              ;Wレジスターの表示データーをPORTBへ出力
   BSF PORTA,4                 ;IC2選択
   BCF PORTA,3
   BSF PORTA,0                 ;RS:HIGH
   BCF PORTA,1                 ;R/W:LOW
   BSF PORTA,2                 ;E:ACTIVE
   BCF PORTA,2                 ;E:NO ACTIVE
   BCF PORTA,4                 ;ICの非選択にする
   CALL BUSY2
   RETURN

CMD_IC1                              ;IC1へコマンド書き込み
   MOVWF PORTB              ;WレジスタのインストラクションコードをPORTBへ出力
   BSF PORTA,3                 ;IC1選択
   BCF PORTA,4 
   BCF PORTA,0                 ;RS:LOW
   BCF PORTA,1                 ;R/W:LOW
   BSF PORTA,2                 ;E:ACTIVE
   BCF PORTA,2                 ;E:NO ACIVE
   BCF PORTA,3                 ;ICの非選択にする
   CALL BUSY1                  ;BUSYチェック
   RETURN

CMD_IC2                              ;IC2へコマンド書き込み
   MOVWF PORTB              ;WレジスタのインストラクションコードをPORTBへ出力
   BSF PORTA,4                 ;IC2選択
   BCF PORTA,3
   BCF PORTA,0                 ;RS:LOW
   BCF PORTA,1                 ;R/W:LOW
   BSF PORTA,2                 ;E:ACTIVE
   BCF PORTA,2                 ;E:NO ACTIVE
   BCF PORTA,4                 ;ICの非選択にする
   CALL BUSY2                  ;BUSYチェック
   RETURN

;画面消去ルーチン
CLEAR1                                  ;左側(IC1側)
   MOVLW B'10111000'       ;Xアドレス0=PAGE0を指定
   CALL CMD_IC1
   CALL ERASE1
   MOVLW B'10111001'       ;Xアドレス1=PAGE1を指定
   CALL CMD_IC1
   CALL ERASE1
   MOVLW B'10111010'       ;Xアドレス2=PAGE2を指定
   CALL CMD_IC1
   CALL ERASE1
   MOVLW B'10111011'       ;Xアドレス3=PAGE3を指定
   CALL CMD_IC1
   CALL ERASE1
   MOVLW B'10111100'       ;Xアドレス4=PAGE4を指定
   CALL CMD_IC1
   CALL ERASE1
   MOVLW B'10111101'       ;Xアドレス5=PAGE5を指定
   CALL CMD_IC1
   CALL ERASE1
   MOVLW B'10111110'       ;Xアドレス6=PAGE6を指定
   CALL CMD_IC1
   CALL ERASE1
   MOVLW B'10111111'       ;Xアドレス7=PAGE7を指定
   CALL CMD_IC1
   CALL ERASE1
   RETURN

CLEAR2 ;右側(IC2側)
   MOVLW B'10111000'       ;Xアドレス0=PAGE0を指定
   CALL CMD_IC2
   CALL ERASE2
   MOVLW B'10111001'       ;Xアドレス1=PAGE1を指定
   CALL CMD_IC2
   CALL ERASE2
   MOVLW B'10111010'       ;Xアドレス2=PAGE2を指定
   CALL CMD_IC2
   CALL ERASE2
   MOVLW B'10111011'       ;Xアドレス3=PAGE3を指定
   CALL CMD_IC2
   CALL ERASE2
   MOVLW B'10111100'       ;Xアドレス4=PAGE4を指定
   CALL CMD_IC2
   CALL ERASE2
   MOVLW B'10111101'       ;Xアドレス5=PAGE5を指定
   CALL CMD_IC2
   CALL ERASE2
   MOVLW B'10111110'       ;Xアドレス6=PAGE6を指定
   CALL CMD_IC2
   CALL ERASE2
   MOVLW B'10111111'       ;Xアドレス7=PAGE7を指定
   CALL CMD_IC2
   CALL ERASE2
   RETURN

;画面消去ルーチン2
ERASE1                                  ;左側(IC1側)
   MOVLW B'00000000'       ;0を書き込み
   CALL WRITE_1
   DECFSZ YADCNT
   GOTO ERASE1
   RETURN 

ERASE2                                  ;右側(IC2側)
   MOVLW B'00000000'       ;0を書き込み
   CALL WRITE_2
   DECFSZ YADCNT
   GOTO ERASE2
   RETURN

; **********「液」書き込みルーチン**********
EKIUE1
   MOVLW B'10111000'        ;Xアドレス0=PAGE0を指定(文字の上半分)
   CALL CMD_IC1
   MOVLW B'01000000'        ;Yアドレス0(Yアドレスの書き込みスタート位置)を指定
   CALL CMD_IC1 
   MOVLW B'00100000'        ;「液」のデーター(上半分)
   CALL WRITE_1 
   MOVLW B'01000010'        ;「液」のデーター(上半分)
   CALL WRITE_1 
   MOVLW B'10000100'        ;「液」のデーター(上半分)
   CALL WRITE_1 
   MOVLW B'00001000'        ;「液」のデーター(上半分) 
   CALL WRITE_1 
   MOVLW B'00000000'        ;「液」のデーター(上半分)
   CALL WRITE_1 
   MOVLW B'00001000'        ;「液」のデーター(上半分)
   CALL WRITE_1 
   MOVLW B'10001000'        ;「液」のデーター(上半分)
   CALL WRITE_1 
   MOVLW B'01101000'        ;「液」のデーター(上半分)
   CALL WRITE_1
   MOVLW B'00011000'        ;「液」のデーター(上半分)
   CALL WRITE_1 
   MOVLW B'10001110'        ;「液」のデーター(上半分)
   CALL WRITE_1 
   MOVLW B'01101000'        ;「液」のデーター(上半分)
   CALL WRITE_1 
   MOVLW B'01001000'        ;「液」のデーター(上半分)
   CALL WRITE_1 
   MOVLW B'01001000'        ;「液」のデーター(上半分)
   CALL WRITE_1 
   MOVLW B'11001000'        ;「液」のデーター(上半分)
   CALL WRITE_1 
   MOVLW B'00001000'        ;「液」のデーター(上半分)
   CALL WRITE_1 
   MOVLW B'00000000'        ;「液」のデーター(上半分)
   CALL WRITE_1
   RETURN

EKIST1
   MOVLW B'10111001'        ;Xアドレス1=PAGE1を指定(文字の下半分)
   CALL CMD_IC1 
   MOVLW B'01000000'        ;Yアドレス0(Yアドレスの書き込みスタート位置)を指定
   CALL CMD_IC1 
   MOVLW B'11000000'        ;「液」のデーター(下半分)
   CALL WRITE_1
   MOVLW B'00110000'        ;「液」のデーター(下半分)
   CALL WRITE_1
   MOVLW B'00001100'        ;「液」のデーター(下半分)
   CALL WRITE_1 
   MOVLW B'00000000'        ;「液」のデーター(下半分)
   CALL WRITE_1
   MOVLW B'00000100'        ;「液」のデーター(下半分)    
   CALL WRITE_1
   MOVLW B'00000010'        ;「液」のデーター(下半分)
   CALL WRITE_1
   MOVLW B'11111111'        ;「液」のデーター(下半分)
   CALL WRITE_1 
   MOVLW B'00000100'        ;「液」のデーター(下半分)
   CALL WRITE_1 
   MOVLW B'10000010'        ;「液」のデーター(下半分)
   CALL WRITE_1
   MOVLW B'01000101'        ;「液」のデーター(下半分)
   CALL WRITE_1
   MOVLW B'00101001'        ;「液」のデーター(下半分)
   CALL WRITE_1 
   MOVLW B'00110010'        ;「液」のデーター(下半分)
   CALL WRITE_1 
   MOVLW B'01001100'        ;「液」のデーター(下半分)
   CALL WRITE_1
   MOVLW B'10000011'        ;「液」のデーター(下半分)
   CALL WRITE_1 
   MOVLW B'10000000'        ;「液」のデーター(下半分)
   CALL WRITE_1 
   MOVLW B'00000000'        ;「液」のデーター(下半分)
   CALL WRITE_1
   RETURN


; **********「晶」書き込みルーチン**********
SHOUUE1
   MOVLW B'10111000'        ;Xアドレス0=PAGE0を指定(文字の上半分)
   CALL CMD_IC1
   MOVLW B'01010000'        ;Yアドレス16(Yアドレスの書き込みスタート位置)を指定
   CALL CMD_IC1
   MOVLW B'00000000'        ;「晶」のデーター(上半分)
   CALL WRITE_1 
   MOVLW B'00000000'        ;「晶」のデーター(上半分)
   CALL WRITE_1 
   MOVLW B'00000000'        ;「晶」のデーター(上半分)
   CALL WRITE_1 
   MOVLW B'01111100'        ;「晶」のデーター(上半分)
   CALL WRITE_1
   MOVLW B'01010100'        ;「晶」のデーター(上半分)
   CALL WRITE_1 
   MOVLW B'01010100'        ;「晶」のデーター(上半分)
   CALL WRITE_1 
   MOVLW B'01010100'        ;「晶」のデーター(上半分)
   CALL WRITE_1 
   MOVLW B'01010100'        ;「晶」のデーター(上半分)
   CALL WRITE_1 
   MOVLW B'01010100'        ;「晶」のデーター(上半分)
   CALL WRITE_1 
   MOVLW B'01010100'        ;「晶」のデーター(上半分)
   CALL WRITE_1 
   MOVLW B'01111100'        ;「晶」のデーター(上半分)
   CALL WRITE_1 
   MOVLW B'00000000'        ;「晶」のデーター(上半分)
   CALL WRITE_1 
   MOVLW B'00000000'        ;「晶」のデーター(上半分)
   CALL WRITE_1 
   MOVLW B'00000000'        ;「晶」のデーター(上半分)
   CALL WRITE_1 
   MOVLW B'00000000'        ;「晶」のデーター(上半分)
   CALL WRITE_1
   MOVLW B'00000000'        ;「晶」のデーター(上半分)
   CALL WRITE_1 
   RETURN

SHOUST1
   MOVLW B'10111001'        ;Xアドレス1=PAGE1を指定(文字の下半分)
   CALL CMD_IC1
   MOVLW B'01010000'        ;Yアドレス16(Yアドレスの書き込みスタート位置)を指定
   CALL CMD_IC1
   MOVLW B'11111110'        ;「晶」のデーター(下半分)
   CALL WRITE_1 
   MOVLW B'10010010'        ;「晶」のデーター(下半分)
   CALL WRITE_1 
   MOVLW B'10010010'       ;「晶」のデーター(下半分)
   CALL WRITE_1 
   MOVLW B'10010010'       ;「晶」のデーター(下半分)
   CALL WRITE_1 
   MOVLW B'10010010'       ;「晶」のデーター(下半分)
   CALL WRITE_1 
   MOVLW B'11111110'       ;「晶」のデーター(下半分)
   CALL WRITE_1     
   MOVLW B'00000000'      ;「晶」のデーター(下半分)
   CALL WRITE_1 
   MOVLW B'00000000'      ;「晶」のデーター(下半分)
   CALL WRITE_1 
   MOVLW B'11111110'      ;「晶」のデーター(下半分)
   CALL WRITE_1 
   MOVLW B'10010010'      ;「晶」のデーター(下半分)
   CALL WRITE_1
   MOVLW B'10010010'      ;「晶」のデーター(下半分)
   CALL WRITE_1 
   MOVLW B'10010010'      ;「晶」のデーター(下半分)
   CALL WRITE_1 
   MOVLW B'10010010'      ;「晶」のデーター(下半分)
   CALL WRITE_1 
   MOVLW B'11111110'      ;「晶」のデーター(下半分)
   CALL WRITE_1 
   MOVLW B'00000000'      ;「晶」のデーター(下半分)
   CALL WRITE_1 
   MOVLW B'00000000'      ;「晶」のデーター(下半分)
   CALL WRITE_1
   RETURN

; **********「液」書き込みルーチン2**********
EKIUE2
   MOVLW B'10111011'        ;Xアドレス3=PAGE3を指定(文字の上半分)
   CALL CMD_IC1
   MOVLW B'01110000'        ;Yアドレス48(Yアドレスの書き込みスタート位置)を指定
   CALL CMD_IC1
   MOVLW B'00100000'        ;「液」のデーター(上半分)
   CALL WRITE_1 
   MOVLW B'01000010'        ;「液」のデーター(上半分)
   CALL WRITE_1
   MOVLW B'10000100'        ;「液」のデーター(上半分)
   CALL WRITE_1
   MOVLW B'00001000'        ;「液」のデーター(上半分) 
   CALL WRITE_1
   MOVLW B'00000000'        ;「液」のデーター(上半分)
   CALL WRITE_1
   MOVLW B'00001000'        ;「液」のデーター(上半分)
   CALL WRITE_1
   MOVLW B'10001000'        ;「液」のデーター(上半分)
   CALL WRITE_1
   MOVLW B'01101000'        ;「液」のデーター(上半分)
   CALL WRITE_1
   MOVLW B'00011000'        ;「液」のデーター(上半分)
   CALL WRITE_1
   MOVLW B'10001110'        ;「液」のデーター(上半分)
   CALL WRITE_1
   MOVLW B'01101000'        ;「液」のデーター(上半分)
   CALL WRITE_1
   MOVLW B'01001000'        ;「液」のデーター(上半分)
   CALL WRITE_1
   MOVLW B'01001000'        ;「液」のデーター(上半分)
   CALL WRITE_1
   MOVLW B'11001000'        ;「液」のデーター(上半分)
   CALL WRITE_1
   MOVLW B'00001000'        ;「液」のデーター(上半分)
   CALL WRITE_1
   MOVLW B'00000000'        ;「液」のデーター(上半分)
   CALL WRITE_1
   RETURN 

EKIST2
   MOVLW B'10111100'        ;Xアドレス4=PAGE4を指定(文字の下半分)
   CALL CMD_IC1
   MOVLW B'01110000'        ;Yアドレス48(Yアドレスの書き込みスタート位置)を指定
   CALL CMD_IC1 
   MOVLW B'11000000'        ;「液」のデーター(下半分)
   CALL WRITE_1
   MOVLW B'00110000'        ;「液」のデーター(下半分)
   CALL WRITE_1
   MOVLW B'00001100'        ;「液」のデーター(下半分)
   CALL WRITE_1
   MOVLW B'00000000'        ;「液」のデーター(下半分)
   CALL WRITE_1
   MOVLW B'00000100'        ;「液」のデーター(下半分)
   CALL WRITE_1
   MOVLW B'00000010'        ;「液」のデーター(下半分)
   CALL WRITE_1
   MOVLW B'11111111'        ;「液」のデーター(下半分)
   CALL WRITE_1
   MOVLW B'00000100'        ;「液」のデーター(下半分)
   CALL WRITE_1
   MOVLW B'10000010'        ;「液」のデーター(下半分)
   CALL WRITE_1
   MOVLW B'01000101'        ;「液」のデーター(下半分)
   CALL WRITE_1
   MOVLW B'00101001'        ;「液」のデーター(下半分)
   CALL WRITE_1
   MOVLW B'00110010'        ;「液」のデーター(下半分)
   CALL WRITE_1
   MOVLW B'01001100'        ;「液」のデーター(下半分)
   CALL WRITE_1
   MOVLW B'10000011'        ;「液」のデーター(下半分)
   CALL WRITE_1
   MOVLW B'10000000'        ;「液」のデーター(下半分)
   CALL WRITE_1
   MOVLW B'00000000'        ;「液」のデーター(下半分)
   CALL WRITE_1
   RETURN

; **********「晶」書き込みルーチン2**********
SHOUUE2
   MOVLW B'10111011'        ;Xアドレス3=PAGE3を指定(文字の上半分)
   CALL CMD_IC2
   MOVLW B'01000000'        ;Yアドレス0(Yアドレスの書き込みスタート位置)を指定
   CALL CMD_IC2 
   MOVLW B'00000000'        ;「晶」のデーター(上半分)
   CALL WRITE_2 
   MOVLW B'00000000'        ;「晶」のデーター(上半分)
   CALL WRITE_2 
   MOVLW B'00000000'        ;「晶」のデーター(上半分)
   CALL WRITE_2 
   MOVLW B'01111100'        ;「晶」のデーター(上半分)
   CALL WRITE_2
   MOVLW B'01010100'        ;「晶」のデーター(上半分)
   CALL WRITE_2 
   MOVLW B'01010100'        ;「晶」のデーター(上半分)
   CALL WRITE_2 
   MOVLW B'01010100'        ;「晶」のデーター(上半分)
   CALL WRITE_2 
   MOVLW B'01010100'        ;「晶」のデーター(上半分)
   CALL WRITE_2 
   MOVLW B'01010100'        ;「晶」のデーター(上半分)
   CALL WRITE_2 
   MOVLW B'01010100'        ;「晶」のデーター(上半分)
   CALL WRITE_2 
   MOVLW B'01111100'        ;「晶」のデーター(上半分)
   CALL WRITE_2 
   MOVLW B'00000000'        ;「晶」のデーター(上半分)
   CALL WRITE_2 
   MOVLW B'00000000'        ;「晶」のデーター(上半分)
   CALL WRITE_2 
   MOVLW B'00000000'        ;「晶」のデーター(上半分)
   CALL WRITE_2 
   MOVLW B'00000000'        ;「晶」のデーター(上半分)
   CALL WRITE_2
   MOVLW B'00000000'        ;「晶」のデーター(上半分)
   CALL WRITE_2
   RETURN

SHOUST2 
   MOVLW B'10111100'        ;Xアドレス4=PAGE4を指定(文字の下半分)
   CALL CMD_IC2
   MOVLW B'01000000'        ;Yアドレス0(Yアドレスの書き込みスタート位置)を指定
   CALL CMD_IC2 
   MOVLW B'11111110'        ;「晶」のデーター(下半分)
   CALL WRITE_2 
   MOVLW B'10010010'        ;「晶」のデーター(下半分)
   CALL WRITE_2 
   MOVLW B'10010010'        ;「晶」のデーター(下半分)
   CALL WRITE_2 
   MOVLW B'10010010'        ;「晶」のデーター(下半分)
   CALL WRITE_2 
   MOVLW B'10010010'        ;「晶」のデーター(下半分)
   CALL WRITE_2 
   MOVLW B'11111110'        ;「晶」のデーター(下半分)
   CALL WRITE_2 
   MOVLW B'00000000'        ;「晶」のデーター(下半分)
   CALL WRITE_1 
   MOVLW B'00000000'        ;「晶」のデーター(下半分)
   CALL WRITE_2 
   MOVLW B'11111110'        ;「晶」のデーター(下半分)
   CALL WRITE_2 
   MOVLW B'10010010'        ;「晶」のデーター(下半分)
   CALL WRITE_2
   MOVLW B'10010010'        ;「晶」のデーター(下半分)
   CALL WRITE_2 
   MOVLW B'10010010'        ;「晶」のデーター(下半分)
   CALL WRITE_2 
   MOVLW B'10010010'        ;「晶」のデーター(下半分)
   CALL WRITE_2 
   MOVLW B'11111110'        ;「晶」のデーター(下半分)
   CALL WRITE_2 
   MOVLW B'00000000'        ;「晶」のデーター(下半分)
   CALL WRITE_2 
   MOVLW B'00000000'        ;「晶」のデーター(下半分)
   CALL WRITE_2
   RETURN

; **********「液」書き込みルーチン3**********
EKIUE3
   MOVLW B'10111110'        ;Xアドレス6=PAGE6を指定(文字の上半分)
   CALL CMD_IC2
   MOVLW B'01100000'        ;Yアドレス32(Yアドレスの書き込みスタート位置)を指定
   CALL CMD_IC2
   MOVLW B'00100000'        ;「液」のデーター(上半分)
   CALL WRITE_2 
   MOVLW B'01000010'        ;「液」のデーター(上半分)
   CALL WRITE_2
   MOVLW B'10000100'        ;「液」のデーター(上半分)
   CALL WRITE_2
   MOVLW B'00001000'        ;「液」のデーター(上半分) 
   CALL WRITE_2
   MOVLW B'00000000'        ;「液」のデーター(上半分)
   CALL WRITE_2
   MOVLW B'00001000'        ;「液」のデーター(上半分)
   CALL WRITE_2
   MOVLW B'10001000'        ;「液」のデーター(上半分)
   CALL WRITE_2
   MOVLW B'01101000'        ;「液」のデーター(上半分)
   CALL WRITE_2
   MOVLW B'00011000'        ;「液」のデーター(上半分)
   CALL WRITE_2
   MOVLW B'10001110'        ;「液」のデーター(上半分)
   CALL WRITE_2
   MOVLW B'01101000'        ;「液」のデーター(上半分)
   CALL WRITE_2
   MOVLW B'01001000'        ;「液」のデーター(上半分)
   CALL WRITE_2
   MOVLW B'01001000'        ;「液」のデーター(上半分)
   CALL WRITE_2
   MOVLW B'11001000'        ;「液」のデーター(上半分)
   CALL WRITE_2
   MOVLW B'00001000'        ;「液」のデーター(上半分)
   CALL WRITE_2
   MOVLW B'00000000'        ;「液」のデーター(上半分)
   CALL WRITE_2
   RETURN 

EKIST3
   MOVLW B'10111111'        ;Xアドレス7=PAGE7を指定(文字の下半分)
   CALL CMD_IC2
   MOVLW B'01100000'        ;Yアドレス32(Yアドレスの書き込みスタート位置)を指定
   CALL CMD_IC2 
   MOVLW B'11000000'        ;「液」のデーター(下半分)
   CALL WRITE_2
   MOVLW B'00110000'        ;「液」のデーター(下半分)
   CALL WRITE_2
   MOVLW B'00001100'        ;「液」のデーター(下半分)
   CALL WRITE_2
   MOVLW B'00000000'        ;「液」のデーター(下半分)
   CALL WRITE_2
   MOVLW B'00000100'        ;「液」のデーター(下半分)
   CALL WRITE_2
   MOVLW B'00000010'        ;「液」のデーター(下半分)
   CALL WRITE_2
   MOVLW B'11111111'        ;「液」のデーター(下半分)
   CALL WRITE_2
   MOVLW B'00000100'        ;「液」のデーター(下半分)
   CALL WRITE_2
   MOVLW B'10000010'        ;「液」のデーター(下半分)
   CALL WRITE_2
   MOVLW B'01000101'        ;「液」のデーター(下半分)
   CALL WRITE_2
   MOVLW B'00101001'        ;「液」のデーター(下半分)
   CALL WRITE_2
   MOVLW B'00110010'        ;「液」のデーター(下半分)
   CALL WRITE_2
   MOVLW B'01001100'        ;「液」のデーター(下半分)
   CALL WRITE_2
   MOVLW B'10000011'        ;「液」のデーター(下半分)
   CALL WRITE_2
   MOVLW B'10000000'        ;「液」のデーター(下半分)
   CALL WRITE_2
   MOVLW B'00000000'        ;「液」のデーター(下半分)
   CALL WRITE_2
   RETURN

; **********「晶」書き込みルーチン3**********
SHOUUE3
   MOVLW B'10111110'        ;Xアドレス6=PAGE6を指定(文字の上半分)
   CALL CMD_IC2
   MOVLW B'01110000'        ;Yアドレス48(Yアドレスの書き込みスタート位置)を指定
   CALL CMD_IC2 
   MOVLW B'00000000'        ;「晶」のデーター(上半分)
   CALL WRITE_2 
   MOVLW B'00000000'        ;「晶」のデーター(上半分)
   CALL WRITE_2 
   MOVLW B'00000000'        ;「晶」のデーター(上半分)
   CALL WRITE_2 
   MOVLW B'01111100'        ;「晶」のデーター(上半分)
   CALL WRITE_2
   MOVLW B'01010100'        ;「晶」のデーター(上半分)
   CALL WRITE_2 
   MOVLW B'01010100'        ;「晶」のデーター(上半分)
   CALL WRITE_2 
   MOVLW B'01010100'        ;「晶」のデーター(上半分)
   CALL WRITE_2 
   MOVLW B'01010100'        ;「晶」のデーター(上半分)
   CALL WRITE_2 
   MOVLW B'01010100'        ;「晶」のデーター(上半分)
   CALL WRITE_2 
   MOVLW B'01010100'        ;「晶」のデーター(上半分)
   CALL WRITE_2 
   MOVLW B'01111100'        ;「晶」のデーター(上半分)
   CALL WRITE_2 
   MOVLW B'00000000'        ;「晶」のデーター(上半分)
   CALL WRITE_2 
   MOVLW B'00000000'        ;「晶」のデーター(上半分)
   CALL WRITE_2 
   MOVLW B'00000000'        ;「晶」のデーター(上半分)
   CALL WRITE_2 
   MOVLW B'00000000'        ;「晶」のデーター(上半分)
   CALL WRITE_2
   MOVLW B'00000000'        ;「晶」のデーター(上半分)
   CALL WRITE_2
   RETURN

SHOUST3 
   MOVLW B'10111111'        ;Xアドレス7=PAGE7を指定(文字の下半分)
   CALL CMD_IC2
   MOVLW B'01110000'        ;Yアドレス48(Yアドレスの書き込みスタート位置)を指定
   CALL CMD_IC2 
   MOVLW B'11111110'        ;「晶」のデーター(下半分)
   CALL WRITE_2 
   MOVLW B'10010010'        ;「晶」のデーター(下半分)
   CALL WRITE_2 
   MOVLW B'10010010'        ;「晶」のデーター(下半分)
   CALL WRITE_2 
   MOVLW B'10010010'        ;「晶」のデーター(下半分)
   CALL WRITE_2 
   MOVLW B'10010010'        ;「晶」のデーター(下半分)
   CALL WRITE_2 
   MOVLW B'11111110'        ;「晶」のデーター(下半分)
   CALL WRITE_2 
   MOVLW B'00000000'        ;「晶」のデーター(下半分)
   CALL WRITE_1 
   MOVLW B'00000000'        ;「晶」のデーター(下半分)
   CALL WRITE_2 
   MOVLW B'11111110'        ;「晶」のデーター(下半分)
   CALL WRITE_2 
   MOVLW B'10010010'        ;「晶」のデーター(下半分)
   CALL WRITE_2
   MOVLW B'10010010'        ;「晶」のデーター(下半分)
   CALL WRITE_2 
   MOVLW B'10010010'        ;「晶」のデーター(下半分)
   CALL WRITE_2 
   MOVLW B'10010010'        ;「晶」のデーター(下半分)
   CALL WRITE_2 
   MOVLW B'11111110'        ;「晶」のデーター(下半分)
   CALL WRITE_2 
   MOVLW B'00000000'        ;「晶」のデーター(下半分)
   CALL WRITE_2 
   MOVLW B'00000000'        ;「晶」のデーター(下半分)
   CALL WRITE_2
   RETURN

;**********LCD BUSYチェック**********
BUSY1                               ;IC1のBUSY CHECK
   MOVWF STORE               ;Wレジスタ内容をSTOREに一時保管
;PORTBを入力モードに変える
   BSF STATUS,RP0            ;バンク1へ切替
   MOVLW 0FFH                  ;ポートBを入力モードに設定
   MOVWF TRISB 
   BCF STATUS,RP0            ;バンク0に戻す
   BSF PORTA,3                  ;IC1選択
   BCF PORTA,4
   BCF PORTA,0                  ;Status Read
   BSF PORTA,3
   BSF PORTA,1                  ;E1 Active
   BCF PORTA,1
   MOVF PORTB,W
   MOVWF STUS                   ;LCDのStatus情報をSTUSに格納
   BTFSC STUS,7                  ;BUSYフラグチェック
   GOTO BUSY1
   BCF PORTA,1                    ;R/WをWに戻しておく
   BSF STATUS,RP0              ;バンク1へ切替
   CLRF TRISB                      ;ポートBを出力モードに設定
   BCF STATUS,RP0              ;バンク0に戻す
   MOVF STORE,W                 ;STOREに格納していた内容をWレジスタに戻す
   BCF PORTA,3                   ;IC1非選択
   RETURN

BUSY2 ;IC2のBUSY CHECK
   MOVWF STORE                ;Wレジスタ内容をSTOREに一時保管
;PORTBを入力モードに変える
   BSF STATUS,RP0             ;バンク1へ切替
   MOVLW 0FFH                   ;ポートBを入力モードに設定
   MOVWF TRISB
   BCF STATUS,RP0             ;バンク0に戻す
   BSF PORTA,4                   ;IC2選択
   BCF PORTA,3
   BCF PORTA,0                   ;Status Read
   BSF PORTA,1
   BSF PORTA,2                   ;E2 Active
   BCF PORTA,2
   MOVF PORTB,W
   MOVWF STUS                   ;LCDのStatus情報をSTUSに格納
   BTFSC STUS,7                  ;BUSYフラグチェック
   GOTO BUSY2
   BCF PORTA,1                    ;R/WをWに戻しておく
   BSF STATUS,RP0               ;バンク1へ切替
   CLRF TRISB                      ;ポートBを出力モードに設定
   BCF STATUS,RP0              ;バンク0に戻す
   MOVF STORE,W                 ;STOREに格納していた内容をWレジスタに戻す
   BCF PORTA,4                    ;IC2非選択
   RETURN
;タイマ 
TIM04                                   ;約0.4mSECタイマ
   MOVLW 0FFH
   MOVWF TIMCNT

   TIMLP 
   NOP
   DECFSZ TIMCNT,F
   GOTO TIMLP
   RETURN

TIM5                                      ;約5mSECタイマ 
   MOVLW 0DH
   MOVWF TIM5CNT

   TIM5LP 
   CALL TIM04
   DECFSZ TIM5CNT,F
   GOTO TIM5LP
   RETURN
   TIM1S                                ;約1mSECタイマ
   MOVLW 0C8H
   MOVWF TIM1CNT

   TIM1SLP 
   CALL TIM5
   DECFSZ TIM1CNT,F
   GOTO TIM1SLP
   RETURN

END