==========================================================================================

ARM

==========================================================================================


<ARM>



=LCD DISPLAY


<LCD.H>

#ifndef __LCD_H__
#define __LCD_H__
#include <AT91SAM7S256.h>

#define LCD_BUS  0x00FF0000  //MASK 16~23
#define LCD_RS  0x00000001  // 1 
#define LCD_RW  0x00000002  // 2
#define LCD_EN  0x00000004  // 3

#define  LCD_INST_CLR  0x01
#define  LCD_INST_HOME  0x02
#define  LCD_INST_ENT  0x06  // I/D = 1 , S = 0 (INCREMENT/DEDREMENT , SHIFT)
#define  LCD_INST_DSP  0x0F  // D = 1 , C = 1 , B = 1 (DISPLAY ON , CURSOR ON , CURSOR BLINK)
#define  LCD_INST_CUR  0x14  // S/C = 0  , R/L = 1 ( DISPLAY SHIF/CURSOR MOVE , RIGHT/LEFT)
#define  LCD_INST_FUNC   0x38  // DL =1 , N =1 , F =
 0 ( DATA LENGTH8/4 , LINE2/1 , FONT5x10/5x7)

#define LCD_CAL_INST(X)  ((LCD_BUS)&((X)<<16)) // INST만 넣기 

void LCD_Data(unsigned char );
void LCD_Print(const unsigned char
 * );
void LCD_Init(void);
#endif // __LCD_H__


<LCD.C>

#include "lcd.h"

void LCD_Inst(unsigned int uiInst) 
{
  
volatile unsigned int uiCnt;  
  
  *AT91C_PIOA_CODR 
= LCD_BUS | LCD_RS | LCD_RW | LCD_EN;  // LOW  
  *AT91C_PIOA_SODR = LCD_CAL_INST(uiInst);  
  
for(uiCnt = 0 ; uiCnt <4600; ++uiCnt);  // ALL INIT
  for(uiCnt = 0 ; uiCnt <4500; ++uiCnt);  // RS = LOW
  *AT91C_PIOA_SODR = LCD_EN; 
  
for(uiCnt = 0 ; uiCnt <4600; ++uiCnt);  // EN = HIGH
  for(uiCnt = 0 ; uiCnt <4500; ++uiCnt);  // BUS = DATA
  for(uiCnt = 0 ; uiCnt <4500; ++uiCnt);  // BUS = VALID DATA  
  *AT91C_PIOA_CODR = LCD_EN; 
  
for(uiCnt = 0 ; uiCnt <4500; ++uiCnt);  // EN = LOW  
  
  
return;
}

void LCD_Data(unsigned char ucData) 
{
  
volatile unsigned int uiCnt;  
  
  *AT91C_PIOA_CODR 
= LCD_BUS | LCD_RS | LCD_RW | LCD_EN;  // LOW  
  *AT91C_PIOA_SODR = LCD_CAL_INST(ucData);  
  
for(uiCnt = 0 ; uiCnt <14; ++uiCnt);  // ALL INIT
  *AT91C_PIOA_SODR = LCD_RS; 
  
for(uiCnt = 0 ; uiCnt <13; ++uiCnt);  // RS = HIGH
  *AT91C_PIOA_SODR = LCD_EN; 
  
for(uiCnt = 0 ; uiCnt <15; ++uiCnt);  // EN = HIGH
  for(uiCnt = 0 ; uiCnt <13; ++uiCnt);  // BUS = DATA
  for(uiCnt = 0 ; uiCnt <13; ++uiCnt);  // BUS = VALID DATA  
  *AT91C_PIOA_CODR = LCD_EN; 
  
for(uiCnt = 0 ; uiCnt <13; ++uiCnt);  // EN = LOW  

  return;
}

void LCD_Print(const unsigned char * ucString) 
{
  
while(0 !=  *ucString)
  {
    LCD_Data(*ucString);
    ++ucString;
  }
  
  
return;
}

void LCD_Init(void)
{
  
volatile unsigned int uiCnt;  
  
  
//*PIO_PER = LCD_BUS | LCD_RS | LCD_RW | LCD_EN; // 0번지 X => ASSEM
  //AT91C_BASE_PIOA->PIO_PER = LCD_BUS | LCD_RS | LCD_RW | LCD_EN;   
  *AT91C_PIOA_PER = LCD_BUS | LCD_RS | LCD_RW | LCD_EN; 
  *AT91C_PIOA_OER 
= LCD_BUS | LCD_RS | LCD_RW | LCD_EN; 
  *AT91C_PIOA_PPUDR 
= LCD_BUS | LCD_RS | LCD_RW | LCD_EN;  
  
  
for(uiCnt = 0 ; uiCnt <50; ++uiCnt);

  LCD_Inst(LCD_INST_FUNC);
  LCD_Inst(LCD_INST_DSP);
  LCD_Inst(LCD_INST_ENT);
  LCD_Inst(LCD_INST_CUR);
  LCD_Inst(LCD_INST_CLR);
  LCD_Inst(LCD_INST_HOME);  

  
  
return;
}


=P20


<하버드 구조>

-AVR


<폰노이만 구조>

-ARM





'2015 스마트 콘트롤러 > 업무일지' 카테고리의 다른 글

20150729  (0) 2015.07.30
20150728  (0) 2015.07.28
20150724  (0) 2015.07.26
20150723  (0) 2015.07.23
20150722  (0) 2015.07.23
Posted by ahj333
,