BASIC4MCU | 질문게시판 | 답변 : 8051 인터럽트 관련해서 질문드립니다.
페이지 정보
작성자 master 작성일2018-02-01 22:36 조회6,647회 댓글1건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=165
본문
#include <reg51.h>//unsigned char led;//void delay(unsigned char i){ while(i--); }//void EXT0_int(void)interrupt 0{ // 외부 인터럽트 0 벡터번호=0EA=0; // 전체 인터럽트 디스에이블led=(led<<1)|0x01; // LED상태 변경if(led==0xff)led=0xfe; // 마지막인지 검사,마지막이면 재설정P1=led; // 포트 1로 출력delay(200); // 스위치 디바운싱을 위한 지연EA=1; // 전체 인터럽트 인에이블return;}//void main(void){TCON=0x01; // INT0 은 하강 에지에서 인터럽트 발생EX0=1; // 외부 인터럽트 인에이블EA=1; // 전체 인터럽트 인에이블PX0=1; // 외부 인터럽트 우선순위 Highled=0xfe; // 초기 출력 데이터P1=led; // 포트 1로 출력while(1);}//---------------------위 코드 중delay(200); // 스위치 디바운싱을 위한 지연EA=1; // 전체 인터럽트 인에이블return;}인터럽트 함수의 마지막 부분 return; 은 없어도 됩니다.왜 넣은 코드인지 모르겠고요이 명령을 사용하는 것 보다는 딜레이 후에 인터럽트 플래그를 크리어 시켜주는 것이 좋습니다.delay(200); // 스위치 디바운싱을 위한 지연IE0=0; // 딜레이 동안에 발생한 인터럽트 플래그가 있다면 clearEA=1; // 전체 인터럽트 인에이블//return;}//---------------------PX0=1; // 외부 인터럽트 우선순위 High다른 인터럽트가 없으니 인터럽트 우선 순위를 주든 안주든 실행에 차이는 없습니다.//---------------------void EXT0_int(void)interrupt 0{ // 외부 인터럽트 0 벡터번호=0EA=0; // 전체 인터럽트 디스에이블led=(led<<1)|0x01; // LED상태 변경if(led==0xff)led=0xfe; // 마지막인지 검사,마지막이면 재설정P1=led; // 포트 1로 출력delay(200); // 스위치 디바운싱을 위한 지연IE0=0; // 딜레이 동안에 발생한 인터럽트 플래그가 있다면 clearEA=1; // 전체 인터럽트 인에이블}다른 인터럽트를 사용하고 있지 않으므로인터럽트 함수의 시작과 끝에 넣은 전체 이네이블 명령도 필요 없습니다.//---------------------인터럽트 플래그를 사용해서 작성한 결과를 알고싶어서 질문드립니다...프로그램 예제 소스를 찾는 것일까요?
그리고 또 하나 여쭤보고싶은데 인터럽트 자체를 사용하는것과 플래그를 사용하는것이 무슨 차이가 있는것인지 여쭤봐도 될까요????
인터럽트는 발생 즉시 실행 됩니다.
플래그를 사용하는 것은
메인에서 인터럽트 플래그를 체크해서 처리하겠다는 뜻 같은데
소스코드가 복잡하면 플래그를 체크하는 시간이 지연 될 수 있겠죠
메인에서 하는 일이 없어서 플래그만 체크하고 있다면 차이가 없습니다.
댓글 1
조회수 6,64727315co님의 댓글
27315co 작성일정말 친절하게 설명해주셔서 감사합니다. 알기쉽게 설명을 해주셔서 이해가 확실히 된것같습니다.