이글의 전부 또는 일부, 사진, 소스프로그램 등은 저작자의 동의 없이는 상업적인 사용을 금지합니다. 또한, 비상업적인 목적이라하더라도 출처를 밝히지 않고 게시하는 것은 금지합니다.


 

1편의 준비에 이어 이번 글에서는 프로그램에 관하여 다루겠습니다. 이번 글에서는 MGG19264로 명령과 데이터를 전달하는 함수를 만들고, ST7565P를 제어하는 명령들을 정리해 보겠습니다. 본격적으로 초기화하고, 문자를 출력하기 위한 폰트 준비 등은 다음 글인 3편에서 다룰 예정입니다.

 

MGG19264 데이터시트에는 프로그래밍 과정에 필요한 정보가 거의 없습니다. 심지어는 데이터 및 명령 전송에 필요한 Timing chart조차도 없습니다. 결국 컨트롤러인 ST7565P의 데이터시트를 찾아 보는 수 밖에 없습니다.

 

ST7565P의 데이터시트를 살펴 보니, 이 컨트롤러는 SPI 통신도 가능하고, 6800 방식과 8080 방식 모두 지원합니다. PSB핀이 low이면 4핀 SPI 통신을 하고, 이 핀이 high 일 때 C86 핀이 high이면 6800 방식, low이면 8080 방식을 지원하는 것으로 되어 있습니다. MGG19264는 SPI 언급이 없는 것으로보아 SPI는 지원하지 않는 듯합니다. 반면에 MGG19264 데이터시트에 6800 방식과 8080 방식을 모두 언급한 것으로 보아, 내부적으로 C86핀을 어떻게 처리했는지는 몰라도 두 가지 방식을 다 지원하는 듯합니다. 실제로 두 가지 방식 모두 다 동작함을 확인하였습니다.

 

본 글에서는 8080 방식으로 제어하는 것을 위주로 하되, 6800 방식으로 명령과 데이터를 전송하는 함수는 작성하도록 합니다. 한 가지 아직 확인하지 못한 사항이 있음을 제약 조건으로 제시합니다. ST7565P의 상태와 메모리 상의 데이터를 읽어 올 수 있습니다만, 어쩐 일인지 실제로는 제대로 동작하지 않고 있습니다. 데이터시트 상에 있는대로 dummy read를 포함시킨 함수를 작성하여 동작시킴에도 불구하고 정상 동작하지 않고 있습니다. 차후에 문제점을 해결하여 보완하도록 하겠습니다.

 

 

 

 

1. 준비

 

앞의 1편에서 연결한 내용을 토대로 매크로를 작성합니다.

.EQU G19264_DATA_PORT = PORTC
.EQU G19264_DATA_DDR  = DDRC
.EQU G19264_DATA_PIN  = PINC
.EQU G19264_CTRL_PORT = PORTD
.EQU G19264_CTRL_DDR  = DDRD
.EQU G19264_CTRL_PIN  = PIND
.EQU G19264_E_RD      = PD7
.EQU G19264_RW_WR     = PD6
.EQU G19264_RS        = PD5
.EQU G19264_CS1       = PD4
.EQU G19264_CS2       = PD3
.EQU G19264_RESET     = PD2 

 

제일 먼저 사용할 포트 값을 초기화 해야합니다. 8080 방식으로 제어하는 경우, MGG19264를 제어하는 핀들의 값을 평상시에는 모두 high 값을 갖도록 하다가 필요시에만 low로 하는 방식으로 제어합니다. 즉,  RD, WR, /CS1, /CS2를 포함한 모든 신호를 high로 하고 있다가 명령을 write하는 함수 내에서 GLCD_RS와 GLCD_RW_WR, 제어하려는 칩의 CS를 low로 하여 데이터를 전송한 후에 다시 GLCD_RS와 GLCD_WR, 제어하려는 치의 CS를 high로 돌려 놓습니다.

 

프로그램의 시작 위치 적당한 곳에 아래와 같은 코드를 넣어 줍니다.

 

.EQU G19264_CTRL_DDR_VALUE  = (1 << G19264_E_RD) | (1 << G19264_RW_WR) | (1 << G19264_RS) | (1 << G19264_CS1) | (1 << G19264_CS2) | (1 << G19264_RESET)
    LDI  AL,0xFF
    OUT  G19264_DATA_DDR,AL
    LDI  AL,G19264_CTRL_DDAR_VALUE
    OUT  G19264_CTRL_DDR,AL
    OUT  G19264_CTRL_PORT,AL

 

 

 

