본문 바로가기

ARM/강의

LCD + 센서 제어 프로그래밍

#include "AT91SAM7S256.h"

/* Character LCD */
#define BU  0x000000FF // PIOA0~7
#define RS  0x00000800 // PIOA11
#define RW  0x00001000 // PIOA12
#define EN  0x00002000 // PIOA13
#define BL  0x00004000 // PIOA14
#define ADC 0x00000600 // PIOA9~10
/* Macro Setting */
#define DELAY(a) for(iCnt=0; (a)>=iCnt; ++iCnt)
#define UP 0x80
#define DOWN 0xC0

void LCD_INIT();              // LCD 설정 함수!
void LCD_INST(unsigned char inst);      // LCD 문자 위치 설정 함수!
void LCD_DATA(unsigned char data);      // LCD 한 문자 전송 함수!
void LCD_Str(int flag, const char *buff);  // LCD 위치 + 문자열 전송 함수!
void ADC_Init(unsigned int uiCH);      // A/D 컨버터 설정 함수

volatile unsigned int iCnt;

int main()
{
  unsigned int iCnt1;
  unsigned short usData;
  short sCnt=1000;
  char cBuf[]="1234";

  AT91C_BASE_PIOA->PIO_PER = BU|RS|RW|EN|BL;  // PIO Enable
  AT91C_BASE_PIOA->PIO_OER = BU|RS|RW|EN|BL;  // PIO Output Enable
  
  ADC_Init(7);        // ADC Setting
  LCD_INIT();          // LCD Setting

  LCD_Str(UP+4"LCD TEST");  // LCD 윗 줄에 출력!
  LCD_Str(DOWN+6"L.JB");  // LCD 아랫 줄에 출력!
  DELAY(1000000);        
  LCD_Str(UP+2"Sensor Start");
  while(1)
  {  // A/D 컨버터 LCD로 출력!
    AT91C_BASE_ADC->ADC_CR = 0x00000002;      // ADC Start
    while(!(AT91C_BASE_ADC->ADC_SR&(1<<7)));
    usData = (AT91C_BASE_ADC->ADC_CDR7&0x000003FF);  // 안전을 위해서 0으로 데이터 초기화
    for(iCnt1=04>iCnt1; ++iCnt1)
    {  // 상수를 문자로 변환!
      cBuf[iCnt1]=((usData/sCnt)%10)+'0';
      sCnt=sCnt/10;
    }
    sCnt=1000;
    LCD_Str(DOWN+6, cBuf);
  }
  return 0;
}
/*====================================================*/
/* LCD 관련 함수 모음                                 */
/*====================================================*/
void LCD_Str(int flag, const char *buff)
{  // LCD 문자열 전송 함수!
  while(0 != (*buff))
  {
    LCD_INST(flag++);
    LCD_DATA(*buff++);
  }
}

void LCD_INIT()
// LCD 기본 셋팅 함수!
  LCD_INST(0x38);    // 8bit, 2line, 5x10 Display select
  LCD_INST(0x06);    // 
  LCD_INST(0x1C);    // 
  LCD_INST(0x0C);    // 
  LCD_INST(0x01);    // 
  
  return;
}

void LCD_INST(unsigned char inst)
{  // LCD 문자 위치 설정 함수! ( 타이밍도에 맞게 설정)
  AT91C_BASE_PIOA->PIO_CODR = EN;
  AT91C_BASE_PIOA->PIO_CODR = RS;    // LCD inst Reg
  AT91C_BASE_PIOA->PIO_CODR = RW;
  DELAY(10000);
  AT91C_BASE_PIOA->PIO_SODR = EN;
  DELAY(10000);
  AT91C_BASE_PIOA->PIO_CODR = BU;
  AT91C_BASE_PIOA->PIO_SODR = inst;
  DELAY(10000);
  AT91C_BASE_PIOA->PIO_CODR = EN;
  DELAY(10000);

  return;
}

void LCD_DATA(unsigned char data)
{  // LCD 한 문자 전송 함수!
  AT91C_BASE_PIOA->PIO_CODR = EN;
  AT91C_BASE_PIOA->PIO_SODR = RS;    // LCD data Reg
  AT91C_BASE_PIOA->PIO_CODR = RW;
  DELAY(10000);
  AT91C_BASE_PIOA->PIO_SODR = EN;
  DELAY(10000);
  AT91C_BASE_PIOA->PIO_CODR = BU;
  AT91C_BASE_PIOA->PIO_SODR = data;
  DELAY(10000);
  AT91C_BASE_PIOA->PIO_CODR = EN;
  DELAY(10000);

  return;
}
/*====================================================*/
/* A/D 컨버터 관련 함수 모음                          */
/*====================================================*/
void ADC_Init(unsigned int uiCH)
{  // A/D컨버터 설정 함수!
  AT91C_BASE_ADC->ADC_CR = 0x000000001;    // Reset
  AT91C_BASE_ADC->ADC_CHER = 1<<uiCH;      // 해당 채널 동작허용
  AT91C_BASE_ADC->ADC_MR = 5<<8;        // 4Mhz
  return;
}
 구동화면 GIF파일로 만들어서 올리기 (카메라없음 잠시 보류)

LCD PIN & 타이밍도

 1. VCC : 5v 연결 2. GND : 0v 연결  3. V0 : VCC or GND 연결(보통 GND) 
 4~14 : PIN 하고 연결  15~16 : 연결하지 않아도 됨

 위의 타이밍도를 보고 타이밍도 순서에 맞게 프로그램을 작성하면 LCD화면에 원하는 문자를 나타낼수 있다. 
보통 Write 모드를 사용하지 Read는 거의 사용하지 않는다.(사용 용도에 따라 다름) 위의 소스에서  INST 와 DATA 함수를 보면 두 소스가 2번째 줄만 빼고 같다는 것을 알수 있다. 타이밍도를 보면 RS에 High 또는 Low를 주게되어 있는데 High의 경우 LCD의 INST 레지스터에 DATA 값이 들어가고 출력하기 위한 설정을 하고 Low의 경우 LCD의 DATA 레지스터에 DATA 값이 들어가 화면에 DATA의 값을 출력해 준다. 
 


'ARM > 강의' 카테고리의 다른 글

AT91SAM7S256의 내부 구조  (0) 2011.02.16
A/D 컨버터(ADC)  (0) 2011.02.14
시리얼 통신으로 문자열 출력 함수 만들기!!  (0) 2011.02.14
LED 제어 테스트  (0) 2011.02.09
링커 스크립트 분석  (0) 2011.02.08