회원가입 ID/PW 찾기

마이크로프로세서 HOT질문이 있습니다. 8051인데요

singost22007.04.11 22:4904.11조회 수 1194댓글 19이 게시물을

AA

질문이 있습니다.  8051인데요
4개의 세그먼트를 1 2 3 4 이렇게 숫자를 붙이면요
4번 세그먼트에 0-9까지 숫자 디스플레이 되다가 인터럽트 스위치를 누르면 3번 세그먼트로 이동되면서 계속 0-9까지 숫자가 반복되고요 또 누르면 2번 세그먼트로...

이렇게 가다가 이번엔 다른인터럽트스위치를 누르면 반대쪽으로 9-0으로 숫자가 디스플레이 되는거 하려고 하는데 회로는 다 만들었지만 소스를 어떻게 만들어야할지 모르겟습니다. 조언좀 주실수잇을까요...

singost2
댓글 19
  • No Profile

    글의 정황상으로는 정확히 알순 없지만

    메인문이 돌아가고 있을때 인터럽트가 걸리면 다른 세그먼트를 동작시키려는 거 같네요..

    회로가 없어 정확한 포트같은것을 알수 없어 개략적으로 글을 올립니다.

    int seg_num=4;
    int_함수()
    {

    set_num--;
    if(set_num < 0)
      set_num = 3;
    }


    main()
    {


    seg_num 번호에 해당하는 세그먼트에 값 출력

    }

  • No Profile

    답변 감사합니다^^ 혹시나해서 쪽지 해봣는데 ...   제가 첫번째 회원이군요 ㅎㅎㅎ

    #include <AT89X51.h>

    code unsigned char SEGMENT1[10] = {0xc0,0xf9,0xa4,0xb0,0x99,
                                                       0x92,0x82,0xf8,0x80,0x90}; //0-9까지 값
    code unsigned char SEGMENT2[10] = {0x90,0x80,0xf8,0x82,0x92,
                                                       0x99,0xb0,0xa4,0xf9,0xc0}; //9-0까지 값

    unsigned char temp;     // 인터럽트 상태 저장 전역 변수
    // 외부 인터럽트 0 처리 루틴
    void EX0_INT(void) interrupt 0
    {
      temp=0;
    }
    // 외부 인터럽트 1 처리 루틴
    void EX1_INT(void) interrupt 1
    {
      temp=1;
    }
    // 일정 시간 지연 함수
    void delay (unsigned int i)
    {
       while (i--);
    }

    // 메인
    void main(void)
    {
       unsigned char i;
       P1 = 0xff;  // 포트 초기 설정
       P2 = 0xef;
       IT0 = 1;         // 외부 인터럽트 0 엣지모드
       EX0 = 1;         // 외부 인터럽트 0 인에이블
       IT1 = 1;         // 외부 인터럽트 1 엣지모드
       EX1 = 1;         // 외부 인터럽트 1 인에이블
       EA = 1;          // 인터럽트 모두 인에이블
       temp = 0;       // state 초기 값
       i = 0;           // 포인터 초기 값
       do{
             for(i=0; i<10; i++){

                   P1 = SEGMENT1[i] //포트1에 세그먼트1 값 출력
                   P2 = SEGMENT2[i]  //포트2에 세그먼트2 값 출력
                   delay(10000); //딜레이함수
                   }
              
             if(i==10) i=0; //세그먼트가 9가되면 다시 0으로 돌려줌
           }
       }while(1);                // 무한 루프

    대충 소스가 이런데요.. 여기에 머 더 써야할꺼 같은데...  

    세그먼트 4개가 잇는데 한 세그먼트에 0-9까지 디스플레이되다가 외부인터럽트0 스위치를 누르면 왼쪽으로 이동되고 계속 0-9

    까지 디스플레이됩니다 또누르면 또 왼쪽 세그먼트로 이동되고요.. 그러다가 외부인터럽트1스위치를 누르면 이번에 오른쪽으

    로 이동되면서 9-0으로 거꾸로 디스플레이 되게 하려고합니다. 제가 너무 몰라서 잘 가르쳐 주신거 같은데 어떡해해야할지 몰라서 소스를 올려봅니다 잘못된거좀 지적해주시고 추가할꺼좀 넣어주세요- 부탁드립니다. 

  • No Profile

    temp라는 변수를 사용하셨는데 이것을 이용해서

    왼쪽으로 움직일지 오른쪽으로 움직일지에 대해서 결정해야 합니다.

    그리고 몇번째 포트를 사용해야할지 결정할 변수가 있어야겠군요.



    void EX0_INT(void) interrupt 0
    {
      temp=0;
     seg_num++;
    }


    void EX0_INT(void) interrupt 1
    {
      temp=0;
     seg_num--;
    }


     
     for(i=0; i<10; i++){
     
     switch(seg_num)
     case 0:
      P1 = SEGMENT1[i] //포트1에 세그먼트1 값 출력
     break;
     case 1:
      P2 = SEGMENT2[i]  //포트2에 세그먼트2 값 출력
      break;
     case 3:
      P3 = SEGMENT2[i]  //포트2에 세그먼트2 값 출력
      break;
     }
     delay(10000); //딜레이함수
     

    아 그리고 한번 눌러도 여러번 쉬프트 되는 현상이 있을꺼에요 이것을 채터링 현상이라고 부르는데요

    이 부분은 하드웨어나 소프트웨어로 처리하셔야 합니다.

    전체소스는 짜드리지 않고 힌트만 드렸으니 보시고 만들어보세요.

    마이컴은 직접 해보면서 실력이 상승하니까요^^;;

    정답은 본인이^^


  • No Profile
    case 하고break에서 컴파일하는데 계속 에러가 뜨네요;;

    몇일째 붙잡고 잇는지 모르겠습니다.

    2주째 집에도 못가고.. 이번주에는 집에 갔다 오려고했는데;;

    어렵지 않으면 전체소스 한번 보여주시겠어요?..
  • No Profile

    부탁드립니다.. 이걸 해결해야 집에갈수잇어서..

  • No Profile

    #include <AT89X51.h>

    code unsigned char SEGMENT1[10] = {0xc0,0xf9,0xa4,0xb0,0x99,
                                                       0x92,0x82,0xf8,0x80,0x90}; //0-9까지 값
    code unsigned char SEGMENT2[10] = {0x90,0x80,0xf8,0x82,0x92,
                                                       0x99,0xb0,0xa4,0xf9,0xc0}; //9-0까지 값

    unsigned char temp;     // 인터럽트 상태 저장 전역 변수
    // 외부 인터럽트 0 처리 루틴
    int seg_num=4;
    void EX0_INT(void) interrupt 0
    {
      temp=0;
     seg_num++;
    }
    // 외부 인터럽트 1 처리 루틴
    void EX1_INT(void) interrupt 1
    {
      temp=1;
     seg_num--;
    }
    // 일정 시간 지연 함수
    void delay (unsigned int i)
    {
       while (i--);
    }

    // 메인
    void main(void)
    {
       unsigned char i;
       P1 = 0xff;  // 포트 초기 설정
       P2 = 0xef;
       IT0 = 1;         // 외부 인터럽트 0 엣지모드
       EX0 = 1;         // 외부 인터럽트 0 인에이블
       IT1 = 1;         // 외부 인터럽트 1 엣지모드
       EX1 = 1;         // 외부 인터럽트 1 인에이블
       EA = 1;          // 인터럽트 모두 인에이블
       temp = 0;       // temp 초기 값
       i = 0;           // 포인터 초기 값
       do{
             for(i=0; i<10; i++){
               
                   switch(seg_num)
                  
            case 0:
                      P1 = SEGMENT1[i]; //포트1에 세그먼트1 값 출력
                     break;
                  
            case 1:
                      P2 = SEGMENT2[i];  //포트2에 세그먼트2 값 출력
                     break;
        
               } 
                   delay(10000); //딜레이함수
                  
              
             if(i==10) i=0; //세그먼트가 9가되면 다시 0으로 돌려줌
           }
       while(1);                // 무한 루프
       }

    이렇게 했는데  case 에서 에러가 나네여;;;
    missing enclosing switch 라구..  에구;;

  • No Profile
         switch(seg_num)
                  
            case 0:
                      P1 = SEGMENT1[i]; //포트1에 세그먼트1 값 출력
                     break;
                  
            case 1:
                      P2 = SEGMENT2[i];  //포트2에 세그먼트2 값 출력
                     break;
        
               } 


    블럭이 빠져있습니다.



         switch(seg_num)
              {    
            case 0:
                      P1 = SEGMENT1[i]; //포트1에 세그먼트1 값 출력
                     break;
                  
            case 1:
                      P2 = SEGMENT2[i];  //포트2에 세그먼트2 값 출력
                     break;
        
               } 
  • No Profile

    감사합니다.. 근데.. 확인해보니... 에러는 없는데..

    아에 동작조차 하지 않네요; ㅠ ㅠ

    어찌된일인지 모르겠어요 . 

    아크마님 도움 부탁... 

  • No Profile

    하드웨어가 포함된 작품을 소스만 보고 판단하기에는 무리가 있습니다.

    하드웨어와의 구성도 알아야하기때문인데요..

    소스만을 올려주셔서는 판별이 좀 힘들듯 합니다.

    회로도도 같이 올려주시면 좋겠는데요..

    그리고 제가 짜드린 부분은 대충 힌트 부문만 간단히 짜드린것이고 실제로는

    인터럽트 부분에서


    void EX0_INT(void) interrupt 0
    {
      temp=0; 
     
    if(seg_num < 3)
       seg_num++;
    }

    위와같은 루틴들이 필요합니다. 물론 인터럽트 1에서도요...

    그래야 seg_num이 0에서 3 사이로만 움직일테니까요

    저 소스에서는 seg_num이 숫자가 무한히 올라가므로 switch문의 조건이 부합되지 않는거구요..


  • No Profile
    http://kin.naver.com/db/detail.php?d1id=1&dir_id=10104&eid=gyRfncekslYLEEam5u0RfdFKb5d8eGqZ&qb=wM7Fzbe0xq4= 여기 가시면 답변에 회로도 하나
    있는 데요  그 회로도에서 89c51에 외부 인터럽트0 외부인터럽트1에  스위치 추가된거에여-
    다른건 똑같아요- 
  • No Profile

    아 외부인터럽트0,1 은 포트 3 에 달려잇어여 3.x 3.x 두개요 정확히 몇인지 기억이 잘..

    정확히 알아야하면 알려드릴게여..

  • No Profile

    확인하시고 연락주시길..ㅋ

  • No Profile

    인터럽트1 이 p3.3 인터럽트0이 p3.2 이에요..

  • No Profile

    흠  주말이라..쉬시는건가;;

    오늘내로 마무리해야되는데..

    계속 와보게 되네여^^ ㅎ

  • No Profile
    밑에 글 보시면 소스 있습니다...
  • No Profile
  • No Profile
    오우..
  • No Profile
    와우....
  • No Profile
    감사합니다.

하드웨어 설계 및 개발에 대하여 개발자들이 자유롭게 토론하는 공간입니다.
- Q&A, 자유주재 토론, 관련 정보 공유
- 분야 : 마이크로프로세서 응용, 전기/전자(아날로그/디지털) 회로 설계, C/C++ 프로그래밍, 펌웨어,
         PCB Artwork, 트러블슈팅 등 하드웨어 설계에 관한 전반인 내용
※ 게시글에 맞는 분류를 선택하여 글을 작성해 주시면 쾌적한 사이트 운영에 많은 도움이 됩니다.
※ 하드웨어 인사이트는 회원들간의 거래정보를 게재할 뿐이지, 그 어떤 책임과 의무도 가지지 않습니다.

search
번호 분류 제목 글쓴이 조회 수 날짜
2 ECAD Simulation HOTOrCAD Layout 단종 안내 아크마 9244 2009.12.29
1 ECAD Simulation HOTPSpice 오류2 jungsik 2177 2008.12.17
  • 자신이 하는 일을 재미없어 하는 사람치고 성공하는 사람 못 봤다.
    - 데일 카네기
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
  • 내 글이 추천받음 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.