MGG19264는 컨트롤러를 두 개 사용합니다. 명령이나 데이터를 전송 또는 읽고자하는 위치에 따라 chip1이나 chip2를, 경우에 따라서는 동시에 두 chip을 제어해야할 수도 있습니다. 이를 위해서 컨트롤러 칩이 두 개 있었던 문자형 LCD LCM4004A에서 사용했던 것처럼 레지스터 변수 CURRENT_CS를 사용하도록 하겠습니다.

 

MGG19264를 대상으로 제일 처음해야할 일은 초기화일 것입니다. 초기화는 두 칩 모두에 해야하기 때문에 CURRENT_CS의 초기화 값으로 두 칩이 모두 동작하도록 다음과 같이 넣습니다.

 

.DEF CURRENT_CS = R22
    LDI  CURRENT_CS,((1 << G19264_CS1) | (1 << G19264_CS2))

 


 

 

 

2. 명령 및 데이터 전송 함수 작성

 

 

 

 

1) 8080 방식의 명령 및 데이터 전송 함수

 

 

ST7565P 데이터시트에 있는 8080 방식 제어에 적용되는 Timing chart입니다.

 


 

 

다음은 MGG19264에 명령을 전송하는 함수 G19264_WRITE_COMMAND 함수와 데이터를 전송하는 함수 G19264_WRITE_DATA 함수입니다.

 

//////////////////////////////////////////////////
// G19264_WRITE_COMMAND
// PARAM     : AL(command), CURRENT_CS
// RETURN    : NONE
// CHANGED : NONE
//////////////////////////////////////////////////
G19264_WRITE_COMMAND:
    PUSH AH
    STS  G19264_DATA_PORT,AL       // put command on DATA port
    IN   AH,G19264_CTRL_PIN
    COM  CURRENT_CS                // set low CURRENT_CS
    AND  AH,CURRENT_CS
    CBR  AH,1 << G19264_RS         // set low RS
    CBR  AH,1 << G19264_RW_WR      // set low WR
    OUT  G19264_CTRL_PORT,AH
    COM  CURRENT_CS
    OR   AH,CURRENT_CS             // set high CURRENT_CS
    SBR  AH,1 << G19264_RS         // set high RS
    SBR  AH,1 << G19264_RW_WR      // set high WR
    OUT  G19264_CTRL_PORT,AH
    POP  AH
    RET 

 

 

레지스터 AL에 전송할 명령을 넣고 G19264_WRITE_COMMAND 함수를 호출합니다. G19264_WRITE_COMMAND 함수는 AL에 있는 명령을 DATA port에 출력합니다. 그 후에 CURRENT_CS로 선택한 칩의 CS와 G19264_RS, G19264_RW_WR 신호를 모두 low 상태로 했다가, 이 신호들을 모두 high로 함으로써 명령을 전송합니다.

 

다음은 GLCD로 데이터를 전송하는 G19264_WRITE_DATA 함수입니다. 데이터이므로 RS를 low로 하지 않는 점을 제외하면 G19264_WRITE_COMMAND 함수와 동일합니다. 참고로 앞에서 언급했듯이 모든 GLCD 제어 신호는 평상시 high 상태로 있도록 설계하였기 때문에, 굳이 G19264_RS 신호를 high로 설정하지 않아도 잘 동작합니다. 

//////////////////////////////////////////////////
// G19264_WRITE_DATA
// PARAM AL(data), CURRENT_CS
// RETURN NONE
// CHANGED NONE
//////////////////////////////////////////////////
G19264_WRITE_DATA: 
    PUSH  AH
    STS   G19264_DATA_PORT,AL
    IN    AH,G19264_CTRL_PIN
    COM   CURRENT_CS
    AND   AH,CURRENT_CS
    CBR   AH,1 << G19264_RW_WR
    OUT   G19264_CTRL_PORT,AH
    COM   CURRENT_CS
    OR    AH,CURRENT_CS
    SBR   AH,1 << G19264_RW_WR
    OUT   G19264_CTRL_PORT,AH
    POP   AH
    RET

 

 

 

 2) 6800 방식의 명령 및 데이터 전송 함수

 

 


 

6800 방식으로 명령을 전송하는 함수입니다. 6800 방식으로 명령을 전송할 때에는 E 신호가 high에서 low로 내려 갈 때에 데이터가 latch됩니다. 이로 인하여 8080 방식과 달리 평상시에 G19264_E_RD 신호는 low를 유지하고 있다가 명령이나 데이터를 전송할 때에 high가 되었다가 low로 가는 펄스를 보내도록 해야 합니다.

 

