문제 설명
다음 요구하는 기능을 만족하는 코드를 작성하라
[요구 사항]
- 로봇이 이동을 시작할때 KEY0가 눌리고 목적지에 도달하면 KEY1이 눌린다고 가정하자
- KEY0를 누르고 KEY1을 누르면 그 간격 시간을 UART로 인쇄하는 코드를 구현하라
- 다만, KEY0를 누른 상태에서 다시 KEY0를 누르는건 무시한다.
- 즉 KEY0를 눌린 뒤 그 때부터 KEY0가 여러번 눌려도 KEY1이 눌릴때 까지 시간만 측정 되면 된다
- 시간은 100msec 단위(즉, 0.1초 단위로 측정하며 반올림하거나 버림하는 것은 무방하다)로 측정한다.
(예를 들어 실제 시간이 3.45초 일 경우 인쇄 결과가 3.4 또는 3.5 어떤 값이든 다 상관없다) - 최대 측정 가능 시간은 거의 무제한으로 본다
- 로직아날라이져를 KEY0와 KEY1에 연결하여 스위치 눌린 사이 시간을 확인할 수 있도록 연결한다.
[제출 요령]
- 코드를 완성하면 반드시 동작 확인을 받은후 강사 지시에 의하여 코드를 업로드해야 함
- 임의로 코드 제출시 해당 문항 0점 처리되므로 주의 바람
- 다른 파일에 있는 수업때 제공 또는 작성한 코드를 사용한 경우는 복사하여 제출할 필요 없음 (예) LED_Display 함수 등
- 작성 또는 기존 코드 변경한 파일의 내용(이 문제와 관련한 코드 부분만)을 모두 복사하여 제출해야 한다.
- 제출시에는 main.c 내용을 제일 위에 놓고 그 아래에 다른 파일의 코드를 제출하되 main.c 이외 파일은 반드시 파일명을 코드 위에 적고 복사하여 제출할 것
정답 코드
#include "device_driver.h"
static void Sys_Init(void)
{
Clock_Init();
LED_Init();
Uart_Init(115200);
Key_Poll_Init();
SCB->VTOR = 0x08003000;
SCB->SHCSR = 0;
}
extern volatile int Key_Value;
extern volatile int TIM4_Expired;
# if 1
void Main(void)
{
Sys_Init();
Key_ISR_Enable(1);
int state = 0;
double t = 0;
for(;;)
{
if ((state == 0) && (Key_Value == 1))
{
TIM4_Repeat_Interrupt_Enable(1, 100);
state = 1;
}
if ((state == 1) && TIM4_Expired)
{
t += 0.1;
TIM4_Expired = 0;
}
if ((state == 1) && (Key_Value == 2))
{
TIM4_Stop();
Uart1_Printf("%.1f\n", t);
state = 0;
Key_Value = 0;
break;
}
}
}
# endif
메모
printf 내부의 \n 습관화 필요