概要

PIC18F46K22のI2Cモジュール1に接続されたI2Cキャラクタ液晶モジュール(8桁*2行)AQM0802A-RN-GBWを接続し文字の表示とコントラストの調整をサポートするライブラリである。
クロックは64MHz前提でソフトウェアディレイを使用しているためクロック周波数が変更された場合はディレイの調整が必要(64MHz以上のPIC18は存在しないので遅くなるだけで動作はする)
使用する場合はi2clcd.incをインクルードしi2clcd.asmをプロジェクトに追加してください
本ライブラリは、PIC18 I2Cモジュール サポートライブラリをコールしているのでそれらのファイルもプロジェクトに加える必要があります。
lcd_initをコールする前に以下のポートを出力にしてください。(GNDを除く)
;   使用端子
;   PIC18F46K22
;    SDA1(RC4)
;    SCK1(RC3) 
;       GND 

プログラムの説明

ソースファイル

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

サブルーチン

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

lcd_init

液晶モジュールの初期化

lcd_disp

RAM上の文字列(FSR1でアドレスを指定)を液晶に表示する。文字列の最後は0でなければならない。改行(00ah)コードを使用すると2行目にカーソルが移動する。

lcd_cont

WREGで指定されたコントラスト値(0~63)を液晶に設定する。

ソースコード

i2clcd.inc

; I2C接続液晶 AQUM0802A-RN-GBWサポートライブラリ Version 1.00  2014/02/23
; Target  PIC18F46K22
; 水晶は16MHzに交換してPICを64MHzで駆動
; MPLAB X IDE v1.85 Microchip MPASM(v5.51)
; PicKit 3


    EXTERN  lcd_init,lcd_clear,lcd_cmd,lcd_data,lcd_cont,lcd_puts
    EXTERN  delay16c,delay4kc,delay1024kc

i2clcd.asm

; I2C接続液晶 AQUM0802A-RN-GBWサポートライブラリ Version 1.00  2014/02/23
; Target  PIC18F46K22
; 水晶は16MHzに交換してPICを64MHzで駆動
; MPLAB X IDE v1.85 Microchip MPASM(v5.51)
; PicKit 3

        #INCLUDE <p18f46k22.inc>
        #INCLUDE "i2c.inc"

LCD_SADS EQU    07ch    ;   AQUM0802Aのi2cスレーブアドレス
LCD_RSDATA  EQU 040h
LCD_RSCMD   EQU 000h
LCD_C01 EQU 080h
LCD_C00 EQU 080h


    EXTERN  temp1,temp2,Tcount1,Tcount2
    GLOBAL  lcd_init,lcd_clear,lcd_cmd,lcd_data,lcd_cont,lcd_puts
    GLOBAL  delay16c,delay4kc,delay1024kc

        CODE

delay16c
        nop
        decfsz  WREG
        goto    delay16c
        return

delay4kc
        movwf   Tcount1
delay4kL2
        clrf    WREG
delay4kL1
        nop
        nop
        decfsz  WREG
        goto    delay4kL1   ;   16*256=4096
        decfsz  Tcount1
        goto    delay4kL2
        return

delay1024kc
        movwf   Tcount2
delay1024kL1   ;   16*256*256=4096
        clrf    Tcount1
delay4kL22
        clrf    WREG
delay4kL11
        nop
        nop
        decfsz  WREG
        goto    delay4kL11   ;   16*256=4096
        decfsz  Tcount1
        goto    delay4kL22
        decfsz  Tcount2
        goto    delay1024kL1
        return

;  LCD初期化

lcd_init
        movlw   038h    ;   Function Set
        call    lcd_cmd
        movlw   d'141' ; 26.3us/64MHz/16=141
        call    delay16c

        movlw   039h    ;   Function Set
        call    lcd_cmd
        movlw   d'141' ; 26.3us/64MHz/16=141
        call    delay16c

        movlw   014h    ;  Internal OSC frequency
        call    lcd_cmd
        movlw   d'141' ; 26.3us/64MHz/16=141
        call    delay16c

        movlw   073h    ;  Contrast set
        call    lcd_cmd
        movlw   d'141' ; 26.3us/64MHz/16=141
        call    delay16c

        movlw   056h    ; Power/ICON/Contrast control
        call    lcd_cmd
        movlw   d'141' ; 26.3us/64MHz/16=141
        call    delay16c

        movlw   06ch    ; Follower control
        call    lcd_cmd
        movlw   d'13' ;  200ms/64Mhz/16/256/256=13
        call    delay1024kc

        movlw   038h    ;   Function Set
        call    lcd_cmd
        movlw   d'141' ; 26.3us/64MHz/16=141
        call    delay16c

        movlw   00ch    ;   Display On/Off
        call    lcd_cmd
        movlw   d'141' ; 26.3us/64MHz/16=141
        call    delay16c
        call    lcd_clear
        return

;  LCDをクリア

lcd_clear
        movlw   001h    ;  Clear Display
        call    lcd_cmd
        movlw   d'141' ; 26.3us/64MHz/16=141
        call    delay4kc
        return


;  LCDへコマンドを1byte送信

lcd_cmd
        movwf   temp1
        call    i2c_start
        movlw   LCD_SADS
        call    i2c_write
        movlw   LCD_RSCMD+LCD_C01
        call    i2c_write
        movf    temp1,w
        call    i2c_write
        call    i2c_stop
        return

;  LCDへデータを1byte送信

lcd_data
        movwf   temp1
        call    i2c_start
        movlw   LCD_SADS
        call    i2c_write
        movlw   LCD_RSDATA+LCD_C01
        call    i2c_write
        movf    temp1,w
        call    i2c_write
        call    i2c_stop
        return

;   LCDの表示アドレスを設定

lcd_ddram
        iorlw   b'11000000'
        call    lcd_cmd
        movlw   d'141' ; 26.3us/64MH/16=141
        call    delay16c
        return

;   LCDコントラスト変更(0?63)

lcd_cont
        movwf   temp1
        movlw   039h    ;   Function Set
        call    lcd_cmd
        movlw   d'141' ; 26.3us/64MHz/16=141
        call    delay16c
        movf    temp1,w
        iorlw   b'10000000'
        call    lcd_cmd
        movlw   d'141' ; 26.3us/64MHz/16=141
        call    delay16c
        rrncf   temp1
        rrncf   temp1
        rrncf   temp1
        rrncf   temp1,w
        iorlw   054h
        call    lcd_cmd
        movlw   d'141' ; 26.3us/64MHz/16=141
        call    delay16c
        return

;   LCDに文字列を表示

lcd_puts
        movf    POSTINC1,w
        bz      lcd_puts_exit
        movwf   temp2
        movlw   0ah     ;   改行コード
        cpfseq  temp2
        bra     lcd_puts_not_lf
        movlw   040h
        call    lcd_ddram
        bra     lcd_puts
lcd_puts_not_lf         ;   改行コード以外
        movf    temp2,w
        call    lcd_data
        movlw   d'141' ; 26.3us/64MHz/16=141
        call    delay16c
        bra     lcd_puts
lcd_puts_exit
        return

        END