//////////////////////////////////////////////////
// G19264_WRITE_COMMAND
// PARAM AL(command)
// RETURN NONE
// CHANGED NONE
//////////////////////////////////////////////////
G19264_WRITE_COMMAND:
    PUSH AH
    OUT  G19264_DATA_PORT,AL
    IN   AH,G19264_CTRL_PIN
    COM  CURRENT_CS
    AND  AH,CURRENT_CS
    CBR  AH,1 << G19264_RS
    CBR  AH,1 << G19264_RW_WR
    SBR  AH,1 << G19264_E_RD
    OUT  G19264_CTRL_PORT,AH
    COM  CURRENT_CS
    OR   AH,CURRENT_CS
    SBR  AH,1 << G19264_RS
    SBR  AH,1 << G19264_RW_WR
    CBR  AH,1 << G19264_E_RD
    OUT  G19264_CTRL_PORT,AH
    POP  AH
    RET 

 

데이터를 전송하는 함수는 위의 G19264_WRITE_COMMAND 함수에서 G19264_RS 신호를 low로 하는 부분(CBR    AH,1 << G19264_RS)만 제거하면 되므로 생략합니다.

 

 

 

3. ST7565P 제어 명령

 

 

ST7565P의 제어 명령이 약 20개 정도 되는 듯합니다. 본 글에서는 이 제어 명령들을 정리하면서 마칩니다. 본격적인 초기화 및 화면 표시는 이어지는 3편에서 다룰 예정입니다.

 

※ 명령 설명의 ()안은 0b로 시작하는 2진수이며, 명령 중 d로 표시된 부분은 명령이 필요로 하는 인수가 들어갈 자리입니다.

 

 

 

1) Display On/Off : 0xAE (0b1010111d)

 

마지막 비트가 1 이면 Display On이고, 이 비트가 0이면 Display Off입니다. 실제 프로그램에서는 다음과 같이 매크로로 정의해서 사용합니다.

 

.EQU SP7565P_DISPLAY_ON  = 0xAF
.EQU SP7565P_DISPLAY_OFF = 0xAE

 

 

 

2) Set Start Line : 0x40 (0B01dddddd)

 

.EQU SP7565P_STARTLINE_CMD = 0x40

 

 화면의 첫 행으로 표시할 Display Data Ram을 지정합니다. 이 명령으로 지정된 주소가 첫 행으로 표시됩니다. 주소값은 하위 비트인 D0 ~ D5로 지정합니다. D0 ~ D5는 6비트이므로, Start Line으로 지정할 수 있는 값의 범위는 0x00(0) ~ 0x3F(63)입니다.

 

 

 

3) Set Page Address : 0xB0 (0b1011dddd)

 

 

.EQU SP7565P_PAGE_CMD = 0xB0

 

ST7565P의 메모리 맵은 다음 그림과 같습니다.

 


 

 

위 그림에서 보듯이 ST7565P는 메모리 상의 한 바이트가 Y축 방향으로 8개의 픽셀로 출력됩니다. 맨 위의 픽셀이 D0에 해당하고 맨 아래의 여덟번째 픽셀이 D7에 해당합니다. 이렇게 한 바이트가 표시하는 Y축으로의 8점, 즉 한 바이트를 한 개의 page로 취급합니다. 데이터를 출력할 화면 상의 Y축 위치에 따라 page를 지정해 주어야 합니다. ST7565P는 Y축으로 최대 65 행을 다룰 수 있으므로 page 값은 0부터 8까지입니다. page 8은 1픽셀만 사용할 수 있습니다. 물론 MGG19264는 GLCD의 행이 64행에 불과하므로 page 8은 실질적 의미가 없습니다. 이 명령의 D0 ~ D4에 필요한 page를 지정해야 합니다.

 

 

 

4) Set Column Address : 0x10(0b0001dddd), 0x00(0b0000dddd)

 

.EQU SP7565P_COLUMN_CMD = 0x10

 

이 명령은 두 바이트를 전송하는 명령입니다. 이 명령은 데이터를 출력하려는 열을 지정합니다. ST7565P는 최대 132열까지 관리할 수 있으므로 열의 값은 0(0x00)부터 131(0x83)까지 입니다. 따라서 열을 지정하는 비트는 8비트이어야 합니다. 8비트를 상하 각각 4비트로 나누어 두 번에 전송합니다. 예를 들어 18(0x12)열에 데이터를 출력하려면 다음과 같이 두 바이트의 명령을 보내야 합니다.

 

첫 바이트 0x11(명령어 0x10 + 상위 4비트 0x01)

