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
등록된 댓글이 없습니다.