질문게시판 > 스탑워치로 동작 질문!!

TODAY302 TOTAL1,939,460
사이트 이용안내
Login▼/회원가입
최신글보기 질문게시판 기술자료 동영상강좌

아두이노 센서 ATMEGA128 PWM LED 초음파 AVR 블루투스 LCD UART 모터 적외선


BASIC4MCU | 질문게시판 | 스탑워치로 동작 질문!!

페이지 정보

작성자 hello0 작성일2021-11-23 10:37 조회55회 댓글14건

본문

	

타이머, 인터럽트, 7-segment를 이용하여 스탑워치로 동작하도록 프로그램 작성

(Button은 포트E, 타이머는 타이머2 OVF/CTC 방식 이용, 2개 코드(OVFCTC)를 제출해야 함)

 

초기 상태 - 0000 출력

ISR 4 - 현재 상태로부터 99:99(9999)까지 증가

(9999가 되면 다시 0초부터 자동으로 재시작, 소수점 이하는 00~99까지)

ISR 5 - 일시 정지

ISR 6 - 누를 때 마다 스탑워치의 카운트 속도가 2배씩 빨라짐 (최대 8배속, 8배속에서 ISR6 신호 시 다시 1배속, 속도를 7-segmentdp 비트에 표시)

ISR 7 - 0000으로 초기화, 스탑워치의 속도도 1배속으로

 default의 스탑워치 속도가 실제 시간과 같도록

타이머(분주비 계산)사용해서 코드 

 

#include <avr/io.h>

#include <avr/interrupt.h>

#include <util/delay.h>

#include <stdio.h>

void port_init(void)

{

PORTA = 0x00; //버튼

DDRA = 0x00; //입력

PORTF = 0x00; //모터

DDRF = 0xff; //출력

}

void timer1_init(void)

{

TCCR1A |= (1<<COM1A1) | (1<<WGM11) | (1<<WGM10); //1000 0011 0x83

TCCR1B |= (1<<WGM12) | (1<<CS11); //0000 1010 0x0A 

TIMSK = 0x3C;

TCNT1AH = 0x00;

TCNT1AL = 0x00;

sei();

}

ISR(TIMER1_OVF_vect)

{

PORTF = 0x00;

}

ISR(TIMER1_COMPA_vect)

{

PORTF = 0x01; 

}

 

void main(void)

{

port_init();

timer1_init();

while(1){

switch(PINA){

case 0x01:

OCR1AH = 0x00;

OCR1AL = 0xFF;

break;

case 0x02:

OCR1AH = 0x01;

OCR1AL = 0xFF;

break;

case 0x04:

OCR1AH = 0x02;

OCR1AL = 0xFF;

break;

case 0x08:

OCR1AH = 0x03;

 

OCR1AL = 0xFF;

break;

}

}

}

라고 썼는데 작동이 안되서 질문드립니다ㅠㅠㅠ 급해요ㅠㅠ 

 

  • BASIC4MCU 작성글 SNS에 공유하기
  • 페이스북으로 보내기
  • 트위터로 보내기
  • 구글플러스로 보내기

댓글 14

조회수 55

master님의 댓글

master 작성일

스위치 회로 구성에 따라서
버튼을 눌렀을 때 HIGH인지 LOW인지 알아야합니다.

hello0님의 댓글

hello0 작성일

high인지 low인지 어떻게 아는건가요??(초보여서 잘몰라요ㅠㅠ죄송합니다)
설명서에?
dp 비트 속도 표시 방법을
1배속 : off off off on
2배속 : off off on off
4배속.  off on off off
8배속  on off off off
로 표시하라고는 나와있어요!!

master님의 댓글

master 댓글의 댓글 작성일

회로도를 첨부하세요(조립 사진이 아닌 회로도를 말합니다.)

hello0님의 댓글

hello0 댓글의 댓글 작성일

스위치가 스탑워치말씀하시는거죠?
high인지 low인지만 알면 되나요?
회로도는 제시해주지 않아가지고요ㅠㅠ 저것만 보여주고 작성하는거여서요ㅠ

master님의 댓글

master 댓글의 댓글 작성일

