액정 표시기의 제어법


【액정 표시기와의 접속】

 PIC와 액정 표시기와의 접속을 설명합니다. 그 액정 표시기로서
사용하는 것은 아래와 같이에 나타내는 것 같은 것입니다.

【액정 표시기의 사양】
품명   SC1602BSLB 또는 SC1602BS*B
개요   16 문자 2행초하이콘트라스트
      백 라이트 첨부(BSLB만)
      5x7 or 5 x10 닷+커서 표시
      5 V단일 전원, 저소비 전류
      CPU 인터페이스
         4비트 or 8비트 패러렐

 이러한 액정 표시기와 접속하려면 , 다소 소프트가 귀찮게는 되어
가, PIC가 사용하는 포토가 적어도 되는 4비트 패러렐을 선택합시다.
이 4비트의 데이터 신호 이외에 필요한 신호는, RS(디바이스 선택 신호),
R/W(독포함/  기록 지정), E(스트로브 신호)의 3개입니다.
 이것들과 PIC와는 우선 아래와 같이 잇는 것으로서 생각합니다.
이 접속 방법이 소프트로부터 제어하기 쉽기 때문입니다.
한층 더 각 신호의 타이밍도 밑그림에 나타냅니다만, 요점은 아래 쪽의 신호가 안쪽
에 들어가도록 출력하면 OK입니다.


   

데이타 버스(DB4-7)의 신호 내용의 구별은 2개의 제어 신호(RS, R/W)로
구별됩니다.

RS R/W    신호 종별
 0  0    Control Command 출력
 1  0    기록 데이터 출력
 0  1    Busy 신호 입력
 1  1    독포함 데이터 입력

【Control Command의 일람표】
 Commnad     DB7 6 5 4 3 2 1 0    설명   
Clear Display     0 0 0 0 0 0 0 1  전소거, Cursor는 Home에
Cursor At Home    0 0 0 0 0 0 1 *  표시 내용은 변화 없음.
Entry Mode Set    0 0 0 0 0 1 I/D S  I/D=Increment/Decrement
                        S=With Display Shift
Display On/Off    0 0 0 0 1 D C B  D=Display C=Cursor B=Blink
Cursor/Dislay Shift 0 0 0 1 S/CR/L * *  S/C=Display/Cursor
                        R/L=Right/Left
Function Set     0 0 1 DL N F * *  DL=8/4Bit N=2/1Line
                        F=Large/Small
CGRAM Address Set  0 1  CCRAM Address   Character Generator RAM
DDRAM Address Set  1 L  DDRAM Address   Display RAM L=Line
Busy Flag/Adrs Read BF  Address       BF=Busy Flag
Data Write        8 Bits Data      CGRAM/DDRAM Common
Data Read         8 Bits Data      CGRAM/DDRAM Common


이 액정 표시기의 제어 내용의 자세한 것은 아래와 같이 Web로부터 다운로드할 수 있습니다.
페이지의 표중의 MSM6562B-1이 해당합니다.

http://www.oki.co.jp/semi/japanese/products/dis_chara.htm


【액정 표시기에의 제어 신호 출력 루틴】

그럼 실제로 액정 표시기에 Control 신호를 출력하는 써브루틴을 설명
합니다.
Control Command 신호이다고 하는 조건은, RS=R/W=0입니다.
4비트 모드로 접속하고 있으므로, 상위 4비트와 하위 4비트의 2회에
나누어  Command를 출력합니다.

;**** LCD command out *****
LCD_CMD
  MOVWF  DPDT   ;Command 데이터의 일시 보존
  ANDLW  0F0H   ;상위 4비트를 우선 출력
  MOVWF  PORTB   ;RB4-7의 데이타 버스에 출력
  BCF   PORTA, 1  ;R/W를 0에 세트 Command 조건 세트
  BCF   PORTA, 2  ;RS를 0에 세트
  BSF   PORTA, 0  ;E high 스트로브 신호 출력
  BCF   PORTA, 0  ;E low
  SWAPF  DPDT, W  ;
  ANDLW  0F0H   ;하위 4비트를 출력    
  MOVWF  PORTB   ;RB4-7에 출력
  BSF   PORTA, 0  ;스트로브 신호 출력
  BCF   PORTA, 0
  CALL   LCD_BUSY ;Busy 신호가 없어질 때까지 기다린다
  RETURN

