본문 바로가기
코스웨어/13년 스마트컨트롤러

Cortex-M3 로 캐릭터 LCD 제어하기

by 알 수 없는 사용자 2013. 10. 23.
728x90
반응형

 

 LCD.c

 #include "LCD.h"


 
void LCD_Init (void)
{
 unsigned int uiCnt;
 
 
 RCC_APB2ENR |= (1<<IOPG); //PG의 클럭 인에이블   
 
 GPIOG_CRL  = ( (0x3 << 0) | (0x3 << 4) | (0x3 << 8) | (0x3 << 12) | (0x3 << 16) | (0x3 << 20) | (0x3 << 24) | (0x3 << 28) );
 GPIOG_CRH =  ( (0x3 << 0) | (0x3 << 4) | (0x3 << 8) | (0x3 << 12) | (0x3 << 16) | (0x3 << 20) | (0x3 << 24) | (0x3 << 28) );
  GPIOG_ODR = 0xFFFF;
 
 GPIOG_BRR  = 0xFFFF; // 핀모두 L으로 초기화
 //GPIOG_BSRR = (1 << 12);
  
 
 LCD_Cmd_write(LCD_FUNC); 
 LCD_Cmd_write(LCD_ENTRY);
 LCD_Cmd_write(LCD_CURSOR);
 LCD_Cmd_write(LCD_DISPLAY);
 LCD_Cmd_write(LCD_CLEAR);
 LCD_Cmd_write(LCD_HOME);
                     
 return ;
}


void LCD_Cmd_write (unsigned char ucdata)    //타이밍도에 맞춘 write operation
{
 volatile unsigned int iCnt;

 GPIOG_BRR  = LCD_EN ;    //EN clear
 GPIOG_BRR  = LCD_RS;    //RS clear
 GPIOG_BRR  = LCD_RW;    //RW clear

 for(iCnt = 0; LCD_DELAY - LCD_DELAY1> iCnt; ++iCnt);  //시간지연

 GPIOG_BSRR = LCD_EN ;    //EN set

 for(iCnt = 0; LCD_DELAY - LCD_DELAY2 > iCnt; ++iCnt);  //시간지연

 GPIOG_BRR  =  (0xFF << LCD_BS);    // BUS clear

 GPIOG_BSRR = (ucdata<<LCD_BS);  // BUS data  input

 for(iCnt = 0; LCD_DELAY - LCD_DELAY3 > iCnt; ++iCnt);  //시간지연

 GPIOG_BRR  = LCD_EN ;    //EN clear

 for(iCnt = 0; LCD_DELAY - LCD_DELAY4 > iCnt; ++iCnt);  //시간지연


 
 return;
}

 


void LCD_Data_write (unsigned char ucdata)  // 함수인자로 BUS에 명령어 바로 넣음  
{
volatile unsigned int iCnt;

 GPIOG_BRR  = LCD_EN ;    //EN clear
 GPIOG_BSRR  = LCD_RS;    //RS Set
 GPIOG_BRR  = LCD_RW;    //RW clear

 for(iCnt = 0; LCD_DELAY - LCD_DELAY1> iCnt; ++iCnt);  //시간지연

 GPIOG_BSRR = LCD_EN ;    //EN set

 for(iCnt = 0; LCD_DELAY - LCD_DELAY2 > iCnt; ++iCnt);  //시간지연

 GPIOG_BRR  =  (0xFF << LCD_BS);    // BUS clear

 GPIOG_BSRR = (ucdata<<LCD_BS);  // BUS data  input

 for(iCnt = 0; LCD_DELAY - LCD_DELAY3 > iCnt; ++iCnt);  //시간지연

 GPIOG_BRR  = LCD_EN ;    //EN clear

 for(iCnt = 0; LCD_DELAY - LCD_DELAY4 > iCnt; ++iCnt);  //시간지연


 
 return;
}

 

void LCD_String(void *vp)
{

 while(1)
 {
  if(*((unsigned char *)vp) == 0 )
  {
   break;
   
  }
  LCD_Data_write(*((unsigned char*)vp));
  vp = ((unsigned char *)vp) + 1;
 }

 return;
}

 

 

 LCD.h

 #ifndef _LCD_H_
#define _LCD_H_

#define IOPG (8)
#define IOPC (4)

//GPIOG(0x40012000)
#define  RCC_AHBENR      (*(volatile unsigned int*)0x40021014)  //GPIOG
#define  RCC_APB2ENR     (*(volatile unsigned int*)0x40021018) 

#define GPIOG_CRL     (*((volatile unsigned int *)(0x40012000)))
#define GPIOG_CRH     (*((volatile unsigned int *)(0x40012004)))
#define GPIOG_ODR     (*((volatile unsigned int *)(0x4001200C)))
#define GPIOG_BSRR    (*((volatile unsigned int *)(0x40012010)))
#define GPIOG_BRR     (*((volatile unsigned int *)(0x40012014)))

 

 


#define  RCC_AHBENR      (*(volatile unsigned int*)0x40021014)  //GPIOC
#define  RCC_APB2ENR     (*(volatile unsigned int*)0x40021018) 
#define GPIOC_CRH     (*((volatile unsigned int *)(0x40011004)))
#define GPIOC_ODR     (*((volatile unsigned int *)(0x4001100C)))
#define GPIOC_BSRR    (*((volatile unsigned int *)(0x40011010)))
#define GPIOC_BRR     (*((volatile unsigned int *)(0x40011014)))


 


#define LCD_RS (1<<0)   // 1을 왼쪽으로 24 시프트 시킴 (0x01000000)
#define LCD_RW (1<<1)   // 0x02000000
#define LCD_EN (1<<2)   // 0x04000000
#define LCD_BS (3)  
        

 

#define LCD_CLEAR   0x01   //0000 0001,  P13, 화면 클리어
#define LCD_HOME   0x02   //0000 0010,  P13, 커서 맨 처음으로
#define LCD_ENTRY   0x06   //0000 0110,  P13, 커서 오른쪽 시프트, 화면고정
#define LCD_DISPLAY 0x0C  //0000 1100, P13, 화면 ON, 커서 OFF, cursor blink OFF
#define LCD_CURSOR 0x1C  //0001 1100,  P13, displayshift, shift to the right 
#define LCD_FUNC      0x38  //0011 1000,  P13, 8bit, 2lines, 5x7dots


#define LCD_DELAY   2500 // 최소 지연시간( 타이밍도에 맞게 동작하기위한 필요 지연시간)
#define LCD_DELAY1  0  
#define LCD_DELAY2  0
#define LCD_DELAY3  150
#define LCD_DELAY4  50


void LCD_Init (void);

void LCD_Cmd_write (unsigned char);

void LCD_Data_write (unsigned char);

void LCD_String(void *);

void LCD_Number(unsigned int, unsigned short);

#endif //_LCD_H_

 

728x90