성엽이
KKIMSSI
성엽이
전체 방문자
오늘
어제
  • 분류 전체보기 (454)
    • :) (2)
    • C프로그래밍이론 (9)
    • C++프로그래밍 (64)
      • STL (1)
    • C# (2)
    • Visual studio 10.0 (9)
    • AT91SAM7S256 (21)
    • 논리회로 (14)
    • AVR2560 (11)
    • TCPIP (16)
    • NetWork (4)
      • Ubuntu Linux (2)
    • Assembly (21)
    • UNIX 프로그래밍 (6)
    • RFID 분석 (1)
    • Win32 API (7)
    • Cortex-M3 (4)
    • Unity (91)
    • Flutter (9)
    • OwnProject (11)
      • It's mine (5)
      • 마인드스톰 실습 (1)
      • 보고서 자료 (2)
      • RPi B+ (2)
    • ETC (25)
      • 상식 (3)
    • MFC (40)
    • PostgeSQL (18)
    • 영상제어 (6)
      • VFW_영상처리 (1)
    • Python (0)
    • Java (30)
      • SpringBoot (2)
      • Javascript (1)
      • JSP (13)
      • Spring (8)
    • Oracle (4)
      • SQL (3)
    • HTML (6)
      • Thymeleaf (1)
      • CSS (1)
      • Bootstrap (3)
    • IDE (1)
      • VS Code (1)
    • Android (2)
    • Privacy Policy (0)
    • MYSQL (2)
      • MariaDB (2)
    • AWS (5)
    • 개인공부 (0)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록
  • 관리자
  • 글쓰기

공지사항

인기 글

태그

  • WINAPI
  • 문자열 나누기
  • ARM Reverse Engineering
  • Boot Code 분석
  • MFC

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
성엽이

KKIMSSI

2013.10.23 _ ARM Cotex-M3 _ LCD 글자 띄우기
Cortex-M3

2013.10.23 _ ARM Cotex-M3 _ LCD 글자 띄우기

2013. 10. 23. 19:34


 LCD.c / LCD.h / main.c

 

 LCD.c


 #include "LCD.h"

void Lcd_Init()
{
  RCC_APB2_ENR = (1<<8);         // RCC_APB2_ENR  // IOPGEN (Port G에 클럭 공급)
  
  GPIOG_CRH = 0x33333333;
  GPIOG_CRL = 0x33333333;
  
  GPIOG_ODR = 0xffff;
  
  GPIOG_BRR = LCD_RS | LCD_RW | LCD_EN | LCD_BS;

  LCD_cmd_write(LCD_FUNC);  // DL 8bit High, N 2line High, F 5*7 dot High  
  LCD_cmd_write(LCD_ENTRY);  // 커서는 오른쪽 쉬프트, 화면은 고정
  LCD_cmd_write(LCD_CURSOR);  // S/C 커서 보이게, R/L 커서를 오른쪽으로
  LCD_cmd_write(LCD_DISPLAY);  // D 화면 ON, C 커서 OFF, B 커서자리블링크 커서 OFF
  LCD_cmd_write(LCD_CLEAR);  // 화면지우기
  LCD_cmd_write(LCD_HOME);  // 커서를 제일 앞으로
  

  return ;
}


void LCD_cmd_write(unsigned char ucdata)  // instruction data input
{
  volatile unsigned int iCnt;

  GPIOG_BRR = LCD_EN; // 1을 넣어주면 LCD_EN 이 0v clear out 으로 된다.
  GPIOG_BRR = LCD_RS; // 1을 넣어주면 LCD_RS 가 Low 가 된다.
  GPIOG_BRR = LCD_RW; // 1을 넣어주면 LCD_RW 가 Low 가 된다.

  for(iCnt=0;iCnt<LCD_delay-LCD_delay1;++iCnt);  // RS, RW 가 Low로 가기전까지, 15ns
                  // EN 이 High 되는 순간 전까지 딜레이
  GPIOG_BSRR = LCD_EN;  // EN을 High

  for(iCnt=0;iCnt<LCD_delay-LCD_delay2;++iCnt);  // EN이 올라가고 나서 DB가 변화를 가진다, 160ns

  GPIOG_BRR = LCD_BS;  // DB에 쓰레기값을 비워준다.
  GPIOG_BSRR = (ucdata<<3);  // Data Bus 핀을 지정

  for(iCnt=0;iCnt<LCD_delay-LCD_delay3;++iCnt);  // DB에서 Input 되기전 까지 EN 을 유지, 60ns 

  GPIOG_BRR = LCD_EN;  // EN 을 다시 Low 시켜준다.

  for(iCnt=0;iCnt<LCD_delay-LCD_delay4;++iCnt); // EN 을 제외한 나머지 RS,RW,DB는 유지, 35ns

  return ;
}


