ホームに戻る
 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

inserted by FC2 system