스탑워치는 시계처럼 제품의 기능으로 구분한 명칭입니다.
스탑워치의 회로도 중에서도 스위치(버튼)의 회로도를 말합니다.
전에 스위치 예제소스를 받은 것이 있을텐데요?
LED 출력과 스위치(버튼) 입력은 가장 초보적인 내용이라서 이 것 조차 알려주지 않았다면 교수님의 자질에 문제가 있는겁니다...만
교수님은 반드시 알려드렸을테고, 학생이 공부를 하지 않아서 뭐가 뭔지 잘 모르고 계시겠죠

switch button을 줄여서 스위치 혹은 버튼이라고 부릅니다.

hello0님의 댓글

hello0 댓글의 댓글 작성일

혹시 버튼 예제소스가 이게 맞을까요??
#include <avr/io.h>
#include <studio.h>
void main()
{
PORTA = 0x00;
DDRA = 0xFF;
PORTF = 0x00;
DDRF = 0x00;
while(1)
{
PORTA = (PINF&0xFF);
}
}
아니면 타이머 소스코드에서 버튼의 회로도를 알 수 있을까요??
같이 섞어배워서 뭐가 뭔지를 모르고 있는 것 같습니다
LED출력이랑 7-segment제어?는 예제소스가 있습니다.....

master님의 댓글

master 작성일

PORTA = (PINF&0xFF);
이런 코드는 언제부터 유행하는지 모르겠지만
PORTA = PINF;
이 코드가 올바른 표기법입니다.
//
포트를 통째로 출력하는 예제로는 스위치 회로구성을 가늠하지 못합니다.
스위치를 눌러서 숫자를 증가시키거나 하는 예제는 없을까요?
스위치를 눌러서 LED를 점멸시키는 예제도 괜찮습니다.

hello0님의 댓글

hello0 댓글의 댓글 작성일

#include <avr/io.h>
#include <util/delay.h>

//소등 : 등불을 끔
//점등 : 등불을 켬
int main()

DDRD = 0xFF; // D포트의 모든 핀은 출력용으로 사용
DDRB = 0x00; // B포트의 모든 핀은 입력용으로 사용

while(1)
{
PORTD =0x00;  //if문이 실행되지 않으면 항상 포트D에 연결된 LED의 불이 소등

if (PINB & 0x01) //B포트에 연결된 스위치의 0번 버튼이 눌러질 경우
{
for(int i = 0; i <1; i++)
{
PORTD = 0x01; //D포트의 연결된 0번 LED를 점등
_delay_ms(1000);
PORTD = 0x02; //D포트의 연결된 1번 LED를 점등
_delay_ms(1000);
PORTD = 0x04; //D포트의 연결된 2번 LED를 점등
_delay_ms(1000);
PORTD = 0x08; //D포트의 연결된 3번 LED를 점등
_delay_ms(1000);
PORTD = 0x10; //D포트의 연결된 4번 LED를 점등
_delay_ms(1000);
PORTD = 0x20; //D포트의 연결된 5번 LED를 점등
_delay_ms(1000);
PORTD = 0x40; //D포트의 연결된 6번 LED를 점등
_delay_ms(1000);
PORTD = 0x80; //D포트의 연결된 7번 LED를 점등
_delay_ms(1000);
}
}
}
}
이거 맞나요???

master님의 댓글

master 댓글의 댓글 작성일

맞습니다.
//
타이머, 인터럽트, 7-segment를 이용하여 스탑워치로 동작하도록 프로그램 작성
(Button은 포트E, 타이머는 타이머2 OVF/CTC 방식 이용, 2개 코드(OVF와 CTC)를 제출해야 함)

초기 상태 - 0000 출력
ISR 4 - 현재 상태로부터 99:99(99초99)까지 증가
(99초99가 되면 다시 0초부터 자동으로 재시작, 소수점 이하는 00~99까지)
ISR 5 - 일시 정지
ISR 6 - 누를 때 마다 스탑워치의 카운트 속도가 2배씩 빨라짐
(최대 8배속, 8배속에서 ISR6 신호 시 다시 1배속, 속도를 7-segment의 dp 비트에 표시)
ISR 7 - 0000으로 초기화, 스탑워치의 속도도 1배속으로
 default의 스탑워치 속도가 실제 시간과 같도록
