CHERISOFT

저번 시간에 GLCD를 작동법을 알았으니 이번에는 실습으로 넘어가서 점을 출력시켜보자.

 

본 강의를 진행 환경은 다음과 같다.

IDE : CodevisionAVR(코드비전AVR)

시뮬레이션 : Proteus(프로테우스) 로 진행을 한다.

AVR : ATMEGA328 (다른 AVR도 상관없다.)

 

프로그래밍

저번 시간에 작동시키기 위한 4가지 동작을 말했다.

 

첫 번째로 Display On 시키기

두 번째로 CS핀 활성화 시키기

세 번째로 좌표찍기

네 번째로 데이터 출력하기

 

첫 번째와 두 번째 동작을 묶어서 'GLCD_ON'이라는 함수로 만들고
좌표 찍는 동작을 GLCD_XY 함수, 데이터 출력을 GLCD_Write 함수로 만들겠다.

 

먼저, 각 핀에 해당하는 이름들을 정의해주는 작업이 먼저 필요할 것 같다.

#define GLCD_DDR_Data    DDRB
#define GLCD_Data        PORTB

#define GLCD_DDR_Control DDRC
#define GLCD_Control     PORTC
#define GLCD_CS1         PORTC.4
#define GLCD_CS2         PORTC.3
#define GLCD_RS          PORTC.2 //RS = DI
#define GLCD_RW          PORTC.1
#define GLCD_EN          PORTC.0 

 

나같은 경우에는 이렇게 정의를 해주겠다. 이름은 각자 편한대로 정의하여 사용하자.

GLCD_Data는 DB0~7을 의미한다.

 

GLCD_ON 함수 만들기

GLCD 디스플레이를 ON시키려면 어떻게 해야하는 지는 위에 쉽게 나와있다.

void GLCD_ON(void)
{
    //LCD에 연결된 핀들을 출력방향 설정
    GLCD_DDR_Data = 0XFF;
    GLCD_DDR_Control = 0xFF;
    
    //디스플레이 켜기
    GLCD_RS = 0;          
    GLCD_RW = 0;          
    GLCD_Data = 0x3F; //0B00111111 
    
    //Enable 펄스
    GLCD_EN = 1;
    delay_us(5);
    GLCD_EN = 0;
    delay_us(5);
    
    //CS1핀 활성화
    GLCD_CS1 = 1;
}

먼저 조건에 맞도록  RS, RW핀을 L로 하고 데이터를 00111111을 보내준다.

그리고 명령이 들어가도록 E펄스를 보내준다.

 

CS핀 활성화도 마지막에 같이 넣어줬다.

 

GLCD_XY 함수 만들기

위 기능표에 나온 것 중 진짜 좌표명령은 두 개(X address, Y address)이다.

Z address는 좌표가 아니니 제외한다.

헷갈릴 수 있는 점은 기능표에 나와있는 X address는 진짜 X좌표가 아니라는 것이다.

사진과 같이 우리가 알고있는 X좌표를 제어하는 것은 Y address이다.

그 반대로, Y좌표는 X address가 담당한다.

이 점을 매우 유의해야 한다.

 

또한 X좌표는 1단위로 선택할 수 있는데 반해 Y좌표는 Page로 선택을 할 수 밖에 없다.

X좌표(Y address)는 0부터 63까지 선택가능

Y좌표(X address)는 0부터 7까지의 8개의 섹터만을 선택할 수 있다는 것이다.

 

우리가 12864 GLCD를 사용한다고 해서 Y값을 64개를 사용하는 게 아니라는 점을 인지해야 한다.

또, X값도 128개를 사용하려면 CS1,2를 이용하여 코드를 짜야한다.

void GLCD_XY(unsigned short x, unsigned short y)
{
    unsigned short X_Data, Y_Data;

    GLCD_RS = 0;
    GLCD_RW = 0;
    
    if(x>63)
    {
        GLCD_CS1 = 0;
        GLCD_CS2 = 1;
        X_Data = x;    
    }
    else
    {
        GLCD_CS1 = 1;
        GLCD_CS2 = 0;
        X_Data = x-64;        
    }
    
    //x 좌표
    GLCD_Data = (X_Data | 0X40) & 0X7F; //Y address(6BIT_0-63)
    //Enable 펄스 
    GLCD_EN = 1;
    delay_us(5);
    GLCD_EN = 0;
    delay_us(5);
    
    //Y 좌표
    GLCD_Data = (y | 0XB8) & 0XBF; //X address(3BIT_0-7)
    //Enable 펄스 
    GLCD_EN = 1;
    delay_us(5);
    GLCD_EN = 0;
    delay_us(5);
}

