BASIC4MCU | 질문게시판 | A tmega128 도어락구현
페이지 정보
작성자 힝헹홍 작성일2020-12-17 13:12 조회3,122회 댓글1건본문
외부인터렙터 스위치 4개와 내장 스위치1개를 이용해서 도어락을 만드는데요
sw4를 누르면 세븐세그먼트 1digit에 숫자 1이 올라가고 나머지는 1 - - - 이렇게 뜨게 하고
sw5를 누르면 세븐세그먼트 2 digit에 숫자 1이 올라가고 나머지는 - 1 - -이렇게 만들어서 4자리 숫자를 완성시키고 내장스위치를 누르면 이게 비밀번호인 5229가 맞으면 경쾌한 소리가 나오고 틀리면 틀린 경고음이 나오게 만들고 싶은데 제가 짠 코드가 어디가 잘못됬는지 모르겠어요ㅜㅜ
외부 인터렙터를 누르면 0 - - -, - 0 - -, - - 0 - , - - - 0 이 나오기는 하는데 숫자증가가 안됩니다ㅜ
#define F_CPU 16000000
#define sw0 0
#define sw1 1
#define sw2 2
#define sw3 3
#define E1 329 //미
#define A1 440 //라
#define C_ 1108 //도샵
#define E2 659 //미
#define A2 880 //라
#define DLY_0 32 // 온음표*2
#define DLY_1 16 // 온음표
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
void ShowDigit(int i, int digit);
const unsigned char Segment_Data[] =
{0x40,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x27,0x7F,0x6F};//0x3F,
int sw;
unsigned char COLUMN[4] = {0,0,0,0};
volatile int Correct[] = {E1, A1, C_, E2, A2};
volatile int Correct_length[]={DLY_1,DLY_1,DLY_1,DLY_1,DLY_1};
volatile int Wrong[] = {A2,A2,A2,A2};
volatile int Wrong_length[] = {DLY_0,DLY_0,DLY_0,DLY_0};
volatile int freq = 1000;
volatile unsigned char TIMERvalue = 0xFF;
void Shimpyo(int time);
void Cutoff_Play(void);
int s1=0;
int s2=0;
int s3=0;
int s4=0;
ISR(INT4_vect)
{
sw = sw0;
}
ISR(INT5_vect)
{
sw = sw1;
}
ISR(INT6_vect)
{
sw = sw2;
}
ISR(INT7_vect)
{
sw =sw3;
}
ISR(TIMER0_OVF_vect)
{
TCNT0 = TIMERvalue;
PORTB ^=0x80;
}
void Cutoff_Play(void)
{
_delay_ms(300);
TIMERvalue=255;
_delay_ms(20);
}
int main(void)
{
DDRG = 0x00; //내장 스위치 입력
DDRE = 0x00; // 외부 인터럽트 입력
DDRA = 0xff; // 세븐세그먼트 입력
DDRC = 0xff; // 세븐세그먼트 입력
DDRB = 0x80; //스피커 7번 output 설정
EICRB = 0xFF; //스위치 외부 인터렙터 레지스터
EIMSK = 0xFF; //스위치 외부 인터렙터 레지스터
TCCR0 = 0x04; // 타이머 인터렙터 normal mode
TCNT0 = 0x05; // 타이머 레지스터
TIMSK = 0x80; // 타이머 레지스터
PORTC = 0x00; //세븐세그먼트 on
sei();
int i;
int digit;
int n=0;
unsigned char keyin =0;
PORTA = Segment_Data[0];
PORTB = keyin = (PING&0x0C)>>2;
sw =6;
while (1)
{
Run();
if(keyin)
{
COLUMN[0] =0;
COLUMN[1] = 0;
COLUMN[2] = 0;
COLUMN[3] = 0;
for(int i=0;i<4;i++)
{
ShowDigit(COLUMN[i],i); //
_delay_ms(0.001);//wait for a second
}
if (s1==5&&s2==2&&s3==2&&s4==9)
{
Correct_song();
_delay_ms(1000);
break;
}
else
{
Wrong_song();
_delay_ms(1000);
break;
}
}
}
}
void Run(void)
{
if (sw == sw0)
{
s1= s1+1;
COLUMN[0] = s1;
COLUMN[1] = 0;
COLUMN[2] = 0;
COLUMN[3] = 0;
for(int i=0;i<4;i++)
{
ShowDigit(COLUMN[i],i);
_delay_ms(0.001);//
}
}
else if (sw == sw1)
{
s2= s2+1;
COLUMN[0] =0;
COLUMN[1] = s2;
COLUMN[2] = 0;
COLUMN[3] = 0;
for(int i=0;i<4;i++)
{
ShowDigit(COLUMN[i],i); //
_delay_ms(0.001);//wait for a second
}
}
else if (sw == sw2)
{
s3= s3+1;
COLUMN[0] =0;
COLUMN[1] =0;
COLUMN[2] = s3;
COLUMN[3] = 0;
for(int i=0;i<4;i++)
{
ShowDigit(COLUMN[i],i); //
_delay_ms(0.001);//wait for a second
}
}
else if (sw == sw3)
{
s4= s4+1;
COLUMN[0] =0;
COLUMN[1] = 0;
COLUMN[2] = 0;
COLUMN[3] = s4;
for(int i=0;i<4;i++)
{
ShowDigit(COLUMN[i],i); //
_delay_ms(0.001);//wait for a second
}
}
}
void ShowDigit(int i, int digit)
{
PORTC= ~(0x01<<digit);
PORTA = Segment_Data[i];
}
void Correct_song(void)
{
for(int i=0;i<4;i++)
{
freq = Correct[i];
TIMERvalue = 255-(1000000/(8*freq));
Shimpyo(Correct_length[i]);
Cutoff_Play();
}
}
void Wrong_song(void)
{
for(int i=0;i<4;i++)
{
freq = Wrong[i];
TIMERvalue = 255-(1000000/(8*freq));
Shimpyo(Wrong_length[i]);
Cutoff_Play();
}
}
void Shimpyo(int time) {
for(int i=0;i<time;i++) {
_delay_ms(50);
}
}