타이머(분주비 계산)사용해서 코드
//
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdio.h>
//
void port_init(void){
  PORTA=0x00; DDRA=0x00; //버튼 //입력
  PORTF=0x00; DDRF=0xff; //모터 //출력
}
//
void timer1_init(void){
  TCCR1A|=(1<<COM1A1)|(1<<WGM11)|(1<<WGM10); //1000 0011 0x83
  TCCR1B|=(1<<WGM12 )|(1<<CS11 );            //0000 1010 0x0A
  TIMSK=0x3C;
  sei();
}
//
ISR(TIMER1_OVF_vect  ){ PORTF=0; }
ISR(TIMER1_COMPA_vect){ PORTF=1; }
//
void main(void){
  port_init();
  timer1_init();
  while(1){
    switch(PINA){
      case 0x01: OCR1A=0x00FF; break;
      case 0x02: OCR1A=0x01FF; break;
      case 0x04: OCR1A=0x02FF; break;
      case 0x08: OCR1A=0x03FF; break;
    }
  }
}

설명글은 "7-segment를 이용한 스탑워치" 인데
질문코드는 PWM 예제 같습니다.
7세그먼트를 이용한 시계나 스톱워치 예제는 없나요?

hello0님의 댓글

hello0 댓글의 댓글 작성일

#include<avr/io.h>
#include<avr/interrupt.h>
#include<util/delay.h>

void register_init();
int main()
{
unsigned char segment_data[10] =
{0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x27, 0x7f, 0x6f};
register_init();
int number = 0;
while(1)
{
PORTC = 0x0D; //PORTC 2번 bit 0x0D: 0b00001101 -> ~0b11110010 : ~0xF2;
PORTA = segment_data[number];
_delay_ms(1000);

if(number == 9)
number = 0;
else
number = number + 1;
}
return 0;

}
void register_init()
{
PORTC = 0x0F; // 7-segment
DDRC = 0xFF;

PORTA = 0x00; // 7-segment
DDRA = 0xFF;

}

#include <avr/io.h>
#include <util/delay.h>

//소등 : 등불을 끔
//점등 : 등불을 켬
int main()

DDRD = 0xFF; // D포트의 모든 핀은 출력용으로 사용
DDRB = 0x00; // B포트의 모든 핀은 입력용으로 사용

while(1)
{
PORTD =0x00;  //if문이 실행되지 않으면 항상 포트D에 연결된 LED의 불이 소등

if (PINB & 0x01) //B포트에 연결된 스위치의 0번 버튼이 눌러질 경우
{
for(int i = 0; i <8; i++)
{
PORTD = 1 << i; //D포트의 연결된 0번 LED를 점등
_delay_ms(1000);
}
}
}
}

hello0님의 댓글

hello0 댓글의 댓글 작성일

#include <avr/interrupt.h>
#include <avr/io.h>

unsigned char led = 0xFE;
volatile int timerCnt = 0; //오버플로우 인터럽트 발생 횟수 카운트
               
void main(void)
{               
// 포트 초기화
DDRC = 0xFF; // 포트 C 출력으로 설정
PORTC = led;         // 포트 C에 초기값 출력
             
// 인터럽트 초기화
TIMSK = 0x01;         // TOIE0 = 1(timer0 오버플로우 인터럽트 허용)
TCCR0 = 0x04;         // 일반모드, 프리스케일 = 64
TCNT0 = 0x06;          // 타이머/카운터0 레지스터 초기값
SREG = 0x80;         // 전역 인터럽트 인에이블 비트 I 셋.  == sei()

while(1); // 무한 루프
}

// 타이머/카운터0 오버플로우 서비스 루틴
// 인터럽트 발생 주기 1/16M * 64분주 * 250카운트= 1ms
ISR(TIMER0_OVF_vect)
{                 
++timerCnt;
if(timerCnt == 1000) // 1ms *1000 = 1s
{
led <<= 1; //led 1씩 좌측 shift
led |= 0x01; //led 가장우측에 불들어도록
if(led == 0xFF) led = 0xFE; //led 불이 모드 들어왔다면 다시 가장 오른쪽이 불이 꺼지도록
PORTC = led; 
timerCnt = 0;   
}
TCNT0 = 0x06; //TCNT0 값을 다시 초기화 해줌     
}

