; *******************************************************************
	LIST P=16F628A
	INCLUDE <P16F628A.INC>

 __CONFIG _BODEN_ON & _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _LVP_OFF

; *******************************************************************
;        PIC      LCD
;      RB4(10) - DB7(14)
;      RB5(11) - DB6(13)
;      RB6(12) - DB5(12)
;      RB7(13) - DB4(11)
;
;　　　PICからLCDへコントロール信号の配置を変更する場合は
;      ①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬の変更が必要
;
;      RA1(18) - RS信号
;      RA0(17) - E信号
; *******************************************************************

			ORG     0x0000

			BCF     STATUS    , RP0
			BCF     STATUS    , RP1
			CLRF    PORTA
			CLRF    PORTB
			MOVLW   0x07
			MOVWF   0x1F
			BSF     STATUS    , RP0
			BCF     STATUS    , RP1
			MOVLW   0xFC
			MOVWF   TRISA
			MOVLW   0x0F
			MOVWF   TRISB
			BCF     STATUS    , RP0
			BCF     STATUS    , RP1

			CALL    LCD_INI

		;1桁目
			MOVLW   0x82
			CALL    LCD_CMD

			MOVLW   "H"				;H  １行目左から3文字目
			CALL    LCD_DATA
			MOVLW   "E"				;E  １行目左から4文字目
			CALL    LCD_DATA
			MOVLW   "L"				;L  １行目左から5文字目
			CALL    LCD_DATA
			MOVLW   "L"				;L  １行目左から6文字目
			CALL    LCD_DATA
			MOVLW   "O"				;O  １行目左から7文字目
			CALL    LCD_DATA



		;2桁目
			MOVLW   0xC9
			CALL    LCD_CMD

			MOVLW   "h"				;h  2行目左から10文字目
			CALL    LCD_DATA
			MOVLW   "e"				;e  2行目左から11文字目
			CALL    LCD_DATA
			MOVLW   "l"				;l  2行目左から12文字目
			CALL    LCD_DATA
			MOVLW   "l"				;l  2行目左から13文字目
			CALL    LCD_DATA
			MOVLW   "o"				;o  2行目左から14文字目
			CALL    LCD_DATA

			CLRF    PORTB

LCD_END		GOTO    LCD_END			;無限ループ　ループにしないと液晶なのに表示がチラチラする

; *******************************************************************
; 液晶表示器 初期化
; *******************************************************************

LCD_INI		CALL    Time5m
			CALL    Time5m
			CALL    Time5m

		;　８ビットモードで動作	
			MOVLW   0x30
			MOVWF   PORTB
			CALL    PutSig
			CALL    Time5m
			CALL    PutCMD
			CALL    Time5m
			CALL    PutCMD
			CALL    Time5m

		; ４ビットモードに設定
			MOVLW   0x20
			MOVWF   PORTB
			CALL    PutCMD
			CALL    Time5m

　　　　　;４ビットモードで機能詳細設定
			MOVLW   0x2E
			CALL    LCD_CMD
			MOVLW   0x08
			CALL    LCD_CMD
			MOVLW   0x0C
			CALL    LCD_CMD
			MOVLW   0x06
			CALL    LCD_CMD
			CALL    LCD_CLR
			RETURN

; *******************************************************************
; 液晶表示器 表示データ出力
; *******************************************************************

LCD_DATA		MOVWF   0x21
			ANDLW   0xF0
			MOVWF   PORTB
			CALL    PutData
			MOVF    0x21      , W
			SWAPF   0x21      , W
			ANDLW   0xF0
			MOVWF   PORTB
			CALL    PutData
			CALL    Time50u
			RETURN

; *******************************************************************
; 液晶表示器 制御コマンド出力
; *******************************************************************

LCD_CMD		MOVWF   0x21
			ANDLW   0xF0
			MOVWF   PORTB
			CALL    PutCMD
			MOVF    0x21      , W
			SWAPF   0x21      , W
			ANDLW   0xF0
			MOVWF   PORTB
			CALL    PutCMD
			CALL    Time50u
			MOVF    0x21      , W
			ANDLW   0xFC
			BTFSC   STATUS    , Z
			CALL    Time5m
			RETURN

; *******************************************************************
; 液晶表示器 全消去
; *******************************************************************

LCD_CLR		MOVLW   0x01
			GOTO    LCD_CMD
			MOVLW   0x02
			GOTO    LCD_CMD

PutData		BSF     PORTA     , 01
			GOTO    PutSig

PutCMD		BCF     PORTA     , 01

PutSig		BSF     PORTA     , 00
			NOP
			BCF     PORTA     , 00
			RETURN

; *******************************************************************
;*　ディレイタイマサブルーチン
;*　内部クロック４ＭＨｚ　1/4000000 0.0000025=0.25μs
;*  実際はその１／４のスピードなので 1クロックの時間は 0.025×4＝1μs

;*    Time50u  ;50usec
;*    Time1m   ;1msec
;*    Time5m   ;5msec
; *******************************************************************

Time50u		MOVLW   0x0F
			MOVWF   0x20
Time50u_1		DECFSZ  0x20      , f
			GOTO    Time50u_1
			RETURN

Time1m		MOVLW   0x4C
			MOVWF   0x20
Time1m_1		DECFSZ  0x20      , f
			GOTO    Time1m_1
Time1m_2		DECFSZ  0x20      , f
			GOTO    Time1m_2
			RETURN

Time5m		CALL    Time1m
			CALL    Time1m
			CALL    Time1m
			CALL    Time1m
			CALL    Time1m
			RETURN

			End
