질문게시판 > 답변 : 답변 : 안녕하세요 썜avr128

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

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

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

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

BASIC4MCU > 질문게시판

답변 : 답변 : 안녕하세요 썜avr128

페이지 정보

작성자 master 작성일19-11-27 17:12 조회3,301회 댓글0건

본문

 

#include

#include

#include

unsigned char SEG[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83};

unsigned char C[3]={0b00000001,0b00000010,0b00000100};

unsigned char R[5]={0b00000000,0b00000001,0b00000010,0b00000100,0b00001000};

unsigned char A[]={0xff,0xff,0xff,0xff,0b11111110,0b11111101,0b11111011,0b11110111};

unsigned int RESULT[4]={0,0,0,0};

unsigned int G[7]={ };

unsigned char n;

char num;

int Gap[7]={ };

int isr;

int a,p,y,t;

int u=0;

int start;

int sec1,sec10,min1,min10;

int s=0;

int loop;

ISR(INT4_vect){ //덧셈

  start=0;

  isr=0;

  for(int g=0; g;>

    isr+=G[g];

  }

  Unit(0);

}

//

ISR(INT5_vect){ //곱셈

  start=0;

  int sum=0;

  int isr=1;

  for(int g=0; g;>

  isr*=G[g]; }

  sum=isr%10000;

  A[3]=SEG[sum/1000]; //1000의 자리

  A[2]=SEG[(sum%1000)/100]; //100의자리

  A[1]=SEG[((sum%1000)%100)/10]; //10의자리

  A[0]=SEG[((sum%1000)%100)%10]; //1의자리

}

//

ISR(INT6_vect){ //최소

  start=0;

  isr=G[0];

  for(int g=0; g;>

    if(G[g])isr=g[g];<>

  }

  Unit(0);

}

//

ISR(INT7_vect){

  start=0;

  isr=0;

  for(int g=0; g;>

    if(G[g]>isr)isr=G[g];

  }

Unit(0); }

ISR(INT_vect){

  start=1;

}

//

void TimerDisplay(){ //Timer/Counter Display

  A[0]=SEG[sec1];

  A[1]=SEG[sec10];

  A[2]=SEG[min1];

  A[3]=SEG[min10];

}

//

ISR(TIMER0_OVF_vect){

  if(loop<100)

  loop++;

  else{

    loop=0;

    sec1++;

    if(sec1>=10){ //second

      sec10++;

      sec1=sec1%10;

    }

    if(sec10>=6){

      min1++;

      sec10=sec10%6;

      sec1=sec1%10;

    }

    if(min1>=10){

      min10++;

      min1=min1%10;

      sec10=sec10%6;

      sec1=sec1%10;

    }

  }

  TCNT0=112;

}

//

char Keypad(){

  char n=0xff;

  PORTC=0b00000001;

  _delay_ms(1);

  if((PINC&0xf0)==0b000100000){

    n=SEG[1];

  }

  else if((PINC&0xf0)==0b00100000){

    n=SEG[4];

  }

  else if((PINC&0xf0)==0b01000000){

    n=SEG[7];

  }

  else if((PINC&0xf0)==0b10000000){

    for(int i=0; i<4; i++)

    A[i]=0xff; //잘못 입력했을 때를 대비하여*누르면 세그먼트값 모두 지우기

  }

  PORTC=0b00000010;

  _delay_ms(1);

  if((PINC&0xf0)==0b00010000){

    n=SEG[2];

  }

  else if((PINC&0xf0)==0b00100000){

    n=SEG[5];

  }

  else if((PINC&0xf0)==0b01000000){

    n=SEG[8];

  }

  else if((PINC&0xf0)==0b1000000){

    n=SEG[0];

  }

  PORTC=0b00000100;

  _delay_ms(1);

  if((PINC&0xf0)==0b00010000){

    n=SEG[3];

  }

  else if((PINC&0xf0)==0b00100000){

    n=SEG[6];

  }

  else if((PINC&0xf0)==0b01000000){

    n=SEG[9];

  }

  else if((PINC&0xf0)==0b10000000){

    G[u++]=StoreNumber();

    for(int i=0; i<4; i++)

    A[i]=0xff; //#이 눌러짐을 확인하기 위해 눌러지면 세그먼트 불 모두 소등

  }

  return n;

}

//