#include <avr/interrupt.h>
#include <avr/io.h>

unsigned char led = 0xFE;
volatile int timerCnt = 0;

void main(void)
{               
// 포트 초기화
DDRC = 0xFF; // 포트 C 출력으로 설정
PORTC = led; // 포트 C에 초기값 출력
             
// 인터럽트 초기화
TIMSK = 0x02; // 출력 비교 인터럽트 인에이블
TCCR0 = 0x0C; // CTC 모드, 프리스케일 = 64
    OCR0 = 249; // 카운트 값 -1(250-1)
TCNT0 = 0x00;    // 타이머/카운터0 레지스터 초기값
    SREG = 0x80;      // 전역 인터럽트 인에이블 비트 I 셋.
                                                           
while(1); // 무한 루프
}
               
// 타이머/카운터0 출력비교(TCNT0 = OCRO 일때) 인터럽트 서비스 루틴
// 인터럽트 발생 주기 1/16M * 64분주 * 250카운트 = 1ms
ISR(TIMER0_COMP_vect)
{                   
++timerCnt;

if(timerCnt == 1000) // 1ms *1000 = 1s
{
led <<= 1; //led 1씩 좌측 shift
led |= 0x01; //led 가장우측에 불들어도록
if(led == 0xFF) led = 0xFE; //led 불이 모드 들어왔다면 다시 가장 오른쪽이 불이 꺼지도록
PORTC = led;       
timerCnt = 0;     
}
//TCNTn값을 초기화 안해줘도 됨
}
이건 타이머 예제입니다
예시는 이거만 들어줘서요...ㅠㅠ

master님의 댓글

master 작성일

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
//
int main(){
  unsigned char seg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f};
  int number=0;
  PORTC=0x0F; DDRC=0xFF;
  PORTA=0x00; DDRA=0xFF;
  while(1){
    PORTC=0x0D; PORTA=seg[number]; _delay_ms(1000);
    if(number==9)number=0;
    else number++;
  }
}
//----------------

#include <avr/io.h>
#include <util/delay.h>
//
int main(){
  int i;
  DDRD=0xFF;
  DDRB=0x00;
  while(1){
    PORTD=0x00;
    if(PINB&1){ // PB0 버튼
      for(i=0;i<8;i++){ PORTD=1<<i; _delay_ms(1000); }
    }
  }
}
//----------------

#include <avr/interrupt.h>
#include <avr/io.h>
//
volatile unsigned char led=0xFE;
volatile int timerCnt=0;
//             
void main(void){             
  DDRC=0xFF; PORTC=led;
  //
  TCCR0=4; TCNT0=6; TIMSK=1;
  SREG=0x80;
  while(1);
}
//
ISR(TIMER0_OVF_vect){      // 1ms
  TCNT0=6;
  if(++timerCnt==1000){    // 1ms *1000=1s
    led<<=1;              // led 1씩 좌측 shift
    led|=1;                // led 가장우측에 불들어도록
    if(led==0xFF)led=0xFE; // led 불이 모드 들어왔다면 다시 가장 오른쪽이 불이 꺼지도록
    PORTC=led;
    timerCnt=0;
  }
}
//----------------

#include <avr/interrupt.h>
#include <avr/io.h>
//
unsigned char led=0xFE;
volatile int timerCnt=0;
//
void main(void){             
  DDRC=0xFF; PORTC=led;
  //
  TCCR0=0x0C; OCR0=249; TIMSK=2;
  SREG=0x80;
  while(1);
}
//
ISR(TIMER0_COMP_vect){    // 1ms
  if(++timerCnt==1000){    // 1ms *1000=1s
    led<<=1;              // led 1씩 좌측 shift
    led|=1;                // led 가장우측에 불들어도록
    if(led==0xFF)led=0xFE; // led 불이 모드 들어왔다면 다시 가장 오른쪽이 불이 꺼지도록
    PORTC=led;
    timerCnt=0;
  }
}
질문 코드를 정리만 한겁니다.
이 코드로 만들어보죠
7세그먼트는 1개만 구동하고 있는데 회로를 알 수가 없으니 4자리 구동 시 정확하게 동작하지 않을 수 있습니다.
시간이 걸리니 공부하고 계세요

