【액정 표시기와의 접속】
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 |