概要

主にSC1602(秋月電子通称のページに移動します)向けのLCD液晶表示用のライブラリである。
液晶モジュールと接続するポートはマクロで変更可能である。
busyフラグはチェックせずソフトウェアディレイで対応しているためクロック周波数が変更された場合はディレイの調整が必要
使用する場合はlcd.incをインクルードしlcd.asmをプロジェクトに追加してください
lcd_initをコールする前に以下のポートを出力にしてください。(GNDを除く)

;   接続方法
;   PIC18F14K50  SC1602
;       RC7 ----> DB7
;       RC6 ----> DB6
;       RC5 ----> DB5
;       RC4 ----> DB4
;       RC3 ----> E
;       RC2 ----> RS
;       GND       R/W

プログラムの説明

ソースファイル

以下のファイルで構成されている
lcd.asm   ・・・ LCD表示用ライブラリ Version 1.00
lcd.inc   ・・・ LCD表示用インクルードファイル Version 1.00

サブルーチン

以下のサブルーチンをサポート

lcd_init

液晶モジュールの初期化

lcd_disp

液晶に表示可能な文字数分(16文字*2行=32byteのメモリ(FSR1で指定)から液晶に文字列を転送し表示する

ソースコード

lcd.inc

; LCDモジュール(SC1602) 4bitモードライブラリー  Version 1.00
; File:        lcd.inc
; Target:      PIC18F14K50 48Mhz
; アセンブラ:   Microchip MPASM(v5.51)
; 書き込み:     PICKit 3
; リリース:     2013/10/01 21:00


        EXTERN  lcd_init,lcd_disp ;    液晶初期化,液晶表示
        EXTERN  wait50,wait10

lcd.asm

; LCDモジュール(SC1602) 4bitモードライブラリー  Version 1.00
; File:        lcd.asm
; Target:      PIC18F14K50 48Mhz
; アセンブラ:   Microchip MPASM(v5.51)
; 書き込み:     PICKit 3
; リリース:     2013/10/01 21:00

        #INCLUDE <p18f14k50.inc>

        EXTERN  LCD_WRITE,LCD_TEMP,Temp1
        EXTERN  Tcount1,Tcount2,Tcount3
        GLOBAL  wait50,wait10
        GLOBAL  lcd_init,lcd_disp

;   接続方法
;   PIC18F14K50  SC1602
;       RC7 ----> DB7
;       RC6 ----> DB6
;       RC5 ----> DB5
;       RC4 ----> DB4
;       RC3 ----> E
;       RC2 ----> RS
;       GND       R/W


LCD_E    EQU     3  ;   E信号のビット位置
LCD_RS   EQU     2  ;   RS信号のビット位置
LCD_E_MASK  EQU  b'00001000'
LCD_RS_MASK EQU  b'00000100'
LCD_ADS  EQU     PORTC  ;   データー上位4bit・E・RS信号のポート


        CODE
lcd_init    ; 液晶初期化
        movlw   d'200'          ;   50μs*200=10msの待機
        call    wait50
        movlw   d'100'          ;   50μs*100=5msの待機
        call    wait50

        bcf     LCD_ADS,LCD_RS  ;   RS 0出力
        movlw   b'00110000'
        movwf   LCD_WRITE
        call    lcd_out4
        movlw   d'100'           ;   50μs*100=5msの待機
        call    wait50

        movlw   b'00110000'
        movwf   LCD_WRITE
        call    lcd_out4
        movlw   d'80'           ;   50μs*80=4msの待機
        call    wait50

        movlw   b'00110000'
        movwf   LCD_WRITE
        call    lcd_out4
        movlw   d'80'           ;   50μs*80=4msの待機
        call    wait50

        movlw   b'00100000'
        movwf   LCD_WRITE
        call    lcd_out4
        movlw   d'80'           ;   50μs*80=4msの待機
        call    wait50

        movlw   b'00101000'
        movwf   LCD_WRITE
        call    lcd_out8
        movlw   d'80'           ;   50μs*80=4msの待機
        call    wait50

        movlw   b'00001110'     ;   表示on
        movwf   LCD_WRITE
        call    lcd_out8
        movlw   d'4'           ;   50μs*4=0.2msの待機
        call    wait50

        movlw   b'00000110'     ;   エントリーモード
        movwf   LCD_WRITE
        call    lcd_out8
        movlw   d'4'           ;   50μs*4=0.2msの待機
        call    wait50

        movlw   b'00000001'     ;   表示クリア
        movwf   LCD_WRITE
        call    lcd_out8
        movlw   d'40'           ;   50μs*40=2msの待機
        call    wait50
        return

lcd_disp ; 液晶表示
        movlw   b'00000010'     ;   カーソルホーム
        movwf   LCD_WRITE
        bcf     LCD_ADS,LCD_RS  ;   RS 0出力
        call    lcd_out8
        movlw   d'40'           ;   50μs*40=2msの待機
        call    wait50

        bsf     LCD_ADS,LCD_RS  ;   RS 1出力

        movlw   d'16'
        movwf   Temp1
lcd_disp_1row_loop
        movf    POSTINC1,W
        movwf   LCD_WRITE
        call    lcd_out8
        movlw   d'1'           ;   50μsの待機
        call    wait50

        decfsz  Temp1       ;   Temp1から1を引き結果が0になるまで繰り返す
        bra     lcd_disp_1row_loop

        movlw   b'11000000'     ;   カーソルを2行目にセット
        movwf   LCD_WRITE
        bcf     LCD_ADS,LCD_RS  ;   RS 0出力
        call    lcd_out8
        movlw   d'1'           ;   50μsの待機
        call    wait50

        bsf     LCD_ADS,LCD_RS  ;   RS 1出力
        movlw   d'16'
        movwf   Temp1
lcd_disp_2row_loop
        movf    POSTINC1,W
        movwf   LCD_WRITE
        call    lcd_out8

        movlw   d'1'           ;   50μsの待機
        call    wait50

        decfsz  Temp1       ;   Temp1から1を引き結果が0になるまで繰り返す
        bra     lcd_disp_2row_loop
        return

lcd_out4          ; LCD_WRITE上位4bitをLCDへ送信する
                  ; RSはあらかじめセットしておく必要がある 下位4bitは無視する。
        movf    LCD_ADS,W
        andlw   0fh    ;   上位4bitを0にする
        movwf   LCD_TEMP
        movf    LCD_WRITE,W
        andlw   0f0h    ; 下位4bitを0にする
        iorwf   LCD_TEMP,w
        movwf   LCD_ADS
        bsf     LCD_ADS,LCD_E   ;   Eをセットbする
        nop
        nop
        nop
        bcf     LCD_ADS,LCD_E   ;   Eをクリアする

        return

lcd_out8           ;   8bitを上位と下位に分割してLCDへ送信する
                   ;   RSはあらかじめセットしておく必要がある
        call    lcd_out4
        swapf   LCD_WRITE   ;   上位4bitと下位4bitを入れ替える
        call    lcd_out4
        return

wait50                 ; 約50μs*ワーキングレジスタ待機
    	movwf   Tcount2
dloop21
        movlw   d'199' 
        movwf   Tcount3
        nop
dloop31
    	decfsz  Tcount3
    	goto    dloop31
    	decfsz  Tcount2
    	goto    dloop21
        return

wait10                  ; 約10ms待機
    	movlw d'200'
    	movwf Tcount2
dloop22
        movlw d'199'
        movwf Tcount3
        nop
dloop32
    	decfsz Tcount3
    	goto dloop32
    	decfsz Tcount2
    	goto dloop22
        return

        END