master님의 댓글

master 작성일

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
//
volatile unsigned char seg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f};
volatile unsigned char OV_speed[4]={6,131,194,226};
volatile unsigned char ms=0,sec=0,run=0,speed=0;
//
ISR(TIMER2_OVF_vect){ // 1ms
  static char cnt=0,ms10=0;
  TCNT2=OV_speed[speed];
  //
  PORTC=0x0F; // OFF
  switch(cnt){
    case 0: PORTA=seg[ms %10];      PORTC=0x0E; break; // ms 일의자리
    case 1: PORTA=seg[ms /10];      PORTC=0x0D; break; // ms 십의자리
    case 2: PORTA=seg[sec%10]|0x80; PORTC=0x0B; break; // sec 일의자리
    case 3: PORTA=seg[sec/10];      PORTC=0x07; break; // sec 십의자리
  }
  if(++cnt>3)cnt=0;
  //------------------
  if(run){
    if(++ms10>=10){ // 1ms*10=10ms
      if(++ms>=100){ ms=0;
        if(++sec>=100)sec=0;
      }
    }
  }
}
//
ISR(INT4_vect){ run=1; } // START
//
ISR(INT5_vect){ run=0; } // STOP
//
ISR(INT6_vect){ // 2배씩 빨라짐
  if(++speed>=4)speed=0; // 최대 8배속 -> 다시 1배속
}
//
ISR(INT7_vect){ ms=sec=run=speed=0; } // 0000으로 초기화, 스탑, 속도 1배속
//
int main(){
  PORTA=0x00; DDRA=0xFF; // 7세그먼트
  PORTC=0x0F; DDRC=0x0F; // 콤몬
  TCCR2=0x03; TCNT2=6;  TIMSK=0x40; //16000000/64/(256-6),1ms
  EICRB=0xFF; EIFR=0xFF; EIMSK=0xF0; // 상승엣지
  SREG=0x80;
  while(1){}
}

master님의 댓글

master 작성일

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
//
volatile unsigned char seg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f};
volatile unsigned char CTC_speed[4]={249,124,62,30};
volatile unsigned char ms=0,sec=0,run=0,speed=0;
//
ISR(TIMER2_COMP_vect){
  static char cnt=0,ms10=0;
  //
  PORTC=0x0F; // OFF
  switch(cnt){
    case 0: PORTA=seg[ms %10];      PORTC=0x0E; break; // ms 일의자리
    case 1: PORTA=seg[ms /10];      PORTC=0x0D; break; // ms 십의자리
    case 2: PORTA=seg[sec%10]|0x80; PORTC=0x0B; break; // sec 일의자리
    case 3: PORTA=seg[sec/10];      PORTC=0x07; break; // sec 십의자리
  }
  if(++cnt>3)cnt=0;
  //------------------
  if(run){
    if(++ms10>=10){ // 1ms*10=10ms
      if(++ms>=100){ ms=0;
        if(++sec>=100)sec=0;
      }
    }
  }
}
//
ISR(INT4_vect){ run=1; } // START
//
ISR(INT5_vect){ run=0; } // STOP
//
ISR(INT6_vect){ // 2배씩 빨라짐
  if(++speed>=4)speed=0; // 최대 8배속 -> 다시 1배속
  OCR2=CTC_speed[speed];
}
//
ISR(INT7_vect){ ms=sec=run=speed=0; } // 0000으로 초기화, 스탑, 속도 1배속
//
int main(){
  PORTA=0x00; DDRA=0xFF; // 7세그먼트
  PORTC=0x0F; DDRC=0x0F; // 콤몬
  TCCR2=0x0B; OCR2=249;  TIMSK=0x80; //16000000/64/(1+249),1ms
  EICRB=0xFF; EIFR=0xFF; EIMSK=0xF0; // 상승엣지
  SREG=0x80;
  while(1){}
}
//----------------








