Did you know that you can navigate the posts by swiping left and right?

AVR led 점멸게임

10 Jan 2018 . category: tech . Comments
#atmega128 #mechatronics #science knowledge

저번주 경철이의 test board를 통해 기본적으로 led 순차점멸, 외부 인터럽트 led 점멸, 포트입력, 타이머등의 코드를 따라해 본 후 오늘 내 test board 납땜 및 선 연결을 마친 후 코딩을 시작했다. 간단히 연결한 회로를 말하면 led는 PORTA, 스위치는 PORTC, LCD는 PORTD에 연결 하였고 vcc, GND등을 전원부에 연결하였다.

게임 내용은 (호준 출처) 간단하다. 우선 각 스위치의 기능을 설정하는데 스위치1번을 누르면 첫번째 led가 켜지는 설정을 놓고 스위치2번을 누르면 첫번째 led와 세번째 led가 반전 즉 toggle되도록 설정한다. 그리고 스위치 3번을 누르면 두번째 led와 세번째 led가 toggle되도록 설정한다. 이렇게 3개의 스위치의 기능을 설치한 후 LED가 모두 켜진 상태에서 3개의 스위치를 각각 여러번 눌러 모두 꺼지게 하면 게임은 끝이난다. 그렇게 LED가 모두 꺼지면 LED 전체가 두세번 켜지고 꺼짐을 반복하여 게임이 클리어 되었음을 알려주고 다시 LED가 모두 켜진 상태인 게임 시작으로 돌아간다.

직접 짜본 코드는 두가지가 있는데 첫번째는

#include <mega128.h>
#include <delay.h>

unsigned char led = 0xFF;

void ON(char key);
void OFF(char key);

void main(void)
{
    unsigned char key = led;
    DDRA = 0xFF;
    DDRC = 0b00000010;
    ON(key);
}

void ON(char key)
{
    while(1)
    {
        if((PINC & 0b00010000) == 0)
        {
            if((key & 0x01) == 0b00000001)
            {
                key |=0x00;
            }
            else
            {
                key |= 0x01;
            }
        }
        if((PINC & 0b00100000) == 0)
        {
            if((key & 0x01) == 0b00000001)
            {
                key ^= 0x01;
            }
            else
            {
                key ^= 0x01;
            }
            if((key & 0x04) == 0b00000100)
            {
                key ^= 0x04;
            }
            else
            {
                key ^= 0x04;
            }
        }
        if((PINC & 0b01000000) == 0)
        {
            if((key & 0x02) == 0b00000010)
            {
                key ^= 0x02;
            }
            else
            {
                key ^= 0x02;
            }
            if((key & 0x04) == 0b00000100)
            {
                key ^= 0x04;
            }
            else
            {
                key ^= 0x04;
            }
        }
        PORTA = key;
        if((key & 0x07) == 0b00000000)
        {
            OFF(key);
        }
    }
}
void OFF(char key)
{
    int i=0;
    do{
        PORTA = key;
        delay_ms(1000);
        key ^= 0x07;
        i++
    } while(i<5);
    ON(led);
}

이런식으로 PINC 스위치가 눌리는 경우를 직접 포트 핀 입력 레지스터에 값을 &로 비교해 설정하였다.

두번째는


#include <mega128.h>
#include <delay.h>

#define switch1_on (!PINC.4)
#define switch2_on (!PINC.5)
#define switch3_on (!PINC.6)
#define switch1_off (PINC.4)
#define switch2_off (PINC.5)
#define switch3_off (PINC.6)

unsigned char led = 0xFF;

void ON(char key);
void OFF(char key);

void main(void)
{
    unsigned char key = led;
    DDRA = 0xFF;
    DDRC = 0b00000010;
    ON(key);
}

void ON(char key)
{
    while(1)
    {
        if(switch1_on)
        {
            if((key & 0x01) == 0b00000001)
            {
                key |=0x00;
            }
            else
            {
                key |= 0x01;
            }
        }
        if(switch2_on)
        {
            if((key & 0x01) == 0b00000001)
            {
                key ^= 0x01;
            }
            else
            {
                key ^= 0x01;
            }
            if((key & 0x04) == 0b00000100)
            {
                key ^= 0x04;
            }
            else
            {
                key ^= 0x04;
            }
        }
        if(switch3_on)
        {
            if((key & 0x02) == 0b00000010)
            {
                key ^= 0x02;
            }
            else
            {
                key ^= 0x02;
            }
            if((key & 0x04) == 0b00000100)
            {
                key ^= 0x04;
            }
            else
            {
                key ^= 0x04;
            }
        }
        PORTA = key;
        if((key & 0x07) == 0b00000000)
        {
            OFF(key);
        }
    }
}
void OFF(char key)
{
    int i=0;
    do{
        PORTA = key;
        delay_ms(1000);
        key ^= 0x07;
        i++
    } while(i<5);
    ON(led);
}

스위치에 &로 비교해 경우를 들지 않고 처음에 #define으로 PINC.num에 On과 OFF 일 경우를 설정하여 간단히 경우를 둘 수 있도록 하였다.

오랜만에 코드를 직접 작성해서 많이 헤매는 경우가 많았고 또 이리저리 책을 뒤져보며 해보니 겨우겨우 끝낼 수 있었다. 기본적인 c의 개념을 다시 한번 봐야겠다는 생각이 든다.

추가로 많은 도움을 준 호준이에게 감사를 전합니다.


Me

github를 이용해 만들어본 블로그입니다.