int main(){

  DDRA=0xff;

  DDRB=0xff;

  DDRC=0x0f;

  DDRE=0x00; // PORTE의 4~7입력

  PORTE=0xf0; // PORTE의 4~7풀업

  DDRF=0x00; // PORTF0입력

  PORTF=0x01; // PORTF 0 풀업

  EIMSK=0b11110001; // INT4~7,0 인터럽트 인에이블

  EICRB=0b10101010; // INT4~7 하강에지

  EICRA=0b10101010; // INT0 하강에지

  SREG=0x80; // 전역 인터럽트 인에이블

  TCCR0=0b00000111;

  TCNT0=112;

  TIMSK=0b00000001;

  while(1){

    NumberInput();

    if(start==1)

    TimerDisplay(); // start값이 1일 때(INT0이 걸렸을 때)display호출

  }

}

//

void NumberInput(){

  char temp;

  num=Keypad(); // Keypad함수의 반환값인 SEG배열을 num에 대입

  if(num!=0xff){

    A[3]=A[2];

    _delay_ms(10);

    A[2]=A[1];

    _delay_ms(10);

    A[1]=A[0];

    _delay_ms(10);

    A[0]=num;

    _delay_ms(10);

  } //세그먼트위에서 값을 왼쪽으로 시프트 시켜줌

  a=0;

  temp=0xfe;

  for(int i=0; i<100; i++){

    PORTB=temp;

    PORTA=A[a++]; // 세그먼트에 입력한 숫자 차례로 출력

    _delay_ms(1);

    temp=(temp<<1)|1; //세그먼트를 오른쪽에서 왼쪽으로 차례로 하나씩 점등

    if(a>3)a=0;

    if(temp==0xef)

    temp=0xfe; //세그먼트를 PORTB 0~3만 이용했으므로 4로 넘어가면 다시 오른쪽 제어

    _delay_ms(1);

  }

}

//

int StoreNumber(void){

  int v[4];

  for(int h=0; h<4; h++){

    RESULT[h]=A[h]; //RESULT배열에 세그먼트에 나타난 숫자를 차례로 대입이 때 대입되는 값은 정수가 아닌 A배열의 값.

    for(int n=0; n<10; n++){

      if(RESULT[h]==SEG[n])v[h]=n; //A배열의 값이 대입되어 있기 떄문에 이를 정수로 바꿔주는 작업

      else if(RESULT[h]==0Xff)v[h]=0; //만약 아무 입력이 없다면 0 이라는 숫자로 취급

    }

    y=(v[3]*1000)+(v[2]*100)+(v[1]*10)+(v[0]); //자릿수에 맞게 세그먼트 각자의 숫자를 하나의 숫자로 계산

  }

  return y;

}

//

void ReadNum(){

  for(int g=0; g;>

    Gap[g]=G[g]; // 입력받은 4개의 값을 Gap 배열에 차례로 대입

  }

}

//

void Unit(int sum){

  sum=isr%10000;

  A[3]=SEG[sum/1000];

  A[2]=SEG[(sum%1000)/100];

  A[1]=SEG[((sum%1000)%100)/10];

  A[0]=SEG[((sum%1000)%100)%10];

}

//

147*2580 전혀 먹통이고 369#누르면 사진과같이 숫자 3333 만 세그먼트에 뜹니다..

스위치도 먹통입니다.

thumb-1908861390_D83Oqyrv_6d91d097c5aeb132ae9c61b9bb61260b561a336c_600x450.jpg

<답변>

우선,,,스위치 회로도가 엉터리입니다.
풀다운 저항이 무엇인지도 모르는 사람이 책을 썻나봅니다.
소스에서는 내부 풀업저항을 사용하고 있으므로 풀업 또는 풀다운 저항 둘 중의 하나로 회로를 구성해야합니다.
현재 동작하더라도 정상적인 회로구성이 아닙니다.

포트A에는 전류제한용 저항을 사용해야 합니다.
저대로 사용하면 포트A가 고장납니다.
역시..실력이 부족한 사람이 맞군요.
//
//
ISR(INT_vect){ start=1; }
ISR(INT0_vect){ start=1; }
인터럽트0 함수명은 오류가 있습니다.
//
  if     ((PINC&0xf0)==0b000100000){ n=SEG[1]; }
  if     ((PINC&0xf0)==0b00010000){ n=SEG[1]; }
여기도 오류가 있군요

 