【액정 표시기에의 표시 데이터 출력 루틴】

실제로 표시하기 위해서는 액정 표시기에 ASCII의 문자 코드를 송신합니다.
송신은 4비트마다 2회로 나누어 실시합니다.
데이터 송신 모드는, RS=0, R/W=1입니다.
문자를 표시할 때는, 커서는 우측으로 쉬프트 해 나가므로 상위측의
문자로부터 표시 출력을 합니다.
2행째에 표시할 경우에는, DDRAM Address Set의 Command로, Address
Data에 「C0」를 Set 해 출력하면(자) 2행째의 최초부터 표시합니다.

;**** LCD Data Write ****
LCD_DATA
    MOVWF  DPDT   ;표시 데이터(ASCII)의 일시 보존
    ANDLW  0F0H   ;상위 4비트 전송
    MOVWF  PORTB
    BCF   PORTA, 1  ;R/W를 0에 세트, 데이터 송신 모드 세트
    BSF   PORTA, 2  ;RS를 1에 세트
    BSF   PORTA, 0  ;E high 스트로브 신호 출력
    BCF   PORTA, 0  ;E low
    SWAPF  DPDT, W  ;get data lower
    ANDLW  0F0H   ;하위 4비트의 전송
    MOVWF  PORTB
    BSF   PORTA, 0  ;스트로브 신호 출력
    BCF   PORTA, 0
    CALL  LCD_BUSY ;Busy 신호가 없어질 때까지 기다린다
    RETURN

【액정 표시기의 Busy 대기 써브루틴】

액정 표시기의 내부 처리는, 각 커멘드마다 약 40 usec 정도 걸립니다.
(유일 Clear 커멘드만은 1.64 msec 걸립니다. )
이 처리 시간의 사이 「Busy」신호가 출력되고 있습니다. 따라서, 연속해
데이터 전송을 실시하기 위해서(때문에)는, 이 Busy 신호가 없어지는 것을 기다리고 나서 실시한다
필요가 있습니다. 아래와 같이는 이 Busy 신호가 없어질 때까지 기다리는 써브루틴
입니다. Busy 신호는 액정 표시기로부터의 입력이 되기 때문에, PIC측의
데이타 버스를 입력 모드로 변경해 줄 필요가 있어, 처리로서 한 치 귀찮음
됩니다. 이 입력 출력의 변환이 필요하기 (위해)때문에, PIC와 액정 표시
그릇과의 접속에는, 데이타 버스와 컨트롤 신호를 나누는 것이 사용하기 쉽다
됩니다.

;**** LCD Busy Check ************
LCD_BUSY
    CLRF  DPDT     ;데이터 버퍼 클리어
    BSF   STATUS, RP0  ;PIC 모드 변경을 위해 Bank1에 변환
    BSF   OPTION_REG, 7 ;포토 B의 pull-up를 OFF 지정
    MOVLW  0FEH     ;PORTBRB0 이외를 입력 모드에 세트
    MOVWF  TRISB
    BCF   STATUS, RP0  ;Bank 0에 되돌린다
    BCF   PORTA, 2   ;RS를 0에 세트
    BSF   PORTA, 1   ;R/W를 1에 세트 Busy 입력 모드를 세트
    BSF   PORTA, 0   ;E high 스트로브 신호 출력
    MOVF  PORTB, W   ;데이터를 2회로 나누어 입력
    BCF   PORTA, 0   ;E low
    ANDLW  0F0H     ;우선 상위 4비트를 입력
    MOVWF  DPDT     ;일시 보존
    BSF   PORTA, 0   ;E high 다음의 스트로브 신호 출력
    MOVF  PORTB, W   ;하위 4비트를 입력
    BCF   PORTA, 0   ;E low
    ANDLW  0FH     ;Mask out upper
    IORWF  DPDT, F    ;상위와 하위를 OR로 합병
    BTFSC  DPDT, 7    ;BUSY FLAG 비트를 체크
    GOTO  LCD_BUSY   ;Busy 상태라면 재차 입력 반복

    BCF   PORTA, 1   ;R/W를 0에 되돌린다(출력 모드에 되돌린다)
    BSF   STATUS, RP0  ;PIC의 모드 변경을 위해 Bank 1에 변환
    MOVLW  0EH     ;RB1, 2,3 이외는 출력에 되돌린다
    MOVWF  TRISB    ;PORTB 모드 세트
    BCF   STATUS, RP0  ;Bank 0에 되돌린다
    RETURN

