본문 바로가기
코스웨어/10년 스마트폰BSP

[BSP]업무일지 - 김강수 - 20100708

by 알 수 없는 사용자 2010. 7. 12.
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;



위와 같이 하나의 설정을 하기 위해, 하나의 타이밍도를 그려주면된다,

한번의 설정에 이렇게 한번 프로그램을 짜야  하기 때문에 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;
  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;
 
 
}
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 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);
 

 
 
    LCD_Data("KIM ", 500);//data표에서 예를 들어 '0'을 출력하고 싶다면, 00110000 을 해도 되지만
                                      //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');

처럼 하게 되면 된다. 하지만

위 보다 더욱 출력하고 싶은 문자가 길어지게 되면 그만큼 코드의 길이가 길어진다

그래서 문자열을 이용하여, 문자열을 인자로 보내는 함수로 구성하여 짜 보았다.


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;
}

이렇게 하면 예제 코드와 같이 

LCD_Data("BSP",200);

으로 입력을 하면 'B''S''P'가 Delayms(200)의 시간을 두고 출력되게 된다.






 
728x90