오류는 직접 수정하세요

질문게시판HOME > 질문게시판 목록

MCU, AVR, 아두이노 등 전자공학에 관련된 질문을 무료회원가입 후 작성해주시면 전문가가 답변해드립니다.
ATMEGA128PWMLED초음파
아두이노AVR블루투스LCD
UART모터적외선ATMEGA
전체 스위치 센서
질문게시판 목록
제목 작성자 작성일 조회
공지 MCU, AVR, 아두이노 등 전자공학에 관련된 질문은 질문게시판에서만 작성 가능합니다. 스태프 19-01-15 4181
공지 사이트 이용 안내댓글[20] master 17-10-29 23884
질문 초음파 센서를 이용한 dc모터 두개 작동입니다. 새글 비버 21-11-27 11
질문 아두이노 월 트레이싱 관련하여 질문드립니다. 새글 hiheel 21-11-27 11
질문 온도센서 4자리 세븐세그먼트 새글 초보코딩자 21-11-27 7
질문 아두이노 진동모터 새글 공머생 21-11-27 10
질문 블루투스 연결 질문입니다.댓글[4] 이미지새글첨부파일 ASAP 21-11-26 24
질문 로드셀을 이용한 모터 제어입니다댓글[1] 새글 정욱스 21-11-26 20
질문 LCD패널 질문댓글[1] 새글 초보코딩자 21-11-26 14
질문 관리자님 저 이전에 쓴글 질문입니다.댓글[1] 새글 호호미 21-11-26 21
질문 스마트 쓰레기통 코딩 문제-3댓글[1] 이미지새글 찬영 21-11-26 17
질문 atmeg 128댓글[1] 새글 초보오 21-11-26 21
질문 스마트 쓰레기통 코딩 문제-2댓글[4] 이미지새글 찬영 21-11-26 21
질문 아두이노 스텝모터 제어 새글 지방대 21-11-26 18
질문 스마트 쓰레기통 코딩 문제댓글[3] 새글 찬영 21-11-26 15
질문 초음파센서 코딩문제댓글[3] 이미지새글첨부파일 민준싸 21-11-26 29
질문 온도센서와 7세그먼트 연결 질문이요..댓글[1] 초보코딩자 21-11-26 16
질문 IRremote, Servo 라이브러리 충돌?문제댓글[3] 댜야자뱌냌 21-11-25 17
질문 전압 충돌댓글[2] 이미지첨부파일 비버 21-11-25 22
질문 아두이노 PIR센서와 온습도센서 DC모터댓글[4] 코딩처음초보 21-11-25 40
질문 아두이노 spi통신 고수님들 도움 부탁드립니다.댓글[2] 이미지첨부파일 hienvd 21-11-25 28
질문 버튼 스위치와 모터 연결 코딩댓글[4] 이미지첨부파일 wpdi123 21-11-25 32
질문 [재업로드]댓글[1] 민예진 21-11-25 21
질문 아두이노 전자시계 만들기 도와주세요댓글[4] yizhide 21-11-25 30
질문 이거 tinker cad로 가능할까요?댓글[1] 비버 21-11-24 30
질문 아두이노 컴파일 에러 도와주세요 ㅠㅠ댓글[1] 분위기파주방장 21-11-24 29
질문 아두이노에서 if문을 이용해 무한 동작 중 키보드 나 블루투스 입력을 통해 탈출할 수 있는 방법좀 알려주세요댓글[4] 아두이노잘하고싶다 21-11-24 34
질문 아두이노 fsr센서 워터펌프 작동관련해서 궁금해서요..댓글[3] TTTp 21-11-24 43
질문 초음파센서 2개를 이용하여 스텝모터2개 제어댓글[4] 동현킴 21-11-24 50
질문 아두이노 와이파이 사용 질문입니다.댓글[2] 이미지첨부파일 호호미 21-11-24 31
게시물 검색

2021년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2020년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2019년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2018년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
Privacy Policy
MCU BASIC ⓒ 2020
모바일버전으로보기