질문이 있습니다. 8051인데요
4개의 세그먼트를 1 2 3 4 이렇게 숫자를 붙이면요
4번 세그먼트에 0-9까지 숫자 디스플레이 되다가 인터럽트 스위치를 누르면 3번 세그먼트로 이동되면서 계속 0-9까지 숫자가 반복되고요 또 누르면 2번 세그먼트로...
이렇게 가다가 이번엔 다른인터럽트스위치를 누르면 반대쪽으로 9-0으로 숫자가 디스플레이 되는거 하려고 하는데 회로는 다 만들었지만 소스를 어떻게 만들어야할지 모르겟습니다. 조언좀 주실수잇을까요...
글의 정황상으로는 정확히 알순 없지만
메인문이 돌아가고 있을때 인터럽트가 걸리면 다른 세그먼트를 동작시키려는 거 같네요..
회로가 없어 정확한 포트같은것을 알수 없어 개략적으로 글을 올립니다.
int seg_num=4;
int_함수()
{
set_num--;
if(set_num < 0)
set_num = 3;
}
main()
{
seg_num 번호에 해당하는 세그먼트에 값 출력
}
답변 감사합니다^^ 혹시나해서 쪽지 해봣는데 ... 제가 첫번째 회원이군요 ㅎㅎㅎ
#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으로 거꾸로 디스플레이 되게 하려고합니다. 제가 너무 몰라서 잘 가르쳐 주신거 같은데 어떡해해야할지 몰라서 소스를 올려봅니다 잘못된거좀 지적해주시고 추가할꺼좀 넣어주세요- 부탁드립니다.
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); //딜레이함수
아 그리고 한번 눌러도 여러번 쉬프트 되는 현상이 있을꺼에요 이것을 채터링 현상이라고 부르는데요
이 부분은 하드웨어나 소프트웨어로 처리하셔야 합니다.
전체소스는 짜드리지 않고 힌트만 드렸으니 보시고 만들어보세요.
마이컴은 직접 해보면서 실력이 상승하니까요^^;;
정답은 본인이^^
몇일째 붙잡고 잇는지 모르겠습니다.
2주째 집에도 못가고.. 이번주에는 집에 갔다 오려고했는데;;
어렵지 않으면 전체소스 한번 보여주시겠어요?..
부탁드립니다.. 이걸 해결해야 집에갈수잇어서..
#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 라구.. 에구;;
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;
}
감사합니다.. 근데.. 확인해보니... 에러는 없는데..
아에 동작조차 하지 않네요; ㅠ ㅠ
어찌된일인지 모르겠어요 .
아크마님 도움 부탁...
하드웨어가 포함된 작품을 소스만 보고 판단하기에는 무리가 있습니다.
하드웨어와의 구성도 알아야하기때문인데요..
소스만을 올려주셔서는 판별이 좀 힘들듯 합니다.
회로도도 같이 올려주시면 좋겠는데요..
그리고 제가 짜드린 부분은 대충 힌트 부문만 간단히 짜드린것이고 실제로는
인터럽트 부분에서
void EX0_INT(void) interrupt 0
{
temp=0;
if(seg_num < 3)
seg_num++;
}
위와같은 루틴들이 필요합니다. 물론 인터럽트 1에서도요...
그래야 seg_num이 0에서 3 사이로만 움직일테니까요
저 소스에서는 seg_num이 숫자가 무한히 올라가므로 switch문의 조건이 부합되지 않는거구요..
있는 데요 그 회로도에서 89c51에 외부 인터럽트0 외부인터럽트1에 스위치 추가된거에여-
다른건 똑같아요-
아 외부인터럽트0,1 은 포트 3 에 달려잇어여 3.x 3.x 두개요 정확히 몇인지 기억이 잘..
정확히 알아야하면 알려드릴게여..
확인하시고 연락주시길..ㅋ
인터럽트1 이 p3.3 인터럽트0이 p3.2 이에요..
흠 주말이라..쉬시는건가;;
오늘내로 마무리해야되는데..
계속 와보게 되네여^^ ㅎ