山本ワールド
LCDモジュール(SC1602) 4bitモードライブラリー
概要
主に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
Copyright (C) 2012 山本ワールド All Rights Reserved.