본문 바로가기

[ARM] 캐릭터 LCD에 글자쓰기

반응형

노준이형꺼


//----------------------------------------------------------------------------------------------------

//병렬 입출력 제어기(PIO) I/O 제어 레지스터
#define PIO_PER    (*(volatile unsigned int *) 0xFFFFF400) //PIO 병렬 입출력 허용 레지스터
#define PIO_PDR    (*(volatile unsigned int *) 0xFFFFF404) //PIO 병렬 입출력 금지 레지스터
#define PIO_OER    (*(volatile unsigned int *) 0xFFFFF410) //PIO 출력 허용 레지스터
#define PIO_ODR    (*(volatile unsigned int *) 0xFFFFF414) //PIO 출력 금지 레지스터
#define PIO_IFER  (*(volatile unsigned int *) 0xFFFFF420) //PIO 입력 필터 허용 레지스터
#define PIO_SODR  (*(volatile unsigned int *) 0xFFFFF430) //PIO 출력 데이터 세트 레지스터
#define PIO_CODR  (*(volatile unsigned int *) 0xFFFFF434) //PIO 출력 데이터 클리어 레지스터
#define PIO_IER    (*(volatile unsigned int *) 0xFFFFF440) //PIO 인터럽트 허용 레지스터
#define PIO_IDR    (*(volatile unsigned int *) 0xFFFFF444) //PIO 인터럽트 금지 레지스터
#define PIO_ISR    (*(volatile unsigned int *) 0xFFFFF44C) //PIO 인터럽트 상태 레지스터
#define PIO_PUDR  (*(volatile unsigned int *) 0xFFFFF460) //PIO 풀업저항 금지 레지스터
#define PIO_PUER  (*(volatile unsigned int *) 0xFFFFF464) //PIO 풀업저항 허용 레지스터
#define PIO_ASR    (*(volatile unsigned int *) 0xFFFFF470) //PIO 주변장치 A 선택 레지스터
#define PIO_BSR    (*(volatile unsigned int *) 0xFFFFF474) //PIO 주변장치 B 선택 레지스터
//----------------------------------------------------------------------------------------------------
//전력관리 제어기(PMC) I/O 제어 레지스터
#define PMC_PCER  (*(volatile unsigned int *) 0xFFFFFC10)  //PMC 주변장치 클록 허용 레지스터
#define MASTERCLOCK 48000000
//----------------------------------------------------------------------------------------------------
//인터럽트 제어기(AIC) I/O 제어 레지스터
#define AIC_SMR    ( (volatile unsigned int *) 0xFFFFF000)  //AIC 소스 모드 레지스터
#define AIC_SVR    ( (volatile unsigned int *) 0xFFFFF080)  //AIC 소스 벡터 레지스터
#define AIC_IECR  (*(volatile unsigned int *) 0xFFFFF120)  //AIC 인터럽트 허용 명령 레지스터
#define AIC_IDCR  (*(volatile unsigned int *) 0xFFFFF124)  //AIC 인터럽트 금지 명령 레지스터
#define AIC_ICCR  (*(volatile unsigned int *) 0xFFFFF128)  //AIC 인터럽트 클리어 명령 레지스터
//----------------------------------------------------------------------------------------------------
//디버그 유닛(DBGU) I/O 제어 레지스터
#define DBGU_CR    (*(volatile unsigned int *) 0xFFFFF200) //DBGU 제어 레지스터
#define DBGU_MR    (*(volatile unsigned int *) 0xFFFFF204) //DBGU 모드 레지스터
#define DBGU_IER  (*(volatile unsigned int *) 0xFFFFF208) //DBGU 인터럽트 허용 레지스터
#define DBGU_IDR  (*(volatile unsigned int *) 0xFFFFF20C) //DBGU 인터럽트 금지 레지스터
#define DBGU_IMR  (*(volatile unsigned int *) 0xFFFFF210) //DBGU 인터럽트 마스크 레지스터
#define DBGU_SR    (*(volatile unsigned int *) 0xFFFFF214) //DBGU 상태 레지스터
#define DBGU_RHR  (*(volatile unsigned int *) 0xFFFFF218) //DBGU 수신홀딩 레지스터
#define DBGU_THR  (*(volatile unsigned int *) 0xFFFFF21C) //DBGU 송신홀딩레지스터
#define DBGU_BRGR  (*(volatile unsigned int *) 0xFFFFF220) //DBGU 보레이트 발생 레지스터
#define DBGU_CIDR  (*(volatile unsigned int *) 0xFFFFF240) //DBGU 칩 ID레지스터
#define DBGU_EXID  (*(volatile unsigned int *) 0xFFFFF244) //DBGU 칩 ID 확장 레지스터
#define DBGU_FNR  (*(volatile unsigned int *) 0xFFFFF248) //DBGU 강제 NTRST레지스터
//----------------------------------------------------------------------------------------------------
//타이머 카운터(TC) I/O 제어 레지스터
#define TC0_CCR    (*(volatile unsigned int *) 0xFFFA0000) //TC0 채널 제어 레지스터
#define TC0_CMR    (*(volatile unsigned int *) 0xFFFA0004) //TC0 채널 모드 레지스터
#define TC0_CV    (*(volatile unsigned int *) 0xFFFA0010) //TC0 카운터 값 레지스터
#define TC0_RA    (*(volatile unsigned int *) 0xFFFA0014) //TC0 레지스터 A
#define TC0_RB    (*(volatile unsigned int *) 0xFFFA0018) //TC0 레지스터 B
#define TC0_RC    (*(volatile unsigned int *) 0xFFFA001C) //TC0 레지스터 C
#define TC0_SR    (*(volatile unsigned int *) 0xFFFA0020) //TC0 상태 레지스터
#define TC0_IER    (*(volatile unsigned int *) 0xFFFA0024) //TC0 인터럽트 허용 레지스터
#define TC0_IDR    (*(volatile unsigned int *) 0xFFFA0028) //TC0 인터럽트 금지 레지스터
#define TC0_IMR    (*(volatile unsigned int *) 0xFFFA002C) //TC0 인터럽트 마스크 레지스터
#define TC_BCR    (*(volatile unsigned int *) 0xFFFA00C0) //TC 블록 제어 레지스터
#define TC_BMR    (*(volatile unsigned int *) 0xFFFA00C4) //TC 블록 모드 레지스터
//----------------------------------------------------------------------------------------------------
//주기적인 시간간격 타이머(PIT) I/O 제어 레지스터
#define PIT_MR    (*(volatile unsigned int *) 0xFFFFFD30) //PIT 모드 레지스터
#define PIT_SR    (*(volatile unsigned int *) 0xFFFFFD34) //PIT 상태 레지스터
#define PIT_PIVR  (*(volatile unsigned int *) 0xFFFFFD38) //PIT 카운터값 레지스터
#define PIT_PIIR  (*(volatile unsigned int *) 0xFFFFFD3C) //PIT 이미지 레지스터