두번째 바이트 0x02(명령어 0x00 + 하위 4비트 0x02)

 

앞의 1편에서 언급했듯이 MGG19264는 ST7565P의 0x12(18)열부터 0x71(113)열까지 0x5F(96) 개의 열을 사용합니다.

 

데이터를 출력할 위치는 다음과 같이 결정합니다.

① Y축의 위치에 따라 page를 계산

② Set Page Address(0x40)으로 page를 지정

③ Set Column Address(0x10, 0x00)로 X축 위치를 지정

 

 

 

5) Read Status

 

GLCD_RS를 low로 하고 읽기 작업을 수행하면 그 결과는 다음과 같습니다.

 


 

BUSY : 이 값이 1이면 현재 GLCD가 다른 작업을 다 마치지 못하였다는 의미입니다.


MX : 이 값이 0이면 입력되는 데이터의 열이 역방향으로 출력됩니다. 즉 SEG131부터 SEG0의 방향으로 진행됩니다. 이 값이 1이면 정방향 SEG0부터 SEG131 방향으로 진행됩니다.

 

D : 이 값이 0이면 Display Off 상태이고, 이 값이 1이면 Display On 상태입니다.

 

RST : 하드웨어 혹은 소프트웨어 RESET 중일 때에는 이 값이 1을 유지합니다.

 

 

 

6) SEG Direction : 0xA0(0b1010000d)

 

.EQU SP7565P_SEGMODE_NORMAL  = 0xA0
.EQU SP7565P_SEGMODE_REVERSE = 0xA1

 

열의 진행 방향을 결정합니다.

d 값이 0이면 열이 역 방향( SEG131부터 SEG0)으로 진행하고, 이 값이 1이면 정방향(SEG0부터 SEG131의 방향)으로 진행한다.

 

 

 

7) Inverse Display : 0xA6(0b1010011d)

 

.EQU SP7565P_DISPLAY_NORMAL  = 0xA6
.EQU SP7565P_DISPLAY_REVERSE = 0xA7

 

d 값이 0이면 정상적인 문자를 출력하며, 이 값이 1이면 역상으로 출력합니다. Data Ram의 내용은 변하지 않습니다.

 

 

 

8) All Pixel On : 0xA4(0b1010010d)

 

.EQU SP7565P_ALL_NORMAL = 0xA4
.EQU SP7565P_ALL_PIXEL  = 0xA6

 

d 값이 1이면 모든 pixel을 On 시키며, 이 값이 0이면 이 모드를 해제합니다.

 

 

 

9) Bias Select : 0xA2(0b1010001d)

 

 

.EQU SP7565P_LCD_BIAS_9 = 0xA5 
.EQU SP7565P_LCD_BIAS_7 = 0xA6

 

MGG19264의 BIAS 비율을 결정합니다. MGG19264의 경우 d가 0이면 bias 값으로 1/9을 사용하며, 1이면 bias 값으로 1/7을 사용한다.

1/9 bias를 사용하는 경우 MGG19264 내부에서 사용하는 전압값은 다음과 같습니다.

V1 = 8/9 * V0,  V2 = 7/9 * V0, V3 = 2/9 * V0, V4 = 1/9 * V0

 

 

 

10) Read-Modify-Write : 0xE0(0b11100000)

 

.EQU SP7565P_MODIFY = 0xE0

이 명령은 다음에 설명하는 SP7565P_END 명령과 짝을 이루어 사용합니다. 이 명령이 전송되면 데이터를 기록할 때에는 Data Ram Address를 1 증가시키지만, 읽을 때에는 Data Ram Address를 증가시키지 않습니다. 이런 기능은 커서를 깜박이게 하는 등 한 영역에서의 입출력이 잦을 때에 MPU의 부하를 줄이는데 도움이 됩니다. 이 기능은 SP7565P_END 명령을 전송하면 중지합니다.

 

 

 

11) End : 0xEE(0b11101110)

 

.EQU SP7565P_END = 0xEE

 

이 명령을 전송하면 Read-Modify-Write 기능이 중단되며, Data Ram Address 값을 Read-Modify-Write 명령이 전송된 당시의 값을 갖도록한다.

 

 

 

12) Reset : 0xE2(0b11100010)

 

.EQU SP7565P_RESET = 0xE2

 

소프트웨어 reset입니다. 이 명령은 Start Line(명령 0x40), Page Address(명령 0xB0), Column Address(명령 0x40), COM Direction(명령 0xC0)을 디폴트 값으로 설정합니다. 소프트웨어 reset은 하드웨어 리셋과 같지 않아서 전원 설정 등과 같은 내용은 초기화하지 않습니다.

 

 

 

