C\C++/임베디드 시스템

임베디드시스템 스위치 버튼을 통한 LED 응용

sundori 2023. 11. 9. 00:05

1번 스위치 : 홀수 번째 LED 점등

2번 스위치 : 짝수 번째 LED 점등

3번 스위치 : LED들이 Shift Left

4번 스위치 : LED들이 Shift Right

5번 스위치 : 모든 LED 점등

6번 스위치 : 두개의 LED들이 Shift Left되며 점등

7번 스위치 : 두개의 LED들이 Shift Right되며 점등

8번 스위치 : 크리스마스 트리.

/*
  날짜 : 2023-10-17
  작성자 : 권xx
  설명 : 스위치 입력에 따라 LED를 제어하는 프로그램.
*/
#include <mega128.h>
#include <delay.h>

#define LED_CON *((unsigned char *)0x8000) // LED  Control bus

void main(void)
{
  unsigned char SW = 0; // 변수 SW 선언
  int i = 0; // 변수 i 선언
  unsigned char buff = 0; // 변수 buff 선언

  DDRB = 0x00;  // PORTB INPUTPORT 설정
  MCUCR = 0x80; // 외부 메모리와 I/O 제어 활성화

  // 외부 I/O 초기화
  LED_CON = 0x00; // LED GLCD 제어 버스

  while (1)
  {
    SW = PINB;
    switch (SW)
    {
    case 0xFE: // 홀수 LED 점등
      LED_CON = 0x55;
      break;
    case 0xFD: // 짝수 LED 점등
      LED_CON = 0xAA;
      break;
    case 0xFB: // 왼쪽으로 LED 이동
      for (i = 0; i < 8; i++)
      {
        LED_CON = 1 << i;
        delay_ms(100); // 이동 속도를 일정하게 설정
      }
      break;
    case 0xF7: // 오른쪽으로 LED 이동
      for (i = 7; i >= 0; i--)
      {
        LED_CON = 1 << i;
        delay_ms(100); // 이동 속도를 일정하게 설정
      }
      break;
    case 0xEF: // 모든 LED 점등
      LED_CON = 0xFF;
      break;
    case 0xDF: // 두 개씩 왼쪽으로 이동
      for (i = 0; i < 4; i++)
      {
        LED_CON = (1 << (2 * i)) | (1 << (2 * i + 1));
        delay_ms(200); // 이동 속도를 일정하게 설정
      }
      break;
    case 0xBF: // 두 개씩 오른쪽으로 이동
      for (i = 0; i < 4; i++)
      {
        LED_CON = (1 << (6 - 2 * i)) | (1 << (7 - 2 * i));
        delay_ms(200); // 이동 속도를 일정하게 설정
      }
      break;
    case 0x7F: // 홀수와 짝수 번갈아가며 점등
      for (i = 0; i < 4; i++)
      {
        LED_CON = 0x55;
        delay_ms(400); // 이동 속도를 일정하게 설정
        LED_CON = 0xAA;
        delay_ms(400); // 이동 속도를 일정하게 설정
      }
      break;
    default:
      LED_CON = 0x00;
      break;
    }
  }
}