概要

LCD液晶に文字列を表示する。
LCD液晶はSC2004及びSC1602を対象としている。液晶モジュールの電源の接続がSC2004とSC1602では逆なので注意。SC1602の場合16文字*2行でしか表示されないので注意。
クロックはUSB-IOで接続済みの12MHzのセラミック振動子を使用しPLLで4倍にしている。書込みはPICKit3を前提とする。
液晶表示例

01234567890123456789
SC2004 LCD          
20モジ*4ギョウ         
Test
    ↓
PIC18F14K50
 ROM 16K
  RAM 768
   Hello
回路は次のとおりである。
回路図(PNG) 回路図(PDF) 回路図(DXF)

プログラムの説明

ソースファイル

以下のファイルで構成されている
lcd4a.asm ・・・ メインプログラム
lcd2.asm   ・・・ LCD表示用ライブラリ Version 1.20
lcd2.inc   ・・・ LCD表示用インクルードファイル Version 1.20

ソースファイルのダウンロード lcd4a.zip

lcd2.asm

主にSC2004向けのLCD液晶表示用のライブラリである。SC2004向けに文字と列位置を指定できるサブルーチンを追加。SC1602で使用する場合は、表示範囲が液晶に収まるように使用すれば問題なく使える。
液晶モジュールと接続するポートはマクロで変更可能である。
busyフラグはチェックせずソフトウェアディレイで対応しているためクロック周波数が変更された場合はディレイの調整が必要
詳細は以下のリンクを参照されたい
lcd2.asm

lcd4a.asm

メインプログラムである。
IOポートの入出力の設定をし、LCDの初期化、lcd_dispで20字*4行をまとめて液晶に表示、約2秒後に1行ずつ、lcd_ddramサブルーチンで文字位置を指定しlcd_putsサブルーチンで文字列を表示する。

; 液晶モジュールSC2004(20文字*4行)表示サンプル Version 1.00
;
; File:        lcd4a.asm
; Target:      PIC18F14K50 48Mhz
; アセンブラ:   Microchip MPASM(v5.51)
; 書き込み:     PICKit 3
; リリース:     2013/10/09 21:00
;
; 20モ文字*4行液晶に対応(ただし電源ピンの配置はSC1602と異なるので注意)
; LCD_LOCATEマクロとサブルーチンlcd_ddramにより任意の位置に文字を表示可能
;
; 液晶表示例
;       01234567890123456789
;       SC2004 LCD          
;       20モジ*4ギョウ         
;       Test
;            ↓
;       PIC18F14K50
;        ROM 16K
;         RAM 768
;          Hello

        #INCLUDE <p18f14k50.inc>
        #INCLUDE "lcd2.inc"

        ; 水晶発振(12MHz) クロック分周無 PLL有効(*4)
        ; ウォッチドッグタイマ無効 低電圧プログラム書き込みモード無効
        CONFIG FOSC = HS,CPUDIV = NOCLKDIV,PLLEN=ON,WDTEN=OFF,LVP=OFF

           UDATA   ; 変数の定義 バンク0
Tcount1     RES 1      ; wait
Tcount2     RES 1      ; wait
Tcount3     RES 1      ; wait
LCD_WRITE   RES 1      ; writeデータを指定
LCD_TEMP    RES 1
Temp1       RES 1      ; サブルーチン用の変数
ARG1        RES 1      ; サブルーチン引数
BYTE2HEX_TEMP RES 1

ARGL        RES 1
ARGH        RES 1

LCD_BUF     RES LCD_CMAX*LCD_RMAX     ; 液晶用バッファ

        GLOBAL  LCD_WRITE,LCD_TEMP,ARG1,ARGL,ARGH
        GLOBAL  Temp1,BYTE2HEX_TEMP
        GLOBAL  Tcount1,Tcount2,Tcount3

; プログラムメモリのアドレスadsをTBLPTRレジスタに設定
LDTBLPTR MACRO   ads
        movlw   UPPER ads
        movwf   TBLPTRU
        movlw   HIGH ads
        movwf   TBLPTRH
        movlw   LOW ads
        movwf   TBLPTRL
        ENDM

        CODE
        ORG 0
        goto   start    ;   リセット時

start
        clrf    ANSEL   ; RC3-RC0,RA4をデジタル入力バッファに設定
        clrf    ANSELH  ; RB5-RB4,RC7-RC6をデジタル入力バッファに設定
        clrf    SLRCON  ; PORTA,PORTB,PORTCをスルーレートを標準に設定
        clrf    TRISA   ; PORTAを全部出力に設定
        movlw   0f0h
        movwf   TRISB   ; RB7-RB4を入力に設定
        clrf    TRISC   ; PORTCを全部出力に設定する
        clrf    PORTC   ; PORTCを全部0にする。

        rcall   lcd_init    ;   液晶初期化

        LDTBLPTR lcd_init_str
        lfsr    FSR0,LCD_BUF
        movlw   LCD_CMAX*LCD_RMAX
        call    prog2mem
        lfsr    FSR1,LCD_BUF
        call    lcd_disp

        movlw   d'200'      ; 10ms*200=2s
wait_loop
        call    wait10
        decfsz  Temp1       ;   Temp1から1を引き結果が0になるまで繰り返す
        bra     wait_loop

        clrf    WREG
        call    lcd_ddram

        LDTBLPTR row1_str
        lfsr    FSR0,LCD_BUF
        movlw   d'11'
        call    prog2mem
        movlw   d'11'

        lfsr    FSR1,LCD_BUF
        call    lcd_puts

        LCD_LOCATE  1,1
        call    lcd_ddram
        LDTBLPTR    row2_str
        lfsr    FSR0,LCD_BUF
        movlw   7
        call    prog2mem
        movlw   7
        lfsr    FSR1,LCD_BUF
        call    lcd_puts

        LCD_LOCATE_XY  2,2
        call    lcd_ddramxy
        LDTBLPTR    row3_str
        lfsr    FSR0,LCD_BUF
        movlw   7
        call    prog2mem
        movlw   7
        lfsr    FSR1,LCD_BUF
        call    lcd_puts

        LCD_LOCATE  3,3
        call    lcd_ddram

        LDTBLPTR    row4_str
        lfsr    FSR0,LCD_BUF
        movlw   5
        call    prog2mem
        movlw   5
        lfsr    FSR1,LCD_BUF
        call    lcd_puts

        bra     $

lcd_init_str    ;0123456789abcdef0123
        DB      "01234567890123456789"
        DB      "SC2004 LCD          "
        DB      "20モジ*4ギョウ         "
        DB      "Test                "

row1_str
        DB      "PIC18F14K50"
row2_str
        DB      "ROM 16K"
row3_str
        DB      "RAM 768"
row4_str
        DB      "Hello"

prog2mem    ; プログラムメモリからデーターメモリへコピーする TABLAT->FSR0
        movwf   Temp1
prog2mem_loop
        tblrd   *+          ;   プログラムメモリTBLPTRから読み出し後TBLPTRを+1する
        movf    TABLAT,W
        movwf   POSTINC0    ;   間接アドレッシング アドレスはアクセス後に+1される
        decfsz  Temp1       ;   Temp1から1を引き結果が0になるまで繰り返す
        bra     prog2mem_loop
        return

        END