노준이형꺼
//----------------------------------------------------------------------------------------------------
//병렬 입출력 제어기(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 int) 1<<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;
}
|
|