13) COM Direction : 0xC0(0b1100dxxx)

 

.EQU ST7565P_COMMODE_NORMAL  = 0xC0
.EQU ST7565P_COMMODE_REVERSE = 0xC8

 

행(common)의 진행 방향을 결정합니다. d의 값이 0이면 정상 방향(COM0으로부터 COM63)으로, 이 값이 1이면 역방향(COM63에서부터 COM0)으로 진행합니다.

 

 

 

14) Power Control : 0x28(0b00101ddd)

 

.EQU SP7565P_PWR_SET            = 0x28
.EQU ST7565P_BOOSTER_ON         = 0x04
.EQU ST7565P_BOOSTER_OFF        = 0x00
.EQU ST7565P_REGULATOR_ON       = 0x02
.EQU ST7565P_REGULATOR_OFF      = 0x00
.EQU ST7565P_FOLLOW_CIRCUIT_ON  = 0x01
.EQU ST7565P_FOLLOW_CIRCUIT_OFF = 0x00

 

ST7565P 내부에 있는 전원 회로의 동작 여부를 결정합니다. D0 ~ D2는 각각 Follower 회로, Regulator, Booster의 동작을 결정합니다. 통상적으로는 세 전원회로를 동시에 켜꺼나 끕니다.

 

 

 

15) Reguration Ratio : 0x20(0b00100ddd)

 

.EQU SP7565P_REGULATE_CMD = 0x20

 

Reguration Ratio는 다음 명령에 의해 결정되는 EV 값과 함께 V0의 값을 결정합니다. V0를 구하는 공식은 다음과 같습니다.

 

V0 = Regulation Ratio * [(99 + EV) / 162] * 2.1

 

D0 ~ D2 값에 의한 Regulation Ratio는 다음의 표와 같습니다.

D2

D1

D0

Regulation Ratio

0

0

0

3.0

0

0

1

3.5

0

1

0

4.0

0

1

1

4.5

1

0

0

5.0

1

0

1

5.5

1

1

0

6.0

1

1

1

6.5

 

 

 

16) Set EV : 0x81(0b10000001), 0x00(0b00dddddd)

 

.EQU SP7565P_SETEV_CMD = 0x81

 

이 명령은 두 바이트 명령입니다. 첫 명령으로 Set EV 명령(0x81)을 전송하고 다음 명령으로 EV(Electric Volume) 값을 보냅니다. EV 값은 6비트이므로 0(0x00)부터 63(0x3F) 사이의 값을 지정해야 합니다. 데이터시트에서는 contrast 조정을 쉽게하기 위해서 EV 값으로 중앙값인 31(0x1F)을 권장하고 있습니다.

 

 

 

17) Power Save

 

Display Off(0xAF) 후에 Display All Points On(0xA6)을 전송하면 절전 모드로 진입합니다. Display All Points Off(0xA4)를 전송하면 절전 모드에서 벗어납니다.

 

절전 모드에서는 내부의 oscillation 회로와 전원 회로가 정지하고 모든 common driver와 segment driver의 출력이 Vss(0V)로 됩니다.

 

 

 

18) Set Booser : 0xF8(0b11111000), 0x00(0b000000dd)

 

.EQU SP7565P_SETBOOST_CMD = 0xF8

 

이 명령은 두 바이트를 전송해야하는 명령입니다. 이 명령은 내부의 레귤레이터에 전원을 공급하는 전원회로를 제어하는 명령입니다. 이 소프트웨어 명령에 따라 하드웨어 연결을 바꾸어야 합니다. 하드웨어 연결과 소프트웨어 설정이 맞지 않으면 ST7565P는 필요없는 전력을 낭비할 수는 있지만, 이로 인해 ST7565P가 고장나지는 않습니다.

 

 D1

D0 

Boost Level

0

0

x2, x3, x4

0

1

x5

1

1

x6

 

 

이상으로 ST7565P 제어 명령에 대한 설명을 마칩니다. 3편에서는 실제로 사용할 수 있도록 MGG19264를 초기화 하는 함수를 만들어 보겠습니다. 아울러 ST7565P의 화면 표시 방식이 기존의 LTBE9H372K8K나 TG322431과 다른 점을 살펴보고, 이에 따른 폰트 재구성 방법에 대하여 살펴 보도록 하겠습니다.

 



블로그 이미지

엠쿠스

Microprocessor(STM32, AVR)로 무엇인가를 만들어 보고자 학습 중입니다.

,