// DateTime : 2019-11-27 오후 5:10:01
// by Ok-Hyun Park
//
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
//
unsigned char SEG[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83};
unsigned char C[3]={1,2,4};
unsigned char R[5]={0,1,2,4,8};
unsigned char A[]={0xff,0xff,0xff,0xff,~1,~2,~4,~8};
unsigned char n;
unsigned int  RESULT[4]={0,0,0,0};
unsigned int  G[7];
//
char num;
int  Gap[7];
int  isr=0,a,p,y,t,u=0,start,sec1,sec10,min1,min10,s=0,loop;
//
int StoreNumber(void){
  int v[4];
  for(int h=0h<4h++){
    RESULT[h]=A[h];
    for(int n=0n<10n++){
      if(RESULT[h]==SEG[n])v[h]=n;
      else if(RESULT[h]==0Xff)v[h]=0;
    }
    y=(v[3]*1000)+(v[2]*100)+(v[1]*10)+(v[0]);
  }
  return y;
}
//
char Keypad(){
  char n=0xff;
  PORTC=1_delay_us(1);
  if     (PINC&0x10){ n=SEG[1]; }
  else if(PINC&0x20){ n=SEG[4]; }
  else if(PINC&0x40){ n=SEG[7]; }
  PORTC=2_delay_us(1);
  if     (PINC&0x10){ n=SEG[2]; }
  else if(PINC&0x20){ n=SEG[5]; }
  else if(PINC&0x40){ n=SEG[8]; }
  else if(PINC&0x80){ n=SEG[0]; }
  PORTC=4_delay_us(1);
  if     (PINC&0x10){ n=SEG[3]; }
  else if(PINC&0x20){ n=SEG[6]; }
  else if(PINC&0x40){ n=SEG[9]; }
  else if(PINC&0x80){
    G[u++]=StoreNumber();
    for(int i=0i<4i++)A[i]=0xff//#
  }
  return n;
}
//
void NumberInput(){
  char temp=0xfe;
  a=0;
  num=Keypad();
  if(num!=0xff){
    A[3]=A[2]; A[2]=A[1]; A[1]=A[0]; A[0]=num;
    while(Keypad()!=0xFF); // key에서 손을 뗄 때까지 대기
  }
  //
  for(int i=0i<100i++){
    PORTB=tempPORTA=A[a++]; _delay_ms(1);
    temp=(temp<<1)|1if(a>3)a=0if(temp==0xef)temp=0xfe_delay_ms(1);
  }
}
//
void ReadNum(){
  for(int g=0g<ug++)Gap[g]=G[g]; // 입력받은 4개의 값을 Gap 배열에 차례로 대입
}
//
void Unit(int sum){
  sum=isr%10000;
  A[3]=SEG[sum/1000%10];
  A[2]=SEG[sum/100%10];
  A[1]=SEG[sum/10%10];
  A[0]=SEG[sum%10];
}
//
ISR(INT4_vect){ //덧셈
  start=0isr=0;
  for(int g=0g<ug++){ isr+=G[g]; }
  Unit(0);
}
//
ISR(INT5_vect){ //곱셈
  int sum=0,isr=1;
  start=0;
  for(int g=0g<ug++){ isr*=G[g]; }
  sum=isr%10000;
  A[3]=SEG[sum/1000];
  A[2]=SEG[(sum%1000)/100];
  A[1]=SEG[((sum%1000)%100)/10];
  A[0]=SEG[((sum%1000)%100)%10];
}
//
ISR(INT6_vect){ //최소
  start=0isr=G[0];
  for(int g=0g<ug++){ if(G[g]<isr)isr=G[g]; }
  Unit(0);
}
//
ISR(INT7_vect){
  start=0isr=0;
  for(int g=0g<ug++){ if(G[g]>isr)isr=G[g]; }
  Unit(0);
}
//
ISR(INT0_vect){ start=1; }
//
void TimerDisplay(){
  A[0]=SEG[sec1]; A[1]=SEG[sec10]; A[2]=SEG[min1]; A[3]=SEG[min10];
}
//
ISR(TIMER0_OVF_vect){
  TCNT0=112;
  //
  if(++loop>99){ loop=0;
    if(++sec1>9){ sec1=0//second
      if(++sec10>5){ sec10=0;
        if(++min1>=10){ min1=0if(++min10>5)min10=0; }
      }
    }
  }
}
//
int main(){
  DDRA=0xff;  DDRB=0xff;  DDRC=0x0FPORTE=0xf0PORTF=0x01;
  TCNT0=112;  TCCR0=0x07TIMSK=0x01;
  EICRA=0xAAEICRB=0xAAEIMSK=0xF1// INT0, INT4~7 하강에지
  SREG=0x80;
  while(1){
    NumberInput();
    if(start==1)TimerDisplay(); // start값이 1일 때(INT0이 걸렸을 때)display호출
  }
}
//
147*2580 전혀 먹통이고 369#누르면 사진과같이 숫자 3333  세그먼트에 뜹니다..
스위치도 먹통입니다.

 

 

  if(num!=0xff){
    A[3]=A[2]; A[2]=A[1]; A[1]=A[0]; A[0]=num;
    while(Keypad()!=0xFF); // key에서 손을 뗄 때까지 대기
  }