void LCD_data_write(unsigned char ucdata)  // data input
{
  volatile unsigned int iCnt;

  GPIOG_BRR = LCD_EN; // 1을 넣어주면 LCD_EN 이 0v clear out 으로 된다.
  GPIOG_BSRR = LCD_RS; // 1을 넣어주면 LCD_RS 가 High 가 된다.
  GPIOG_BRR = LCD_RW; // 1을 넣어주면 LCD_RW 가 Low 가 된다.

  for(iCnt=0;iCnt<LCD_delay-LCD_delay1;++iCnt);  // RS, RW 가 Low로 가기전까지,
                  // EN 이 High 되는 순간 전까지 딜레이
  GPIOG_BSRR = LCD_EN;  // EN을 High

  for(iCnt=0;iCnt<LCD_delay-LCD_delay2;++iCnt);  // EN이 올라가고 나서 DB가 변화를 가진다.

  GPIOG_BRR = LCD_BS;  // DB에 쓰레기값을 비워준다.
  GPIOG_BSRR = (ucdata<<3);  // 0x10101010, DB에 입력을 해줌!

  for(iCnt=0;iCnt<LCD_delay-LCD_delay3;++iCnt);  // DB에서 Input 되기전 까지 EN 을 유지 

  GPIOG_BRR = LCD_EN;  // EN 을 다시 Low 시켜준다.

  for(iCnt=0;iCnt<LCD_delay-LCD_delay4;++iCnt); // EN 을 제외한 나머지 RS,RW,DB는 유지

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

void LCD_number(unsigned int i_line, unsigned short us_Num)   // short 로 하는 이유는   
{                                                         // One 8-channel 10-bit Analog-to-Digital Converter,
  unsigned char uc_string[] = "00000";  // Four Channels Multiplexed with Digital I/Os
                                                           // ADC컨버터는 10bit 를 쓰기 때문임.
  uc_string[0] = '0'+(us_Num/10000);
  uc_string[1] = '0'+((us_Num%10000)/1000);
  uc_string[2] = '0'+((us_Num%1000)/100);
  uc_string[3] = '0'+((us_Num%100)/10);
  uc_string[4] = '0'+(us_Num%10);

  if( 1 == i_line )  // 화면지우기
  {
    LCD_cmd_write(0x80);
    LCD_string("TEMP : ");
  }
  else         // 커서를 제일 앞으로
  {
    LCD_cmd_write(0xC0);
    LCD_string("LIGHT: ");    
  }
  
  LCD_string(uc_string);
}



LCD.h



#ifndef  _LCD_H_ 

#define  _LCD_H_

#define GPIOG_BASE_ADDR  (0x40012000)
#define RCC_APB2_ENR    (*(volatile unsigned int*)0x40021018)

#define GPIOG_CRL            (  (*(volatile unsigned int*)   (GPIOG_BASE_ADDR + 0x00 ) ) )
#define GPIOG_CRH            (  (*(volatile unsigned int*)   (GPIOG_BASE_ADDR + 0x04 ) ) )
#define GPIOG_IDR            (  (*(volatile unsigned int*)   (GPIOG_BASE_ADDR + 0x08 ) ) )
#define GPIOG_ODR            (  (*(volatile unsigned int*)   (GPIOG_BASE_ADDR + 0x0C ) ) )
#define GPIOG_BSRR           (  (*(volatile unsigned int*)   (GPIOG_BASE_ADDR + 0x10 ) ) )
#define GPIOG_BRR            (  (*(volatile unsigned int*)   (GPIOG_BASE_ADDR + 0x14 ) ) )
#define GPIOG_LCKR           (  (*(volatile unsigned int*)   (GPIOG_BASE_ADDR + 0x18 ) ) )

#define LCD_RS  (1<<0)  // LCD_RS 는 LCD 와 보드 결선때 꽂는 위치로 현재 PORT G 0번 핀에 꽂혀있다. 
#define LCD_RW  (1<<1)  // 마찬가지로 1번 핀
#define LCD_EN  (1<<2)  // 2번 핀
#define LCD_BS  (0xFF<<3)  // 3번 핀  



#define LCD_CLEAR  (0x01) // 0d00000001 , P13 LCD_spec, 화면을 깨끗이!
#define LCD_HOME  (0x02) // 0d00000010 , P13 LCD_spec, 맨앞에서부터 디스플레이
#define LCD_ENTRY  (0x06) // 0d00000110 , P13 LCD_spec, 커서는 오른쪽 쉬프트, 화면은 고정
#define LCD_DISPLAY  (0x0C) // 0d00001100 , P13 LCD_spec, D 화면 ON, C 커서 OFF, B 커서블링크 커서 OFF
#define LCD_CURSOR  (0x1C) // 0d00011100 , P13 LCD_spec, S/C 커서 보이게, R/L 커서를 오른쪽으로
#define LCD_FUNC  (0x38) // 0d00111000 , P13 LCD_spec, DL 8bit High, N 2line High, F 5*7 dot High

#define LCD_delay  6000
#define LCD_delay1 0  // 15ns
#define LCD_delay2 0  // 160ns
#define LCD_delay3 50  // 60ns
#define LCD_delay4 150 // 35ns 


void Lcd_Init();
void LCD_cmd_write(unsigned char ucdata);
void LCD_data_write(unsigned char ucdata);
void LCD_string(void *);
void LCD_number(unsigned int i_line ,unsigned short us_Num);
  
  #endif // _LCD_H_ 



 main.c











---- 참고 자료 ---

ARM Cortex-M3 _ spec.zip


ARM_Cortex-M3_회로도.zip


LCD스펙.pdf

-----------------

---- 소스 ----

lcd.c

lcd.h

-------------

---컴파일러-------

Keil uVersion4 사용 

------------------



저작자표시 (새창열림)

'Cortex-M3' 카테고리의 다른 글

2013.10.16 _ ARM _ Boot Code 분석 ( 어셈블리 )  (0) 2013.10.17
2013.10.16_컴파일 및 프로그램 로드 방법 by 유진  (0) 2013.10.16
20131008_ Cortex-M3 컴파일 및 다운로드 to 디바이스  (0) 2013.10.08
    'Cortex-M3' 카테고리의 다른 글
    • 2013.10.16 _ ARM _ Boot Code 분석 ( 어셈블리 )
    • 2013.10.16_컴파일 및 프로그램 로드 방법 by 유진
    • 20131008_ Cortex-M3 컴파일 및 다운로드 to 디바이스
    성엽이
    성엽이

    티스토리툴바