ホームに戻る
PICとLCD(SC1602BS)を使ったテスト
LCDを買ったので使ってみました。
SC1602BS は500円くらいで買えるようです。
16文字×2行までの文字の表示が可能。
5×7ドットで新たな文字も作成できる。
LCDのピンは14本。
2本は電源。
1本は照度の調整用。
3本は制御用。
8本は制御データ領域。
手順
まずお約束のやり方で初期化
最初はモードを設定していないのでビジーかどうかを調べる方法が無い。
なので、1命令ごとに確実に動作する時間だけ待つ必要がある。
モードを設定したらビジーで無いのを待って命令を送る。
命令するには以下の手順を繰り返す。
1、ビジー待ち
2、命令データのセット
3、RSフラグ、R/Wフラグのセット
4、Eフラグを立てて 200ns 以上待って降ろす
画面をクリアしたりカーソルを動かしたり、
カーソル位置に文字を表示したりする命令があるのでそれを送れば良い。
LCDの内部には2つの記憶領域がある。
DDRAMにはLCDの各位置の文字情報が記録されている。
CGRAMにはある文字上の各ドット情報が記録されている。
データの転送は通常いちどに8ビット単位で行うが、
4ビット単位で2回にわけてデータを送るモードもある。
4ビットモードではDB0からDB3をGNDに接続し、
DB4からDB7までの4つで動作させることが可能になる。
以下は8ビットモードで文字 A と B を2行で表示するサンプルである。
;
; LCD(SC1602BS) と PIC16F84A を使ったテスト
; 振動子はセラミック振動子 10MHz を使用
;
;
; ピンと PIC 端子の接続対応表
;
; 1 VDD +5V
; 2 VSS GND
; 3 VO (GNDに接続)
; 4 RS RA2
; 5 R/W RA1
; 6 E RA0
; 7 DB0 RB0
; 8 DB1 RB1
; 9 DB2 RB2
; 10 DB3 RB3
; 11 DB4 RB4
; 12 DB5 RB5
; 13 DB6 RB6
; 14 DB7 RB7
;
LIST P=PIC16F84A
INCLUDE P16F84A.INC
__CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF
T1 EQU 0CH
T2 EQU 0DH
T3 EQU 0EH
DPDT EQU 0FH
RS SET 2
RW SET 1
E SET 0
BUSY_F SET 7
; スタート地点
ORG 0
; 初期設定
BSF STATUS, RP0
CLRF TRISA
CLRF TRISB
BCF STATUS, RP0
; LCD の初期設定
CALL LCD_INIT
; 画面をクリア
CALL LCD_BUSY
MOVLW B'00001110'
CALL LCD_CMD
; 「A」 と表示
CALL LCD_BUSY
MOVLW B'01000001' ;「A」
CALL LCD_DATA
; 2行目へ移動
CALL LCD_BUSY
MOVLW B'11000000'
CALL LCD_CMD
; 「B」 と表示
CALL LCD_BUSY
MOVLW B'01000010' ;「B」
CALL LCD_DATA
LOOP
GOTO LOOP
; 画面の初期化ルーチン
LCD_INIT
CALL TIME20 ; 15ms以上待つ
MOVLW B'00110000'
CALL LCD_CMD
CALL TIME20 ; 4.1ms以上待つ
MOVLW B'00110000'
CALL LCD_CMD
CALL TIME04 ; 0.1ms以上待つ
MOVLW B'00110000'
CALL LCD_CMD
CALL TIME04 ; 0.1ms以上待つ
MOVLW B'00111000'
CALL LCD_CMD
CALL LCD_BUSY
MOVLW B'00001000'
CALL LCD_CMD
CALL LCD_BUSY
MOVLW B'00000001'
CALL LCD_CMD
CALL LCD_BUSY
MOVLW B'00000110'
CALL LCD_CMD
RETURN
; LCDコマンドルーチン
LCD_CMD
MOVWF PORTB
BCF PORTA, RW
BCF PORTA, RS
BSF PORTA, E
NOP ; E が 220ns 以上 1 であるために NOP を確保
BCF PORTA, E
RETURN
; 文字データ書き込みルーチン
LCD_DATA
MOVWF PORTB
BCF PORTA, RW
BSF PORTA, RS
BSF PORTA, E
NOP
BCF PORTA, E
RETURN
; ビジーチェックルーチン
LCD_BUSY
BSF STATUS, RP0
MOVLW B'11111111'
MOVWF TRISB
BCF STATUS, RP0
BCF PORTA, RS
BSF PORTA, RW
BSF PORTA, E
MOVF PORTB, W
BCF PORTA, E
MOVWF DPDT
BTFSC DPDT, BUSY_F
GOTO LCD_BUSY
BCF PORTA, RW
BSF STATUS, RP0
MOVLW B'00000000'
MOVWF TRISB
BCF STATUS, RP0
RETURN
; 以降、遅延タイマー
; 0.4ms
TIME04
MOVLW D'250'
MOVWF T1
TIMELOOP1
NOP
DECFSZ T1, F
GOTO TIMELOOP1
RETURN
; 20ms
TIME20
MOVLW D'50'
MOVWF T2
TIMELOOP2
CALL TIME04
DECFSZ T2, F
GOTO TIMELOOP2
RETURN
; 1m
TIME1000
MOVLW D'50'
MOVWF T3
TIMELOOP3
CALL TIME20
DECFSZ T3, F
GOTO TIMELOOP3
RETURN
END