山本ワールド
LCD液晶に文字を表示
概要
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
Copyright (C) 2012 山本ワールド All Rights Reserved.