BASIC4MCU | 질문게시판 | atmega128 스톱워치 작성 중 외부 인터럽트 관련 질문 드립니다.
페이지 정보
작성자 마프하나 작성일2022-05-22 16:20 조회516회 댓글4건본문
댓글 4
조회수 516master님의 댓글
master 작성일
PC에 연결된 키패드로 인터럽트를 구동하고 싶다는 말인가요?
1. 회로적으로 PC7을 PE4(INT4)에 연결합니다.
2, 키패드 초기 조건은 PC3=0;을 출력해두면 키패드 ON/C키를 누르면 PE4(INT4)에 HIGH가 출력됩니다.
상승엣지 트리거 모드로 받으면 되겠죠
마프하나님의 댓글
마프하나
키패드의 다른 버튼도 입력으로 사용하고 싶은데 그 경우 알려주신대로 동일한 방법을 사용해도 괜찮을까요?
master님의 댓글
master 작성일
뭘하려는지 명확하지 않은 상태라 답변이 어렵고요
(하기 전에 가능한지 체크부터) 일단 해보고
안되면 질문하세요
마프하나님의 댓글
마프하나 작성일
일단은 INT0~INT7모두 다른 곳에 연결이 되어 있는 상태이고, 위 사진의 나수셈 기호를 시작버튼, INT0를 인터럽트로 사용하고 싶어서 PC7 = 0;으로 해두고 PC7와 PD0를 연결해보았는데 인터럽트가 발생되지 않았습니다.
저는 키패드의 나숫셈 기호를 입력 시작 버튼으로 하여 초기에는 FND가 '----'상태이고, 나숫셈 기호를 누르면 입력 동작으로 넘어가서 키패드의 숫자를 누르면 1의 자리부터 시작하여 1000의 자리 까지 0~9의 숫자가 입력되고 그 다름은 더하기 기호를 누르면 숫자가 1초씩 줄어드는 타이머를 구현할려고 하는데 일단은 동작입력모드에서 문제가 발생한 상황입니다. 혹시 어떤 코드가 잘못 작성되었는지 조언을 주실 수 있다면 감사하겠습니다.
#include <avr/io.h>
#define F_CPU 14.7456E6
#include <avr/interrupt.h>
#include <util/delay.h>
static unsigned char Count;
static unsigned char sec;
static unsigned int Port_fnd[] ={0x1f,0x2f,0x4f,0x8f};
static unsigned char Port_char[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90,0x88,0x83,0xc4,0xa1,0x84,0x8e};
void Init_Timer2(void){
TIMSK = (1 << TOIE0);
TCNT0 = 112;
EICRA = (1 << ISC01) | (1 << ISC00);
EIMSK = 0x03;
}
void PORT_Init(void)
{
DDRB = 0xff;
DDRE = 0xf0;
DDRC = 0x0f;
}
void Num_divide(unsigned char* divide_num, int num)
{
int buffer=0;
divide_num[3] = num / 1000;
buffer = num % 1000;
divide_num[2] = buffer / 100;
buffer = buffer % 100;
divide_num[1] = buffer/10;
divide_num[0] = buffer%10;
}
unsigned char keyScan(void)
{
unsigned int key_scan_line = 0xEF;
unsigned char key_scan_loop = 0, getPinData = 0;
unsigned char key_num = 0;
for (key_scan_loop = 0; key_scan_loop < 4; key_scan_loop++)
{
PORTC = key_scan_line;
_delay_us(1);
getPinData = PINC & 0x0F;
if(getPinData != 0x00)
{
switch(getPinData)
{
case 0x10:
key_num = key_scan_loop*4 + 1;
break;
case 0x20:
key_num = key_scan_loop*4 + 2;
break;
case 0x40:
key_num = key_scan_loop*4 + 3;
break;
case 0x80:
key_num = key_scan_loop*4 + 4;
break;
default:
break;
}
return key_num;
}
key_scan_line = (key_scan_line << 1);
}
}
int KEYIN (void)
{
int Keynum =(int)keyScan();
int num = 10;
while(num != 10)
{
switch(Keynum)
{
case 2 :
num = 0;
break;
case 5 :
num = 1;
break;
case 6 :
num = 2;
break;
case 7 :
num = 3;
break;
case 9 :
num = 4;
break;
case 10 :
num = 5;
break;
case 11 :
num = 6;
break;
case 13 :
num = 7;
break;
case 14 :
num = 8;
break;
case 15 :
num = 9;
break;
default:
num = 10;
break;
}
}
return num;
}
ISR(INT0_vect)
{
unsigned char FND_Print[4] = {0,};
int i = 0;
//Num_divide(FND_Print, (int)sec);
if ((int)keyScan() == 16)
{
while (1)
{
PORTC = 0xfe;
if(i < 3)
{
FND_Print[i] = KEYIN();
i ++;
}
PORTE = Port_fnd[0];
PORTB = Port_char[FND_Print[0]];
_delay_ms(1);
PORTE = Port_fnd[1];
PORTB = Port_char[FND_Print[1]];
_delay_ms(1);
PORTE = Port_fnd[2];
PORTB = Port_char[FND_Print[2]];
_delay_ms(1);
PORTE = Port_fnd[3];
PORTB = Port_char[FND_Print[3]];
_delay_ms(1);
if(PIND = 0x02)
break;
}
}
}
ISR(INT1_vect)
{
TCCR0 = (1 << CS02) | (1 << CS01) | (1 << CS00);
}
ISR(TIMER0_OVF_vect)
{
TCNT0 = 112;
Count++;
if(Count == 100)
{
sec++;
Count = 0;
}
}
int main(void)
{
unsigned char FND_Print[4] = {0,};
Count = 0;
sec = 0;
Init_Timer2();
PORT_Init();
sei();
while(1)
{
PORTE = Port_fnd[0];
PORTB = 0xbf;
_delay_ms(1);
PORTE = Port_fnd[1];
PORTB = 0xbf;
_delay_ms(1);
PORTE = Port_fnd[2];
PORTB = 0xbf;
_delay_ms(1);
PORTE = Port_fnd[3];
PORTB = 0xbf;
_delay_ms(1);
}
}