뉴티씨



  • HOME
  • 고객지원
  • 질문답변


 
kd-128all 과제
 글쓴이 : 이도희
작성일 : 19-01-09 16:41
조회 : 82  
안녕하세요....

#include <iom128v.h>
#include <macros.h>
#include <stdio.h>

#define SWITCH_IN PINA

/* 해당포트의 비트별 hex값 */
#define BIT7 0x80
#define BIT6 0x40
#define BIT5 0x20
#define BIT4 0x10
#define BIT3 0x08
#define BIT2 0x04
#define BIT1 0x02
#define BIT0 0x01

#define BIT(x)            (1 << (x))  // 해당 비트에 1을 세팅
#define SETBIT(x, y)        (x |= y)    // 해당 비트를 1로 세팅
#define CLEARBIT(x, y)      (x &= ~y)  // 해당 비트를 0으로 클리어
#define CHECKBIT(x, y)      (x & y)    // 해당 비트의 0값 체크

// 전역 변수 선언
unsigned char i, led;
volatile unsigned    char keyin;

/* led_on/off 지연시간 관련 function */
void delay(int dt)
{
    int i, j;
    for(i=0; i<=100; i++)
    {
        for(j=0; j<=dt; j++);
    }
}

/* a. 순서대로 1초에 한번씩 꺼졌다 켜지기 - turn_led function */
void turn_led(void)
{
    unsigned char port_a=0;
    while(1)
    {
              if((PINA & 0xff) != 0x00)
              {
                    PORTD = 0x00;
                    break;
              }
        while((PINA & 0xff) == 0x00)
        {
              led = BIT0; // 0번 led를 점등 시킴
              for(i=0; i<=7; i++)
              {
                  PORTD = led;
                  led <<= 1;  // 한비트씩 왼쪽으로 이동하며 led 점등 시킴
                  delay(1000);
              }

              led = 0x80; // 7번 led를 점등 시킴
              for(i=0; i<=7; i++)
              {
                  PORTD = led;
                  led >>= 1;  // 한비트씩 오른쪽으로 이동하며 led 점등 시킴
                  delay(1000);
              }
        }
    }
}


void main (void)
{
    DDRA = 0x00;
    DDRD = 0xff;
    while(1)
    {
        keyin = (PINA&0xff);
        switch(keyin)
        {
        case BIT0 : turn_led();  break;
       
        default : PORTD = 0x00; break;
        }
    }
}

-------------------작동 구성-----------------------------
1. porta에 연결된 스위치의 동작 감지를 위해 porta의 값을 계속 확인한다.

2. 스위치를 입력 받으면 해당 함수로 진입해서 porta의 값이 0x00가 될 때가지 무한 루프를 돌며 대기한다.

3. porta의 값이 0x00가 되면 해당함수의 로직을 구현한다.

4. 해당함수의 로직이 구현되는 동안 porta의 값이 변하면, 함수를 빠져나와 1. 번동작부터 반복한다.

------------> 위와 같이 로직을 구현
일단 기본 동작은 작동 구성한 상태로 작동이 되는 것 같습니다.

그런데 문제는 수위치를  짧게 누루거나 다른 스위치를 누르면 동작이 않되고 조금 길게 누르면 되는 경우가
있습니다.
위의 로직상에 문제가 있는건지요?

또한 제가 생각할때 로직을 더욱 간결하게 하는 방법이 있지 않을까 하는데 어떻게 해야 하는지 감을 잡지
못하겠습니다.

혹 다른 로직으로 구현이 가능하거나 간단하게 구성할수 있는 다른 방법이 있을지 지도 부탁드립니다.