728x90
반응형
텍스트형 LCD
[모델명]HY-160W-204
<그림 1>
<그림 2>
<그림 3>
<그림 4>
<그림 5>
<그림 6>
<데이터 시트>
LCD창에 문자를 출력하도록 하자
회로 구성은 위 그림의 4, 5번 챕터를 참고하여 구성하면된다
참고로 코딩할 때의 번거로움을 없애기 위해 데이터핀 7~14는 ARM의 PA0~PA7 번으로 출력하게끔 하였다.
하나의 설정을 하기 위해서는 다음과 같이 <그림 4>의 타이밍도를 보고
타이밍도에 맞게 코딩을 하면 된다
PIO_CODR = RS; //RS -LOW : Instruction register( <그림 5>)
PIO_CODR = RW; //R/W - LOW : Write
Delayms(1); //Tsu1
PIO_SODR =E; //E - High : Enable
Delayms(1);
PIO_SODR = set; //set : <그림 5>를 보고 원하는 설정 값을 넣는다
Delayms(1);
PIO_CODR=E; //E - Low : disable
Delayms(1); //Tsu2
PIO_CODR = set;
PIO_SODR = set; //set : <그림 5>를 보고 원하는 설정 값을 넣는다
Delayms(1);
PIO_CODR=E; //E - Low : disable
Delayms(1); //Tsu2
PIO_CODR = set;
위와 같이 하나의 설정을 하기 위해, 하나의 타이밍도를 그려주면된다,
한번의 설정에 이렇게 한번 프로그램을 짜야 하기 때문에 Instruction 명령부분을 함수로 만들어서 인자로 설정값을 넘겨주면 되겠다
문자 '0'을 출력을 해보자
//---------- 입출력 IO설정
#define PIO_PER (*(volatile unsigned int *) 0xFFFFF400)
#define PIO_OER (*(volatile unsigned int *) 0xFFFFF410)
#define PIO_SODR (*(volatile unsigned int *) 0xFFFFF430)
#define PIO_CODR (*(volatile unsigned int *) 0xFFFFF434)
//---------- 전력 제어 설정
#define PMC_PCER (*(volatile unsigned int *) 0xFFFFFC10)
/////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////
#define MASTERCLOCK 48000000
#define RS 1<<11
#define RW 1<<12
#define E 1<<13
//--------- 딜레이 함수
void Delayms(unsigned int ms)
{
volatile unsigned int count;
volatile unsigned int countmax = (MASTERCLOCK / 10000) * ms;
{
volatile unsigned int count;
volatile unsigned int countmax = (MASTERCLOCK / 10000) * ms;
for(count = 0; count < countmax; count++);
}
}
////////////////////////////////////////////
void LCD_Instruction(int set)
{
PIO_CODR = RS;
PIO_CODR = RW;
PIO_SODR =E;
Delayms(1);
PIO_SODR = set;
Delayms(1);
PIO_CODR=E;
Delayms(1);
PIO_CODR = set;
}
{
PIO_CODR = RS;
PIO_CODR = RW;
PIO_SODR =E;
Delayms(1);
PIO_SODR = set;
Delayms(1);
PIO_CODR=E;
Delayms(1);
PIO_CODR = set;
}
void LCD_Data(const char* data, int Delaytime)
{
int i;
for(i=0; *(data+i)!=0; i++)
{
PIO_SODR = RS;
PIO_CODR = RW;
Delayms(1);
PIO_SODR = E;
Delayms(1);
PIO_SODR = data[i];
Delayms(1);
PIO_CODR=E;
Delayms(1);
PIO_CODR = data[i];
Delayms(Delaytime);
}
return;
}
{
int i;
for(i=0; *(data+i)!=0; i++)
{
PIO_SODR = RS;
PIO_CODR = RW;
Delayms(1);
PIO_SODR = E;
Delayms(1);
PIO_SODR = data[i];
Delayms(1);
PIO_CODR=E;
Delayms(1);
PIO_CODR = data[i];
Delayms(Delaytime);
}
return;
}
int main(void)
{
PMC_PCER = 1<<2;
PIO_PER = 0x0000ffff;
PIO_OER = 0x0000ffff;
Delayms(30);
PIO_CODR=0xffffffff;
LCD_Instruction(0x38);
LCD_Instruction(0x06);
LCD_Instruction(0x1c);//글자쓰고 커서를 이동시킨다
LCD_Instruction(0x0c);
LCD_Instruction(0x01);
PIO_PER = 0x0000ffff;
PIO_OER = 0x0000ffff;
Delayms(30);
PIO_CODR=0xffffffff;
LCD_Instruction(0x38);
LCD_Instruction(0x06);
LCD_Instruction(0x1c);//글자쓰고 커서를 이동시킨다
LCD_Instruction(0x0c);
LCD_Instruction(0x01);
LCD_Data("KIM ", 500);//data표에서 예를 들어 '0'을 출력하고 싶다면, 00110000 을 해도 되지만
//00110000을 10진수로 바꾸어 보면 '0'의 아스키코드 48임을 알수있다
//이를 통해 아스키코드에 있는 문자는 굳이 data테이블을 보지 않더라도
//편하게 출력할 수 있다
Delayms(1);
while(1)
{
}
//00110000을 10진수로 바꾸어 보면 '0'의 아스키코드 48임을 알수있다
//이를 통해 아스키코드에 있는 문자는 굳이 data테이블을 보지 않더라도
//편하게 출력할 수 있다
Delayms(1);
while(1)
{
}
return 0;
}
}
Charater를 출력할 때
RS - High : data register 이다
0을 찍고 싶다면 <그림 6>을 보고 하면 되겠다
1. '0'을 출력
(upper4bit) : LLHH
(low4bit) : LLLL
= 00110000
PIO_SODR = RS;
PIO_CODR = RW;
Delayms(1);
PIO_SODR = E;
Delayms(1);
PIO_SODR =00110000;
Delayms(1);
PIO_CODR=E;
Delayms(1);
PIO_CODR = 00110000;
하면 되겠다
2. 위에서 좀 더 편하게
00110000(2진수) = 48(10진수)
48은 아스키 코드로 '0'이다
이처럼 다른 문자들도 아스키코드와 값이 같기 때문에
굳이 위의 표를 보고 찾지 않아도
'0', 'K'와 같이 써주면 편하게 할 수 있다.
3.위에서 좀 더 편하게
void LCD_Data(int data)
{
PIO_SODR = RS;
PIO_CODR = RW;
Delayms(1);
PIO_SODR = E;
Delayms(1);
PIO_SODR =data;
Delayms(1);
PIO_CODR=E;
Delayms(1);
PIO_CODR = data;
}
LCD_Data('K');
LCD_Data('I');
LCD_Data('M');
처럼 하게 되면 된다. 하지만
위 보다 더욱 출력하고 싶은 문자가 길어지게 되면 그만큼 코드의 길이가 길어진다
그래서 문자열을 이용하여, 문자열을 인자로 보내는 함수로 구성하여 짜 보았다.
이렇게 하면 예제 코드와 같이
LCD_Data("BSP",200);
으로 입력을 하면 'B''S''P'가 Delayms(200)의 시간을 두고 출력되게 된다.
RS - High : data register 이다
0을 찍고 싶다면 <그림 6>을 보고 하면 되겠다
1. '0'을 출력
(upper4bit) : LLHH
(low4bit) : LLLL
= 00110000
PIO_SODR = RS;
PIO_CODR = RW;
Delayms(1);
PIO_SODR = E;
Delayms(1);
PIO_SODR =00110000;
Delayms(1);
PIO_CODR=E;
Delayms(1);
PIO_CODR = 00110000;
하면 되겠다
2. 위에서 좀 더 편하게
00110000(2진수) = 48(10진수)
48은 아스키 코드로 '0'이다
이처럼 다른 문자들도 아스키코드와 값이 같기 때문에
굳이 위의 표를 보고 찾지 않아도
'0', 'K'와 같이 써주면 편하게 할 수 있다.
3.위에서 좀 더 편하게
void LCD_Data(int data)
{
PIO_SODR = RS;
PIO_CODR = RW;
Delayms(1);
PIO_SODR = E;
Delayms(1);
PIO_SODR =data;
Delayms(1);
PIO_CODR=E;
Delayms(1);
PIO_CODR = data;
}
LCD_Data('K');
LCD_Data('I');
LCD_Data('M');
처럼 하게 되면 된다. 하지만
위 보다 더욱 출력하고 싶은 문자가 길어지게 되면 그만큼 코드의 길이가 길어진다
그래서 문자열을 이용하여, 문자열을 인자로 보내는 함수로 구성하여 짜 보았다.
void LCD_Data(const char* data, int Delaytime)
{
int i;
for(i=0; *(data+i)!=0; i++)
{
PIO_SODR = RS;
PIO_CODR = RW;
Delayms(1);
PIO_SODR = E;
Delayms(1);
PIO_SODR = data[i];
Delayms(1);
PIO_CODR=E;
Delayms(1);
PIO_CODR = data[i];
Delayms(Delaytime);
}
return;
}
{
int i;
for(i=0; *(data+i)!=0; i++)
{
PIO_SODR = RS;
PIO_CODR = RW;
Delayms(1);
PIO_SODR = E;
Delayms(1);
PIO_SODR = data[i];
Delayms(1);
PIO_CODR=E;
Delayms(1);
PIO_CODR = data[i];
Delayms(Delaytime);
}
return;
}
이렇게 하면 예제 코드와 같이
LCD_Data("BSP",200);
으로 입력을 하면 'B''S''P'가 Delayms(200)의 시간을 두고 출력되게 된다.
728x90
'코스웨어 > 10년 스마트폰BSP' 카테고리의 다른 글
[BSP]업무일지-정호영-20100715 (0) | 2010.07.15 |
---|---|
[BSP]업무일지-박동수-20100714 (1) | 2010.07.15 |
[BSP]업무일지-서동준-20100713 (0) | 2010.07.15 |
[BSP]업무일지-강혜정-20100712 (0) | 2010.07.12 |
[BSP]업무일지 - 김병찬 - 20100707 (0) | 2010.07.08 |
[BSP]업무일지-이상구-20100706 (0) | 2010.07.06 |
[bsp]업무일지_한경수_20100705 (0) | 2010.07.06 |
[BSP]업무일지-전현수-20100702 (0) | 2010.07.02 |