You are on page 1of 4

2018-04-24, 마이크로컴퓨터 중간고사 문제.

나는 시험과 관련한 일체의 부정행위를 하지 않을 것이며, 적발시 어떠한 불이익도 감수할 것임을 서명합니다.
학번 출석번호 이름 sign 점수(90점)

1. (5점) void main() { unsigned char name[4]=”this”; } 이 부분을 작성한다. 빠진 부분을 채워라.
MOV R0, #20 ; name[4]은 20번지~23번지
MOV DPTR, ( #STR )
LOOP: CLR (A )
MOVC ( A, @A+DPTR )
MOV @R0, A
INC R0
( INC DPTR ) ; ROM의 다음 주소로 이동
( CJNE R0, #24, LOOP ) ; CJNE 명령어를 사용하라
STR: DB ‘t’, ‘h’, ‘i’, ‘s’
2.(5점) void strcpy (char *dst, char *src, char n)를 작성하라. 단 입력은 R0=dst, R1=src, R2=n 으로 전달됨
STRCPY:( MOV A, @R1 ); *dst=*src
( MOV @R0, A ); *dst=*src
( INC R1 ); next src
( INC R0 ); next dst
DJNZ ( R2, STRCPY ); loop
RET
3.(5점) DJNZ, CJNE 를 사용하여 1부터 10까지 더하는 코드를 작성하라. 반드시 1부터 더하며 더하는 중간
결과는 P1으로 계속 출력하게 작성하라. (ORG 생략, label은 LOOP이라는 이름 사용)

MOV R0,#10 MOV R0,#1


MOV R1, #1 CLR A
CLR A LOOP: ADD A,R0
LOOP: ADD A,R1 MOV P1,A
MOV P1,A INC R0
INC R1 CJNE R0,#11,LOOP
DJNZ R0,LOOP

4.(5점) disp_7seg(int n) { const seg7[5]={ 0xc0, 0xF9, 0xA4, 0xB0, 0x99 }; P1=seg7[n]; } 을 코딩하는
데 입력(n)은 R0로 넘겨진다. 제일 오른쪽 display에 출력하게 코드를 완성하라.
DISP_7SEG: ( MOV P3, #0 ) ; 오른쪽 display선택
( MOV DPTR, #SEG7 ) ;DPTR 설정 ( MOV P1, A ) ; P1에 출력
( MOV A, R0 ) ;A=n RET
( MOVC A, @A+DPTR ) ; A=seg7(n) SEG7:( DB 0C0H, 0F9H, 0A4H, 0B0H, 99H

5.(10점) 시험지 뒷면에 이번 HW의 4번째 과제를 적고 코딩하라. SW의 상하위 4비트를 읽어서 더하는
데, 그것을 함수로 만들어서 구현하는 문제이다. 코드이해를 위해 충분히 comment를 적어라 (아니면 감점)
6.(15점) keypad로 door lock 기능을 구현하라. 구현할 기능은 다음과 같다. 연결은 오른쪽 그림과 같다.
- key를 2번 scan하고
Vcc Vcc
-첫번째, 두번째 키입력을 packed BCD로 저장하고 23이면 P3.0에 1출력
(a)(4점)key를 scan 하여 그 결과를 R0로 돌려주는 함수 SCAN을 작성하라.
P2.1
SCAN: ( MOV P1, #1 ) ; 위쪽 row부터 scan … P2.0
( MOV P2, #0F ) ; 읽기모드로 포트 설정 1 0
MOV R0, #0 ; R0가 눌러진 키를 표시 P1.1
( JNB P2.0, HIT );오른쪽키가 눌러졌으면 HIT로 jump, JNB 사용 3 2
INC R0 ; 다음 키 검색 P1.0
keypad
( JNB P2.1, HIT );왼쪽키가 눌러졌으면 HIT로 jump, JNB 사용
( MOV P1, #2 ) ; 아래쪽 키패드 scan
… ; 이부분은 위쪽과 동일한 과정이므로 코드를 생략한다. 위의 4라인이 있다고 생각하면 되겠죠?
HIT: RET ; 함수에서 빠져나간다.
(b)(3점) (a)SCAN 함수를 호출, 첫 숫자를 읽고 이를 R1의 상위 4비트에 설정하라 (4줄)
CALL SCAN;
MOV A, R0;
SWAP A;
MOV R1, A;
(c)(2점)(a)함수를 한번더 호출,두번째 숫자를 A의 하위 4비트에 읽고 (b)의 R1과 packed BCD생성(3줄)
CALL SCAN;
MOV A, R0;
ORL A, R1
DELAY: MOV R0,#255
(d)(3점)(a) R1이 23이면 1을, 아니면 0을 P3.0에 출력(CJNE 사용)
LOOP1: MOV R1,#255
CJNE R1, #23, NOT23;
LOOP2: DJNZ R1, LOOP2
SETB P3.0;
DJNZ R0, LOOP1
SJMP EXIT; NOT23: CLR P3.0; EXIT: END
RET
(e)(3점) 2중 loop으로 전체 255x255 만큼 시간 지연시키는 DELAY
함수를 오른쪽 박스에 작성하라. (R0, R1사용,DJNZ 사용)

7.(10점) (a)(4점) 아래 회로는 ( rising ) edge에서 동작하는 ( D-FF ) 회로이다. 입력 D는 clock 보다


( setup ) time 이전에 도착해야 하고 ( hold ) time 동안 그 값을 유지해야 한다.

(b)(2점) 오른쪽 빈칸에 출력을 그려라.


CLK

QM

(c) (4점) 시험지 뒷면에 더하기와 빼기가 가능한 4 bit adder를 그리는데 FA는 하나만 그리고 나머지는 박스
로만 표시하라.
8. (10점) 시험지 뒷면에 입력(I) 비트열이 “111”이 매칭될 때마다 1을 출력하는 FSM을 설계하라.
(1)(2점)상태 천이도를 moor machine으로 나타내라. 상태는 S0, S1, S11, S111 상태로 그려라.
그리고, 상태에 번호(숫자)를 할당하고 (S0=0, S1=1, S11=2, S111=3)
(2)(2점)상태천이를 ROM으로 구현한다. HW를 정확하게 그리고,
(3)(2점) ROM의 주소는 (I,Q1,Q0)=(A2,A1,A0)일 때, ROM의 내용을 적어라
(4)(2점) 만약 ROM의 주소 입력부터 출력까지 20ns가 소요되고, DFF의 tsetup=30ns, thold=20ns일 때
이회로는 최대 ( ) MHz로 동작할 수 있다. 단, DFF은 시간지연없이 출력된다고 가정한다
(5)(2점) FSM 에는 moor machine과 ( mealy ) machine이 있고, 둘의 차이를 간단히 기술하라.
( 출력이 상태만의 함수이면 moor, 아니면 mealy )
9.(5점) 아래에 PORT의 HW 구조를 그리고, 왜 핀을 읽기 위해서는 먼저 1을 적어야 하는지를 설명하라.

10.(5점) 3-state buffer가 무엇인지를 설명하고 3-state buffer를 gate를 사용하여 그 내부 구조를 그려라.

ORG 0H
11.(10점) 오른쪽 코드를 보고 답하라. (코멘트에 opcode가 있음)
MOV A,#0 ; 7400H (1)
(a)(2점) (7)번 라인을 수행한 후의 PC 값은? ( 13(0DH) )
MOV R0,#2 ; 7802H (2)
(b)(2점)오른쪽에서 5번째로 수행되는 어셈블리코드는? (mov
MOV R1,#3 ; 7903H (3)
R1,#5 )
MOV 3, 2 ; 850203H (4)
(c)(2점) (8)번에서 A값은? ( 7 )
TAB: DB 79H, 05H ;(5)
(d)(2점) (8)번에서 ( )에 들어갈 값은? ( FA )
ADD A,R1 ; 29H (6)
(e)(2점) 만약 clock=10MHz, 1mc=1clock이고 각 명령어를 수행하는데
ADD A,R0 ; 28H (7)
명령어 길이(byte수)만큼 mc가 소요된다면 (8)번까지 수행하는데 걸린
SJMP TAB ; 80( ) (8)
시간은 ( 1.5 us ) 이다.

12.(5점) (a)(2점)오른쪽 코드에서 가까운 거리에 있는 FUNC이


ACALL FUNC
ORG 0H call 되지 않았다면 그 이유는 무엇인가?
MOV A,#1
ACALL FUNC 다른 segment에 코드 위치
MOV R0,#2
FUNC: PUSH 1
FUNC:
PUSH 1 b)(3점)edsim을 초기화하고 왼쪽 코드를 실행한다. RET 문장은
INC R0
MOV R1,#8 두 번 실행되는데 실행 후, 첫번째에는 PC=( 0000H )로 돌
RET
RET
아오고 두번째에는 PC=( 0808H )로 돌아온다.

You might also like