8051/PIC > 이런 질문을 하는 저를 용서 해 주세요

인기검색어 > 아두이노 센서 ATMEGA128

최신글 질문게시판 동영상강좌 가입하기

▼ BASIC4MCU 후원업체 신제품 정보 ▼

▲ BASIC4MCU 후원업체 신제품 정보 ▲

BASIC4MCU > 8051/PIC

DT-516 강좌 | 이런 질문을 하는 저를 용서 해 주세요

페이지 정보

작성자 키트 작성일17-08-23 15:19 조회1,286회 댓글0건

본문

CU_C Seg_Data[]={
    0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E //0123456789AbcdEF
};


질문1). code unsigned char 과 unsigned char 차이점이 뭔가요?
unsigned char i;       // 내부 SRAM, 혹은 외부 SRAM 

idata unsigned char i; // 내부 SRAM

xdata unsigned char i; // 외부 SRAM 

code unsigned char i;  // 코드메모리 영역

 

임베디드에서 사용될 C Language 책 하나 추천 해 주신다면?

각각의 mcu 서적 중에서 c로 기술된 것 중에서 한권 고르세요

 

//
bit delay_flg=0;
U_C FND_CNT=0;
U_I delay_buf=0, counter=0;
//
void Timer_0_Interrupt(void) interrupt 1
{  // 225Hz주기
    P4=0xFF; // FND OFF

질문2). P4=0xFF 이놈을 주석 처리 해 봤는데
        제가 생각했을때는 최소한 처음엔(1의자리수 말고는 십자리부터 천자리까지는
        변화없이 0(zero)가 표시될 줄 알았는데 8만 표시(약간 부분적으로 흐리하게)되는데
        왜 그러죠?

 

void dly_ms(unsigned int d) {  
    unsigned int  i,j;
    for(i=0;i<d;i++){ for(j=0;j<920;j++); }       // @22.118400Hz
}

void Timer_0_Interrupt(void) interrupt 1{  // 225Hz주기
//  P4=0xFF; // FND OFF

    switch(FND_CNT){
        case 0: P0=Seg_Data[counter/1000];     dly_ms(1); FND_COM1=0; break;
        case 1: P0=Seg_Data[(counter/100)%10]; dly_ms(1); FND_COM2=0; break;
        case 2: P0=Seg_Data[(counter/ 10)%10]; dly_ms(1); FND_COM3=0; break;
        case 3: P0=Seg_Data[counter%10];       dly_ms(1); FND_COM4=0; break;
    }

딜레이를 넣어서 문제를 키우면 눈에 확 들어올 수 있습니다.

 


    switch(FND_CNT){
        case 0: P0=Seg_Data[counter/1000];     FND_COM1=0; break;
        case 1: P0=Seg_Data[(counter/100)%10]; FND_COM2=0; break;
        case 2: P0=Seg_Data[(counter/ 10)%10]; FND_COM3=0; break;
        case 3: P0=Seg_Data[counter%10];       FND_COM4=0; break;
    }
    if(++FND_CNT>3)FND_CNT=0;
    //
    if(delay_buf)
    { 
      if(--delay_buf==0)delay_flg=1; 
    }
}

질문3). FND_CNT가 0에서 3까지 변하는 것과 switch문과 관계?
        즉 counter는 인터럽트에 의하여 계속 변하는고 있는데 이때 FND_CNT를
        위와 같이 변하게 해서 처리하는 이유

counter는 안터럽트에 의해서 변하지 않습니다.

인터럽트에서는 사용만 할 뿐이고,

counter값 변화는 메인의 for()문입니다.

FND_CNT는 FND 자릿수를 표시 하기 위한 카운터입니다.

 

질문4). FND_CNT가 1일때
        P0에 계산된 결과 값이 대입이 되고 FND_COM1에 0이 세팅되면
        첫번째 세그먼트에만 P0에 계산된 결과값이 대입되고 첫번째 세그먼트에만 표시되는 건가요?

맞습니다.

//
void delay_ms(U_I d){ 
    delay_buf=(U_I)((float)d*0.225);
    if(delay_buf==0)delay_buf=1;
    TH0=0; delay_flg=0; while(!delay_flg);
}

질문5). 크리스탈 주파수에 따라서 0.225 값을 추출 해 내는 방법은 ?

225Hz 주기와 연동 해서 잘 생각 해 보세요


    if(delay_buf)
      if(--delay_buf==0)delay_flg=1; 
    }
225Hz 주기의 인터럽트 함수 안에서 delay_buf 변수는 1씩 감소 합니다.

 

 

//
void main(){
    ET0=1; TR0=1; EA=1;
    while(1){
        for(counter=0;counter<10000;counter++)delay_ms(1000);
    }
}
//-------------------------------------------------------------

댓글 : 0

조회수 : 1,286

등록된 댓글이 없습니다.

게시물 검색

8051/PIC 목록

게시물 검색


Privacy Policy
MCU BASIC ⓒ 2017
PC버전