키를 눌렀을 경우, key에서 손을 뗄 때까지 대기하는 코드를 추가했습니다.

 

조금만 복잡해도 생각한대로 동작하지 않습니다.

차근 차근 하나씩 버그를 찾아서 수정하세요

복잡한 코드는 남이 도와주지 못합니다.

스스로 해결해야하죠

 

  • BASIC4MCU 작성글 SNS에 공유하기
  • 페이스북으로 보내기
  • 트위터로 보내기
  • 구글플러스로 보내기
  • 카카오톡으로 보내기

댓글 : 0

조회수 : 3,301

등록된 댓글이 없습니다.

게시물 검색

BASIC4MCU > 질문게시판 목록

제목 날짜
공지 MCU, AVR, 아두이노 등 전자공학에 관련된 질문은… 스태프  19-01-15
공지 사이트 이용 안내 댓글[25] master  17-10-29
질문 빵판없이 디스플레이 넣을 수 있을까요? 댓글[1] 첨부파일오소로롯 새글 22-06-29
질문 라즈베리파이4 신형 선택문제 댓글[1] maximum  22-06-26
질문 음전압 ADC 댓글[2] 412904  22-06-26
질문 아두이노 센서값 출력 질문입니다! 댓글[1] 아궁2  22-06-24
질문 ATmega128, ATmega28 RS232통신 첨부파일Moon4201  22-06-24
답변 답변 : ATmega128, ATmega28 RS232… 댓글[1] master  22-06-25
질문 서보모터, 온습도센서 코드 질문 댓글[2] 첨부파일kshdlfaldfh  22-06-22
답변 답변 : 서보모터, 온습도센서 코드 질문 댓글[15] master  22-06-22
질문 steppermulti5 질문 응애  22-06-21
답변 답변 : steppermulti5 질문 댓글[1] master  22-06-22
질문 atmega128 avr usart 질문 snoflak  22-06-21
답변 답변 : atmega128 avr usart 질문 댓글[5] master  22-06-21
질문 사용자 정의 함수 변환 하는 방법 댓글[2] 첨부파일da0800  22-06-21
질문 atmega128 댓글[1] 양의노래  22-06-20
질문 아두이노 동시동작 재질문 댓글[9] 첨부파일죠르디  22-06-20
질문 초음파센서로 dc모터 제어하기 댓글[1] 첨부파일난쟁2  22-06-20
질문 아두이노 동시동작 댓글[7] 죠르디  22-06-19
질문 ATMEGA128 UART,FND 연동 질문 JMOD  22-06-19
답변 답변 : ATMEGA128 UART,FND 연동 질문 댓글[1] master  22-06-20
질문 atmeg128 질문이요 댓글[1] 첨부파일공대생er  22-06-18
질문 atmega128 초음파 센서로 신호등 시간초 늘리기 서동씨  22-06-18
답변 답변 : atmega128 초음파 센서로 신호등 시간초… 댓글[1] master  22-06-18
질문 atmega128 댓글[2] 망경이  22-06-18
질문 앱인벤터 이용해서 수동 자동 할라고하는데 ..잘안됩니다… 댓글[1] 따랑해영  22-06-18
답변 질문 : 앱인벤터 이용해서 수동 자동 할라고하는데 ..… 댓글[1] 첨부파일따랑해영  22-06-19
답변 질문 : 앱인벤터 이용해서 수동 자동 할라고하는데 .… 첨부파일따랑해영  22-06-19
질문 서보모터와 초음파센서 댓글[1] 브링미히어  22-06-17
질문 LCD 도와주세요 ㅜㅠㅠㅠ 댓글[2] 첨부파일dentist22  22-06-17
게시물 검색


Privacy Policy
MCU BASIC ⓒ 2017
PC버전