[AVR] GLCD제어_KS0108 - 3편(점 찍기, 프로테우스)
저번 시간에 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);
}
}
}
'AVR > GLCD' 카테고리의 다른 글
[AVR] GLCD제어_KS0108 - 4편(Hello World, 문자 출력) (0) | 2021.01.07 |
---|---|
[AVR] GLCD제어_KS0108 - 2편(핀 기능 정리, 인터페이스) (0) | 2021.01.05 |
[AVR] GLCD제어_KS0108 - 1편(작동원리, 데이터시트) (0) | 2021.01.05 |