void Delayms(unsigned int ms) //딜레이 함수..
{
  volatile unsigned int count, countmax = (48000000/10000)*ms;
  for(count = 0;count<countmax;count++);
}

void LCD_Instruction(unsigned int ist)
{
  PIO_CODR = 1<<0|1<<1//Rs, RW = Low
  Delayms(10);
  PIO_SODR = 1<<2//E = High
  Delayms(10);
  PIO_SODR = ist<<3//DB0~DB7 = LCD 제어 명령
  Delayms(10);
  PIO_CODR = 1<<2//E = Low
  Delayms(10);
  PIO_CODR = 0xFF<<3//DB0~DB7 = 0
}

void LCD_Data(unsigned int data)
{
  PIO_SODR = 1<<0//Rs = High
  PIO_CODR = 1<<1//RW = Low
  Delayms(10);
  PIO_SODR = 1<<2//E = High
  Delayms(10);
  PIO_SODR = data<<3//DB0~DB7 = LCD 표시 문자
  Delayms(10);
  PIO_CODR = 1<<2//E = Low
  Delayms(10);
  PIO_CODR = 0xFF<<3//DB0~DB7 = 0
  Delayms(100);
}

void LCD_String(char *str)
{
  while(*str != '\0')
    { LCD_Data(*str);
      str++;
    }
}

int main(void)
{
  PIO_PER = 0xFFF;
  PIO_OER = 0xFFF;
  PIO_CODR = 1<<2//E = Low

  LCD_Instruction(0x38); //Function Set 2line, 8bit.
  LCD_Instruction(0x06); //Entry Mode Set
  LCD_Instruction(0x0C); //Set Display
  LCD_Instruction(0x01); //Clear Display

  LCD_String("I Love You ^^*");
  Delayms(1000);

  while(1)
  {
    LCD_Instruction(0x1C); //Cursor of Display Shift(Rt)
    Delayms(500);
    LCD_Instruction(0x1C); //Cursor of Display Shift(Rt)
    Delayms(500);
    LCD_Instruction(0x18); //Cursor of Display Shift(Lt)
    Delayms(500);
    LCD_Instruction(0x18); //Cursor of Display Shift(Lt)
    Delayms(500);
  }
    return 0;
 }










이거는 강사님꺼



#define PIO_ASR (*(volatile unsigned int *) 0xFFFFF470)//주변장치 A로 선택
#define PIO_BSR (*(volatile unsigned int *) 0xFFFFF474)//주변장치 B로 선택
#define PIO_PDR (*(volatile unsigned int *) 0xFFFFF404)//병렬 입출력 포트로 사용 금지


#define PIO_SODR (*(volatile unsigned int *) 0xFFFFF430) //출력 
#define PIO_CODR (*(volatile unsigned int *) 0xFFFFF434) //출력 하지 않음
#define PIO_OER  (*(volatile unsigned int *) 0xFFFFF410) //출력버퍼 사용 설정
#define PIO_PER  (*(volatile unsigned int *) 0xFFFFF400) //병렬 입출력 제어 레지스터 병렬 입출력 포트로 사용한다.
#define PIO_PUDR (*(volatile unsigned int *) 0xFFFFF460) //풀업저항 사용하지 않음

