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

TODAY465 TOTAL2,592,986
사이트 이용안내
Login▼/회원가입
최신글보기 질문게시판 기술자료 동영상강좌

아두이노 센서 ATMEGA128 PWM LED 초음파 AVR 블루투스 LCD UART 모터 적외선


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

페이지 정보

작성자 키트 작성일2017-08-23 15:19 조회1,287회 댓글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,287

등록된 댓글이 없습니다.

8051/PICHOME > 8051/PIC > 전체 목록

게시물 검색

2022년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2021년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2020년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2019년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2018년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
Privacy Policy
MCU BASIC ⓒ 2020
모바일버전으로보기