【액정 표시기의 초기 리셋트 써브루틴】

마지막에 한 치 까다로운 초기 리셋트의 제어 써브루틴입니다.
이 액정 표시기는, 전원 입력시에 자동적으로 리셋트 처리를 합니다만,
그것이 잘 실행되지 않았던 때의 일을 생각해 소프트웨어에서도 초기
화 할 수 있게 되어 있습니다.
그 순서가 한 치 귀찮습니다. 우선 액정 표시기를 8비트 모드로 한다
일로부터 시작합니다. 또 이 시점에서는 Busy Flag는 신용 할 수 없기 때문에
사용하지 않게 해, 시간에 기다립니다.
이 개략의 처리의 흐름은 아래와 같이 됩니다.

  전원 ON
   ↓
 15 msec 이상 기다린다      BusyFlag는 사용하지 않는다
   ↓
 8비트 모드 설정
   ↓
 4.1 msec 이상 기다린다      BusyFlag는 사용하지 않는다
   ↓
 재차 8비트 모드로 설정
   ↓
 100 usec 이상 기다린다      BusyFlag는 사용하지 않는다
   ↓
 여러번 8비트 모드로 설정
   ↓
 4비트 모드로 설정 여기까지는 8비트 모드로 동작하고 있다
   ↓
 Function 설정 이 이후 4비트 모드로 BusyFlag도 유효
 Display Off 제어
 Display On제어
 Entry Mode 세트

  아래와 같이에 실제의 초기화 써브루틴을 설명합니다.

;**** Initialize *****
LCD_INI
    CALL   TIME5M   ;15 msec 이상 기다린다(5 msec3회대기로 하고 있다)
    CALL   TIME5M
    CALL   TIME5M
    MOVLW   030H    ;8비트 모드 설정 제어
    MOVWF   PORTB
    BCF    PORTA, 1  ;R/W 0 세트
    BCF    PORTA, 2  ;RS 0 세트
    BSF    PORTA, 0  ;E high 스트로브
    BCF    PORTA, 0  ;E low
    CALL   TIME5M   ;4. 1 msec 이상 기다린다(5 msec 대기)
    MOVLW   030H    ;재차 8비트 모드 설정 제어
    MOVWF   PORTB
    BCF    PORTA, 1  ;R/W 0 세트
    BCF    PORTA, 2  ;RS 0 세트
    BSF    PORTA, 0  ;E high 스트로브
    BCF    PORTA, 0  ;E low
    CALL   TIME100  ;100 usec 이상 기다린다
    MOVLW   030H    ;여러번 번 8비트 모드 설정 제어
    MOVWF   PORTB
    BCF    PORTA, 1  ;R/W 0 세트
    BCF    PORTA, 2  ;RS 0 세트
    BSF    PORTA, 0  ;스트로브
    BCF    PORTA, 0
    CALL   TIME100  ;만약을 위해 100 usec 대기
    MOVLW   020H    ;4비트 모드 설정 제어
    MOVWF   PORTB   ;(이 때는 아직 8비트 모드)
    BCF    PORTA, 1  ;R/W 0 세트
    BCF    PORTA, 2  ;RS 0 세트
    BSF    PORTA, 0  ;스트로브
    BCF    PORTA, 0
    CALL   TIME100  ;만약을 위해 100 usec 대기
;이후 4비트 모드로 동작 또한 BusyFlag 유효
    MOVLW   02CH    ;Function Set(2행, 5 x10Dot 표시 지정)
    CALL   LCD_CMD
    MOVLW   08H    ;Display off (Cursor, Blink 없음)
    CALL   LCD_CMD
    MOVLW   0CH    ;Display on (Cursor, Blink 없음)
    CALL   LCD_CMD
    MOVLW   06H    ;Entry Mode Set(Increment, 표시 쉬프트 지정)
    CALL   LCD_CMD
    RETURN
그런데 다음는 다이나믹 표시 제어의 노하우입니다.


     다음에      목차 페이지로