Professional Documents
Culture Documents
20170617 마이컴 기말고사 답
20170617 마이컴 기말고사 답
학번 출석번호 이름 sign 점수
3.(10점) PC와 통신을 하면서 PC에서 받은 문자를 다시 PC로 돌려주는 C 코드를 작성하라.(header는 생략)
1). 9600bps, 8bit 1start 1stop mode(보통 모드)
2). 좌측에는 polling 방식으로 우측에는 interrupt 방식으로 동작하게
3). 코드는 동작이 가능하게 정확히 작성하고 또박또박 작성할 것 (글자를 알아보기 힘들면 감점,or 0점)
P0.0
3 2
5. (10점)오른쪽 그림과 같이 0~3를 가진 미니 keypad를 연결하였다.
INT0
P1.1
(a)(3점) 평소 키가 눌러지지 않은 상태에서는 INT0에 1이 입력되어 인터럽
1 0
트가 발생하지 않고 키를 누르면 0이 입력된다. 이를 위해 P1=( 3 )로 P1.0
설정하고 A에는 ( NOR )회로를 연결해야 한다. R
keypad
R
(b)(7점) 좌측에 polling 방식, 우측에 interrupt 방식으로 눌러진 키를 스캔
하는 코드를 C 코딩하라.
6. (8점) 5번 문제와 연결하여 key 입력을 조사하여 0110 패턴을 찾는(예를 들면 0010011010…) 코드를 작
성한다. 이것을 mealy FSM(finite state machine) (output이 input과 state의 함수)으로 설계한다.
(a)(4점) 먼저 0110을 찾는 FSM의 state transition diagram을 아래에 그려라. 각 상태는 SX(0을 기다리는 상
태),S0(0을 수신한 상태),S01(01을 수신한 상태),S011,S0110 로 표시하라.
(b)(4점)위 FSM을 check_key()라는 함수로 작성하라. (hint: switch 문을 사용하라, key_scan_isr에서 call)
다 적으면 복잡하니, SX, S0, S01 에 대한 처리만 적어라.
enum {SX, S0, S01, S011, S0110} ST; ST state; // enum은 이름에 숫자를 할당한다. 즉, SX=0,S0=1,…
void check_key(int key) { static int state; // 상태변수를 정적 변수로 할당
switch(state) { case SX: if (key==0) state = S0; break;
case S0: if (key==1) state = S01; break;…
case S01: state = (key==1?) S011:S0; break;}}
7.(5점) 앞의 5번 문제와 연결하여 key 입력을 cmd[4] 변수에 저장하고 저장된 배열값이 “1111”이면 P2를 토
글하는 코드를 작성한다. 아래 코드를 완성하라.
char cmd[4]; char cnt=0;
void key_scan_isr()… { ( cmd[cnt++]=key_scan(); }
void main() { while(1) { if (cnt==4) { if (!strncmp(cmd,”1111”,4)) P2=~P2; } }
8.(5점) P2로 packed BCD 값이 입력된다. 이를 각각의 ASCII 코드로 변환하는 C 코드를 작성하라.
예를 들면 P2에 0x23이 입력되면 이를 ‘2’, ‘3’,즉, ASCII 숫자로 변환하여 a1, a2 변수에 저장하라.
void main () {
char t, a1, a2 ; // t: 포트에서 읽은 값, a1: 상위 바이트 ASCII, a2: 하위 바이트 ASCII 코드
P2 = 0xff; // 입력 모드 설정
t = P2; // 포트를 읽고
a1 = (t>>4) + ‘0’; // 상위 바이트 처리
a2 = t&0x0f + ‘0’; // 하위 바이트 처리
}
9. (7점) HW4의 1번째 과제는, key를 scan하여 *을 누른후 번호 4~8자리숫자를 누르고 *을 누르면 원래 설정
되어 있던 비밀번호와 비교한다. 먼저, *와 *사이의 숫자의 수를 keyN, 눌러진 숫자들을 keyA[]배열에 저장하
는 함수 extract_key_pressed()함수를 작성하라. 다음 과정으로 코딩하라.
(a)(5점) 먼저 첫번째 *를 기다리는 상태 ST_1, 두번째 *를 기다리는 상태 ST_2를 정의하고 ST_1에서 *를 입
력받으면 ST_2로 천이하고 ST_2에서 *를 입력받으면 ST_1으로 천이하고 배열에 그 사이의 key를 저장하는
코드를 작성하라.
#define ST_1 1 // 첫번째 *를 기다리는 상태
#define ST_2 2 // 두번째 *를 기다리는 상태
char keyA[8]; // *와 * 사이에 눌러진 숫자들을 저장
char keyN=0; // *와 *사이에 눌러진 숫자의 수를 저장
char extract_key_pressed(char key) // 두번째 *가 눌러지면 1을 아니면 0을 return 한다.
{ static char state=1; char keyN = 0;
switch(state) { case ST_1:
if (key==’*’) state = 2; break;
case ST_2:
if (key!=’*’) keyA[keyN++]=key;
else { state = 1; return(1); }
break;
}
return(0);
}