우리가 X값을 입력할 때 0~127까지 사용하려면 X값이 63가 초과되면 CS1을 비활성화하고 CS2를 활성화 시킨 뒤,

입력된 X값에서 64를 뺀 좌표 값을 넣어 주면 된다.

 

GLCD_Write 함수 만들기

좌표 함수에 비하면 누워서 떡먹기 수준이다.

기능표에 나와있는 대로 만들면 아주 쉽게 만들 수 있다.

void GLCD_Write(unsigned short data)
{
    GLCD_RS = 1;
    GLCD_RW = 0; 
    
    GLCD_Data = data;
    delay_us(1);
    
    //Enable 펄스
    GLCD_EN = 1;
    delay_us(5);
    GLCD_EN = 0;
    delay_us(5);
}

 

<전체코드> 

#include <mega328.h>
#include <delay.h>

#define GLCD_DDR_Data    DDRB
#define GLCD_Data        PORTB

#define GLCD_DDR_Control DDRC
#define GLCD_Control     PORTC
#define GLCD_CS1         PORTC.4
#define GLCD_CS2         PORTC.3
#define GLCD_RS          PORTC.2 //RS = DI
#define GLCD_RW          PORTC.1
#define GLCD_EN          PORTC.0 

void GLCD_ON(void);
void GLCD_XY(unsigned short x, unsigned short y);
void GLCD_Write(unsigned short data);
void Enable_Pulse(void);

void main()
{
    GLCD_ON();
    GLCD_XY(0,0);    
    GLCD_Write(1);
}

void GLCD_ON(void)
{
    //LCD에 연결된 핀들을 출력방향 설정
    GLCD_DDR_Data = 0XFF;
    GLCD_DDR_Control = 0xFF;
    
    //디스플레이 켜기
    GLCD_RS = 0;          
    GLCD_RW = 0;          
    GLCD_Data = 0x3F; //0B00111111 
    Enable_Pulse();
    
    //CS1핀 활성화
    GLCD_CS1 = 1;
}

void GLCD_XY(unsigned short x, unsigned short y)
{
    unsigned short X_Data, Y_Data;

    GLCD_RS = 0;
    GLCD_RW = 0;
    
    if(x>63)
    {
        GLCD_CS1 = 0;
        GLCD_CS2 = 1;
        X_Data = x;    
    }
    else
    {
        GLCD_CS1 = 1;
        GLCD_CS2 = 0;
        X_Data = x-64;        
    }
    
    GLCD_Data = (X_Data | 0X40) & 0X7F; //Y address(6BIT_0-63) 
    Enable_Pulse();
    
    GLCD_Data = (y | 0XB8) & 0XBF; //X address(3BIT_0-7)
    Enable_Pulse();
}

void GLCD_Write(unsigned short data)
{
    GLCD_RS = 1;
    GLCD_RW = 0; 
    
    GLCD_Data = data;
    delay_us(1);
    Enable_Pulse();
}

void Enable_Pulse(void)
{
   GLCD_EN = 1;
   delay_us(5);
   GLCD_EN = 0;
   delay_us(5);
}

※ Enable 펄스를 함수로 만든 코드이다.

 

시뮬레이션(Proteus)

지금까지 작성한 코드를 돌려보면 아래와 같이 점이 찍힌다.

기본 코드를 적용했을 때 결과

<응용>

void main()
{   
    int x, y;
    
    GLCD_ON();
         
    for(x=0; x<128; x+=2)
    {
        for(y=0; y<8; y++)
        {
            GLCD_XY(x,y);     
            GLCD_Write(1);
        }
        
    }
    
}

void main()
{   
    int x, y;
    
    GLCD_ON();
         
    for(x=0; x<128; x+=2)
    {
        for(y=0; y<8; y++)
        {
            GLCD_XY(x,y);     
            GLCD_Write(0XAA);
        }
        
    }
    
}