#define PIO_IFER (*(volatile unsigned int *) 0xFFFFF420) //글리치 필터 사용허가 레지스터
#define PIO_IER (*(volatile unsigned int *) 0xFFFFF440)  //인터럽트 인에이플 레지스터
#define PIO_ISR (*(volatile unsigned int *) 0xFFFFF44C)  //인터럽트 스테이터스 레지스터
#define PIO_ODR (*(volatile unsigned int *) 0xFFFFF414)  //인터럽트 금지 레지스터 
#define PIO_MDER (*(volatile unsigned int *) 0xFFFFF450)  //오픈드레인 출력 허용 레지스터 
//----------------------------------------------------------------------------------




#define PMC_PCER (*(volatile unsigned int *) 0xFFFFFC10)
#define FORCNT 10000
#define MASTERCLOCK 48000000


#define PA_8BIT 0xFF//LCD 데이터 핀 설정

#define REGISTER_RS 0x100  //LCD RS
#define REGISTER_RD 0x800    //LCD RW
#define LCD_ENABLE  0x1000   //LCD ENABLE Pin 'E'

#define LCD_CONFIGURE_PIN (PA_8BIT|REGISTER_RS|REGISTER_RD|LCD_ENABLE)

enum LCD_SET
{
 RS_DATA =1,
 RS_INST =0,
 RD_READ =1,
 RD_WRITE =0,
 LCD_ON =1,
 LCD_OFF=0
};

void Configure_PIOA(void);
void Configure_LCD(void);
void LCD_Instruction(unsigned char);
void LCD_Data(unsigned char);
void lprint(const char *ucData);
void Delayus(unsigned int us);
void Delayms(unsigned int ms);


//----------    전력 제어 설정

 


void Delayus(unsigned int us)   /* us delay for -O2 -Otime option */

  volatile unsigned int count, countmax = (MASTERCLOCK / 9600000) * us;

  for(count = 0; count < countmax; count++);
}


void Delayms(unsigned int ms) //딜레이 함수..

  volatile unsigned int count, countmax = (MASTERCLOCK / 10000) * ms;

  for(count = 0; count < countmax; count++);
}

 

void LCD_Init(){

 volatile unsigned int uiCount =0;
 
 LCD_Instruction(0x38);    //Function Set 2line,8Bit

 LCD_Instruction(0x06);    //Entry Mode Set
 
 LCD_Instruction(0x1C);    //Cursor or Display Shift 
 
 LCD_Instruction(0x0C);    //Set Display

 LCD_Instruction(0x01);    //Clear Display
 
 Delayms(10);
}

void LCD_Instruction(unsigned char ucInstruction){

   PIO_CODR = REGISTER_RS; //인스트럭션 모드 , 레지스터 명령
   PIO_CODR = REGISTER_RD;
   PIO_CODR = LCD_ENABLE;
   Delayms(40);
   
   PIO_SODR = LCD_ENABLE;
   Delayms(40);
   
   PIO_CODR = PA_8BIT;       //DataBitClear
   PIO_SODR = ucInstruction; //펑션  셋
   Delayms(40);
   
   PIO_CODR = LCD_ENABLE;    //Enable pin Low
   PIO_CODR = PA_8BIT;       //DataBit Clear
   Delayms(40);
}


void LCD_Data(unsigned char ucData)
{
 volatile unsigned int uiCount =0;
 PIO_CODR = LCD_ENABLE;
 PIO_SODR = REGISTER_RS;
 PIO_CODR = REGISTER_RD;

 Delayms(10);
 PIO_SODR = LCD_ENABLE;
  
 Delayms(10);
 PIO_CODR =PA_8BIT;
 PIO_SODR =ucData;
  
 Delayms(10);
 PIO_CODR =LCD_ENABLE; 
  
 Delayms(10);
  
}

void lprint(const char *ucData){
 while(0 != *ucData)
  LCD_Data(*ucData++);
}

void Configure_PIOA(void){
 PIO_OER=LCD_CONFIGURE_PIN;
 PIO_PER=LCD_CONFIGURE_PIN;
 PIO_PUDR=LCD_CONFIGURE_PIN;
 PIO_CODR=LCD_CONFIGURE_PIN;
}

void Configure_LCD(void){
 Configure_PIOA();
 LCD_Init();
}


int main(void){

  PMC_PCER =(unsigned int1<<2;
  Delayms(50);
  Configure_LCD();
  
  
  while(1){ 
      LCD_Data('A');
      Delayms(500);
      LCD_Data('B');
      Delayms(500);
      LCD_Data('1');
      Delayms(500);
      LCD_Data('2');      
    }
    
    return 0;
}

반응형

'About 프로그래밍!!! > ARM' 카테고리의 다른 글

[ARM] ADC  (0) 2010.07.13
[ARM]캐릭터 LCD  (0) 2010.07.09
[ARM]주기적 타이머로 통신하기  (0) 2010.07.07
[ARM]주기적 타이머로 LED 옮기기  (0) 2010.07.07
[ARM]주기적인 시간간격 타이머(PIT)  (0) 2010.07.06
-->