mcs-51 마이크로컴퓨터 - koreatechmicrocom.koreatech.ac.kr/course...

446
MCS-51 마이크로컴퓨터 이 명 의 박 천 주

Upload: others

Post on 27-Aug-2020

8 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

MCS-51

마이크로컴퓨터

이 명 의 ․ 박 천 주

Page 2: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt
Page 3: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

머릿말 1

머릿말

MCS-51 MCU 및 주변 입출력 디바이스를 제어하기 위한 프로그램을 작성할 때

에 어셈블리 언어와 C 언어를 사용할 수 있다. 어셈블리 언어를 이용하여 프로

그램을 작성하면 하드웨어에 대한 이해와 수행 속도 및 메모리 관리 면에서 이

점이 있는 반면, 마이크로프로세서마다 명령어가 각기 다르고 기계어에 준하는

어셈블리 언어를 이해하고 숙달하는데 다소 어려움과 시간을 요구할 수 있다. 반

면, C 언어는 코드 효용성, 구조화된 프로그래밍, 그리고 풍부한 연산자를 제공하

는 다목적 프로그래밍 언어로 응용 프로그램을 손쉽고 효과적으로 개발할 수 있

다.

본 서에서는 MCS-51 MCU를 통해 주변 입출력 디바이스를 제어하는 응용 프로

그램 작성을 위해 어셈블리 프로그래밍과 C51 프로그래밍을 함께 진행할 수 있

도록 구성한다. 어셈블리 프로그래밍과 C51 프로그래밍이 가능하며, 산업체 현장

에서 개발자들이 주로 사용하고 있는 개발 툴인 Keil 컴파일러를 활용하여 프로

그래밍 할 수 있도록 하였다. 표준 C의 기능에 MCS-51 MCU의 하드웨어적인

특성을 확장한 C51 컴파일러는 어셈블리 언어로 개발된 동일 기능의 프로그램과

대등한 실행 속도, 코드 효용성 및 유연성을 소프트웨어 개발자에게 제공한다.

어셈블리 프로그래밍을 통해 하드웨어의 이해를 증진하고, C51 프로그래밍을 통

해 손쉽게 MCU를 제어함으로써 마이크로프로세서 활용 능력을 향상시킬 수 있

도록 풍부한 예제를 제시한다.

본 서는 자체 개발한 KUT51 실습 보드와 LED 모듈, 버튼 스위치 모듈, FND

모듈, 광센서 모듈, 릴레이 모듈, 음 스위치 모듈, 멜로디 모듈, 앰프 모듈, 스피커

모듈, DC 모터 모듈, DotMatrix 모듈, KeyPad 모듈, CLCD 등의 주변 입출력 모

듈을 활용하여 응용 프로그램을 작성함으로써, 마이크로프로세서 응용 능력을 배

양할 수 있도록 다음과 같이 구성하였다.

본 서는 크게 MCS-51 MCU의 하드웨어 관련 부분, 어셈블리 프로그래밍 관련

부분, C51 프로그래밍 관련 부분의 장들로 분류할 수 있다.

우선, MCS-51 MCU의 하드웨어와 관련하여 제1장에서 MCS-51 계열 MCU의

Page 4: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

2 MCS-51 마이크로컴퓨터

내부 구조 및 메모리 구성, 동작 특성을, 제2장에서는 명령어의 동작을 설명한다.

제3장에서 실습을 위해 설계된 KUT51 실습 보드 제작 및 응용 프로그램 작성

절차를 살펴본다.

두 번째로, 어셈블리 프로그래밍과 관련된 장들로 제4장에서 각종 연산 명령어의

동작을 숙지하기 위한 기초적인 프로그래밍 실습을, 제5장에서는 반복 처리에 대

해, 제6장에서는 스택과 서브루틴를 활용한 응용 프로그램의 구현을 살펴본다.

제7장에서는 입출력 포트를 통해 주변 입출력 모듈의 제어에 대한 실습을 진행

한다. 제8장에서는 MCS-51 MCU가 제공하는 각종 인터럽트에 대해 개괄적으로

설명하고 외부 인터럽트를 취급하는 실습을 수행한다. 제9장에서 타이머/카운터

인터럽트, 제10장에서는 시리얼 통신 인터럽트에 대한 개념을 이해하고, 이를 통

한 응용 실습을 진행한다. 제11장에서는 CLCD에 대한 제어 방법을 학습하고, 관

련 응용 프로그램을 실습한다.

끝으로, C51 프로그래밍과 관련된 장들로 제12장에서는 Keil C51 컴파일러를 중

심으로 C51 프로그래밍과 관련한 확장 개념들을 살펴본다. 제13장에서는 C51 컴

파일러를 활용하여 포트 입출력, 외부 인터럽트, 타이머/카운터 인터럽트, 시리얼

인터럽트, CLCD, DotMatrix 모듈, KeyPad 모듈 등의 제어를 위한 응용 프로그

램을 구현한다.

여러 학기를 거쳐 강의 및 실습에 활용하였던 자료를 토대로, 필요한 개념들을

정리하여 책으로 묶기에 이르렀다. 여러 부분에서 미흡한 느낌을 지울 수 없으

나, 추후 미진한 부분들은 다듬어 보완토록 하겠다.

2017년 8월

Page 5: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

목차 1

목 차

제1장 MCS-51 MCU ··············································································1

1.1 MCS-51 계열 MCU ·················································································1

1.2 8051의 구조 ·································································································4

1.3 메모리 구조 ·································································································9

1.4 내부 데이터 메모리 ·················································································22

1.5 MCU 타이밍도 ·························································································37

제2장 MCS-51 명령어 ··········································································45

2.1 주소 지정 방식 ·························································································45

2.2 MCS-51 명령어 ·······················································································51

2.3 명령어 요약 ·······························································································93

제3장 KUT51 실습 보드 ······································································99

3.1 실습 보드 제작 ·························································································99

3.2 실습 환경 구축 ·······················································································105

3.3 Keil uVision IDE ··················································································111

3.4 소스 작성, 어셈블 및 실행 ··································································128

3.5 실습과제 ···································································································140

Page 6: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

2 MCS-51 마이크로컴퓨터

제4장 기초 연산 명령 ··········································································143

4.1 전송 명령 ·································································································143

4.2 산술 연산 명령 ·······················································································146

4.3 논리 및 기타 연산 명령 ·······································································150

4.4 실습과제 ···································································································153

제5장 반복 처리 ····················································································157

5.1 분기 명령 및 반복 처리 ·······································································157

5.2 데이터 블록 전송 및 합산 ···································································162

5.3 검색 및 정렬 ···························································································164

5.4 실습과제 ···································································································170

제6장 스택 및 서브루틴 ······································································171

6.1 스택과 서브루틴 ·····················································································171

6.2 코드 변환 ·································································································177

6.3 실습과제 ···································································································185

Page 7: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

목차 3

제7장 포트 입출력 ················································································187

7.1 입출력 포트 ·····························································································187

7.2 입출력 처리 및 시간지연 ·····································································192

7.3 입출력 모듈 제어 ···················································································194

7.4 실습과제 ···································································································210

제8장 인터럽트 ······················································································213

8.1 인터럽트 개요 ·························································································213

8.2 관련 SFR ·································································································220

8.3 이벤트 취급 방식 ···················································································224

8.4 실습 보드에서의 인터럽트 ···································································228

8.5 외부 인터럽트 ·························································································231

8.6 실습과제 ···································································································237

제9장 타이머/카운터 ············································································239

9.1 타이머/카운터의 용도 ···········································································239

9.2 관련 SFR ·································································································243

9.3 타이머/카운터의 동작 모드 ·································································248

9.4 예제 프로그램 ·························································································253

9.5 실습과제 ···································································································258

Page 8: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

4 MCS-51 마이크로컴퓨터

제10장 시리얼 통신 ··············································································259

10.1 시리얼 통신 모드 ·················································································259

10.2 관련 SFR ·······························································································262

10.3 보 레이트 설정 및 송수신 ·································································266

10.4 예제 프로그램 ·······················································································271

10.5 실습과제 ·································································································276

제11장 CLCD 제어 ···············································································277

11.1 CLCD 개요 ···························································································277

11.2 CLCD 제어 명령 ··················································································286

11.3 CLCD의 초기화 ···················································································293

11.4 예제 프로그램 ·······················································································298

11.5 실습과제 ·································································································312

제12장 C51 컴파일러 ···········································································313

12.1 C51 개요 ································································································313

12.2 데이터 형 ·······························································································314

12.3 메모리 형 및 모델 ···············································································319

12.4 포인터 ·····································································································324

12.5 외부 메모리 및 입출력 디바이스 접근 ···········································330

12.6 함수 ·········································································································333

12.7 C와 어셈블리 소스간 인터페이싱 ····················································338

Page 9: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

목차 5

제13장 C51 프로그래밍 ······································································345

13.1 C51 프로그래밍 절차 ··········································································345

13.2 C51 기초 실습 ······················································································354

13.3 포트 입출력 ···························································································369

13.4 DotMatrix 및 Keypad 제어 ······························································381

13.5 CLCD 제어 ···························································································391

13.6 외부 인터럽트 ·······················································································402

13.7 타이머/카운터 인터럽트 ·····································································406

13.8 시리얼 인터럽트 ···················································································410

부록 1. KUT51 회로도 ·······································································425

부록 2. KUT51 부품 목록 ·································································426

부록 3. 모니터 프로그램 소스 ························································427

Page 10: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

6 MCS-51 마이크로컴퓨터

Page 11: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제1장 MCS-51 MCU 1

제1장 MCS-51 MCU

본 장에서는 MCS-51 계열의 호환 모델, 하드웨어 구조, 메모리 구조 및 CPU

타이밍에 대해서 살펴본다.

1.1 MCS-51 계열 MCU

본 절에서는 Intel 사의 8비트 마이크로컨트롤러인 MCS-51 계열 모델의 각 특징

과 Atmel 사에서 개발한 MCS-51 호환 모델들의 특징을 살펴본다.

1.1.1 MCS-51 계열 모델

Intel 사는 8051 외에 8051의 기본 구조에서 일부 기능을 추가 혹은 제거한 형태

의 다양한 모델의 마이크로컨트롤러를 제품화하고 있다. 이 중 8051의 기본 구조

를 중심으로 일부 변형된 형태의 마이크로컨트롤러를 통칭하여 MCS(micro

controller system)-51 계열의 MCU(micro controller unit)라고 한다.

MCS-51 계열의 마이크로컨트롤러는 하버드(Harvard) 구조를 채택한

CISC(complex instruction set computer) 형의 마이크로프로세서이다. 하버드 구

조란 데이터 메모리를 레지스터 파일 방식으로 관리하는 구조로, 레지스터와 데

이터 메모리를 구분하지 않고 데이터 메모리 영역을 범용 레지스터처럼 사용하

는 구조를 의미한다. MCS-51 계열 MCU는 111개의 명령어를 제공하며, 8가지의

주소 지정 방식을 제공하는 CISC 형의 MCU다.

MCS-51 계열의 MCU는 다양한 종류의 모델을 출시하고 있는데, 이중 주목하여

야 할 것은 8031, 8051, 8751이며, 이들의 기본 구조는 동일하나, ROM의 내장 여

부 및 롬의 유형, ROM과 RAM의 크기에 따라 구별된다. 이외에 8032, 8052와

같이 모델 번호의 끝자리가 2인 모델을 추가로 고려할 필요가 있다. 또한 80C51

유형의 모델은 CHMOS 제작 기술로 생산된 저전력 모델로, 저전력 모드를 제공

하기도 한다. [표 1.1]은 Intel사의 MCS-51 계열 MCU의 특징들을 요약하여 보

Page 12: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

2 MCS-51 마이크로컴퓨터

인 것이다.

표 1.1 Intel MCS-51 계열

모델 ROM RAM 속도 I/O핀 T/C UART Interrupt8031AH ROMless 128B 12MHz 32 2 1 58051AH 4KB ROM 128B 12MHz 32 2 1 58751BH 4KB EPROM 128B 12MHz 32 2 1 58032AH ROMless 256B 12MHz 32 3 1 68052AH 8KB ROM 256B 12MHz 32 3 1 68752BH 8KB EPROM 256B 12MHz 32 3 1 6

8051 MCU

8051은 4KB의 프로그램 메모리(Mask ROM), 128바이트의 데이터 메모리(RAM),

16비트 타이머/카운터 2개, 인터럽트 소스 5개, UART 1개를 내장하고 있으며,

최대 64KB의 외부 프로그램 메모리와 최대 64KB의 외부 데이터 메모리를 장착

할 수 있는 메모리 공간을 확보하고 있다. 내장된 프로그램 메모리는 한번 기록

되면 이후 재 기록할 수 없는 단점이 있으나 저렴하다는 장점이 있기도 하다. 일

반적으로 4KB 미만의 프로그램 개발이 완료된 후 대량 생산하는 경우에 적합하

다. [그림 1.1]은 8051 MCU의 하드웨어 구조를 블록형태로 보이고 있다.

INTERRUPTCONTROL 4K

ROM

CPU

OSC

EXTERNALINTERRUPTS

BUSCONTROL

128 BYTES RAM

4 I/O PORTS

P0 P2 P2 P3

ADDRESS/DATA

TIMER 1

TIMER 0

SERIALPORT

TXD RXD

COUNTERINPUTS

그림 1.1 8051 MCU의 블록도

Page 13: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제1장 MCS-51 MCU 3

8031 MCU

8031은 프로그램 메모리(ROM)가 내장되어 있지 않다는 점을 제외하고 8051

MCU와 동일하다. 이 MCU는 프로그램 메모리가 필요시 외부 장착해야 함을 의

미하며, 최대 64KB까지 외부 장착 가능하다. 따라서 사용자가 응용에서 필요로

하는 프로그램 메모리가 4KB(8051) 혹은 8KB(8052) 이상인 경우로, 외부 프로그

램 메모리의 장착을 피할 수 없는 경우에 8031 MCU를 선택할 수 있다.

8751 MCU

8751은 내부 프로그램 메모리가 EPROM으로 내장되어 있다는 점을 제외하고

8051 MCU와 동일하다. 이는 프로그램 메모리 내의 정보를 자외선 이레이저

(eraser)를 사용하여 삭제한 후, 다시 재 기록할 수 있는 장점을 가진다. 이는

4KB 미만의 프로그램을 개발하는 과정에서 바람직한 모델이다.

8032, 8052, 8752 MCU

이들 MCU는 각각 8031, 8051, 8751 MCU의 후속 모델로서, 내부 프로그램 메모

리와 내부 데이터 메모리가 이전 모델에 비해 두 배씩 늘어났으며, 타이머/카운

터가 하나씩 추가된 모델이다. 결국 8KB의 내부 프로그램 메모리, 256바이트의

내부 데이터 메모리, 3개의 타이머/카운터를 내장하고 이외는 이전 모델과 동일

한 기능을 가지는 MCU라고 할 수 있다.

1.1.2 MCS-51 호환 모델

최근에는 Intel 사의 MCS-51 계열과 호환되는 모델을 Atmel 사에서 출시하고

있으며 이들 모델에 대한 특징을 [표 1.2]에 정리하여 보인다. 이들 Atmel 89Cxx

시리즈는 MCS-51 계열과 달리 내부 프로그램 메모리를 플래쉬(flash) 메모리로

대체 내장한 모델을 출시하였다. 이들 모델에는 외부에 ROM 혹은 RAM을 필요

로 하지 않는 소형 20핀 형태의 89Cxx51 계열과, 8051과 완전 호환되며 플래쉬

메모리가 내장된 89C5x 시리즈가 공급되고 있다.

이외에도 Philips사는 MCS-51 호환 제품으로 초저가형, 저전력형, OTP형, 플래

시 메모리형 등을 출시하고 있으며, Dallas사는 배터리 백업기능, RTC 기능이

내장된 모델 등을 생산하고 있다.

Page 14: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

4 MCS-51 마이크로컴퓨터

표 1.2 Atmel사의 AT89Cxx 계열

모델 flashROM RAM 속도 I/O핀 T/C UART InterruptAT89C1051 1KB 64B 24MHz 15 1 - 3AT89C2051 2KB 128B 24MHz 15 2 1 6AT89C4051 4KB 128B 24MHz 15 2 1 6AT89C51 4KB 128B 24MHz 32 2 1 6AT89C52 8KB 256B 24MHz 32 3 1 8

1.2 8051의 구조

MCS-51 계열 MCU의 대표적인 모델인 8051 MCU의 특징 및 구조를 살펴본다.

1.2.1 MCS-51의 특징

MCS-51 계열의 대표적인 모델인 8051은 다음과 같은 특징들을 가진다.

▪ 제어를 위한 응용에 최적화된 8비트 CPU이다.

▪ 강화된 비트 단위의 대수 처리 능력을 가진다.

▪ 최대 64KB 크기의 프로그램 메모리 주소 공간을 제공한다.

▪ 최대 64KB 크기의 데이터 메모리 주소 공간을 제공한다.

▪ 최대 4KB 크기의 내장 프로그램 메모리를 제공한다.

▪ 128B 크기의 내장 데이터 메모리를 제공한다.

▪ 32 핀의 양방향 입출력 기능을 제공하며, 각 핀은 개별적으로 주소지정 가

능하다.

▪ 2 개의 16비트 타이머/카운터를 제공한다.

▪ 전이중 방식의 UART(Universal Asynchronous Receiver/Transmitter)를

제공한다.

▪ 두 레벨의 우선순위를 가지는 5가지 인터럽트 구조를 제공한다.

▪ 클록 오실레이터를 제공한다.

Page 15: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제1장 MCS-51 MCU 5

1.2.2 하드웨어 구조

[그림 1.2]는 MCS-51 MCU의 기본 내부 구조를 보다 구체적으로 나타낸 것이

다.

CY OVRS2RS1F0AC P

ACC

DPL

DPH

TCON

TMOD

TL0

TH0

TL1

TH1

SCON

SBUF

IEC

IPC

B

SP

128 X 8RAM

REGISTER BANK 3

REGISTER BANK 0

REGISTER BANK 1

REGISTER BANK 2

DRIVERS

SPEC

IAL

FUN

CTI

ON

REG

ISTE

R A

DD

RES

S D

ECO

DER

RAM

AD

DR

ESS

DEC

OD

ER

PARITY

ALU

ROTATE CONTROL

INTERRUPTCONTROL

SERIALPORT

TIMERCONTROL

OSCTIMING

CIRCUITRY P1 P3

XTAL1

XTAL2

EA/VDD

ALE/PROG

PSEN

PORT 1 PORT 3

P2

PROGRAM CONTROL

PCL

PCH

CONTROLPLA

INSTRUCTIONDECODER

CONTROLENGINE

CO

NTR

OL

P0

PORT 2 PORT 0 VSS

RST/VPD

VCC

4K X 8NONE (8031)ROM (8051)

EPROM (8751)

PRO

GR

AM M

EMO

RY

ADD

RES

S D

ECO

OD

R

DRIVERS

그림 1.2 8051의 내부 구조

Page 16: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

6 MCS-51 마이크로컴퓨터

특수 기능 레지스터 영역에 있는 외부 인터럽트 관련, 타이머/카운터 인터럽트

관련, 시리얼 통신 인터럽트 관련 레지스터들과 그 외의 레지스터들은 내부 메모

리를 언급할 때 살펴보기로 하고, 여기서는 프로그램 카운터에 대해 간단히 살펴

본다. 프로그램 카운터(program counter, PC)는 수행될 다음 명령이 메모리의 어

디에 위치하는 지를 알려주는 두 바이트 크기의 주소를 값으로 가진다. 리셋하였

을 때 8051의 프로그램 카운터 값은 0000H으로 초기화되며, 명령이 수행될 때마

다 그 값을 변경한다. 항상 프로그램 카운터는 다음에 실행할 명령의 주소를 그

값으로 가지는 16비트 길이의 레지스터이다.

1.2.3 8051 핀 기능

MCS-51의 PDIP형과 PLCC형의 핀 배치도는 [그림 1.3]과 같다.

(a) PDIP형 (b) PLCC형

그림 1.3 MCS-51의 핀 배치

각 핀의 기능을 살펴보면 다음과 같다.

Page 17: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제1장 MCS-51 MCU 7

P0(P0.7,...,P0.0)

포트 P0는 8개의 핀으로 구성된 오픈 드레인(open drain) 출력 방식의 양방향 입

출력 포트다. 각 핀은 독립적으로 입력 혹은 출력으로 사용될 수 있으며, 출력용

으로 사용할 때 4개의 LS TTL을 구동할 수 있다. 추가의 외부 메모리를 장착하

는 경우, 포트 P0는 16비트 길이의 외부 메모리 주소중 하위 바이트에 해당하는

어드레스 신호(A7,...,A0)의 통로로, 혹은 기록/판독한 데이터 신호(D7,...,D0)의 이

동 통로로 사용된다. 반면 외부 메모리를 연결하지 않을 경우, 순수한 입출력 포

트의 용도로 사용된다.

P1(P1.7,...,P1.0)

포트 P1은 8개 핀으로 구성되며, 내부적으로 풀업(pull-up)된 양방향 입출력 포

트다. 출력으로 사용할 때 각 핀은 4개의 LS TTL을 구동할 수 있다.

P2(P2.7,...,P2.0)

포트 P2는 8개 핀으로 구성되며, 내부적으로 풀업된 8비트 양방향 입출력 포트

로, 출력으로 사용될 경우 각 핀은 4개의 LS TTL을 구동할 수 있다. 추가의 외

부 메모리를 장착하는 경우, 포트 P2는 16비트 길이의 외부 메모리 주소중 상위

바이트에 해당하는 어드레스 신호(A15,..,A8)의 통로로 사용된다. 외부 메모리를

연결하지 않는 경우, 범용의 입출력용으로 사용된다.

P3(P3.7,...,P3.0)

포트 P3은 8개 핀으로 구성되며, 내부적으로 풀업된 8비트 양방향 입출력 포트

다. 출력으로 사용될 경우 4개의 LS TTL을 구동할 수 있다. 포트 P3의 각 핀은

입출력 용도 외에 [표 1.3]과 같은 특수한 기능으로도 사용된다.

표 1.3 P3 핀의 특수 기능

핀 명 칭 기 능P3.0 RxD 시리얼 수신 포트P3.1 TxD 시리얼 송신 포트P3.2 외부 인터럽트 0P3.3 외부 인터럽트 1P3.4 T0 타이머/카운터 0의 외부 입력P3.5 T1 타이머/카운터 1의 외부 입력P3.6 외부 데이터 메모리 기록 신호P3.7 외부 데이터 메모리 판독 신호

Page 18: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

8 MCS-51 마이크로컴퓨터

RESET

MCU를 리셋(reset)하기 위해 사용되는 핀으로, 이 핀에 입력되는 신호가 최소 2

머신 사이클 이상동안 High 레벨로 유지되어야 한다. 리셋하였을 때 각 레지스

터의 내정된 초기 상태는 [표 1.4]와 같다. 리셋하고 난 후, PC는 0000H, SP는

07H, 입출력포트는 FFH, 인터럽트 허용여부를 설정하는 IE은 00H로 설정됨을

유의할 필요가 있다.

표 1.4 리셋시의 주요 레지스터의 내정된 초기치

레지스터 초기값 레지스터 초기값PC 0000H ACC 00HB 00H PSW 00HSP 07H DPTR 0000HP0 FFH P1 FFHP2 FFH P3 FFHIP XX000000B IE 0X000000B

TMOD 00H TCON 00HTH0 00H TL0 00HTH1 00H TL1 00H

SCON 00H PCON 0XXX0000BSBUF XXXXXXXXB

/ (Address Latch Enable/Program Pulse)

는 어드레스를 래취(latch)하기 위해 MCU에서 발생하는 출력신호로 사용될

때를 말한다. 이 신호는 74HC573과 같은 래취용 IC의 칩 인에이블 핀에 입력된

다. 이 신호는 P0 핀의 신호가 어드레스 혹은 데이터 신호로 사용될 수 있는데

이들을 구분하여 래취하는 경우에 사용된다. 신호로 사용되는 경우는 내

부 EPROM에 프로그램을 기록할 경우에 사용된다.

(Program Store Enable)

외부 프로그램 메모리를 접근할 때 사용하는 핀으로, Low 신호에서 활성화된다.

각 머신 사이클에서 두 번 발생되며, 이 신호의 하강 에지에서 포트 P0에 인가된

신호는 어드레스의 하위 바이트로 사용된다.

Page 19: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제1장 MCS-51 MCU 9

/Vpp(External Access/Vpp)

는 사용자에 의해 정의되는 기능을 하는 용도로, 일반적으로 외부 롬 혹은

내부 롬을 사용할 것인지에 따라 다른 신호를 입력한다. 핀에 Low 신호가

입력되면 외부 롬을, High 신호가 입력되면 내부 롬을 0000H부터 0FFFH 어드

레스로 접근할 수 있다. Vpp 신호로 사용되는 경우는 내부 EPROM에 프로그램

을 기록하는 동안 전원 입력 핀으로 사용되는 것을 말한다.

XTAL1, XTAL2

시스템 클록 발생회로를 위한 핀이다.

Vcc, Vss

Vcc는 전원 핀으로 통상 5V 전원을 인가하며, Vss는 접지 핀으로 전원의 Gnd와

연결한다.

1.3 메모리 구조

MCS-51은 [그림 1.4]와 같이 세 가지 유형의 메모리를 이용하여 구성할 수 있

다. 즉, MCU 내에 내장된 온칩(on-chip) 메모리, MCU 외부에 접속한 ROM인

외부 프로그램 메모리, 그리고 외부에 RAM을 연결한 외부 데이터 메모리로 구

성된다.

그림 1.4 메모리의 구성

온칩 메모리는 물리적으로 MCU 자체에 내장된 메모리로 내부 데이터 메모리와

Page 20: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

10 MCS-51 마이크로컴퓨터

내부 프로그램 메모리가 다양한 형태로 조합될 수 있다. 즉, 출시되는 모델에 따

라 내부 데이터 메모리의 크기, 내부 프로그램 메모리의 유무와 크기가 결정된

다. 외부 프로그램 메모리는 MCU 외부에 장착하는 프로그램 메모리로, 종종

EPROM을 사용한다. 외부 데이터 메모리는 MCU 외부에 장착하는 RAM 형태의

메모리로, 표준 형태의 SRAM이나 플래쉬(flash) 메모리를 흔히 사용한다. 응용

프로그램을 보다 효율적으로 작성할 수 있기 위해서는 이러한 메모리 구성에 대

한 내용을 파악하고 있을 필요가 있다.

1.3.1 메모리 주소 체계

모든 MCS-51 계열의 MCU는 내부 데이터 메모리와 내부 프로그램 메모리를 위

해 각기 다른 주소 체계를 제공한다. 즉, 내부 데이터 메모리는 8비트 주소 체계

를, 내부 프로그램 메모리를 비롯하여 MCU 외부에 확장 연결하는 외부 메모리

는 16비트 주소 체계를 사용하고 있다.

8비트 주소 체계

내부 데이터 메모리는 8비트 길이의 주소에 의해 접근하므로 8비트 처리 시스템

인 MCS-51 MCU에 의해 16비트 주소 체계의 메모리를 접근하는 것보다 고속으

로 해당 메모리를 접근할 수 있다.

그림 1.5 내부 데이터 메모리의 주소 체계

[그림 1.5]은 내부 데이터 메모리의 주소 체계를 나타낸다. 특히, xx52 모델의

Page 21: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제1장 MCS-51 MCU 11

MCU의 경우 주소 80H부터 FFH까지의 내부 램 128바이트가 추가 제공되어 총

256 바이트의 내부 데이터 메모리를 제공한다.

xx52 모델 경우 SFR 영역의 주소도 80H부터 FFH이다. 동일 주소를 통해 상위

의 내부 램과 SFR 영역의 주소 지정에 있어 충돌이 발생한다. 이러한 문제는 각

영역에 따른 주소 지정 방식을 달리함으로써 해결하고 있다. 주소 00H부터 7FH

까지는 직접 주소, 혹은 간접 주소 지정 방식으로 접근 가능하다. 하지만 주소

80H부터 FFH까지 접근할 때 직접 주소 지정 방식을 사용하면 SFR 영역을, 간

접 주소 지정 방식으로 접근하면 상위의 내부 램 128바이트를 접근하도록 설계

되었다. 이에 대한 보다 세부적인 내용은 다음 절에서 설명하도록 한다.

16비트 주소 체계

반면, 내부 프로그램 메모리는 16비트 길이의 DPTR(data pointer) 레지스터로 주

소 지정하여 접근할 수 있다. 뿐만 아니라 외부에 확장 구성하는 외부 프로그램

메모리 및 외부 데이터 메모리 역시 16비트 주소 체계를 사용하므로, 확장 가능

한 외부 프로그램 메모리 및 데이터 메모리는 최대 64KB까지 가능하다.

내부 프로그램 메모리는 MCS-51 계열 모델에 따라 ROM 혹은 EPROM 형태로

4KB 혹은 8KB 크기의 내장된 메모리로 제공된다. 각 모델에 따른 내부 프로그

램 메모리의 크기는 앞의 [표 1.1]을 참조한다. 내장된 프로그램 메모리는 필요에

따라 사용할 수도 있고 사용하지 않을 수 있다. 내장된 프로그램 메모리를 사용

하기 위해서는 MCU의 단자에 High 신호를 인가한다. 내장 프로그램 메모

리를 사용하지 않으려면 MCU의 단자에 Low 신호를 인가하면 된다.

[그림 1.6]은 내부 프로그램 메모리가 제공되는 MCS-51 모델에서 내부 프로그램

메모리를 사용하면서, 외부에 프로그램 메모리와 데이터 메모리를 확장 장착한

상황에서의 회로 및 주소 체계를 나타낸다. 제공되는 내부 프로그램 메모리의 크

기에 따라 주소 0000H부터 사용하고, 나머지 주소 공간은 확장 장착된 외부의

메모리의 주소 공간으로 사용된다. 이렇게 내부 프로그램 메모리를 포함하도록

하려면 MCU의 단자에 High 신호를 인가하면 된다.

Page 22: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

12 MCS-51 마이크로컴퓨터

그림 1.6 내부 프로그램 메모리를 포함한 경우의 회로 및 주소 체계

또한 [그림 1.6]에서 보듯이 외부 프로그램 메모리와 외부 데이터 메모리는 필요

에 따라 조합되어 사용될 수 있으며, 조합되는 ROM과 RAM의 전체 주소 공간

은 최대 64KB까지 구성될 수 있다.

추가 장착된 외부 프로그램 메모리에 대한 읽기 신호는 MCU로부터의을

이용한다. MCU로부터 외부 데이터 메모리 접근동안 필요에 따라 읽기와 기록

신호인 와 신호를 생성한다. AND 게이트의 두 입력단에 MCU의

와 신호를 인가하고, 그 게이트의 출력을 외부 프로그램 메모리와 외부

데이터 메모리의 신호 단자에 연결한다. 이 신호는 이들 외부 메모리에 대

한 판독 신호로 작용한다.

[그림 1.7]은 내부 프로그램 메모리를 제공하지 않거나, 제공하더라도 사용하지

않고 외부에 프로그램 메모리와 데이터 메모리를 확장 장착하는 상황에서의 회

로 및 주소 체계를 나타낸다. 내부 프로그램 메모리의 사용하지 않기 위해서는 단자에 Low 신호를 인가하면 된다. 이 경우 주소 0000H은 외부에 장착된

프로그램 메모리 혹은 데이터 메모리의 첫 위치를 지정하게 된다. 외부에 장착하

는 메모리는 프로그램 메모리만으로 최대 64KB까지, 데이터 메모리만으로 최대

64KB까지, 혹은 프로그램 메모리와 데이터 메모리의 조합으로 최대 64KB까지

접속가능하다.

Page 23: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제1장 MCS-51 MCU 13

그림 1.7 내부 프로그램 메모리를 제외한 경우의 회로 및 주소 체계

1.3.2 내부 데이터 메모리

MCS-51 MCU의 내부 데이터 메모리의 주소체계는 [그림 1.8]과 같이 사상되어

있다. 이 메모리 공간은 2개의 영역으로 나누어져 있으며, 하위 128B 영역, 상위

128B 영역 혹은 SFR 영역으로 지칭된다. 주소 00H부터 7FH까지는 하위 128B영

역인 반면, 상위 128B 영역과 SFR 영역은 물리적으로는 구분됨에도 불구하고

주소 80H부터 FFH까지 동일한 주소 공간을 사용하고 있는 것을 확인할 수 있

다.

그림 1.8 내부 데이터 메모리의 접근

Page 24: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

14 MCS-51 마이크로컴퓨터

내부 데이터 메모리의 주소는 8비트의 주소 체계를 사용하므로 256바이트의 주

소 공간만을 가질 수 있음을 의미한다. 그러나 내부 데이터 메모리를 위한 주소

지정 방식을 달리함으로써 최대 384바이트의 공간을 접근하는 것이 가능하다. 하

위 128B 영역의 각 바이트는 직접 혹은 간접 주소 지정하여 접근할 수 있다. 반

면 상위 128B 영역은 단지 간접 주소지정에 의해서만 접근할 수 있다. SFR 영

역은 직접 주소지정 방식에 의해 접근할 수 있다. 즉, RAM의 상위 128B 영역은

8051 MCU에는 제공되지 않으나, 8052 MCU와 같은 xx82 모델에서는 256바이트

의 내부 RAM을 제공한다. 이 경우, 80H부터 FFH까지의 주소 영역을 간접 주소

지정방식에 의해 접근하면 내부 RAM의 상위 128B 영역을 접근하는 것이며, 직

접 주소지정 방식으로 접근하면 SFR 영역을 접근하는 것이다.

램의 하위 128B 영역은 [그림 1.9]에 보인 것과 같이 모든 MCS-51 MCU에 존

재하며, 레지스터 뱅크, 비트 주소 가능 영역, 사용자 데이터 영역의 3개 영역으

로 구성된다. 이러한 내부 데이터 메모리에 대한 내용은 다음 절에서 보다 자세

히 살펴보도록 한다.

그림 1.9 하위 128B 영역

레지스터 뱅크 영역

최하위의 32바이트에는 8개 레지스터로 구성되는 레지스터 뱅크(register bank)

가 4조가 위치한다. 각 레지스터 뱅크내의 레지스터 각각은 R0, R1, ..., R7으로

지칭된다. 이렇게 레지스터 이름을 사용하는 명령들은 해당 레지스터의 직접 주

소를 사용하는 명령보다 짧기 때문에 명령 코드를 보다 효율적으로 사용할 수

Page 25: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제1장 MCS-51 MCU 15

있도록 한다. 이러한 레지스터 뱅크는 한 순간에 하나의 레지스터 뱅크만이 의미

를 가지며, PSW(program status word) SFR의 두 비트 RS1, RS0의 설정 값에

따라 레지스터 뱅크가 선택된다.

리셋 후 레지스터 뱅크는 RB0가 기본적으로 설정되고, SP(stack pointer)는 07H

로 설정된다. 이 경우 실질적인 스택 영역은 주소 08H부터 시작된다. 따라서 레

지스터 뱅크를 제외한 나머지 영역은 프로그램 수행 중에 스택 영역으로 사용된

다. 이들 레지스터 뱅크는 한 순간에 하나의 레지스터 뱅크만을 사용할 수 있으

며, 다른 레지스터 뱅크를 선택하는 경우에는 SP도 적절히 재설정해 줄 필요가

있다.

비트 주소 가능 영역

비트 주소 가능 영역은 레지스터 뱅크 다음의 16바이트 영역으로 바이트 단위뿐

만 아니라 비트 단위의 주소 지정이 가능한 메모리 공간이다. MCS-51 명령은

많은 비트 처리 명령을 가지고 있으며, 이들 16바이트는 128비트로 구성되므로

이 영역의 비트 주소는 00H부터 7FH까지의 범위로 주소 지정될 수 있다.

사용자 데이터 영역

하위 128B 영역의 나머지 영역은 스택 영역 혹은 사용자의 데이터 메모리로서

사용될 수 있다. 특히, xx52 MCU와 같이 상위 128B 영역을 제공하는 경우 이

영역도 데이터 영역으로 사용된다. [그림 1.10]은 이 모델에서의 데이터 영역 및

SFR 영역의 주소 공간을 보여준다.

그림 1.10 SFR 영역 및 상위 128B 영역

Page 26: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

16 MCS-51 마이크로컴퓨터

특수 기능 레지스터 영역

다음으로 특수 기능 레지스터(SFR) 영역은 입출력 포트, 외부 인터럽트, 타이머/

카운터 등의 인터럽트 등의 처리를 위해 연관된 특수 기능의 레지스터들이 위치

한 영역이다. 이들 특수 기능 레지스터 영역은 직접 주소 지정에 의해서만 접근

할 수 있다. 일반적으로 모든 MCS-51 계열의 MCU는 기본적으로 8051 MCU와

동일한 SFR를 가지며, 동일한 주소 공간을 사용한다. 그러나 보다 개선된 모델

에서는 부가적인 SFR가 제공되기도 한다. 위의 [그림 1.10]을 통하여 SFR 영역

의 주소 공간을 확인할 수 있다.

특수 기능 레지스터 영역의 레지스터 중에서 16개 주소는 바이트 단위 및 비트

단위 접근이 가능하다. SFR중 비트 단위 주소 지정이 가능한 SFR는 주소의 하

위 3비트가 0002로 끝나는 주소의 SFR들이다. 이 영역에서의 비트 주소는 80H부

터 FFH가 사용된다.

1.3.3 내부 프로그램 메모리

프로그램 메모리는 리셋 후 곧바로 실행될 실질적인 8051 프로그램을 적재하는

메모리이다. 이 프로그램 메모리는 16비트 주소 체계를 사용한다. 또한 MCS-51

계열의 모델에 따라 내부 프로그램 메모리의 사이즈가 다르게 출시된다. 8031의

경우 내부 프로그램 메모리는 제공되지 않으며, 이 모델을 사용하면서 프로그램

메모리를 두고자 하는 경우는 외부에 ROM을 장착하는 방식으로 설계할 수 있

다. 8051의 경우 4K 바이트의 프로그램 메모리를 내장하고 있다. 8052의 경우

8K 바이트의 프로그램 메모리를 제공한다.

내장된 프로그램 메모리를 제공하는 모델에서 내부 프로그램 메모리를 사용하기

위해서는 MCU의 단자에 High 신호를 인가하여야 한다. 이 경우 내부 프로

그램 메모리의 첫 주소는 0000H 번지가 된다. 따라서 4KB를 제공하는 8051의

경우 내부 프로그램 메모리의 주소 범위는 0000H부터 0FFFH번지까지, 8KB를

제공하는 8052의 경우 내부 프로그램 메모리의 주소 범위는 0000H부터 1FFFH

번지까지 사용되며, 응용 프로그램의 크기도 이 범위 내에 있어야 적재하여 실행

가능하다.

[그림 1.11]은 프로그램 메모리의 하위 영역의 메모리 맵을 보인다. 리셋 후

MCU는 0000H 주소부터 실행을 시작하도록 되어 있으며, 인터럽트를 취급하여

Page 27: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제1장 MCS-51 MCU 17

야 하는 경우 각 인터럽트 서비스 루틴의 시작 위치는 [그림 1.11]에서 보듯이

프로그램 메모리의 고정된 위치에 할당되어 있다. 이들 인터럽트 서비스 루틴의

첫 명령이 위치해야 할 주소를 인터럽트 벡터 주소(interrupt vector address)라

한다. 인터럽트 요청시 MCU는 PC의 값을 인터럽트 벡터 값으로 설정함으로써

해당 인터럽트의 서비스 루틴이 실행될 수 있도록 한다.

그림 1.11 프로그램 메모리

예를 들면, 외부 인터럽트 INT0의 벡터 주소는 0003H으로 지정되어 있다. 만일

외부 인터럽트 0의 요청이 발생한다면 그것의 인터럽트 서비스 루틴은 0003H에

서 시작되어야 한다. 만일 이 인터럽트를 취급할 필요가 없다면 서비스 루틴이

있어야할 위치의 메모리는 일반 목적의 프로그램 메모리로서 사용할 수 있다.

인터럽트 서비스 루틴의 위치들은 8바이트 간격으로 배치되어 있다. 만일 인터럽

트 서비스 루틴이 충분히 짧다면 그 루틴은 8바이트 구간 내에 상주할 수 있으

나 보다 많은 코드로 작성된다면 인접한 다른 인터럽트 서비스 루틴의 위치를

침범할 수 있다. 따라서 인터럽트를 취급하는 프로그램을 작성할 때는, 인터럽트

서비스 루틴을 메모리의 다른 영역에 적재하고, 그 위치로의 분기 명령을 해당

인터럽트 벡터 주소에 위치하는 방식을 취한다.

Page 28: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

18 MCS-51 마이크로컴퓨터

일반적으로 인터럽트를 취급하는 응용 프로그램이 있을 경우, 0000H번지에는 실

질적인 응용 프로그램이 위치하게 되는 0028H 번지 이후의 위치로 분기하는 분

기 명령이 위치하게 된다. 또한 인터럽트 서비스 루틴도 0028H 번지 이후의 주

소 공간에 위치하도록 하고, 해당 인터럽트 벡터 주소에서는 실질적인 인터럽트

서비스 루틴이 위치한 주소로 분기할 수 있도록 분기 명령을 위치시키게 된다.

1.3.4 외부 프로그램 메모리

내부 프로그램 메모리의 크기는 MCU 모델의 선택에 따라 없거나, 4KB 혹은

8KB가 제공될 수 있다. 내장 형태로 제공되는 이러한 내부 프로그램 메모리가

특정 응용 프로그램을 실행하기에 부족한 경우, 외부에 추가의 ROM을 장착함으

로써 프로그램 메모리를 확장할 수 있다. 이렇게 외부에 확장된 형태의 프로그램

메모리를 외부 프로그램 메모리라 한다. MCS-51 MCU에서는 프로그램 메모리

를 위해 16비트 주소 체계를 사용하므로, 내부 프로그램 메모리를 포함하여 외부

프로그램 메모리는 최대 64KB까지 확장할 수 있다.

그림 1.12 에 따른 프로그램 메모리 주소 영역

프로그램 메모리는 내부 프로그램 메모리와 외부 프로그램 메모리로 구성될 수

Page 29: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제1장 MCS-51 MCU 19

있으며, 선택된 MCU 모델에 따라 (External Access) 핀을 Vcc 혹은 Vss의

어느 것에 접속하느냐에 의해 여러 형태로 구성될 수 있다. [그림 1.12]는 MCU

모델에 따른 프로그램 메모리의 구성 사례를 보인다.

8031과 같이 내부 프로그램 메모리를 제공하지 않는 모델의 경우, 외부 프로그램

메모리를 장착하여 구성해야 하며, 이 경우 최대 64KB까지 장착할 수 있다. 이

경우, 단자는 Low 신호를 인가함으로써 외부 프로그램 메모리만을 사용함

을 MCU에 알려주어야 한다.

8051의 경우 4KB의 내부 프로그램 메모리가 제공되며, 이 경우 내부 프로그램

메모리를 사용하고 추가로 외부 프로그램 메모리를 장착하고자 하는 경우,

단자에 Low 신호를 인가하여 내장된 프로그램 메모리를 사용하여 확장하겠다는

것을 MCU에 알려 주어야 한다. 이 경우 4KB 범위를 넘어서는 주소에 접근하면

자동적으로 외부 프로그램 메모리를 접근하게 된다. 즉, 주소 0000H부터 0FFFH

주소까지는 내부 프로그램 메모리를, 나머지 경우는 외부 프로그램 메모리를 접

근하게 된다. 최대 장착 가능한 프로그램 메모리는 60KB이다.

8052의 경우 8KB의 내부 프로그램 메모리가 제공되며, 이 경우 내부 프로그램

메모리를 사용하고 추가로 외부 프로그램 메모리를 장착하고자 하는 경우,

단자에 Low 신호를 인가하여 내장된 프로그램 메모리를 사용하여 확장하겠다는

것을 MCU에 알려 주어야 한다. 이 경우 8KB 범위를 넘어서는 주소에 접근하면

자동적으로 외부 프로그램 메모리를 접근하게 된다. 즉, 주소 0000H부터 1FFFH

주소까지는 내부 프로그램 메모리를 나머지 경우는 외부 프로그램 메모리를 접

근하게 된다. 최대 장착 가능한 프로그램 메모리는 56KB이다.

물론, 내부 프로그램 메모리를 제공하는 8051, 8052 모델에서 내부 프로그램 메

모리를 사용하지 않고 외부 프로그램 메모리만으로 프로그램 메모리를 구성하는

것도 가능하다. 이 경우 내부 프로그램 메모리가 제공되지만 사용하지 않겠다는

의미로 단자에 Low 신호를 인가하고, 최대 64KB까지의 외부 프로그램 메

모리를 장착할 수 있다.

외부 프로그램 메모리에 대한 판독 때에는 신호를 사용하여 외부 프로그

램 메모리를 접근하여야 하며, 내부 프로그램 메모리를 접근할 때는 활성

Page 30: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

20 MCS-51 마이크로컴퓨터

화되지 않아야 한다.

프로그램 메모리는 최대 64KB로 제한되기 때문에 응용 프로그램의 크기 또한

64KB로 제한 받는다. 몇몇 어셈블러나 컴파일러는 특수한 보조 하드웨어를 이용

하여 이 제한을 극복할 수 있는 수단을 제공하기도 하지만, 그러한 특수한 컴파

일러나 하드웨어가 없다면 프로그램 메모리는 64KB를 초과할 수 없다.

외부 프로그램 메모리와의 하드웨어 인터페이스는 [그림 1.13]에서 보인다. 입출

력 포트 P0, P2에 해당하는 16개의 라인은 외부 프로그램 메모리 접근동안 전용

버스로서 사용된다. 포트 P0는 다중화되어 주소 혹은 데이터 버스로 사용된다.

PC의 하위 바이트(PCL), 즉 주소의 하위 바이트는 P0로 내보내고, 그런 다음 프

로그램 메모리로부터 코드 바이트의 도착을 기다리는 플로팅 상태에 있게 된다.

PC의 하위 바이트가 포트 P0 상에서 유효한 동안 (Address Latch Enable)

신호는 어드레스 래치로 하위 주소에 해당하는 바이트를 취한다. 그 동안 포트

P2를 통해 PC의 상위 바이트(PCH)를 내보낸다. 이 때은 EPROM을 활

성화하면, 포트 P0을 통하여 1바이트의 데이터가 MCU로 읽혀지게 된다.

MCS-51

P1 P0

EA

ALE

P3 P2

PSEN

EPROM

INSTR.

ADDR

OE

LATCH

그림 1.13 외부 프로그램 메모리로부터의 실행

비록 실제 프로그램 메모리로 사용하는 크기가 64KB보다 작더라도, 프로그램 메

모리 주소는 항상 16비트 크기를 가진다. 또한 외부 프로그램을 실행하려면 프로

그램 메모리의 주소를 지정하기 위한 용도로 두 개의 8비트 포트 P2, P0를 사용

Page 31: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제1장 MCS-51 MCU 21

해야 한다.

1.3.5 외부 데이터 메모리

MCS-51 계열 MCU는 8비트 주소체계를 사용하여 접근하는 내부 데이터 메모리

를 모델에 따라 128바이트 혹은 256바이트까지 제공한다. 하지만, 이러한 내부

데이터 메모리로는 부족할 때, 외부 데이터 메모리를 추가 장착할 수 있다. 이

경우 외부 데이터 메모리의 접근은 앞서 살펴본 프로그램 메모리 공간을 사용하

므로 16비트 주소체계를 사용한다. 따라서 외부 데이터 메모리로의 접근은 유연

성이 떨어지며 속도 또한 느리다. 예로 내부 데이터 메모리의 특정 위치 값을 증

가시키는데 단지 하나의 명령을 요구하며, 하나의 명령 사이클을 필요로 한다.

하지만 외부 데이터 메모리에 저장된 특정 위치의 값을 증가하기 위해서는 4개

의 명령과 7개의 명령 사이클을 요구한다. 비록 외부 데이터 메모리가 속도와 유

연성에서 취약하지만 데이터 메모리 크기를 늘릴 수 있다는 장점을 제공한다.

MCS-51 MCU에서 외부 데이터 메모리로 최대 64KB까지 추가 장착할 수 있다.

[그림 1.14]는 MCS-51 MCU에서 장착 가능한 외부 데이터 메모리의 주소 체계

를 보인다.

그림 1.14 외부 데이터 메모리의 주소 영역

Page 32: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

22 MCS-51 마이크로컴퓨터

[그림 1.15]는 2KB 크기의 외부 데이터 메모리를 장착하고 이를 접근하기 위한

하드웨어 구성을 보인다. 즉 크기가 2KB이므로 주소 비트로 11비트를 사용한다.

이 경우 MCU에서 프로그램 메모리로 내부 프로그램 메모리를 사용한다고 가정

한 상황이다. 포트 P0는 램에 대한 다중화된 주소/데이터 버스로서 사용되고, 포

트 P2의 3라인은 RAM에 대한 페이지 지정을 위해 사용된다. CPU는 외부 RAM

을 접근하는 동안 필요에 따라 와 신호를 생성한다. 프로그램 메모리가

내부에 있다면 포트 P2의 나머지 비트는 입출력용으로 사용 가능하다.

P1 P0EA

MCS-51WITH INTERNAL

ROMALE

P3 P2RDWR

DATA

RAM

ADDR

WE OE

LATCH

I/OPAGE BITS

그림 1.15 외부 데이터 메모리 접근

외부 데이터 메모리는 최대 64KB까지 장착할 수 있기 때문에, 만일 64KB의 외

부 데이터 메모리를 구성하는 경우라면 [그림 1.15]의 포트 P2의 모든 비트는 메

모리 주소의 상위 바이트를 위해 사용되어야 할 것이다.

1.4 내부 데이터 메모리

MCS-51 MCU는 내부 데이터 메모리는 흡사 고속의 레지스터들의 집단으로 볼

수 있다. 프로그램 수행 중에 임시의 데이터를 저장하기 위한 영역과 입출력, 인

러텁트 등과 관련된 특정 목적의 용도로 사용되는 레지스터들의 영역인 특수 기

Page 33: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제1장 MCS-51 MCU 23

능 레지스터 영역으로 나누어 볼 수 있다. 전자는 통상 내부 데이터 메모리의 하

위 128B 영역을, 후자는 상위의 128B 영역을 의미한다. [그림 1.16]은 MCS-51

계열 MCU의 내부 데이터 메모리의 메모리 맵을 나타낸다.

그림 1.16 내부 메모리

하위의 128B 영역은 다시 레지스터 뱅크 영역, 비트 주소 가능 영역, 데이터 영

역으로 나누어 볼 수 있다. 이들 영역은 빈번히 혹은 고속으로 접근해야 하는 사

용자용 임시 기억 공간으로 사용된다. 또한 이 영역은 서브루틴을 호출할 때 반

환할 주소를 저장하는 등의 용도로 사용되는 스택 영역으로도 사용된다. 따라서

스택과 사용자용 임시 기억 공간을 위해 공유되기 때문에 주의하여 취급하여야

한다.

Page 34: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

24 MCS-51 마이크로컴퓨터

1.4.1 레지스터 뱅크 영역

MCS-51에는 [그림 1.17]과 같이 4조의 레지스터 뱅크(register bank)가 제공된

다. 하나의 레지스터 뱅크에는 1 바이트 길이의 범용 레지스터 8개로 구성되며,

특정 레지스터 뱅크의 최하위 바이트부터 R0, R1, ..., R7로 명명된다. 이들 레지

스터는 많은 명령에서 유용하게 사용되는 보조 레지스터로 이용된다. 또한 이들

레지스터는 값을 임시 저장하는 데에도 유용하게 사용된다.

그림 1.17 레지스터 뱅크 영역

레지스터 뱅크는 [표 1.5]와 같이 PSW의 RS1, RS0 비트의 설정으로 선택된다.

표 1.5 레지스터 뱅크 선택

RS1 RS0 뱅크 선택0 0 레지스터 뱅크 0(RB0, 00H~07H)0 1 레지스터 뱅크 1(RB1, 08H~0FH)1 0 레지스터 뱅크 2(RB2, 10H~17H)1 1 레지스터 뱅크 3(RB3, 18H~1FH)

리셋하였을 때, PSW의 RS1, RS0비트가 00으로 설정되므로 기본 선택되는 레지

스터 뱅크는 레지스터 뱅크 RB0이다. 또한 이 때의 스택 포인터(SP) 값은 07H

이다. 이것이 의미하는 바는 범용 레지스터로 레지스터 뱅크 RB0를, 즉, 00H번지

부터 07번지의 레지스터를 사용하며, 범용 레지스터 R3이라 함은 03H번지를 의

Page 35: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제1장 MCS-51 MCU 25

미하게 된다. 또한 SP의 기본 값으로 인해 08H번지부터 스택 영역으로 사용하겠

다는 의미가 된다. 즉, 스택은 주소 08H부터 시작하여 주소가 커지는 방향으로

확장되어 사용된다.

만일 어떠한 프로그램에서 레지스터 뱅크를 다른 것으로 선택하고자 하는 경우

두가지 점에서 주의를 기울여야 한다. 하나는 범용 레지스터로 접근하는 R0, R1,

..., R7의 사용과 스택 영역에 관한 것이다.

첫 번째로 범용 레지스터 사용에서의 예를 들면 다음과 같다. 다음 명령과 같이,

범용 레지스터 R4의 값을 어큐뮬레이터의 값과 덧셈하는 경우이다.

ADD A,R4 ; ACC <- ACC + R4

이 경우 R4의 주소와 관련된 것으로, R4는 레지스터 뱅크 RB0인 경우 주소가

04H이다. 따라서 위의 명령은 다음의 명령과 동일한 기능을 수행하는 것이다.

ADD A,04H ; ACC <- ACC + (04H)

즉, 내부 데이터 메모리의 04H 주소에 있는 값을 어큐뮬레이터의 값과 더하여

그 결과를 어큐뮬레이터에 저장하는 것이다. R4는 실제로 내부 램 04H 주소이기

때문에 위 명령은 앞에서 보았던 명령과 동일한 기능을 한다.

하지만 MCS-51 MCU는 4개의 레지스터 뱅크를 제공하며, 필요에 따라 사용자

프로그램에서 다른 레지스터 뱅크를 사용하도록 선택할 수 있다. 만일 다른 레지

스터 뱅크를 선택한 경우라면 R4는 더 이상 내부 데이터 메모리의 04H 주소를

지시하지 않는다. 예로 다음의 코드와 같이 레지스터 뱅크 RB3을 사용하도록 사

용자 프로그램에 설정되어 있다면, R4는 내부 데이터 메모리의 1CH 주소를 의미

한다.

MOV PSW,#18H ; RB3 사용, 00011000BADD A,R4 ; R4의 주소는 1CH

두 번째로 스택 영역과 관련한 것으로, 리셋시 SP는 07H를 설정된다고 이미 살

펴보았다. 이는 08H 주소부터 이후 영역을 스택 영역으로 사용한다는 의미이다.

Page 36: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

26 MCS-51 마이크로컴퓨터

하지만 프로그램에서 기본 설정된 레지스터 뱅크와는 다른 레지스터 뱅크를 선

택하는 경우는 SP도 주의를 기울여 재설정하여야 한다. 즉, 아래의 코드와 같이

레지스터 뱅크 RB1을 사용하기로 선택하였다면, 범용 레지스터 R0, R1, ..., R7으

로 내부 데이터 메모리의 08H 주소부터 0FH까지의 주소를 사용하므로, 기본 설

정된 스택 영역과 중복된다. 따라서 레지스터 뱅크 RB1 영역 이후로 스택 영역

이 위치하도록 SP를 재설정할 필요가 있다.

MOV PSW,#08H ; RB1 사용, 00001000BMOV SP,#0FH ; 10H부터 스택영역

레지스터 뱅크의 개념은 MCS-51 CPU에 상당한 유연성을 제공한다. 특히 인터

럽트 서비스 루틴이나 서브루틴을 사용할 때 그러하다. 메인 루틴에서의 레지스

터 뱅크와 인터럽트 서비스 루틴이나 일반 서브루틴 내에서 사용하는 레지스터

뱅크를 달리 선택함으로써, 범용 레지스터 R0, R1, ..., R7을 사용하는데 있어 중

복 사용으로 인한 데이터 손실의 우려를 덜 수 있다.

또한 레지스터 뱅크 내의 범용 레지스터 R0와 R1은 다음 명령과 같이 간접 주소

지정할 수 있는 레지스터로 유용하게 사용된다.

MOV A,@R0 ; ACC <- (R0)

또한, 프로그램에서 레지스터 뱅크 RB0만 사용한다면, 나머지 레지스터 뱅크들의

영역인 내부 데이터 메모리의 주소 08H부터 1FH까지는 프로그래머 자신의 용도

로 이용할 수 있다.

1.4.2 비트 주소 가능 영역

비트 주소 가능 영역은 실제로 새로운 형태의 메모리가 아니라 내부 데이터 메

모리의 일부분이다. 그러나 MCS-51 MCU는 이들 영역에 대해 비트 단위로 접

근하는 특수한 명령을 제공하기 때문에 구분되는 영역으로 생각하는 것이 유용

하다.

내부 데이터 메모리의 주소 20H부터 2FH까지의 16바이트 영역은 비트 주소 가

Page 37: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제1장 MCS-51 MCU 27

능 영역으로, 비트 단위의 주소가 부여되어 있어서 비트 명령을 통해 비트 단위

의 데이터 처리가 가능한 영역이다. 이들 16바이트 영역은 총 128비트로 구성되

되므로 비트 주소 영역은 128개 비트가 된다. 이 영역에 대한 비트 주소는 00H

부터 7FH까지 주소를 지정하도록 되어 있으며, [그림 1.18]은 비트 주소 영역의

각 비트에 할당된 비트 주소를 보여주고 있다.

그림 1.18 비트 주소 가능 영역의 비트 주소

프로그램에서 사용되는 00H부터 7FH까지의 주소가 바이트 주소인지 비트 주소

인지는 해당 명령이 바이트 처리 명령이냐, 비트 처리 명령이냐에 의해 결정된

다. 즉, 다음과 같이 피연산자로 20H라고 사용되었을 때 첫 번째 명령은 또다른

피연산자가 즉치 F0H이므로 바이트 단위 처리 명령으로, 바이트 단위 주소 20H

번지로 1바이트 데이터를 전송하는 것이다. 반면 두 번째 명령은 피연산자가 C

로, 즉, 캐리 플래그 비트에 대한 비트 단위 처리이므로, 비트 주소 20H의 1 비

트를 전송하는 명령이다.

MOV 20H,#0F0H ; 바이트 단위 처리 명령MOV C,20H ; 비트 단위 처리 명령

Page 38: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

28 MCS-51 마이크로컴퓨터

이러한 전송 명령 이외에, 비트 단위 처리 명령으로 해당 비트를 1로 설정하는

SETB와 0으로 설정하는 CLR 명령들이 제공된다. 예로 비트 주소 영역의 24H

비트 주소의 값을 1로 설정하고, 25H의 값을 0으로 설정하려면 다음 명령들을

수행하면 된다.

SETB 24H ; 비트 주소 24H <- 1CLR 25H ; 비트 주소 25H <- 0

이들 명령에 의해 영향 받는 비트는 내부 데이터 메모리의 바이트 주소 24H의

비트 인덱스 4와 5에 해당하는 비트이다.

앞의 명령 MOV 20H,#0F0H은 바이트 주소 20H에 값 F0H를 저장하는 것으로

효과면에서 비트 주소 04H부터 07H까지는 1로, 00H부터 03H까지는 0으로 설정

하는 것과 동일한 기능을 한다. 이를 비트 단위 명령으로 재 작성하면 다음의 8

개 명령들과 동일 기능을 하는 것이다.

CLR 00HCLR 01HCLR 02HCLR 03HSETB 04HSETB 05HSETB 06HSETB 07H

프로그램에서 비트 주소 가능 영역의 비트 주소를 표현하는 방법은 지금까지 언

급되어 왔듯이 해당 비트에 부여된 비트 주소를 사용하는 방법과 바이트 주소와

비트 인덱스를 도트(.)로 결합하여 표현하는 방법이 있다. 즉, 다음 명령에서 보

이듯이 바이트 주소 20H번지의 비트 인덱스 0에 해당하는 비트는 20H.0로 표현

할 수 있다.

MOV C,20H.0 ; 바이트 주소 20H의 인덱스 0의 비트

프로그램에서 비트 영역에 대한 접근이 요구된다면, 앞의 레지스터 뱅크 영역 절

에서 언급한 것과 유사하게 비트 주소 영역을 보호하기 위해 SP를 적절히 설정

Page 39: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제1장 MCS-51 MCU 29

하여 비트 주소 영역과 스택 영역이 중복되지 않도록 해야 한다. 즉, 범용 레지

스터뿐만 아니라 비트 주소 영역도 사용할 것이라면, 다음과 같은 명령을 사용하

여 스택 영역이 이들 영역과 중첩되지 않도록 해야 한다. 이 명령은 30H 번지부

터 스택 영역으로 사용하겠다는 의미이다.

MOV SP,#2FH

만일 사용자 프로그램이 비트 주소 영역을 사용하지 않는다면, 이 영역은 일반

목적의 데이터 영역 혹은 스택 영역으로 사용할 수 있다.

1.4.3 데이터 영역

내부 데이터 메모리 하위 128바이트 중 레지스터 뱅크 영역, 비트 주소 가능 영

역을 제외한 나머지 영역은 데이터 영역으로, 사용자 프로그램에서 다양한 목적

으로 데이터를 임시 기억하는 용도로 사용할 수 있다. 경우에 따라서 스택 영역

으로 사용될 수도 있다. 물론 레지스터 뱅크 영역, 비트 주소 가능 영역도 그 고

유의 목적으로 사용되지 않을 경우 데이터 영역에 포함된다.

MCS-51 MCU중 xx52형태의 모델은 상위의 128 바이트의 데이터 영역을 추가

로 제공한다. 이들 모델에서 상위 128 바이트의 데이터 영역을 접근하기 위해서

는 간접 주소 지정 방식으로만 접근해야 한다. 이들 모델에서 데이터 영역 80H

주소에 F0H 값을 저장하려면 다음과 같은 명령들을 사용해야 한다.

MOV R1,#80HMOV @R1,#0F0H

만일 다음의 명령과 같이 직접 주소 지정 방식으로 80H 번지를 접근하게 되면,

이는 특수 기능 레지스터 영역을 접근하는 것이 된다. 즉 포트 P0에 F0H를 출력

하는 것이다.

MOV 80H,#0F0H ; P0 <- F0H

반면, 하위 128 바이트에 대해서는 위에서 살펴본 간접 주소 지정뿐만 아니라,

Page 40: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

30 MCS-51 마이크로컴퓨터

직접 주소 지정 방식 둘 다 사용하여 접근할 수 있다.

1.4.4 특수 기능 레지스터 영역

특수 기능 레지스터(special function register) 영역은 MCS-51 MCU의 특수한

기능을 제어하는 메모리 영역이다. 즉, 어떤 SFR는 CPU의 32개의 입출력 핀에

접근하는 것을 허용하고, 어떤 SFR는 프로그램이 시리얼 포트로 기록하거나 읽

어 들이는 것을 허용하며, 또 다른 SFR는 사용자가 외부 인터럽트, 타이머/카운

터, 시리얼 통신 등의 인터럽트와 관련한 환경을 설정하는데 이용되기도 한다.

[그림 1.19]는 MCS-51 MCU에서 제공되는 특수 기능 레지스터 영역의 SFR 이

름과 그들의 주소를 나타낸다.

그림 1.19 특수 기능 레지스터 영역

Page 41: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제1장 MCS-51 MCU 31

비록 80H부터 FFH까지의 주소 범위는 128개의 가능한 접근 가능한 특수 기능

레지스터 영역의 주소들이지만 MCS-51 MCU에서는 단지 21개의 SFR만이 정의

되어 있다. 이 영역에서 SFR 이름으로 정의되지 않은 주소에 대해서 읽거나 기

록하는 것은 무의미하다. 즉, 특수 기능 레지스터 영역의 미 정의된 주소를 일반

목적의 데이터 영역으로 사용하는 것은 허용되지 않는다.

특수 기능 레지스터 영역을 접근하기 위한 80H번지부터 FFH번지까지의 접근은

직접 주소 지정 방식으로만 접근하도록 설계되었다. 예로 시리얼 포트에 어떤 값

을 보내려면 시리얼 버퍼인 SBUF에 해당 데이터 값을 전달하면 된다. 즉, 다음

명령과 같이 해당 데이터 값 0FH을 주소가 99H인 SBUF라 불리는 SFR에 저장

하면 된다.

MOV 99H,#0FH ; 직접 주소

혹은, 다음 명령과 같이 해당 특수 기능 레지스터 이름을 사용할 수도 있다.

MOV SBUF,#0FH

하지만 다음과 같이 간접 주소 지정 방식으로 표현하는 경우는, xx52 계열의

MCU에서만 의미가 있으며, 이 경우에 한해 상위 128 바이트에 해당하는 데이터

영역의 99H 번지에 0FH를 저장함을 유의할 필요가 있다.

MOV R0,#99HMOV @R0,#0FH ; 간접 주소

특히, [그림 1.19]에서 +0의 열에 존재하는 SFR는 비트 단위 접근이 가능한 특수

기능 레지스터들로 주소의 최하위 3비트가 000B이다. 특수 기능 레지스터 영역

내에서 비트 주소로 접근 가능한 주소 공간은 80H부터 FFH까지다. 비트 주소

00H부터 7FH까지는 앞에서 살펴보았듯이 비트 주소 가능 영역에 할당된다. [그

림 1.20]은 이러한 SFR들에 부여된 비트 주소를 보여준다.

Page 42: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

32 MCS-51 마이크로컴퓨터

7 6 5 4 3 2 1 080H P0 87H 86H 85H 84H 83H 82H 81H 80H88H TCON 8FH 8EH 8DH 8CH 8BH 8AH 89H 88H90H P1 97H 96H 95H 94H 93H 92H 91H 90H98H SCON 9FH 9EH 9DH 9CH 9BH 9AH 99H 98HA0H P2 A7H A6H A5H A4H A3H A2H A1H A0HA8H IE AFH AEH ADH ACH ABH AAH A9H A8HB0H P3 B7H B6H B5H B4H B3H B2H B1H B0HB8H IP BFH BEH BDH BCH BBH BAH B9H B8HC0H C7H C6H C5H C4H C3H C2H C1H C0HC8H CFH CEH CDH CCH CBH CAH C9H C8HD0H PSW D7H D6H D5H D4H D3H D2H D1H D0HD8H DFH DEH DDH DCH DBH DAH D9H D8HE0H ACC E7H E6H E5H E4H E3H E2H E1H E0HE8H EFH EEH EDH ECH EBH EAH E9H E8HF0H B F7H F6H F5H F4H F3H F2H F1H F0HF8H FFH FEH FDH FCH FBH FAH F9H F8H

그림 1.20 비트 주소 가능한 SFR의 비트 주소

비트 주소 가능 영역의 비트 주소 00H부터 7FH는 사용자의 프로그램에서 사용

자가 그 기능을 정의하여 이용하게 된다. 그러나 80H부터 FFH까지의 비트 주소

는 몇몇 특수 기능 레지스터를 비트 단위로 접근하는데 이용된다. 예로 포트 P0

의 비트 인덱스 0인 핀에 High 신호를 출력하려면 다음의 명령들 중 하나를 사

용하면 된다. 이들 명령을 통해서 특수 기능 레지스터 영역에서의 비트 단위 접

근 표현 방법도 살펴 볼 수 있다.

MOV P0,#01H ; 바이트 단위 명령SETB P0.0 ; SFR명과 비트 인덱스SETB 80H.0 ; 바이트 단위 직접 주소와 비트 인덱스 SETB 80H ; 비트 주소

위의 명령들 중 첫 번째 MOV 명령은 기타의 다른 비트들에 0의 신호를 출력하

게 된다. 하지만 나머지 세 개의 명령은 비트 인덱스 0만 1로 영향을 주는 반면,

Page 43: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제1장 MCS-51 MCU 33

다른 비트들에는 영향을 주지 않는다.

1.4.5 각 특수 기능 레지스터의 기능

아래에서 각 SFR의 개괄적인 기능에 대해 살펴보며, 보다 구체적인 사항들은 해

당 SFR의 취급과 관련된 절에서 살펴보도록 한다.

P0(Port 0, 80H, Bit-Addressable)

이는 입출력 포트 0이다. 이 SFR의 각 비트는 마이크로프로세서에서 하나의 핀

에 대응된다. 예로 P0의 최하위 비트는 P0.0와 최상위 비트는 P0.7과 대응된다.

이 SFR의 특정 비트에 1의 값을 기록하는 것은 대응하는 입출력 핀에 High 신

호를, 0을 기록하는 것은 Low 신호를 보내는 것과 마찬가지이다.

MCS-51 MCU는 4개의 입출력 포트(P0, P1, P2, P3)를 제공하지만, 사용자의 하

드웨어가 외부 데이터 메모리나 외부 프로그램 메모리를 사용한다면, P0 혹은

P2는 사용할 수 없을 수도 있다. 이는 포트 P0와 P2를 외부 메모리의 주소 신호

로 이용하기 때문이다. 따라서 만일 외부 데이터 메모리 혹은 외부 프로그램 메

모리를 사용한다면, 단지 P1과 P3 포트만이 의도된 목적으로 이용될 수 있다.

SP(Stack Pointer, 81H)

SP는 스택 영역을 지시하는 스택 포인터다. 리셋 후 SP은 07H로 초기화되며, 스

택 영역은 08H부터 시작하여 내부 램의 주소 증가 방향으로 확장된다. 이 SFR

는 스택에 동작을 가하는 PUSH, POP 명령의 실행에 의해 그 값이 변경된다. 또

한 서브루틴의 호출 및 반환, 인터럽트 서비스 루틴의 실행 및 반환과 관련한

LCALL, RET, RETI 등과 같은 명령의 실행으로 그 값이 변경된다. 스택에 값을

저장하는 PUSH 명령의 경우, SP값을 하나 증가시키고 해당 위치에 값을 저장한

다. POP 명령의 경우 우선 현재 SP값의 주소에 있는 값을 읽어내고, SP 값을

하나 감소한다.

또한, 응용 프로그램에서 레지스터 뱅크를 변경하거나, 비트 주소 가능 영역을

사용할 필요가 있을 경우는 응용 프로그램의 시작부분에서 이러한 영역과 중첩

되지 않도록 SP의 값을 적절히 초기화할 필요가 있다. 일반적으로 이러한 영역

을 피하여 SP의 값을 2FH로 설정하는 것이 바람직하다.

Page 44: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

34 MCS-51 마이크로컴퓨터

DPL/DPH(Data Pointer Low/High, 82H/83H)

DPH와 DPL은 데이터 포인터(data pointer)라 명명된 16비트 값을 표현하기 위

해 함께 사용된다. 이 데이터 포인터는 외부 램과 관련된 동작에서 이용되며, 경

우에 따라서는 프로그램 메모리와 관련된 명령에서도 이용된다. DPTR은 비부호

2바이트 정수이기 때문에 0000H부터 FFFFH까지의 값을 표현할 수 있다.

DPTR은 실제로 DPH와 DPL이 결합되어 16비트 값을 표현한다. 실제로 대부분

의 경우 DPTR을 다룰 때 한 번에 한 바이트씩 취급해야 한다. 예로 DPTR을

스택에 저장하려면 우선 DPL을 우선 저장하고 다음에 DPH를 저장해야 한다.

단순히 DPTR을 스택에 저장할 수 없다. 아울러 게다가 DPTR을 증가시키는 명

령을 실행할 때 두 바이트는 마치 16비트 값처럼 동작한다. 그러나 DPTR을 감

소시키는 명령은 존재하지 않기 때문에 DPTR의 값을 감소시키려면 바이트 단위

로 취급하여 DPL을 감소함으로써 그 기능을 구현할 수 있다.

PCON(Power Control, 87H)

PCON은 CPU의 파워 제어 모드를 통제하는데 이용한다. 8051의 특정 동작 모드

는 보다 적은 파워를 요구하는 휴면(sleep) 모드에서 8051이 동작하는 것을 허용

한다. 이러한 동작 모드는 PCON에 의해 통제된다. 게다가 PCON의 최상위 비트

는 시리얼 포트의 유효 보 레이트를 두 배로 하는데 이용되기도 한다.

TCON(Timer Control, 88H, Bit-Addressable)

TCON은 두 개의 타이머/카운터의 동작 방식 설정에 이용한다. 이 SFR는 두 타

이머의 각각이 수행되도록 혹은 정지하도록 통제하기도 하며, 각 타이머에서 오

버플로가 발생되었는지를 나타내는 플래그 비트를 포함한다. 게다가 몇몇 타이머

와 무관한 비트들이 포함되어 있다. 이들 비트는 외부 인터럽트의 트리거 모드를

설정하고 외부 인터럽트가 발생할 때 1로 설정되는 외부 인터럽트 플래그를 포

함한다.

TMOD(Timer Mode, 89H)

TMOD는 두 타이머/카운터 각각의 동작 모드를 설정하는데 이용된다. 이 SFR를

이용하여 사용자 프로그램은 13비트, 16비트 혹은 8비트 자동 재적재 타이머/카

운터가 되도록 할 수 있다. 게다가 내부 클록을 계수하거나 외부 핀에 들어오는

사건을 계수하도록 설정할 수 있다.

Page 45: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제1장 MCS-51 MCU 35

TL0/TH0(Timer 0 Low/High, 8AH/8CH)

이 두 SFR은 함께 사용되어 타이머/카운터 0를 표현한다. 이들의 정확한 동작은

TMOD에서 환경 설정이 어떻게 되었는가에 따라 다르다. 그러나 이들 타이머/카

운터는 항상 계수를 행한다. 계수하는 방법과 언제 계수할 것인가는 프로그래머

가 통제할 수 있다.

TL1/TH1(Timer 1 Low/High, 8BH/8DH)

이 두 SFR은 함께 사용되어 타이머/카운터 1를 표현한다. 이들의 정확한 동작은

TMOD에서 환경 설정이 어떻게 되었는가에 따라 다르다. 그러나 이들 타이머/카

운터는 항상 계수를 행한다. 계수 방법과 언제 계수할 것인가는 통제 가능하다.

P1(Port 1, 90H, Bit-Addressable)

P1은 입출력 포트 1이며, 각 비트는 마이크로프로세서에서 하나의 핀에 대응된

다. 예로 P1의 최하위 비트는 P1.0와 최상위 비트는 P1.7과 대응된다. 이 SFR의

한 비트에 1의 값을 기록하는 것은 대응하는 입출력 핀에 High 신호를, 0을 기

록하는 것은 Low 신호를 보내는 것과 마찬가지이다.

SCON(Serial Control, 98H, Bit-Addressable)

SCON은 시리얼 포트의 동작에 대한 환경 설정에 이용된다. 이 SFR는 시리얼

포트의 보 레이트(baud rate) 설정과 관련된 비트, 시리얼 포트가 데이터를 수신

하도록 활성화되었는지를 나타내는 비트와 데이터가 성공적으로 전송 혹은 수신

되었을 때 1로 설정되는 플래그들을 포함하고 있다.

일반적으로 시리얼 포트를 이용하기 위해서는 SCON, TCON, TMOD를 초기화

하는 과정이 요구된다. 이는 SCON이 시리얼 포트를 통제하기 때문이다. 그러나

대부분의 경우에서 프로그램은 시리얼 포트의 보 레이트를 설정하기 위해 타이

머의 하나를 이용할 것이다. 이 경우에 TCON과 TMOD를 초기화함으로써 타이

머/카운터 1을 적절히 설정할 필요가 있다.

SBUF(Serial Buffer, 99H)

SBUF는 시리얼 포트를 통해 데이터를 전송하고 수신하는데 이용된다. SBUF에

기록되는 값은 시리얼 포트의 TXD 핀으로 전송된다. 마찬가지로 시리얼 포트의

RXD 핀으로 수신된 값은 SBUF를 통해 사용자 프로그램에 전달된다. 즉, SBUF

는 기록될 때는 출력 포트 역할을 하며 읽어들 일 때는 입력 포트 역할을 한다.

Page 46: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

36 MCS-51 마이크로컴퓨터

P2(Port 2, A0H, Bit-Addressable)

P2는 입출력 포트 2로, 각 비트는 마이크로프로세서에서 하나의 핀에 대응된다.

예로 P2의 최하위 비트는 P2.0와 최상위 비트는 P2.7과 대응된다. 이 SFR의 특

정 비트에 1을 기록하는 것은 대응하는 입출력 핀에 High 신호를, 0을 기록하는

것은 Low 신호를 보내는 것과 마찬가지이다.

IE(Interrupt Enable, A8H)

IE는 특정 인터럽트를 허용하거나 거부하는데 이용된다. IE의 하위 비트들은 특

정 인터럽트를 허용하거나 불허하는데 이용되는 반면, 최상위 비트는 모든 인터

럽트를 허용할지의 여부를 나타내는데 이용된다. 따라서 IE의 최상위 비트가 0이

면 각각의 인터럽트가 허용된 것에 상관없이 모든 인터럽트는 허용되지 않는다.

P3(Port 3, B0H, Bit-Addressable)

P3은 입출력 포트 3으로, 각 비트는 마이크로프로세서에서 하나의 핀에 대응된

다. 예로 P3의 최하위 비트는 P3.0와 최상위 비트는 P3.7과 대응된다. 이 SFR의

특정 비트에 1을 기록하는 것은 대응하는 입출력 핀에 High 신호를, 0을 기록하

는 것은 Low 신호를 보내는 것과 마찬가지이다.

IP(Interrupt Priority, B8H, Bit-Addressable)

IP는 각 인터럽트의 상대적인 우선순위를 명시하는데 이용된다. MCS-51 MCU

에서 인터럽트는 하위(0) 혹은 상위(1)의 두 레벨의 우선순위를 가질 수 있다. 인

터럽트는 보다 하위의 우선순위를 갖는 인터럽트만 개입할 수 있다. 예로 만일

시리얼 인터럽트를 제외한 모든 인터럽트를 하위의 우선순위를 가지도록 환경

설정하였다면, 다른 인터럽트가 현재 수행중일지라도 시리얼 인터럽트는 항상 시

스템을 가로챌 수 있다. 그러나 시리얼 인터럽트가 수행중이라면 다른 어떠한 인

터럽트도 시리얼 인터럽트 루틴을 가로채지 못한다. 이는 시리얼 인터럽트 루틴

은 최상위의 우선순위로 설정되었기 때문이다.

PSW(Program Status Word, D0H, Bit-Addressable)

PSW는 명령이 수행된 후에 그 결과에 따라 그 상태를 반영하는 중요한 비트들

을 저장하는데 이용된다. PSW는 캐리, 보조 캐리, 오버플로, 그리고 패리티 플래

그를 포함한다. 또한 PSW는 현재 선택된 레지스터 뱅크가 무엇인지를 나타내는

데 이용되는 레지스터 뱅크 선택 플래그 비트를 가진다.

Page 47: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제1장 MCS-51 MCU 37

만일 인터럽트 서비스 루틴을 작성한다면 PSW를 스택에 저장하였다가 인터럽트

가 종료되면 복구하는 것이 바람직하다. 대부분의 MCS-51 연산 명령들은 명령

실행 결과를 반영하여 PSW의 비트들을 변경한다. 만일 인터럽트 루틴에 진입할

때와 동일한 PSW를 가지고 종료하는 것을 보장하지 않는다면 사용자 프로그램

은 예기치 않은 동작을 유발할 수 있다. 그리고 이는 그 행위가 옳지 않기 때문

에 디버그하기도 쉽지 않다.

ACC(Accumulator, E0H, Bit-Addressable)

어큐뮬레이터는 많은 명령에서 사용되기 때문에 MCS-51 MCU에서 가장 많이

사용되는 SFR의 하나이다. A의 주소는 E0H에 위치하기 때문에 MOV A,#20H는

실제로 MOV E0H,#20H와 동일하다. 그러나 후자의 명령은 3 바이트를 요구하는

반면 전자의 명령은 단지 2 바이트만을 요구하기 때문에 전자의 방법을 이용하

는 것이 바람직하다.

B(B Register, F0H, Bit-Addressable)

B 레지스터는 곱셈과 나눗셈 연산을 행하는 두 명령 MUL, DIV에서 이용된다.

또한 B 레지스터는 임시의 값을 저장하는 보조 레지스터로 프로그래머에 의해

보편적으로 이용된다.

1.5 MCU 타이밍도

본 절에서는 MCS-51에서의 클록 생성 회로, 명령 사이클, 메모리 사이클에 관에

살펴본다.

1.5.1 클록 생성 회로

모든 MCS-51 MCU는 클록 신호로 사용할 수 있는 내장 오실레이터를 가지고

있다. 내장 오실레이터를 사용하려면 [그림 1.21]과 같이 CPU의 XTAL1과

XTAL2 핀 사이에 수정 발진자 혹은 세라믹 발진자를 연결하고 커패시터를 그

라운드에 연결한다. 발진기는 내부에서 1/12로 분주되어 시스템 클록으로 사용된

다. 통상 수정 발진자를 사용하는 경우 C1, C2의 용량은 30pF정도를 사용한다.

Page 48: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

38 MCS-51 마이크로컴퓨터

MCS-51HMOS

OR CHMOS

XTAL2

XTAL1VSS

C2

C1

OUATRZ CRYSTALOR CERAMICRESONATOR

그림 1.21 내장 오실레이터를 사용한 클록 생성

외부 클록을 사용할 경우는 [그림 1.22]와 같은 여러 가지 방법에 의해 구현 될

수 있다. 이러한 경우 내장 발진기를 동작시키면 내부 클록의 신호는 외부 클록

신호 주파수의 1/2로 동작한다.

(a) HMOS 혹은 CHMOS (b) HMOS 만 (c) CHMOS 만

그림 1.22 외부 클록을 활용한 클록 생성

1.5.2 머신 사이클(machine cycle)

[그림 1.23]의 머신 사이클 타이밍도는 MCS-51 MCU의 발진자 클록, 머신 사이

클(T), 스테이트(S), 페이즈(P)간의 상호관계를 보여준다. 하나의 머신 사이클인

Page 49: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제1장 MCS-51 MCU 39

T는 S1,...,S6까지의 6개 스테이트로 구성되며, 각각의 스테이트는 P1, P2의 2개

페이즈로 구성된다. 또한 각 페이즈는 1개 발진 주기를 의미한다. 신호는

매 머신 사이클마다 S1P2에서 S2P1까지와 S4P2에서 S5P1까지 두 차례 활성화

되며, 이때 명령어 페치가 이루어진다.

그림 1.23 MCS-51 MCU의 머신 사이클

1.5.3 명령어 페치 사이클

[그림 1.24]에서 MCS-51 CPU의 명령어 페치(fetch) 사이클 타이밍도를 보여준

다. 여기서 신호는 외부 메모리의 주소를 지정할 때, 주소의 하위 바이트

(PCL)가 포트 P0를 통해 인가되고 있음을 나타내며, 이 신호는 포트 P0

를 통하여 데이터가 전달될 때 주소의 하위 바이트를 래치(latch)하는데 이용한

다.

[그림 1.24] (A)는 1바이트, 1T인 명령어의 페치 사이클을 보여주며, 이러한 명령

어의 예로는 INC A가 있다. 즉 INC A 명령어는 1 바이트로 구성되며 실행에 1

머신 사이클을 요구한다. 이러한 경우 S1P2에서 OP 코드를 페치하며, S4P2에서

페치된 OP 코드는 다음 명령어의 OP 코드이므로 무시하며, 이때 PC 값은 변하

지 않는다. 무시된 다음 명령어는 다음 머신 사이클에서 다시 페치된다.

[그림 1.24] (B)는 2바이트, 1T인 명령어의 페치 사이클을 보여주며, 이러한 명령

어의 예로는 ADD A,#10H가 있다. 즉, ADD A,#10H 명령의 경우 2 바이트 명령

어이며, 실행할 때 2개 머신 사이클을 요구한다. 이 경우 S4P2에서 피연산자를

읽어 들여 처리하게 되며 이 때 PC 값은 증가한다.

Page 50: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

40 MCS-51 마이크로컴퓨터

그림 1.24 MCS-51 명령어 페치 사이클

[그림 1.24] (C)는 1바이트, 2T인 명령어의 페치 사이클을 보여주며, 이러한 명령

어의 예로는 INC DPTR가 있다. 즉, INC DPTR 명령의 경우 1바이트 명령이면

서 실행할 때 2개 머신 사이클을 요구한다. 이 경우 첫 번째 머신 사이클의

S4P2와 두 번째 머신 사이클의 S1P2, S4P2에서 읽어 들인 데이터는 불필요하므

로 무시하고, 이 때 PC 값은 변하지 않는다.

[그림 1.24] (D)는 1바이트, 2T인 명령어의 특수한 경우인 MOVX 명령어에 대한

페치 사이클을 보여준다. 이 명령어의 두 번째 머신 사이클의 S1P2에서 신

호는 활성화되지 않는다. 대신 신호 혹은 이 발생한다. 첫 번째 머신 사

Page 51: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제1장 MCS-51 MCU 41

이클의 S4P2와 두 번째 머신 사이클의 S4P2에 읽혀진 데이터는 불필요한 것이

므로 무시하며, 이 때 PC 값은 변하지 않는다.

1.5.4 외부 프로그램 메모리 판독 사이클

외부 프로그램 메모리와는 포트 P2를 통해 주소의 상위 바이트가, 포트 P0를 통

해 주소의 하위 바이트 및 판독된 데이터 전달에 이용되도록 연결된다. 또한 신호는 프로그램 메모리의 단자와 연결된다. 신호가 Low로

되어 활성화된 동안 포트 P0를 통해 주소의 하위 바이트가 출력되는 반면,

신호가 High가 되어 비 활성화된 동안은 해당 주소의 데이터를 MCU로 전달하

기 위해 사용된다. 포트 P0가 데이터 전달통로로 사용되는 동안에 직전에 인가되

었던 주소의 하위 바이트 값은 래치에 의해 유지되어야 한다.

그림 1.25 외부 프로그램 메모리 판독 사이클

외부 프로그램 메모리의 판독은 MOVC 명령에 의해 실행되며, [그림 1.25]의 판

독 타이밍도와 갈이 신호와 함께 MCU로부터 포트 P2와 포트 P0를 통해

주소 값이 출력된다. 이 때, 포트 P0를 통해 출력된 주소의 하위 바이트(A7..0)는

신호가 Low로 되어 비활성화된 후에도 래치에 의해 하드웨어적으로 유지

된다. 신호가 Low가 된 직후 신호가 Low로 변경되어 활성화되면,

Page 52: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

42 MCS-51 마이크로컴퓨터

외부 프로그램 메모리의 단자가 인에이블되어 해당 주소의 데이터가 포트

P0를 통해 MCU로 전달된다.

1.5.5 외부 데이터 메모리 판독 사이클

외부 데이터 메모리는 판독 및 기록이 가능하므로 이를 위한 제어신호 와이 MCU의 포트 P3으로부터 출력된다. MCU의 신호 단자는 외부 데이

터 메모리의 단자와 연결되고 신호 단자는 외부 데이터 메모리의

단자와 연결된다.

외부 데이터 메모리의 판독은 MOVX 명령에 의해 이루어지며, [그림 1.26]의 판

독 타이밍도와 같이 신호와 함께 MCU로부터 포트 P2와 P0를 통해 주소

값이 인가된다. 이때 신호는 하나의 머신 사이클 동안 한번만 출력되며, 신호가 Low로 되어 활성화된 후, 외부 데이터 메모리 내 해당 주소의 데이

터가 포트 P0를 통해 MCU에 전달된다.

그림 1.26 외부 데이터 메모리 판독 사이클

Page 53: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제1장 MCS-51 MCU 43

1.5.6 외부 데이터 메모리 기록 사이클

외부 데이터 메모리 기록은 판독할 때와 마찬가지로 MOVX 명령에 의해 이루어

진다. 외부 데이터 메모리에 데이터를 기록하는 타이밍도는 [그림 1.27]에서 보인

다. 포트 P2와 P0를 통해 주소 값이 인가된 후, 신호를 Low로 하여 주소

래치를 활성화한다. 이후 외부 데이터 메모리의 해당 주소에 기록할 데이터를 포

트 P0에 인가한 후, 신호를 Low로 하여 활성화 시켜주면 외부 데이터 메모

리에 기록된다.

그림 1.27 외부 데이터 메모리 기록 사이클

Page 54: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

44 MCS-51 마이크로컴퓨터

Page 55: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제2장 MCS-51 명령어 45

제2장 MCS-51 명령어

본 장에서는 MCS-51 MCU에서 제공하는 명령어들에 대해 살펴본다. 우선 명령

어의 형식과 주소 지정 방식을 알아보고, 제공되는 각 명령어를 기능 유형별로

나누어 구체적으로 살펴본다. 마지막 절에는 각 명령어를 유형별로 분류하여 기

능 등을 요약하여 정리한다.

2.1 주소 지정 방식

주소 지정(addressing) 방식은 명령어의 실행에서 사용되는 데이터를 접근하는

방법을 표현하는 것이다. 우선 MCS-51 MCU에서 제공하는 명령의 형식을 살펴

본 후, 주소 지정 방식들을 살펴본다.

2.1.1 명령어 형식

명령어는 그 형식에 있어서 1바이트, 2바이트, 3바이트 명령의 3가지가 지원되는

데, 구체적인 사례들을 들어 살펴본다.

1바이트 명령

1바이트 명령에는 레지스터 주소 지정 방식 혹은 간접 주소 지정 방식 등을 지

원하는 다음과 같은 명령들이 있다.

ANL A,Rn7 6 5 4 3 2 1 0

0 1 0 1 1 r r r

ADD A,@Ri7 6 5 4 3 2 1 0

0 0 1 0 0 1 1 i

2바이트 명령

2바이트 명령에는 직접 주소지정 방식 혹은 즉치 주소 지정 방식 등을 지원하는

Page 56: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

46 MCS-51 마이크로컴퓨터

다음과 같은 명령들이 있다.

ANL A,direct7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

0 1 0 1 0 1 0 1 direct address

ANL A,#data7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

0 1 0 1 0 1 0 0 immediate data

3바이트 명령

3바이트 명령에는 직접 주소 지정 방식과 즉치 주소 지정 방식을 함께 사용하거

나, 즉치 주소 지정 방식과 상대 주소 지정 방식 등을 지원하는 다음과 같은 명

령들이 있다.

ANL direct,#data7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

0 1 0 1 0 0 1 1 direct address immediate data

CJNE Rn,#data,rel7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

1 0 1 1 1 r r r immediate data relative address

2.1.2 주소 지정 방식

MCS-51 MCU는 대략 6가지 유형의 주소 지정 방식을 제공한다.

즉치 주소 지정 방식

즉치 주소 지정(immediate addressing) 방식은 레지스터 혹은 내부 램에 설정할

즉치 데이터가 명령어 내에 포함되어 기술되는 방식이다.

즉치 주소 지정 방식을 사용한 명령어의 예들은 다음과 같다. 아래의 예에서 보

듯이 소스 프로그램에서 즉치 데이터의 표현은 #을 앞에 덧붙여 표기한다. 또한

표현하는 데이터는 진법에 따라, 이진수인 경우 B(binary)를, 8진수의 경우

O(octal)를, 10진수의 경우 D(decimal) 혹은 표시없이, 16진수의 경우

H(hexadecimal)를 즉치 데이터 후위에 덧붙여 표기한다. 아울러 16진수의 즉치

Page 57: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제2장 MCS-51 명령어 47

데이터를 표현하는데 있어서 즉치의 첫 자리가 A부터 F까지로 시작될 때는 그

앞에 0을 덧붙인다.

MOV A,#20H ; A <- 20HMOV A,#11111111B ; A <- FFHMOV A,#377O ; A <- FFHMOV A,#255 ; A <- FFHMOV A,#255D ; A <- FFHMOV A,#0FFH ; A <- FFH

또한 즉치 데이터 표현에 있어 어셈블러에서의 지원여부에 따라 다음 명령과 같

은 수식의 표현도 가능하다.

MOV A,#(10H+10H) ; A <- 20H

즉치 주소지정 방식은 적재되어야 할 값이 명령에 포함되기 때문에 데이터 참조

를 위한 추가의 처리가 없으므로 실행 면에서 빠르다. 그러나 적재될 값이 컴파

일할 때 고정되기 때문에 유연성은 크지 않다.

레지스터 주소 지정 방식

레지스터 주소 지정(register addressing) 방식은 레지스터 뱅크 내의 R0,...,R7을

사용하여 데이터를 주소 지정하는 방식이다. 물론 MCS-51 MCU에서 4조의 레

지스터 뱅크를 제공하지만 프로그램 실행의 특정 시점에서는 오직 하나의 레지

스터 뱅크만을 사용할 수 있다.

다음의 명령어들은 레지스터 주소 지정 방식의 예를 보인다.

MOV R1,A ; R1 <- AMOV A,R7 ; A <- R7

주의할 것은 다음과 같은 동일 레지스터 뱅크내의 레지스터 사이의 전송 명령은

지원되지 않는다는 것이다. 이와 같은 경우는 직접 주소 지정 방식을 사용하여야

한다.

Page 58: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

48 MCS-51 마이크로컴퓨터

MOV R1,R5 ; 제공되지 않음

사용되는 레지스터는 명령어 내에서 3비트로 표현되기 때문에 명령어의 코드 길

이를 줄이는 장점을 제공한다.

직접 주소 지정 방식

직접 주소 지정(direct addressing) 방식은 내부 데이터 메모리의 하위 128B 영역

과 SFR 영역에 대해 8비트의 직접 주소를 사용하는 방식이다. 이 방식은 MCU

내의 데이터 메모리에 있는 데이터를 참조하기 때문에 비교적 고속의 접근 방법

이다. 즉치 데이터와 구별되게 직접 주소를 표현할 때는 #을 붙이지 않는다. 직

접 주소 지정 방식의 명령어 사례는 다음과 같다.

MOV A,30H ; A <- (30H)MOV 70H,30H ; (70H) <- (30H)MOV 30H,#40H ; (30H) <- 40H

또한 다음 명령어와 같이 SFR 영역의 임의 레지스터를 지칭하는 이름을 사용하

는 것은 대응하는 직접 주소 지정과 동일한 기능을 한다.

MOV P1,#0FEH ; (90H) <- FEH

특히, 레지스터 주소 지정 방식에서 MOV R1,R5와 같은 명령은 지원되지 않는

다. 이 경우 다음과 같이 직접 주소 지정 방식을 사용하여야 한다. 주의할 것은

레지스터 뱅크가 무엇이 선택되었느냐에 따라 직접 주소가 다를 수 있다는 것이

다.

MOV 01H,05H ; RB0인 경우, (R1) <- (R5)MOV 09H,0DH ; RB1인 경우, (R1) <- (R5)

아울러, 8052와 같이 내부 램이 256B가 제공되는 MCU에서 80H부터 FFH까지의

직접 주소를 사용하면 SFR 영역을 참조하게 되므로, 상위 128B 영역은 직접 주

소 지정 방식을 이용하여 접근할 수 없다. 따라서 이와 같은 상위 128B 데이터

메모리 영역을 접근할 때는 간접 주소 지정 방식을 사용해야 한다.

Page 59: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제2장 MCS-51 명령어 49

내부 간접 주소 지정 방식

내부 간접 주소 지정(internal indirect addressing) 방식은 각 레지스터 뱅크 내

의 R0와 R1 레지스터를 이용하여 내부 램의 특정 주소를 지시하도록 하는 주소

지정 방식이다. 이러한 주소 지정 방식은 8051에서의 하위 128바이트, 혹은 8052

에서 제공하는 256바이트의 내부 데이터 메모리를 간접적으로 주소 지정하여 접

근하는데 사용된다. SFR 영역은 간접 주소 지정 방식으로 접근할 수 없다.

간접 주소 지정 방식에서는 사용되는 레지스터 앞에 @를 덧붙여 다음과 같이 표

현한다. 이 명령어에서 R0의 값이 70H가 저장되어 있다면, ACC의 내용을 내부

램의 70H번지에 전송하라는 의미이다.

MOV @R0,A ; (70H) <- ACC

만일 다음과 같이 간접 주소 지정된 데이터를 동일 레지스터 뱅크 내의 다른 레

지스터로 전송하는 경우에는 해당 레지스터에 대한 직접 주소를 사용하여야 한

다.

MOV 07H,@R1 ; R7 <- ((R1))

또한, 다음과 같이 두 피연산자를 모두 간접 주소 지정하는 명령어는 제공되지

않음을 유의한다.

MOV @R1,@R0 ; 제공되지 않음

외부 간접 주소 지정 방식

외부 간접 주소 지정(external indirect addressing) 방식은 외부 메모리를 간접적

으로 접근하는 방식으로, DPTR을 통해 간접 주소 지정하는 방식과 각 레지스터

뱅크의 R0, R1을 통해 간접 주소 지정하는 방식으로 나누어 볼 수 있다. 특히,

이들 외부 메모리를 접근하는 전송 명령어의 경우 MOVX를 사용한다.

DPTR을 이용한 외부 간접 주소 지정 방식을 이용하는 명령은 외부 메모리의 16

비트 주소를 DPTR에 설정하여 접근하는 다음의 명령어가 있다.

Page 60: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

50 MCS-51 마이크로컴퓨터

MOVX A,@DPTR ; A <- ((DPTR))MOVX @DPTR,A ; ((DPTR)) <- A

위 명령어에서 DPTR에 8000H가 설정되었다고 가정하면, 첫 명령어는 외부 메모

리의 주소 8000H의 내용을 ACC에 전송하고, 두 번째 명령어는 ACC의 내용을

외부 메모리 주소 8000H에 저장한다.

또한 레지스터 뱅크 내의 R0, R1을 간접 주소 지정하여 외부 메모리를 접근하는

방식이 있다. 이 방식은 비교적 작은 크기의 외부 메모리가 연결되었을 때 8비트

의 주소 체계로 접근하는 방식으로, 00H부터 FFH까지의 범위 내에서 주소 지정

가능하다.

MOVX A,@R1 ; A <- ((R1))MOVX @R0,A ; ((R0)) <-A

인덱스 주소 지정 방식

인덱스 주소 지정(index addressing) 방식은 베이스 레지스터로 DPTR이나 PC를

사용하고, 오프셋 값을 위해 ACC를 사용하는 주소 지정 방식으로, 프로그램 메

모리를 접근하여 데이터를 읽어오는데 사용된다. 이 방식은 코드 변환 처리와 같

은 응용에서 LUT(look-up table)을 참조하는데 유용하며, 테이블의 참조 기준 위

치는 DPTR이나 PC로 지시하고, 테이블 내의 특정 항목을 지시하는 오프셋을 위

해 ACC를 사용한다. 다음의 명령들은 이러한 주소 지정 방식의 사용 예를 보인

다.

MOV DPTR,#8100H ; DPTR <- 8100HMOV A,#10H ; A <- 10HMOVC A,@A+DPTR ; A <- ((A)+DPTR)

Page 61: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제2장 MCS-51 명령어 51

2.2 MCS-51 명령어

본 절에서 각 명령어의 기능 및 동작을 세세히 살펴본다. 이에 앞서 다음의 명령

어를 예로 들어 표기법에 대해 간단히 언급한다.

ACALL address_11 2/2

위와 같은 표기에서 사용되는 기호들의 의미를 [표 2.1]에 요약하여 보인다.

특히, 각 명령어가 실행되고 그 결과에 따라 상태를 반영하는 PSW의 플래그 비

트는 [그림 2.1]과 같이 각 플래그 비트에 -, ∙, √로 표기하여 명령 실행 결과

에 따른 상태 반영 여부를 표시한다.

C AC F0 RS1 RS0 OV - P

√ √ - - - √ - ∙

- : 관계없음, ∙ : 영향안줌, √ : 반영

그림 2.1 PSW SFR의 플래그 비트 표기

표 2.1 명령어 표기에서 기호 및 의미

기 호 의 미2/2 해당 명령의 바이트 수/실행 사이클 수Rn R0, R1, R2, R3, R4, R5, R6, R7address_11 11비트 길이의 주소address_16 16비트 길이의 주소direct 직접 주소rel 상대 주소bit 비트 주소#data 즉치 데이터@Ri @R0, @R1PC7..0 PC의 하위 바이트(비트7부터 비트0)(A) A가 가지고 있는 값AND, OR, XOR, NOT 비트 단위의 논리 연산+, -, *, / 산술 연산

Page 62: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

52 MCS-51 마이크로컴퓨터

MCS-51 명령어를 전송 명령어, 산술 연산 명령어, 논리 연산 명령어, 비트 연산

명령어, 흐름 제어 명령어의 5개 군으로 분류하여 각 명령의 기능에 대해 설명한

다.

2.2.1 전송 명령어

MOV(Move Memory)

MOV 명령의 형식은 다음과 같다.

MOV op1,op2

MOV는 op2의 값을 op1에 복사한다. op2의 값은 영향 받지 않는다. 두

피연산자 op1, op2는 내부 데이터 메모리에 있어야 한다. 1비트 값을 C

비트로 옮기는 명령, 혹은 PSW 레지스터에 값을 옮기는 명령을 제외하

고는 어떠한 플래그 비트도 영향 받지 않는다.

MOV iram_addr,iram_addr 경우에, 명령의 피연산자 바이트 순서는 역

순으로 저장된다. 즉, 명령이 85H, 20H, 50H로 구성된다면, 내부 데이터

메모리의 주소 20H의 내용을 주소 50H로 이동하라는 의미이다.

관련 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

∙ ∙ - - - ∙ - ∙

MOV A,Rn 1/1

(A) ← (Rn)

7 6 5 4 3 2 1 0

1 1 1 0 1 r r r

MOV A,direct 2/1

(A) ← (direct)

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

1 1 1 0 0 1 0 1 direct address

Page 63: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제2장 MCS-51 명령어 53

MOV A,@Ri 1/1

(A) ← ((Ri))

7 6 5 4 3 2 1 0

1 1 1 0 0 1 1 i

MOV A,#data 2/1

(A) ← #data

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

0 1 1 1 0 1 0 01 immediate data

MOV Rn,A 1/1

(Rn) ← (A)

7 6 5 4 3 2 1 0

1 1 1 1 1 r r r

MOV Rn,direct 2/2

(Rn) ← (direct)

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

1 0 1 0 1 r r r direct address

MOV Rn,#data 2/1

(Rn) ← #data

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

0 1 1 1 1 r r r immediate data

MOV direct,A 2/1

(direct) ← (A)

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

1 1 1 1 0 1 0 1 direct address

MOV direct,Rn 2/2

(direct) ← (Rn)

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

1 0 0 0 1 r r r direct address

Page 64: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

54 MCS-51 마이크로컴퓨터

MOV dest_direct,src_direct 3/2

(dest_direct) ← (src_direct)

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

1 0 0 0 0 1 0 1 src direct address dest direct address

MOV direct,@Ri 2/2

(direct) ← ((Ri))

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

1 0 0 0 0 1 1 i direct address

MOV direct,#data 3/2

(direct) ← #data

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

0 1 1 1 0 1 0 1 direct address immediate data

MOV @Ri,A 1/1

((Ri)) ← (A)

7 6 5 4 3 2 1 0

1 1 1 1 0 1 1 i

MOV @Ri,direct 2/2

((Ri)) ← (direct)

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

1 0 1 0 0 1 1 i direct address

MOV @Ri,#data 2/1

((Ri)) ← #data

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

0 1 1 1 0 1 1 i immediate data

MOV C,bit 2/1

(C) ← (bit)

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

1 0 1 0 0 0 1 0 bit address

Page 65: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제2장 MCS-51 명령어 55

예외적으로 이 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

√ ∙ - - - ∙ - ∙

MOV bit,C 2/1

(bit) ← (C)

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

1 0 0 1 0 0 1 0 bit address

MOV DPTR,#data_16 3/2

(DPTR) ← #data15..0

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

1 0 0 1 0 0 0 0 immediate data15..8 immediate data7..0

MOVX(Move Data To/From External Memory)

MOVX 명령의 형식은 다음과 같다.

MOVX op1,op2

MOVX는 외부 램으로부터 ACC로, ACC에서 외부 램으로 한 바이트를

이동한다.

op1이 @DPTR이면, ACC는 DPTR에 의해 지시하는 16비트 외부 메모

리 주소로 이동된다. 이 명령은 16비트 주소와 데이터를 출력하기 위해

P0와 P2 모두에서 이용한다. op2가 @DPTR이면, 외부 램으로부터 1바

이트가 ACC로 이동된다.

op1이 @R0 혹은 @R1이면, ACC는 제시된 레지스터의 의해 지시되는 8

비트 외부 메모리 주소로 이동된다. 이 명령은 8비트 주소와 데이터를

출력하기 위해 포트 P0만 사용한다. P2에는 영향주지 않는다. 만일 op2

가 @R0 혹은 @R1이면, 외부 메모리로부터 한 바이트가 ACC로 옮겨진

다.

Page 66: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

56 MCS-51 마이크로컴퓨터

관련 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

∙ ∙ - - - ∙ - ∙

MOVX A,@Ri 1/2

(A) ← ((Ri))

7 6 5 4 3 2 1 0

1 1 1 0 0 1 1 i

MOVX A,@DPTR 1/2

(A) ← ((DPTR))

7 6 5 4 3 2 1 0

1 1 1 0 0 0 0 0

MOVX @Ri,A 1/2

((Ri)) ← (A)

7 6 5 4 3 2 1 0

1 1 1 1 0 0 1 i

MOVX @DPTR,A 1/2

(DPTR) ← (A)

7 6 5 4 3 2 1 0

1 1 1 1 0 0 0 0

MOVC(Move Code Byte to Accumulator)

MOVC 명령의 형식은 다음과 같다.

MOVC A,@A+register

MOVC는 코드 메모리로부터 한 바이트를 ACC에 이동한다. 옮길 바이

트의 코드 메모리 주소는 ACC에 DPTR 혹은 PC 중 하나의 값을 더함

에 의해 결정된다. PC를 사용하는 경우 ACC와 더하기 전에 1만큼 우선

증가한다.

Page 67: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제2장 MCS-51 명령어 57

관련 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

∙ ∙ - - - ∙ - ∙

MOVC A,@A+DPTR 1/2

(A) ← ((A)+(DPTR))

7 6 5 4 3 2 1 0

1 0 0 1 0 0 1 1

MOVC A,@A+PC 1/2

(PC) ← (PC) + 1

(A) ← ((A)+(PC))

7 6 5 4 3 2 1 0

1 0 0 0 0 0 1 1

PUSH(Push Value Onto Stack)

PUSH 명령의 형식은 다음과 같다.

PUSH iram_addr

PUSH는 표시된 iram_addr상의 데이터를 스택에 저장한다. PUSH는 우

선 SP 값을 1만큼 증가하고 지정된 iram_addr에 있는 데이터를 현재

SP에 의해 지시되는 스택에 저장한다.

관련 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

∙ ∙ - - - ∙ - ∙

PUSH direct 2/2

(SP) ← (SP) + 1

((SP)) ← (direct)

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

1 1 0 0 0 0 0 0 direct address

Page 68: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

58 MCS-51 마이크로컴퓨터

POP(Pop Value From Stack)

POP 명령의 형식은 다음과 같다.

POP iram_addr

POP은 스택에서 SP가 가리키는 위치의 데이터를 iram_addr에 저장한

후, SP의 값을 1만큼 감소시킨다.

관련 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

∙ ∙ - - - ∙ - ∙

POP direct 2/2

(direct) ← ((SP))

(SP) ← (SP) - 1

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

1 1 0 1 0 0 0 0 direct address

XCH(Exchange Bytes)

XCH 명령의 형식은 다음과 같다.

XCH A,register

XCH는 ACC의 값과 제시된 레지스터의 값 사이의 바이트 단위 교환을

수행한다.

Page 69: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제2장 MCS-51 명령어 59

관련 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

∙ ∙ - - - ∙ - ∙

XCH A,Rn 1/1

(A) ↔ (Rn)

7 6 5 4 3 2 1 0

1 1 0 0 1 r r r

XCH A,direct 2/1

(A) ↔ (direct)

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

1 1 0 0 0 1 0 1 direct address

XCH A,@Ri 1/1

(A) ↔ ((Ri))

7 6 5 4 3 2 1 0

1 1 0 0 0 1 1 i

XCHD(Exchange Digit)

XCHD 명령의 형식은 다음과 같다.

XCHD A,[@R0/@R1]

XCHD는 ACC의 하위 니블과 R0 혹은 R1에 의해 간접 주소 지정된 내

부 램의 하위 니블간 데이터 교환을 수행한다. 각 레지스터의 상위 니블

은 영향 받지 않는다.

Page 70: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

60 MCS-51 마이크로컴퓨터

관련 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

∙ ∙ - - - ∙ - ∙

XCHD A,@Ri 1/1

(A3..0) ↔ ((Ri3..0))

7 6 5 4 3 2 1 0

1 1 0 1 0 1 1 i

SWAP(Swap Accumulator Nibbles)

SWAP 명령의 형식은 다음과 같다.

SWAP A

SWAP은 ACC의 상위 니블 값과 하위 니블 값을 교환한다. 이 명령은

RR A 혹은 RL A를 4차례 수행한 것과 동일한 결과를 생성한다.

관련 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

∙ ∙ - - - ∙ - ∙

SWAP A 1/1

(A7..4) ↔ (A3..0)

7 6 5 4 3 2 1 0

1 1 0 0 0 1 0 0

Page 71: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제2장 MCS-51 명령어 61

2.2.2 산술 연산 명령어

ADD(Add Accumulator)

ADD 명령의 형식은 다음과 같다.

ADD A,<src-byte>

ADD는 ACC의 값과 피연산자의 값을 더하여, 결과를 ACC에 저장한다.

피연산자의 값에는 영향을 주지 않는다. ADD 명령은 결과에 C 플래그

값을 더하지 않는다.

캐리(C) 비트는 비트 7에서 캐리가 발생하면 1로 변경된다. 즉, ACC와

피연산자의 값을 더한 결과가 255를 초과하면 캐리 비트를 1로 된다. 그

렇지 않으면 캐리 비트는 0이다.

보조 캐리(AC) 비트는 비트 3에서 캐리가 발생하면 1로 변경된다. 즉,

ACC와 피연산자 값을 더한 결과가 15를 초과하면 AC는 1로 되고, 그렇

지 않으면 AC는 0이다.

오버플로(OV) 비트는 비트 6 혹은 비트 7에서 자리올림이 발생하면 1로

변경된다. 그러나 두 비트 모두에서 자리올림이 발생하면 0이 된다. 즉,

ACC와 피연산자 값을 더한 결과를 부호화 값으로 취급하였을 때 1바이

트의 부호화 표현의 범위(-128~+127)를 벗어나면 OV 비트는 1로 되고,

그렇지 않은 경우 0이 된다.

관련 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

√ √ - - - √ - ∙

ADD A,Rn 1/1

(A) ← (A) + (Rn)

7 6 5 4 3 2 1 0

0 0 1 0 1 r r r

Page 72: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

62 MCS-51 마이크로컴퓨터

ADD A,direct 2/1

(A) ← (A) + (direct)

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

0 0 1 0 0 1 0 1 direct address

ADD A,@Ri 1/1

(A) ← (A) + ((Ri))

7 6 5 4 3 2 1 0

0 0 1 0 0 1 1 i

ADD A,#data 2/1

(A) ← (A) + #data

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

0 0 1 0 0 1 0 0 immediate data

ADDC(Add Accumulator With Carry)

ADDC 명령의 형식은 다음과 같다.

ADDC A,operand

ADDC는 ACC의 값과 피연산자의 값 그리고 C 값을 더하여, 결과를

ACC에 저장한다. 피연산자의 값에는 영향을 주지 않는다.

캐리(C) 비트는 비트 7에서 캐리가 발생하면 1로 변경된다. 즉, ACC와

피연산자의 값 그리고 C를 더한 결과가 255를 초과하면 캐리 비트를 1

로 하고, 그렇지 않으면 캐리 비트는 0이다.

보조 캐리(AC) 비트는 비트 3에서 캐리가 발생하면 1로 변경된다. 즉,

ACC와 피연산자 값 그리고 C를 더한 결과가 15를 초과하면 AC는 1로

되고, 그렇지 않으면 AC는 0이다.

오버플로(OV) 비트는 비트 6 혹은 비트 7에서 자리올림이 발생하면 1로

변경된다. 그러나 두 비트 모두에서 자리올림이 발생하면 0이 된다. 즉,

Page 73: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제2장 MCS-51 명령어 63

ACC와 피연산자 값 그리고 C를 더한 결과를 부호화 값으로 취급하였을

때 1바이트의 부호화 표현의 범위(-128 ~ +127)를 벗어나면 OV 비트는

1로 되고, 그렇지 않은 경우 0이 된다.

관련 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

√ √ - - - √ - ∙

ADDC A,Rn 1/1

(A) ← (A) + (C) + (Rn)

7 6 5 4 3 2 1 0

0 0 1 1 1 r r r

ADDC A,direct 2/1

(A) ← (A) + (C) + (direct)

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

0 0 1 1 0 1 0 1 direct address

ADDC A,@Ri 1/1

(A) ← (A) + (C) + ((Ri))

7 6 5 4 3 2 1 0

0 0 1 1 0 1 1 i

ADDC A,#data 2/1

(A) ← (A) + (C) + #data

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

0 0 1 1 0 1 0 0 immediate data

SUBB(Subtract from Accumulator With Borrow)

SUBB 명령의 형식은 다음과 같다.

SUBB A,operand

Page 74: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

64 MCS-51 마이크로컴퓨터

SUBB는 ACC의 값으로부터 피연산자의 값을 빼고, 결과 값은 ACC에

저장한다. 피연산자의 값은 영향 받지 않는다.

만일 비트 7에서 빌림수가 요구되면 C 비트는 1로, 그렇지 않으면 0의

값을 가진다. 즉, 만일 감산할 비부호 값이 ACC의 값보다 크면 C 비트

는 1의 값을 가진다. 비트 3에서 빌림이 발생하면 AC 비트는 1의 값을

가지며, 그렇지 않으면 0의 값을 가진다. 즉, 뺄 값의 하위 니블이 ACC

의 하위 니블의 값보다 크면 이 비트는 1의 값을 가진다.

비트 6 혹은 7에서 빌림이 발생하면 OV 비트는 1의 값을 가지며, 두 비

트에서 모두 빌림이 발생하면 OV 비트는 0의 값을 가진다. 즉, 두 부호

화 값의 감산 결과가 부호화 1바이트 값의 범위(-128 ~ +127) 밖이면

OV 비트는 1의 값을 가지며, 그렇지 않으면 0의 값을 가진다.

관련 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

√ √ - - - √ - ∙

SUBB A,Rn 1/1

(A) ← (A) - (C) - (Rn)

7 6 5 4 3 2 1 0

1 0 0 1 1 r r r

SUBB A,direct 2/1

(A) ← (A) - (C) - (direct)

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

1 0 0 1 0 1 0 1 direct address

SUBB A,@Ri 1/1

(A) ← (A) - (C) - ((Ri))

7 6 5 4 3 2 1 0

1 0 0 1 0 1 1 i

Page 75: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제2장 MCS-51 명령어 65

SUBB A,#data 2/1

(A) ← (A) - (C) - #data

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

1 0 0 1 0 1 0 0 immediate data

INC(Increment Register)

INC 명령의 형식은 다음과 같다.

INC register

INC는 레지스터의 값을 1만큼 증가한다. 만일 레지스터의 초기 값이

FFH면, 그 값을 증가하여 0이 되도록 한다. 이처럼 FFH에서 00H로 넘

어갈 때 C 비트는 1로 변경되지 않는다. INC DPTR의 경우, DPTR의 2

바이트 비부호 정수 값은 1 증가된다. 만일 DPTR이 FFFFH라면 그 값

이 증가되어 0으로 될 것이다. 이 경우도 C 비트는 1로 변경되지 않는

다.

관련 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

∙ ∙ - - - ∙ - ∙

INC A 1/1

(A) ← (A) + 1

7 6 5 4 3 2 1 0

0 0 0 0 0 1 0 0

INC Rn 1/1

(Rn) ← (Rn) + 1

7 6 5 4 3 2 1 0

0 0 0 0 1 r r r

Page 76: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

66 MCS-51 마이크로컴퓨터

INC direct 2/1

(direct) ← (direct) + 1

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

0 0 0 0 0 1 0 1 direct address

INC @Ri 1/1

((Ri)) ← ((Ri)) + 1

7 6 5 4 3 2 1 0

0 0 0 0 0 1 1 i

INC DPTR 1/2

(DPTR) ← (DPTR) + 1

7 6 5 4 3 2 1 0

1 0 1 0 0 0 1 1

DEC(Decrement Register)

DEC 명령의 형식은 다음과 같다.

DEC register

DEC는 레지스터의 값을 1만큼 감소시킨다. 만일 레지스터의 초기 값이

0이면, 그 값을 1만큼 감소하여 FFH가 되게 한다. 이 때 0에서 255로

될 때 C 비트는 1로 되지 않는다.

관련 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

∙ ∙ - - - ∙ - ∙

DEC A 1/1

(A) ← (A) - 1

7 6 5 4 3 2 1 0

0 0 0 1 0 0 0 0

Page 77: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제2장 MCS-51 명령어 67

DEC Rn 1/1

(Rn) ← (Rn) - 1

7 6 5 4 3 2 1 0

0 0 0 1 1 r r r

DEC direct 2/1

(direct) ← (direct) - 1

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

0 0 0 1 0 1 0 1 direct address

DEC @Ri 1/1

((Ri)) ← ((Ri)) - 1

7 6 5 4 3 2 1 0

0 0 0 1 0 1 1 i

MUL(Multiply Accumulator by B)

MUL 명령의 형식은 다음과 같다.

MUL AB

MUL은 ACC의 비부호 값에 B 레지스터의 비부호 값을 곱셈한다. 결과

의 하위 바이트는 ACC에 저장되고, 상위 바이트는 B 레지스터에 저장

된다. C 비트는 항상 0이다. OV 비트는 결과가 255보다 크면 1이 되고,

그렇지 않으면 0이 된다.

이 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

√ ∙ - - - √ - ∙

Page 78: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

68 MCS-51 마이크로컴퓨터

MUL AB 1/4

(A) ← {(A) * (B)}7..0

(B) ← {(A) * (B)}15..8

7 6 5 4 3 2 1 0

1 0 1 0 0 1 0 0

DIV(Divide Accumulator by B)

DIV 명령의 형식은 다음과 같다.

DIV AB

ACC의 비부호화 값을 B 레지스터의 비부호화 값으로 나눈다. 결과의

몫은 ACC에 나머지는 B 레지스터에 저장된다. C 비트는 항상 0이 된

다. 0으로 나누려는 시도가 있으면 OV 비트를 1로, 그렇지 않으면 0이

다.

이 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

√ ∙ - - - √ - ∙

DIV AB 1/1

(A) ← que{(A)/(B)}

(B) ← rem{(A)/(B)}

7 6 5 4 3 2 1 0

1 0 0 0 0 1 0 0

DA(Decimal Adjust Accumulator)

DA 명령의 형식은 다음과 같다.

DA A

DA는 두 BCD 숫자를 ADD 혹은 ADDC 명령에 의해 더한 후 ACC에

Page 79: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제2장 MCS-51 명령어 69

저장된 결과를 BCD 수로 조정한다. 만일 C 비트가 1이거나 0-3비트의

값이 9를 초과하면 ACC에 06H가 더해진다. 이 명령이 시작할 때 C 비

트가 1이면 혹은 앞 과정에서 ACC에 06H이 더해지면 ACC에 06H를 더

한다. 만일 결과 값이 99H보다 크면 C 비트는 1이 되고, 그렇지 않으면

0이 된다.

이 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

√ ∙ - - - ∙ - ∙

DA A 1/1

A의 내용이 BCD일 때,

IF (A3..0)>9 OR (AC)=1

THEN (A3..0) ← (A3..0) + 6

IF (A7..4)>9 OR (C)=1

THEN (A7..4) ← (A7..4) + 6

7 6 5 4 3 2 1 0

1 1 0 1 0 1 0 0

2.2.3 논리 연산 명령어

ANL(Bitwise AND)

ANL 명령의 형식은 다음과 같다.

ANL op1,op2

ANL은 두 피연산자 간의 비트 단위 AND 논리 연산을 하고, 결과를 피

연산자 1에 저장한다. 피연산자 2의 값은 영향 받지 않는다. 논리적

AND는 각 피연산자의 비트를 비교하여 만일 본래의 피연산자들의 해당

비트가 모두 1이면, 결과 바이트의 대응하는 비트를 1로 설정하고, 그렇

지 않으면 0으로 변경한다.

관련 명령의 PSW 플래그 비트 영향은 다음과 같다.

Page 80: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

70 MCS-51 마이크로컴퓨터

C AC F0 RS1 RS0 OV - P

∙ ∙ - - - ∙ - ∙

ANL A,Rn 1/1

(A) ← (A) AND (Rn)

7 6 5 4 3 2 1 0

0 1 0 1 1 r r r

ANL A,direct 2/1

(A) ← (A) AND (direct)

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

0 1 0 1 0 1 0 1 direct address

ANL A,@Ri 1/1

(A) ← (A) AND ((Ri))

7 6 5 4 3 2 1 0

0 1 0 1 0 1 1 i

ANL A,#data 2/1

(A) ← (A) AND #data

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

0 1 0 1 0 1 0 0 immediate data

ANL direct,A 2/1

(direct) ← (direct) AND (A)

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

0 1 0 1 0 0 1 0 direct address

ANL direct,#data 3/2

(direct) ← (direct) AND #data

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

0 1 0 1 0 0 1 1 direct address immediate data

Page 81: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제2장 MCS-51 명령어 71

ORL(Bitwise OR)

ORL 명령의 형식은 다음과 같다.

ORL op1,op2

ORL은 op1과 op2간의 비트 단위 OR 연산을 하고, 그 결과는 op1에 저

장한다. op2의 값은 영향 받지 않는다. 논리적인 OR는 피연산자 각각의

비트들을 비교하여 대응하는 비트의 어느 하나라도 1이면 결과의 대응

하는 비트를 1로 변경하고, 그렇지 않으면 0으로 변경한다.

관련 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

∙ ∙ - - - ∙ - ∙

ORL A,Rn 1/1

(A) ← (A) OR (Rn)

7 6 5 4 3 2 1 0

0 1 0 0 1 r r r

ORL A,direct 2/1

(A) ← (A) OR (direct)

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

0 1 0 0 0 1 0 1 direct address

ORL A,@Ri 1/1

(A) ← (A) OR ((Ri))

7 6 5 4 3 2 1 0

0 1 0 0 0 1 1 i

ORL A,#data 2/1

(A) ← (A) OR #data

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

0 1 0 0 0 1 0 0 immediate data

Page 82: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

72 MCS-51 마이크로컴퓨터

ORL direct,A 2/1

(direct) ← (direct) OR (A)

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

0 1 0 0 0 0 1 0 direct address

ORL direct,#data 3/2

(direct) ← (direct) OR #data

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

0 1 0 0 0 0 1 1 direct address immediate data

ORL C,bit 2/2

(C) ← (C) OR (bit)

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

0 1 1 1 0 0 1 0 bit address

예외적으로 이 명령과 다음 명령은 다음과 같이 PSW 플래그 비트에 영

향 준다.

C AC F0 RS1 RS0 OV - P

√ ∙ - - - ∙ - ∙

ORL C,/bit 2/2

(C) ← (C) OR NOT(bit)

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

1 0 1 0 0 0 0 0 bit address

XRL(Bitwise Exclusive OR)

XRL 명령의 형식은 다음과 같다.

XRL op1,op2

XRL은 op1과 op2간의 비트단위 XOR 연산을 수행하고, 결과 값을 op1

에 저장한다. op2의 값은 영향 받지 않는다. 논리적 XOR 연산은 각 피

연산자의 대응하는 비트에 대해 둘 중 어느 하나는 1이고 다른 하나는

Page 83: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제2장 MCS-51 명령어 73

0인 경우만 결과의 대응하는 비트에 1의 값을, 그렇지 않은 경우는 0의

값을 생성하는 것이다.

관련 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

∙ ∙ - - - ∙ - ∙

XRL A,Rn 1/1

(A) ← (A) XOR (Rn)

7 6 5 4 3 2 1 0

0 1 1 0 1 r r r

XRL A,direct 2/1

(A) ← (A) XOR (direct)

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

0 1 1 0 0 1 0 1 direct address

XRL A,@Ri 1/1

(A) ← (A) XOR ((Ri))

7 6 5 4 3 2 1 0

0 1 1 0 0 1 1 i

XRL A,#data 2/1

(A) ← (A) XOR #data

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

0 1 1 0 0 1 0 0 immediate data

XRL direct,A 2/1

(direct) ← (direct) XOR (A)

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

0 1 1 0 0 0 1 0 direct address

Page 84: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

74 MCS-51 마이크로컴퓨터

XRL direct,#data 3/2

(direct) ← (direct) XOR #data

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

0 1 1 0 0 0 1 1 direct address immediate data

RL(Rotate Accumulator Left)

RL 명령의 형식은 다음과 같다.

RL A

RL은 ACC의 비트들을 좌측으로 이동하고, ACC의 최상위 비트는 최하

위 비트로 들어온다.

이 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

√ ∙ - - - ∙ - ∙

RL A 1/1

(An+1) ← (An) for n = 0,...,6

(A0) ← (A7)

7 6 5 4 3 2 1 0

0 0 1 0 0 0 1 1

RLC(Rotate Accumulator Left Through Carry)

RLC 명령의 형식은 다음과 같다.

RLC A

Page 85: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제2장 MCS-51 명령어 75

RLC는 ACC의 각 비트들을 좌측으로 이동하고, ACC의 최상위 비트는

C 비트로 들어간다. 그리고 본래의 C 비트의 내용은 ACC의 최하위 비

트로 적재된다. 이 기능은 한 바이트의 값에 2를 고속으로 곱셈하는데

이용될 수 있다.

이 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

√ ∙ - - - ∙ - ∙

RLC A 1/1

(An+1) ← (An) for n = 0,...,6

(A0) ← (C)

(C) ← (A7)

7 6 5 4 3 2 1 0

0 0 1 1 0 0 1 1

RR(Rotate Accumulator Right)

RR 명령의 형식은 다음과 같다.

RR A

RR은 ACC의 각 비트들을 우측으로 이동하고, ACC의 최하위 비트는

ACC의 최상위 비트로 적재된다.

Page 86: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

76 MCS-51 마이크로컴퓨터

이 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

∙ ∙ - - - ∙ - ∙

RR A 1/1

(An) ← (An+1) for n = 0,...,6

(A7) ← (A0)

7 6 5 4 3 2 1 0

0 0 0 0 0 0 1 1

RRC(Rotate Accumulator Right Through Carry)

RRC 명령의 형식은 다음과 같다.

RRC A

ACC의 각 비트들은 우측으로 이동하고, ACC의 최하위 비트는 C 비트

로 적재되고, 본래의 C 비트는 ACC의 최상위 비트로 적재된다. 이 기능

은 고속으로 한 바이트 값을 2로 나눗셈하는데 이용될 수 있다.

이 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

√ ∙ - - - ∙ - ∙

Page 87: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제2장 MCS-51 명령어 77

RRC A 1/1

(An) ← (An+1) for n = 0,...,6

(A7) ← (C)

(C) ← (A0)

7 6 5 4 3 2 1 0

0 0 0 1 0 0 1 1

CLR(Clear Register)

CLR 명령의 형식은 다음과 같다.

CLR register

CLR은 지시된 레지스터의 모든 비트를 0으로 만든다. 만일 대상이 한

비트이면, 그 비트만 영향 준다.

관련 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

∙ ∙ - - - ∙ - ∙

CLR A 1/1

(A) ← 0

7 6 5 4 3 2 1 0

1 1 1 0 0 1 1 1

CLR C 1/1

(C) ← 0

7 6 5 4 3 2 1 0

1 1 0 0 0 0 1 1

예외적으로 이 명령어의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

√ ∙ - - - ∙ - ∙

Page 88: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

78 MCS-51 마이크로컴퓨터

CLR bit 2/1

(bit) ← 0

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

1 1 0 0 0 0 1 0 bit address

CPL(Complement Register)

CPL 명령의 형식은 다음과 같다.

CPL operand

CPL은 피연산자의 각 비트를 반전시켜 피연산자에 그 결과를 저장한다.

만일 피연산자가 하나의 비트이면 그 비트의 상태는 반전된다. 만일

ACC이면 모든 비트가 반전된다. 만일 피연산자가 출력 포트의 한 비트

를 나타내면, 최근 읽은 값이 아니라 최근 기록한 값의 해당 비트를 반

전한다.

관련 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

∙ ∙ - - - ∙ - ∙

CPL A 1/1

(A) ← NOT(A)

7 6 5 4 3 2 1 0

1 1 1 1 0 1 0 0

CPL C 1/1

(C) ← NOT(C)

7 6 5 4 3 2 1 0

1 0 1 1 0 0 1 1

예외적으로 이 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

√ ∙ - - - ∙ - ∙

Page 89: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제2장 MCS-51 명령어 79

CPL bit 2/1

(bit) ← NOT(bit)

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

1 0 1 1 0 0 1 0 bit address

SETB(Set Bit)

SETB 명령의 형식은 다음과 같다.

SETB bit addr

SETB는 지시된 특정 비트를 1로 설정한다.

관련 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

∙ ∙ - - - ∙ - ∙

SETB C 1/1

(C) ← 1

7 6 5 4 3 2 1 0

1 1 0 1 0 0 1 1

예외적으로 이 명령어의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

√ ∙ - - - ∙ - ∙

SETB bit 2/1

(bit) ← 1

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

1 1 0 1 0 0 1 0 bit address

Page 90: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

80 MCS-51 마이크로컴퓨터

2.2.4 흐름 제어 명령어

ACALL(Absolute Call within 2K Block)

ACALL 명령의 형식은 다음과 같다.

ACALL <address_11>

ACALL은 지시된 코드 주소에 있는 서브루틴을 무조건 호출한다.

ACALL은 ACALL 뒤에 있는 명령의 주소를 하위 바이트부터 스택에

저장한다. 그런 후, PC를 갱신함으로써 프로그램 실행을 지시된 주소에

서 계속한다.

PC를 위한 새로운 값은 PC의 하위 바이트를 ACALL 명령의 두 번째

바이트로 대체하고, 페이지를 지시하는 3비트로 PC 상위 바이트의 0-2

비트를 대체함에 의해 계산된다. PC 상위 바이트의 3-7비트는 변경되지

않는다. PC의 11비트만이 ACALL에 의해 영향 받기 때문에 ACALL 뒤

의 첫 바이트로 동일한 2KB 블록 내에 위치한 루틴으로만 호출이 이루

어진다.

이 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

∙ ∙ - - - ∙ - ∙

ACALL address_11 2/2

(PC) ← (PC) + 2

(SP) ← (SP) + 1

((SP)) ← (PC7..0)

(SP) ← (SP) + 1

((SP)) ← (PC15..8)

(PC10..0) ← address_11

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

a10..8 1 0 0 0 1 a7..0

예로, 0121H 주소에 있는 다음의 명령을 수행할 때를 살펴보자. 현재의

Page 91: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제2장 MCS-51 명령어 81

SP 값은 07H이고, 레이블 RTN은 프로그램 메모리의 0345H 주소에 위

치한다고 가정한다.

ACALL RTN

위 명령의 수행이 완료된 직후, SP는 09H 값을 가지며, 내부 램의 주소

08H와 09H에는 각각 23H와 01H 값을 가지며, PC는 0345H로 설정된다.

LCALL(Long Call)

LCALL 명령의 형식은 다음과 같다.

LCALL code addr

LCALL은 서브루틴을 호출한다. LCALL은 PC값을 3 증가하고 스택에

그 값을 하위 바이트부터 우선하여 저장한다. 그런 후, PC는 LCALL 명

령을 뒤따르는 16비트 값으로 설정되어, 이 위치부터 프로그램을 실행한

다.

이 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

∙ ∙ - - - ∙ - ∙

LCALL address_16 3/2

(PC) ← (PC) + 3

(SP) ← (SP) + 1

((SP)) ← (PC7..0)

(SP) ← (SP) + 1

((SP)) ← (PC15..8)

(PC) ← address15..0

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

0 0 0 1 0 0 1 0 address15..8 address7..0

Page 92: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

82 MCS-51 마이크로컴퓨터

RET(Return From Subroutine)

RET 명령의 형식은 다음과 같다.

RET

RET는 LCALL 혹은 ACALL에 의해 호출된 서브루틴으로부터 호출한

주 루틴으로 제어를 반환되는데 사용한다. 스택에서 처음 POP한 값은

PC의 상위 바이트에 저장되고, SP는 하나 감소한다. 두 번째 POP한 값

은 PC의 하위 바이트로 저장되고 SP는 하나 감소한다.

이 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

∙ ∙ - - - ∙ - ∙

RET 1/2

(PC15..8) ← ((SP))

(SP) ← (SP) - 1

(PC7..0) ← ((SP))

(SP) ← (SP) - 1

7 6 5 4 3 2 1 0

0 0 1 0 0 0 1 0

RETI(Return From Interrupt)

RETI 명령의 형식은 다음과 같다.

RETI

RETI는 인터럽트 서비스 루틴으로부터 반환할 때 사용된다. 스택에서

처음 POP한 값은 PC의 상위 바이트에 저장되고, SP는 하나 감소한다.

두 번째 POP한 값은 PC의 하위 바이트로 저장되고 SP는 하나 감소한

다. RETI는 인터럽트 서비스 루틴의 밖에서 실행된다면 RET와 동일한

기능을 한다.

Page 93: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제2장 MCS-51 명령어 83

관련 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

∙ ∙ - - - ∙ - ∙

RETI 1/2

(PC15..8) ← ((SP))

(SP) ← (SP) - 1

(PC7..0) ← ((SP))

(SP) ← (SP) - 1

7 6 5 4 3 2 1 0

0 0 1 1 0 0 1 0

AJMP(Absolute Jump Within 2K Block)

AJMP 명령의 형식은 다음과 같다.

AJMP address_11

AJMP는 지시된 코드 주소로 무조건 분기한다. PC를 위한 새로운 값은

PC의 하위 바이트를 AJMP 명령의 두 번째 바이트로 대체하고, 페이지

를 지시하는 3비트로 PC 상위 바이트의 0-2비트를 대체함에 의해 계산

된다. PC 상위 바이트의 3-7비트는 변경되지 않는다. PC의 11비트만이

AJMP에 의해 영향 받기 때문에 AJMP 뒤의 첫 바이트로 동일한 2KB

블록 내에 위치한 코드로만 분기한다.

이 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

∙ ∙ - - - ∙ - ∙

AJMP address_11 2/2

(PC) ← (PC) + 2

(PC10..0) ← address_11

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

a10..8 0 0 0 0 1 a7..0

Page 94: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

84 MCS-51 마이크로컴퓨터

LJMP(Long Jump)

LJMP 명령의 형식은 다음과 같다.

LJMP code addr

LJMP는 지시된 16비트 코드 주소로 무조건 분기한다.

이 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

∙ ∙ - - - ∙ - ∙

LJMP address_16 3/2

(PC) ← address15..0

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

0 0 0 0 0 0 1 0 address15..8 address7..0

SJMP(Short Jump)

SJMP 명령의 형식은 다음과 같다.

SJMP reladdr

SJMP는 표시된 상대 주소로 무조건 분기한다. 상대 주소는 SJMP의 다

음 명령으로부터 -128에서 +127 바이트 범위이어야 한다.

이 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

∙ ∙ - - - ∙ - ∙

SJMP rel 2/2

(PC) ← (PC) + 2

(PC) ← (PC) + rel

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

1 0 0 0 0 0 0 0 relative address

Page 95: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제2장 MCS-51 명령어 85

JMP(Jump to Data Pointer + Accumulator)

JMP 명령의 형식은 다음과 같다.

JMP @A+DPTR

JMP는 DPTR의 값과 ACC의 값을 합한 값으로 표현되는 주소로 무조

건 분기한다.

이 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

∙ ∙ - - - ∙ - ∙

JMP @A+DPTR 1/2

(PC) ← (A) + (DPTR)

7 6 5 4 3 2 1 0

0 1 1 1 0 0 1 1

JC(Jump if Carry Set)

JC 명령의 형식은 다음과 같다.

JC reladdr

JC는 C비트가 1이면 상대 주소로 지시되는 주소로 분기한다. 만일 C비

트가 1이 아니면, 프로그램은 JC 다음 명령을 실행한다.

이 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

∙ ∙ - - - ∙ - ∙

Page 96: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

86 MCS-51 마이크로컴퓨터

JC rel 2/2

(PC) ← (PC) + 2

IF (C)=1

THEN (PC) ← (PC) + rel

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

0 1 0 0 0 0 0 0 relative address

JNC(Jump if Carry Not Set)

JNC 명령의 형식은 다음과 같다.

JNC reladdr

JNC는 C비트가 1이 아니면, 상대 주소에 의해 지시되는 주소로 분기한

다. 만일 C비트가 1이면 JNB 다음 명령을 실행한다.

이 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

∙ ∙ - - - ∙ - ∙

JNC rel 2/2

(PC) ← (PC) + 2

IF (C)=0

THEN (PC) ← (PC) + rel

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

0 1 0 1 0 0 0 0 relative address

JZ(Jump if Accumulator Zero)

JZ 명령의 형식은 다음과 같다.

JZ reladdr

JZ는 ACC의 값이 0이면 상대 주소에 의해 지시되는 주소로 분기한다.

Page 97: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제2장 MCS-51 명령어 87

만일 ACC의 값이 0이 아니면, 프로그램은 JZ 다음 명령을 실행한다.

이 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

∙ ∙ - - - ∙ - ∙

JZ rel 2/2

(PC) ← (PC) + 2

IF (A)=0

THEN (PC) ← (PC) + rel

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

0 1 1 0 0 0 0 0 relative address

JNZ(Jump if Accumulator Not Zero)

JNZ 명령의 형식은 다음과 같다.

JNZ reladdr

JNZ는 ACC의 값이 0이 아니면, 상대 주소에 의해 지시되는 주소로 분

기한다. 만일 ACC의 값이 0이면, 프로그램은 JNZ 다음 명령을 실행한

다.

이 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

∙ ∙ - - - ∙ - ∙

JNZ rel 2/2

(PC) ← (PC) + 2

IF (A)<>0

THEN (PC) ← (PC) + rel

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

0 1 1 1 0 0 0 0 relative address

Page 98: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

88 MCS-51 마이크로컴퓨터

JB(Jump if Bit Set)

JB 명령의 형식은 다음과 같다.

JB bit addr, reladdr

JB는 만일 비트 주소에 의해 지시된 비트가 1이면 상대 주소로 지시되

는 주소로 분기한다. 만일 이 비트가 1이 아니면, 프로그램은 JB 명령의

다음 명령을 실행한다.

이 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

∙ ∙ - - - ∙ - ∙

JB bit,rel 3/2

(PC) ← (PC) + 3

IF (bit)=1

THEN (PC) ← (PC) + rel

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

0 0 1 0 0 0 0 0 bit address relative address

JNB(Jump if Bit Not Set)

JNB 명령의 형식은 다음과 같다.

JNB bit addr,reladdr

JNB는 지시된 비트가 1이 아니면 상대 주소에 의해 지시된 주소로 분기

한다. 만일 그 비트가 1이면 JNB 다음 명령을 실행한다.

이 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

∙ ∙ - - - ∙ - ∙

Page 99: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제2장 MCS-51 명령어 89

JNB bit,rel 3/2

(PC) ← (PC) + 3

IF (bit)=0

THEN (PC) ← (PC) + rel

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

0 0 1 1 0 0 0 0 bit address relative address

JBC(Jump if Bit Set, then Clear Bit)

JBC 명령의 형식은 다음과 같다.

JBC bit addr, reladdr

JBC는 비트 주소에 의해 지시된 비트가 1이면 상대 주소에 의해 지시된

주소로 분기하며, 상대 주소로 분기하기 전에 해당 비트를 0으로 변경한

다. 만일 그 비트가 1이 아니면, 프로그램은 JBC 다음 명령을 실행한다.

이 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

∙ ∙ - - - ∙ - ∙

JBC bit,rel 3/2

(PC) ← (PC) + 3

IF (bit)=1

THEN (bit) ← 0,

(PC) ← (PC) + rel

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

0 0 0 1 0 0 0 0 bit address relative address

Page 100: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

90 MCS-51 마이크로컴퓨터

CJNE(Compare and Jump If Not Equal)

CJNE 명령의 형식은 다음과 같다.

CJNE op1,op2,reladdr

CJNE 는 op1과 op2의 값을 비교하여 같지 않으면 지시된 상대 주소로

분기한다. 만일 두 피연산자가 동일하면, 프로그램 제어는 CJNE 다음

명령에서 계속된다. C 비트는 op1이 op2보다 작으면 1로, 그렇지 않으면

C 비트는 0이 된다.

관련 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

√ ∙ - - - ∙ - ∙

CJNE A,direct,rel 3/2

(PC) ← (PC) + 3

IF (A)<>(direct)

THEN (PC) ← (PC) + relative_offset

IF (A)<(direct)

THEN (C) ← 1

ELSE (C) ← 0

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

1 0 1 1 0 1 0 1 direct address relative address

CJNE A,#data,rel 3/2

(PC) ← (PC) + 3

IF (A)<>#data

THEN (PC) ← (PC) + relative_offset

IF (A)<#data

THEN (C) ← 1

ELSE (C) ← 0

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

1 0 1 1 0 1 0 0 immediate data relative address

Page 101: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제2장 MCS-51 명령어 91

CJNE Rn,#data,rel 3/2

(PC) ← (PC) + 3

IF (Rn)<>#data

THEN (PC) ← (PC) + relative_offset

IF (Rn)<#data

THEN (C) ← 1

ELSE (C) ← 0

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

1 0 1 1 1 r r r immediate data relative address

CJNE @Ri,#data,rel 3/2

(PC) ← (PC) + 3

IF ((Ri))<>#data

THEN (PC) ← (PC) + relative_offset

IF ((Ri))<#data

THEN (C) ← 1

ELSE (C) ← 0

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

1 0 1 1 0 1 1 i immediate data relative address

DJNZ(Decrement and Jump if Not Zero)

DJNZ 명령의 형식은 다음과 같다.

DJNZ register,reladdr

DJNZ는 레지스터의 값을 1 감소한다. 만일 초기 값이 0이면, 그 값을

감소하여 FFH로 만든다. 만일 결과의 레지스터 값이 0이 아니면 프로그

램은 상대주소에 의해 지시되는 주소로 분기한다. 만일 레지스터의 결과

값이 0이면, 제어는 DJNZ 다음의 명령에서 계속된다.

관련 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

∙ ∙ - - - ∙ - ∙

Page 102: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

92 MCS-51 마이크로컴퓨터

DJNZ Rn,rel 2/2

(PC) ← (PC) + 2

(Rn) ← (Rn) - 1

IF (Rn)>0 OR (Rn)<0

THEN (PC) ← (PC) + rel

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

1 1 0 1 1 r r r relative address

DJNZ direct,rel 3/2

(PC) ← (PC) + 2

(direct) ← (direc) - 1

IF (direct)>0 OR (direct)<0

THEN (PC) ← (PC) + rel

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

1 1 0 1 0 1 0 1 direct address relative address

NOP(No operation, waste time)

NOP 명령의 형식은 다음과 같다.

NOP

NOP는 명령의 이름 자체에서 의미하듯이 한 머신 사이클동안 어떠한

동작도 하지 않는다. NOP는 일반적으로 타이밍의 목적으로 사용된다.

이 명령의 PSW 플래그 비트 영향은 다음과 같다.

C AC F0 RS1 RS0 OV - P

∙ ∙ - - - ∙ - ∙

NOP 1/1

(PC)← (PC) + 1

7 6 5 4 3 2 1 0

0 0 0 0 0 0 0 0

Page 103: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제2장 MCS-51 명령어 93

2.3 명령어 요약

본 절에서는 MCS-51 명령어를 전송 명령어, 산술 연산 명령어, 논리 연산 명령

어, 비트 연산 명령어, 흐름 제어 명령어의 5개 군으로 분류하여 각 명령의 간단

한 기능 명세, 바이트 수, 사이클 수, PSW 플래그 비트 영향 등을 정리하여 보

인다.

표 2.2 전송 명령어

명령어 기 능 B T PSWC AC F0 RS1 RS0 OV - P

MOV A,Rn Move register to A 1 1 ∙ ∙ - - - ∙ - ∙MOV A,direct Move direct byte to A 2 1 ∙ ∙ - - - ∙ - ∙MOV A,@Ri Move indirect RAM to A 1 1 ∙ ∙ - - - ∙ - ∙MOV A,#data Move immediate data to

A 2 1 ∙ ∙ - - - ∙ - ∙MOV Rn,A Move A to register 1 1 ∙ ∙ - - - ∙ - ∙MOV Rn,direct Move direct byte to

register 2 2 ∙ ∙ - - - ∙ - ∙MOV Rn,#data Move immediate data to

register 2 1 ∙ ∙ - - - ∙ - ∙MOV direct,A Move A to direct byte 2 1 ∙ ∙ - - - ∙ - ∙MOV direct,Rn Move register to direct

byte 2 2 ∙ ∙ - - - ∙ - ∙MOV direct,direct Move direct byte to

direct byte 3 2 ∙ ∙ - - - ∙ - ∙MOV direct,@Ri Move indirect RAM to

direct byte 2 2 ∙ ∙ - - - ∙ - ∙MOV direct,#data Move immediate data to

direct byte 3 2 ∙ ∙ - - - ∙ - ∙MOV @Ri,A Move A to indirect RAM 1 1 ∙ ∙ - - - ∙ - ∙MOV @Ri,direct Move direct byte to

indirect RAM 2 2 ∙ ∙ - - - ∙ - ∙MOV @Ri,#data Move immediate data to

indirect RAM 2 1 ∙ ∙ - - - ∙ - ∙MOV DPTR,#data16 Load Data Pointer with

16-bit constant 3 1 ∙ ∙ - - - ∙ - ∙

Page 104: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

94 MCS-51 마이크로컴퓨터

표 2.2 전송 명령어(계속)

명령어 기 능 B T PSWC AC F0 RS1 RS0 OV - P

MOVC A,@A+DPTR Move Code byte relative to DPTR to A 1 2 ∙ ∙ - - - ∙ - ∙

MOVC A,@A+PC Move Code byte relative to PC to A 1 2 ∙ ∙ - - - ∙ - ∙

MOVX A,@Ri Move External RAM (8-bit addr) to A 1 2 ∙ ∙ - - - ∙ - ∙

MOVX A,@DPTR Move External RAM (16-bit addr) to A 1 2 ∙ ∙ - - - ∙ - ∙

MOVX @Ri,A Move A to External RAM (8-bit addr) 1 2 ∙ ∙ - - - ∙ - ∙

MOVX @DPTR,A A Move A to External RAM (16-bit addr) 1 2 ∙ ∙ - - - ∙ - ∙

PUSH direct Push direct byte onto stack 2 2 ∙ ∙ - - - ∙ - ∙

POP direct Pop direct byte from stack 2 2 ∙ ∙ - - - ∙ - ∙

XCH A,Rn Exchange register with A 1 1 ∙ ∙ - - - ∙ - ∙

XCH A,direct Exchange direct byte with A 2 1 ∙ ∙ - - - ∙ - ∙

XCH A,@Ri Exchange indirect RAM with A 1 1 ∙ ∙ - - - ∙ - ∙

XCHD A,@RiExchange low-order Digit indirect RAM with A

1 1 ∙ ∙ - - - ∙ - ∙

Page 105: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제2장 MCS-51 명령어 95

표 2.3 산술 연산 명령어

명령어 기 능 B T PSWC AC F0 RS1 RS0 OV - P

ADD A,Rn Add register to A 1 1 √ √ - - - √ - ∙ADD A,direct Add direct byte to A 2 1 √ √ - - - √ - ∙ADD A,@Ri Add indirect RAM to A 1 1 √ √ - - - √ - ∙ADD A,#data Add immediate data to A 2 1 √ √ - - - √ - ∙ADDC A,Rn Add register to A with Carry 1 1 √ √ - - - √ - ∙ADDC A,direct Add direct byte to A with Carry 2 1 √ √ - - - √ - ∙ADDC A,@Ri Add indirect RAM to A with Carry 1 1 √ √ - - - √ - ∙ADDC A,#data Add immediate data to A with Carry 2 1 √ √ - - - √ - ∙SUBB A,Rn Subtract register from A with Borrow 1 1 √ √ - - - √ - ∙SUBB A,direct Subtract direct byte from A with Borrow 2 1 √ √ - - - √ - ∙SUBB A,@Ri Subtract indirect RAM from A with Borrow 1 1 √ √ - - - √ - ∙SUBB A,#data Subtract immediate data from A with Borrow 2 1 √ √ - - - √ - ∙INC A Increment A 1 1 ∙ ∙ - - - ∙ - ∙INC Rn Increment register 1 1 ∙ ∙ - - - ∙ - ∙INC direct Increment direct byte 2 1 ∙ ∙ - - - ∙ - ∙INC @Ri Increment indirect RAM 1 1 ∙ ∙ - - - ∙ - ∙DEC A Decrement A 1 1 ∙ ∙ - - - ∙ - ∙DEC Rn Decrement register 1 1 ∙ ∙ - - - ∙ - ∙DEC direct Decrement direct byte 2 1 ∙ ∙ - - - ∙ - ∙DEC @Ri Decrement indirect RAM 1 1 ∙ ∙ - - - ∙ - ∙INC DPTR Increment Data Pointer 1 2 ∙ ∙ - - - ∙ - ∙MUL AB Multiply A and B (A x B => BA) 1 4 √ ∙ - - - √ - ∙DIV AB Divide A by B (A/B => A + B) 1 4 √ ∙ - - - √ - ∙DA A Decimal Adjust A 1 1 √ ∙ - - - ∙ - ∙

Page 106: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

96 MCS-51 마이크로컴퓨터

표 2.4 논리 연산 명령어

명령어 기 능 B T PSWC AC F0 RS1 RS0 OV - P

ANL A,Rn AND register to A 1 1 ∙ ∙ - - - ∙ - ∙ANL A,direct AND direct byte to A 2 1 ∙ ∙ - - - ∙ - ∙ANL A,@Ri AND indirect RAM to A 1 1 ∙ ∙ - - - ∙ - ∙ANL A,#data AND immediate data to

A 2 1 ∙ ∙ - - - ∙ - ∙ANL direct,A AND A to direct byte 2 1 ∙ ∙ - - - ∙ - ∙ANL direct,#data AND immediate data to

direct byte 3 2 ∙ ∙ - - - ∙ - ∙ORL A,Rn OR register to A 1 1 ∙ ∙ - - - ∙ - ∙ORL A,direct OR direct byte to A 2 1 ∙ ∙ - - - ∙ - ∙ORL A,@Ri OR indirect RAM to A 1 1 ∙ ∙ - - - ∙ - ∙ORL A,#data OR immediate data to A 2 1 ∙ ∙ - - - ∙ - ∙ORL direct,A OR A to direct byte 2 1 ∙ ∙ - - - ∙ - ∙ORL direct,#data OR immediate data to

direct byte 3 2 ∙ ∙ - - - ∙ - ∙XRL A,Rn Exclusive-OR register to

A 1 1 ∙ ∙ - - - ∙ - ∙XRL A,direct Exclusive-OR direct

byte to A 2 1 ∙ ∙ - - - ∙ - ∙XRL A,@Ri Exclusive-OR indirect

RAM to A 1 1 ∙ ∙ - - - ∙ - ∙XRL A,#data Exclusive-OR immediate

data to A 2 1 ∙ ∙ - - - ∙ - ∙XRL direct A Exclusive-OR A to

direct byte 2 1 ∙ ∙ - - - ∙ - ∙XRL direct,#data Exclusive-OR immediate

data to direct byte 3 2 ∙ ∙ - - - ∙ - ∙CLR A Clear A 1 1 ∙ ∙ - - - ∙ - ∙CPL A Complement A 1 1 ∙ ∙ - - - ∙ - ∙RL A Rotate A Left 1 1 √ ∙ - - - ∙ - ∙RLC A Rotate A Left through

Carry 1 1 √ ∙ - - - ∙ - ∙RR A Rotate A Right 1 1 ∙ ∙ - - - ∙ - ∙RRC A Rotate A Right through

Carry 1 1 √ ∙ - - - ∙ - ∙SWAP A Swap nibbles within A 1 1 ∙ ∙ - - - ∙ - ∙

Page 107: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제2장 MCS-51 명령어 97

표 2.5 비트 연산 명령어

명령어 기 능 B T PSWC AC F0 RS1 RS0 OV - P

CLR C Clear Carry flag 1 1 √ ∙ - - - ∙ - ∙CLR bit Clear direct bit 2 1 ∙ ∙ - - - ∙ - ∙SETB C Set Carry flag 1 1 √ ∙ - - - ∙ - ∙SETB bit Set direct bit 2 1 ∙ ∙ - - - ∙ - ∙CPL C Complement Carry flag 1 1 √ ∙ - - - ∙ - ∙CPL bit Complement direct bit 2 1 ∙ ∙ - - - ∙ - ∙ANL C,bit AND direct bit to Carry

flag 2 2 √ ∙ - - - ∙ - ∙ANL C,/bit AND complement of

direct bit to Carry flag 2 2 √ ∙ - - - ∙ - ∙ORL C,bit OR direct bit to Carry

flag 2 2 √ ∙ - - - ∙ - ∙ORL C,/bit OR complement of direct

bit to Carry flag 2 2 √ ∙ - - - ∙ - ∙MOV C,bit Move direct bit to Carry

flag 2 1 √ ∙ - - - ∙ - ∙MOV bit,C Move Carry flag to

direct bit 2 2 ∙ ∙ - - - ∙ - ∙

주) 표기Rn: Working register R0-R7direct: 128 internal RAM locations, any I/O port, control or status register@Ri: Indirect internal RAM location addressed by register R0 or R1data: 8-bit constant included in instructiondata16: 16-bit constant included in instructionbit: 128 software flags, any I/O pin, control or status bitaddr16: Destination address may be anywhere in 64-kByte program address spaceaddr11: Destination address will be within same 2-kByte page of program address space as first byte of the following instructionrel: 8-bit offset relative to first byte of following instruction (+127, -128)

Page 108: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

98 MCS-51 마이크로컴퓨터

표 2.6 흐름 제어 명령어

명령어 기 능 B T PSWC AC F0 RS1 RS0 OV - P

ACALL addr11 Absolute subroutine call 2 2 ∙ ∙ - - - ∙ - ∙LCALL addr16 Long subroutine call 3 2 ∙ ∙ - - - ∙ - ∙RET Return from subroutine 1 2 ∙ ∙ - - - ∙ - ∙RETI Return from interrupt 1 2 ∙ ∙ - - - ∙ - ∙AJMP addr11 Absolute Jump 2 2 ∙ ∙ - - - ∙ - ∙LJMP addr16 Long Jump 3 2 ∙ ∙ - - - ∙ - ∙SJMP rel Short Jump at relative

address 2 2 ∙ ∙ - - - ∙ - ∙JMP @A+DPTR Jump indirect relative to

DPTR 1 2 ∙ ∙ - - - ∙ - ∙JZ rel Jump if A is Zero 2 2 ∙ ∙ - - - ∙ - ∙JNZ rel Jump if A is Not Zero 2 2 ∙ ∙ - - - ∙ - ∙JC rel Jump if Carry flag is set 2 2 ∙ ∙ - - - ∙ - ∙JNC rel Jump if No Carry flag 2 2 ∙ ∙ - - - ∙ - ∙JB bit,rel Jump if direct Bit is set 3 2 ∙ ∙ - - - ∙ - ∙JNB bit,rel Jump if direct Bit is Not

set 3 2 ∙ ∙ - - - ∙ - ∙JBC bit,rel Jump if direct Bit is set

and Clear bit 3 2 ∙ ∙ - - - ∙ - ∙CJNE A,direct,rel Compare direct to A and

Jump if Not Equal 3 2 √ ∙ - - - ∙ - ∙CJNE A,#data,rel Compare immediate to A

and Jump if Not Equal 3 2 √ ∙ - - - ∙ - ∙

CJNE Rn,#data,relCompare immediate to register and Jump if Not Equal

3 2 √ ∙ - - - ∙ - ∙

CJNE @Ri,#data,relCompare immediate to indirect and Jump if Not Equal

3 2 √ ∙ - - - ∙ - ∙

DJNZ Rn,rel Decrement register and Jump if Not Zero 2 2 ∙ ∙ - - - ∙ - ∙

DJNZ direct,rel Decrement direct byte and Jump if Not Zero 3 2 ∙ ∙ - - - ∙ - ∙

NOP No operation 1 1 ∙ ∙ - - - ∙ - ∙

Page 109: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제3장 KUT51 실습보드 99

제3장 KUT51 실습 보드

본 장에서는 MCS-51 실습을 위한 실습보드 제작에 관련된 사항과 실습 환경 구

축 및 프로그래밍 절차에 대해 언급한다.

3.1 실습 보드 제작

본 절에서는 MCS-51 응용 프로그램을 작성하여 그 동작을 실습하기 위한 실습

보드의 제작 및 사용 방법에 대해서 살펴본다.

3.1.1 부분별 회로

KUT51 실습 보드의 전체 회로도는 [부록 1]을 참조하기 바라며, 여기서는 기능

별로 부분적인 회로도를 제시하면서 간단히 소개한다.

리셋 및 클록발생 회로

[그림 3.1]의 회로도는 리셋 회로와 클록 발생 회로 부분을 보인다.

그림 3.1 리셋 및 클록 발생 회로

Page 110: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

100 MCS-51 마이크로컴퓨터

특히, 8031의 경우 내부 프로그램 메모리가 내장되어 있지 않기 때문에 프로그램

메모리를 위해 외부 ROM을 연결하여야 한다. 이렇듯 외부 프로그램 메모리를

사용하기 위해 핀에 Gnd 신호를 투입하고 있음을 관찰할 수 있다. 만일

8031 대신 내부 ROM을 장착하고 있는 MCU를 사용할지라도 그 영역을 사용하

지 않으려면 동일한 방식을 취하면 된다.

입출력 포트 연결 회로

[그림 3.2]는 일반 목적의 입출력 포트로 사용되는 P1 포트를 커넥터에 연결하는

회로도를 보이며, 이 커넥터에 입출력용 보조 모듈을 연결할 수 있도록 제작되었

다.

각각의 8핀 커넥터상의 핀 용도는 다음과 같다. 각 커넥터의 최상단 핀과 최하단

핀은 연결할 주변 모듈에 전원을 공급하기 위해 각각 Vcc, Gnd를 연결하고, 최

하단 핀 다음의 두 핀 x, y는 연결하지 않으며 나머지 핀들을 차례로 연결한다.

그림 3.2 입출력 포트 연결 회로

외부 메모리 접속 회로

제작할 KUT51 실습 보드는 내부 프로그램 메모리를 사용하지 않고 [그림 3.3]과

같이 외부 프로그램 메모리와 외부 데이터 메모리를 사용한다. 외부 프로그램 메

Page 111: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제3장 KUT51 실습보드 101

모리는 32KB 크기의 27256 EPROM을 사용하며, 주소 범위는 0000H부터

7FFFH까지 사용된다. 이 EPROM에는 ROM 기록 장치를 이용하여 기록된 모니

터 프로그램이 있다. 외부 데이터 메모리로는 32KB 크기의 62256 RAM을 장착

하였으며, 주소는 8000H부터 시작된다. 사용자 프로그램은 이 RAM 영역에 적재

되어 실행되며, 프로그래머는 사용자 프로그램의 소스 작성에서 이점을 고려하여

야한다. 또한 CLCD 등의 주변장치를 위한 주소 공간으로 E000H 이후를 사용하

도록 설계되었다.

그림 3.3 KUT51 실습 보드의 메모리 구조

[그림 3.4]는 제작할 실습 보드에서 메모리 부분 및 CLCD 부분의 회로도를 보여

준다.

Page 112: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

102 MCS-51 마이크로컴퓨터

그림 3.4 외부 메모리 및 CLCD 접속 회로

[그림 3.5]는 [그림 3.4]의 아랫부분에 제시된 주소 디코딩 회로를 정리하여 각 단

자별로 할당된 주소 공간을 보인다.

그림 3.5 외부 디바이스 디코딩 회로

Page 113: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제3장 KUT51 실습보드 103

[표 3.1]은 KUT51 실습 보드에서의 주소 디코딩에 따른 각 영역과의 관계를 보

인 것이다. CLCD 외에 주변 디바이스를 위한 세 개의 단자 J5, J6, J7이 마련되

어 있으며, 이들에 대해 할당된 주소 공간을 확인할 수 있다.

표 3.1 주소 디코딩에 따른 영역

A15 A14 A13 A12 A11 A10-A2 A1 A0 영역 주소 비고0 x x x x x x x ROM 0000H~ 외부ROM1 0 x x x x x x RAM 8000H~ 외부RAM1 1 0 x x x x x 비정의 C000H~1 1 1 0 0 x x x J5 E000H~ IO장치1 1 1 0 1 x x x J6 E800H~ IO장치1 1 1 1 0 x x x J7 F000H~ IO장치1 1 1 1 1 x x x CLCD F800H~ IO장치

시리얼 통신 회로

[그림 3.6]은 MAX232를 이용한 시리얼 통신을 위한 회로 부분과 RS232C DB9

커넥터 연결을 보이고 있다. RS-232C는 음 논리의 신호 레벨을 사용하여 High

신호는 -3V 이하, Low 신호는 +3V 이상으로 규정하고 있다. 따라서 이러한 신

호 레벨을 변환하도록 MAX232 IC를 사용한다.

그림 3.6 시리얼 통신 회로

Page 114: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

104 MCS-51 마이크로컴퓨터

3.1.2 실습 보드 제작

납땜 과정

KUT51 실습 보드의 제작에 소요되는 부품 목록은 [부록 2]를 참조한다. 보드 제

작 과정은 대략 다음의 순으로 납땜을 진행한다.

▪ PCB에 IC 소켓을 각각의 제자리에 인덱스 노치(index notch)를 고려하여

장착한 후, 납땜한다. 이때 소켓을 대각선 부분의 핀을 우선 납땜하고, 후

에 나머지 부분을 납땜하는 것이 바람직하다.

▪ 기타 나머지 부품들 중 긴 다리를 가지는 저항, 세라믹콘덴서 등은 PCB에

밀착하고 뒷면에서 다리를 벌려 고정한다. 납땜 후 나머지 다리를 니퍼로

절단한다.

▪ 극성이 있는 부품인 LED, 전해콘덴서를 납땜할 때는 극성을 고려하여 납

땜한다.

▪ 기타 부품들을 납땜한다.

▪ 끝으로, IC를 각 소켓에 인덱스 노치를 감안하여 삽입한다. 단, 27C256

EPROM은 아래에서 설명하듯이, ROM 기록 장치를 이용하여 모니터 프로

그램을 구워 넣은 후 장착한다.(아래의 모니터 프로그램 굽기 참조)

▪ 서포트(support)를 장착한다.

▪ 다음으로, CLCD에 소켓헤더를 1번부터 14번까지 삽입한 후 납땜하여 실습

보드에 장착한다.

모니터 프로그램 굽기

제반 제작과정이 완료되면 빈 IC 소켓에 해당 IC를 장착하면 된다. 특히, 27256

EPROM은 해당 IC 소켓에 장착하기에 앞서 ROM 기록 장치를 이용하여 모니터

프로그램을 기록하여야 한다. 모니터 프로그램의 소스는 어셈블러와 함께

“KUT51LCD.ASM” 파일([부록 3] 참조)로 존재하며, 이 프로그램을 ASM51 어

셈블러를 이용하여 다음과 같이 컴파일한다.

C:\MCS-51> ASM51 KUT51LCD.ASM

어셈블이 완료되면 [그림 3.7]에서 보듯이 관련 파일들이 생성된다. 생성된 파일

중 "KUT51LCD.HEX"라는 파일이 모니터 프로그램의 목적코드 파일이다. ROM

Page 115: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제3장 KUT51 실습보드 105

기록 장치를 이용하여 27256 EPROM에 이 목적코드 파일을 기록한다. 모니터

프로그램이 저장된 ROM을 KUT51 실습 보드의 ROM 소켓에 장착한다.

그림 3.7 모니터 프로그램의 어셈블 및 생성 파일

3.2 실습 환경 구축

제작된 KUT51 실습 보드의 동작 여부를 검사하거나 사용자 프로그램을 작성하

여 실행하기 위해서 필요한 절차들을 살펴본다.

3.2.1 PC와 실습 보드의 연결

제작된 KUT51 실습 보드의 동작 여부를 검사하거나 사용자 프로그램을 작성하

여 실행하기 위해서는 제작된 실습 보드를 [그림 3.8]과 같이 시리얼 케이블을

이용하여 개인용 컴퓨터의 시리얼 포트와 연결한다.

Page 116: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

106 MCS-51 마이크로컴퓨터

그림 3.8 PC와 KUT51 실습 보드의 연결

여기서, 개인용 컴퓨터는 통신 프로그램이 설치되어 KUT51 실습 보드의 프로그

램 메모리 영역에 적재된 모니터 프로그램의 명령 실행 결과를 확인하거나 명령

을 입력하는 전체 시스템의 단말기 역할을 수행한다. 반면 모든 사용자 프로그램

은 KUT51 실습 보드 상의 외부 데이터 메모리 공간에 적재되어 실행된다.

3.2.2 하이퍼터미널 통신프로그램

제작한 KUT51 실습 보드와 단말기로 사용되는 컴퓨터 간의 시리얼 통신을 위해

MS Windows에서 제공하는 통신 프로그램인 하이퍼터미널(Hyper Terminal)을

이용한다. 아래의 과정은 Windows XP 환경에서의 절차이며, 운영체제 환경이

다른 경우 이를 토대로 진행할 수 있다.

[시작]-[모든 프로그램]-[보조 프로그램]-[통신]-[하이퍼터미널]의 아이콘을 더블

클릭함으로써 하이퍼터미널 통신프로그램을 실행할 수 있으며, [그림 3.9]는 초기

실행 화면을 보인다.

Page 117: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제3장 KUT51 실습보드 107

그림 3.9 하이퍼터미널 초기 실행 화면

하이퍼터미널의 환경 설정 과정을 살펴보자. 초기 화면의 '새 연결'창에 연결이

름 및 아이콘을 적절히 선택함으로써 이후의 KUT51 실습 보드와의 시리얼 통신

을 위한 단축 아이콘을 생성한다. [그림 3.10]은 연결 이름을 'KUT51LCD'로 하

고 적절한 아이콘을 선택한 화면을 보여준다.

그림 3.10 새 연결 화면

'새 연결' 화면에서 확인을 누르면 [그림 3.11]과 같은 '연결 대상' 화면이 나타

Page 118: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

108 MCS-51 마이크로컴퓨터

나고 여기에서 실습 보드를 시리얼 케이블을 통해 연결한 시리얼 포트를 선택하

면 된다. '연결에 사용할 모뎀'항목에서 시리얼 포트를 선택하고 확인을 누른다.

그림 3.11 연결 대상 화면

그러면, 선택된 시리얼 포트에 대한 '포트 설정' 화면이 [그림 3.12]와 같이 나타

난다. 이 화면에서는 시리얼 통신을 위한 속도 및 프레임 관련 정보를 설정한다.

그림 3.12 포트 설정 화면

제작한 KUT51 실습 보드와의 정상적인 통신을 위해서는 '포트 설정' 화면에서

[표 3.2]와 같이 설정하고, '확인'을 누른다. 그러면 하이퍼터미널의 메인 화면이

나타난다.

Page 119: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제3장 KUT51 실습보드 109

표 3.2 시리얼통신 환경 설정

항 목 설 정 비트/초 19200 데이터 비트 8 패리티 없음 정지비트 1 흐름제어 없음

이상으로 보편적인 통신 프로그램의 환경 정보의 설정이 마무리되었다. 하지만

KUT51 실습 보드에서 안정적인 통신을 위해서는 다음의 환경설정을 반드시 해

주어야 한다. 하이퍼터미널의 메인 메뉴에서 [파일]-[속성]메뉴를 선택하고 '설정

'탭을 클릭하면 [그림 3.13]의 왼쪽 그림과 같은 속성 설정 화면이 나타난다. 이

속성 설정 화면의 아랫부분의 'ASCII 설정'항목을 클릭하고, 오른쪽 그림과 같은

'ASCII 설정'화면의 '줄 지연' 항목에 반드시 20ms를 입력하고 확인 버튼을 클

릭한다.

그림 3.13 속성 설정 화면

3.2.3 모니터 프로그램 실행

시리얼 통신을 위한 환경이 설정된 후, KUT51 실습 보드에 전원을 투입하고 리

셋 버튼을 누른다. 이 동작을 통하여 실습 보드는 제반 환경을 초기화하고, 외부

Page 120: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

110 MCS-51 마이크로컴퓨터

프로그램 메모리의 0000H부터 시작되는 모니터 프로그램의 실행을 개시한다.

모니터 프로그램이 실행되게 되면, [그림 3.14]와 같이 하이퍼터미널 화면 내에

여러 라인의 메시지와 KUT51> 프롬프트가 나타난다. 이러한 화면을 볼 수 있다

면 KUT51 실습 보드가 잘 제작되었으며, 이후의 실습에 활용할 수 있다고 볼

수 있다.

그림 3.14 시리얼 모니터 프로그램 실행

KUT51> 프롬프트가 출력되면 모니터 프로그램이 제공하는 내부 명령을 실행할

수 있다. 이들 명령은 사용자 프로그램의 목적 코드를 실습 보드에 업로드하거

나, 메모리 내용을 수정, 확인하는 등의 기능을 수행한다.

KUT51 모니터 프로그램에서 제공하는 내부 명령들의 기능을 [표 3.3]에 나타낸

다. 각 명령은 필요에 따라 주소 혹은 데이터 입력을 요구할 수 있다.

Page 121: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제3장 KUT51 실습보드 111

표 3.3 모니터 프로그램의 내부 명령

내부명령 기 능H 내부명령어 목록 및 도움말(Help)D 100H개 바이트를 덤프(Dump)W 특정외부메모리에 데이터 기록(Write)U 사용자프로그램코드를 KUT51보드로 업로드(Upload)G 사용자프로그램코드의 실행(Go)

H(Help) 명령은 모니터 프로그램에서 제공하는 내부 명령들을 나열하고 이들 명

령에 대한 간단한 도움말을 출력하는 명령이다.

D(Dump) 명령은 외부 프로그램 및 데이터 메모리의 공간의 내용을 출력하는 명

령으로 메모리내의 저장된 내용을 확인할 때 사용한다. 이 명령은 결과를 외부

메모리에 기록하는 사용자 프로그램을 실행하고 그 결과를 확인하거나 외부 메

모리의 내용을 수정하고 이를 확인할 때 주로 사용된다. 한번 수행되면 메모리상

의 16*16 바이트의 내용을 확인할 수 있다.

W(Write) 명령은 외부 데이터 메모리에 특정 주소위치에 특정 데이터를 기록하

는 명령이다. 일반적으로 간단하게 외부 데이터 메모리의 특정 주소의 값을 변경

할 때 사용한다. U(Upload) 명령은 사용자 프로그램을 실습키트의 외부 데이터

메모리에 적재하는 명령이다. G(Go) 명령은 외부 데이터 메모리에 적재된 사용

자 프로그램의 실행을 개시하는 명령이다.

이들 모니터 프로그램의 내부 명령의 활용은 3.4 절에서 보다 자세히 설명하도록

한다.

3.3 Keil uVision IDE

본 절에서는 산업체에서 주로 사용하는 MCS-51 MCU를 위한 어셈블러 및 컴파

일러인 Keil 사의 µVision3 툴 설치 및 사용법을 살펴본다. Keil 사의 µVision3은

소프트웨어 통합 개발 환경으로 편집기, 프로젝트 매니저 등의 기능들을 제공하

며, 소프트웨어 개발 사이클은 [그림 3.15]와 같다.

Page 122: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

112 MCS-51 마이크로컴퓨터

그림 3.15 µVision3 소프트웨어 개발 사이클

3.3.1 KEIL PK51 설치

CD 드라이브에 설치 CD를 넣고, [그림 3.16]과 같은 화면에서 'setup.exe' 아이

콘을 클릭하여 설치를 시작한다.

Page 123: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제3장 KUT51 실습보드 113

그림 3.16 설치 CD 내용 화면

[그림 3.17]과 같은 개발 툴 설치 화면이 나타난다. 이 화면에서 [C51 Compiler

& Tools] 메뉴를 선택하여 MCS-51 MCU를 위한 개발 툴의 설치를 시작한다.

그림 3.17 개발 툴 설치 화면

설치를 시작하기에 앞서 환영 메시지 화면이 나타나면, 'Next'를 클릭한다. 그리

고, [그림 3.18]과 같은 '라이센스 동의' 화면이 나타나면 하단의 체크박스에 체

크하고 'Next'를 클릭한다.

Page 124: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

114 MCS-51 마이크로컴퓨터

그림 3.18 라인센스 동의 창

[그림 3.19]의 '폴더 선택' 창에서 설치할 폴더의 경로 및 폴더명을 입력한다. 기

본적으로 내정된 설치 폴더는 C:\Keil로 지정되어 있다. 설치 폴더의 입력이 완

료되었으면 'Next'를 클릭한다.

그림 3.19 설치 폴더 선택 창

다음으로, [그림 3.20]과 같은 '고객 정보' 창이 나타나면, 빈 곳에 적절히 입력한

후 'Next' 클릭한다. 그러면 설치가 진행된다.

Page 125: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제3장 KUT51 실습보드 115

그림 3.20 고객 정보 창

[그림 3.21]은 설치가 진행되는 가운데 나타나는 설치 상태 창을 보여준다.

그림 3.21 설치 상태 창

설치가 완료되면 [그림 3.22]와 같은 설치 종료 창이 나타난다. 이 화면에서

'Finish'를 클릭한다.

그림 3.22 설치 종료 창

Page 126: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

116 MCS-51 마이크로컴퓨터

설치가 완료된 후, 바탕화면에 'Keil uVision' 아이콘이 생성된다. 이 후 소스를

편집하거나 어셈블 혹은 컴파일 할 때 이 아이콘을 클릭하여 사용하면 된다.

3.3.2 어셈블리 프로그래밍 절차

운영체제의 [시작]-[모든 프로그램]에서 혹은 바탕화면의 Keil uVison3 아이콘을

클릭하여 실행하면 [그림 3.23]과 같은 초기 실행 화면이 나타난다.

그림 3.23 초기 실행 화면

프로젝트 파일 생성

우선 프로젝트 파일을 생성하여야 한다. [그림 3.24]와 같이 [Project]-[New

uVision Project] 메뉴를 클릭한다.

Page 127: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제3장 KUT51 실습보드 117

그림 3.24 새 프로젝트 생성 메뉴

프로젝트 파일의 저장 위치와 파일 명의 입력 창이 [그림 3.25]와 같이 나타난다.

'저장위치'에서 적절한 작업 폴더를 선택한다. 사용자는 자신의 작업 폴더를 작

성하여 사용하는 것이 파일 관리에 도움이 될 것이다. 파일 이름 항목에 프로젝

트 이름을 입력한다. 프로젝트 파일의 기본 확장자는 .uv2다. 본 절에서는 예시를

위해 프로젝트 명으로 'TEST'를 사용하기로 하자. 작업 폴더 및 프로젝트 명이

입력되었으면 '저장' 버튼을 클릭한다.

그림 3.25 프로젝트 파일명 입력 창

다음으로, 해당 프로젝트 파일을 위한 디바이스 선택 창이 [그림 3.26]과 같이 나

Page 128: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

118 MCS-51 마이크로컴퓨터

타난다.

그림 3.26 디바이스 제조사 선택 창

이 창에는 다양한 제조사들이 나열되어 있으며, 이 중 'Intel' 디바이스를 선택하

고, [그림 3.27]과 같이 Intel사가 제공하는 모델 중 실습 보드에 장착한

'8031AH' 모델을 선택한다.

그림 3.27 특정 모델 선택 창

다음으로, [그림 3.28]과 같이 표준 스타트업 코드 파일 복사 및 추가 질의 창이

나타난다. 일단 어셈블리 소스를 작성할 때는 '아니오'를 선택한다. 하지만 C51

소스를 작성할 때, 특히 인터럽트를 취급할 경우 스타트업 코드 파일이 추가 될

Page 129: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제3장 KUT51 실습보드 119

수 있도록 선택해야 한다.

그림 3.28 스타트업 코드 복사 및 추가 질의 창

이와 같은 과정을 거쳐 특정 MCU를 위한 프로젝트 파일을 생성하게 된다. 지금

까지의 작업을 통해 'TEST'라는 프로젝트가 생성된 것을 [그림 3.29]에서 확인

할 수 있다. 화면의 캡션 바에 있는 프로젝트 명과 화면 좌측의 프로젝트 워크스

페이스에 항목이 추가된 것을 확인할 수 있다.

그림 3.29 프로젝트 생성 결과 화면

어셈블리 소스 파일 생성 및 추가

[그림 3.30]에서 보듯이 소스 파일을 작성하려면 [File]-[New] 메뉴를 클릭한다.

Page 130: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

120 MCS-51 마이크로컴퓨터

그림 3.30 새 파일 생성 메뉴

[그림 3.31]과 같이 소스 편집창이 나타나면 어셈블리 소스를 작성한다. 혹은 미

리 적당한 파일명으로 저장하고 나서 편집하여도 좋다.

그림 3.31 어셈블리 소스 파일 작성 화면

[그림 3.32]와 같이 [File]-[Save] 메뉴를 클릭한다.

Page 131: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제3장 KUT51 실습보드 121

그림 3.32 파일 저장 화면

그러면 [그림 3.33]과 같은 저장할 파일명 입력 화면이 나타난다. 이 화면에서 파

일명으로 'TEST.ASM'을 입력하여 저장한다. 여기서 파일명을 표기할 때 어셈

블리 소스이므로 확장자를 .ASM으로 하여 저장한다.

그림 3.33 저장 파일명 입력 화면

[그림 3.34]는 명기된 파일명으로 저장한 후의 화면을 보여준다.

Page 132: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

122 MCS-51 마이크로컴퓨터

그림 3.34 파일 저장 후의 화면

소스 파일을 프로젝트에 추가

[그림 3.35]와 같이 화면 좌측의 프로젝트 워크스페이스 창에서 [Target1]을 클릭

하면 [Source Group 1]이 나타나며, 이 위에서 마우스 오른쪽 버튼을 클릭한다.

그림 3.35 프로젝트에 파일 추가 화면

Page 133: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제3장 KUT51 실습보드 123

[그림 3.36]과 같은 추가할 파일 선택 창이 나타나면, 추가할 어셈블리 소스 파일

을 선택한 후, 'Add' 버튼을 클릭한다. 이 과정을 반복함으로써 여러 개의 소스

파일을 프로젝트에 추가할 수 있다. 더 이상 추가할 것이 없을 경우 'close' 버튼

을 클릭한다.

그림 3.36 추가할 파일 선택 창

[그림 3.37]과 같이 좌측 프로젝트 워크스페이스 창에서 어셈블리 소스 파일이

추가 된 것을 확인할 수 있다.

그림 3.37 파일이 추가된 프로젝트 창

Page 134: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

124 MCS-51 마이크로컴퓨터

빌드 옵션 설정

이제 어셈블을 하기 위해 필요한 옵션을 설정할 단계이다. 어셈블에 필요한 옵션

을 설정하려면 [그림 3.38]과 같이 [project]-[Options for Target 'Targer 1'] 메

뉴를 클릭한다.

그림 3.38 어셈블 옵션 설정 메뉴 화면

Options for Target 'Targer 1'옵션 설정 화면이 나타나면, [그림 3.39]와 같이

'Target' 탭을 선택한다. 특히, 'Off-Chip Code Memory'항의 시작 주소 항목을

유의한다. 만일 어셈블리 소스에서 ORG 의사 명령을 사용하여 코드의 시작 주

소를 8000H로 지정할 수 있다면, 이 항목은 비워둬도 좋다. 하지만 ORG 의사

명령을 사용하지 않는 경우 'Start'항에 '0x8000' 주소를 설정한다. 이렇게 함으

로써 실습 보드에 적재시 8000H번지부터 적재될 수 있도록 소스 코드를 어셈블

하게 된다.

Page 135: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제3장 KUT51 실습보드 125

그림 3.39 Target 탭의 코드 메모리 시작 주소 설정 창

다음으로 [그림 3.40]과 같이 'Output' 탭을 선택한 후, 반드시 'Create HEX

File'항목을 체크 표시 한다. 그리고 '확인'버튼을 클릭한다. 이는 어셈블 후 목적

코드 파일로 HEX 형식의 파일을 생성함을 의미한다. 이렇게 하여 생성된 HEX

파일이 실습보드에 업로딩될 목적 코드 파일이다.

그림 3.40 Output 탭의 HEX 파일 생성 설정 창

끝으로, [그림 3.41]과 같이 'A51' 탭의 중간 부분에 있는 'Special Function

Registers'의 이름 정의 항목에 체크가 되었는지 확인한다. 체크가 되어 있어야

특수 기능 레지스터들의 이름을 자유롭게 사용할 수 있다. 그렇지 않으면 SFR

이름과 주소가 정의된 파일을 프로그램 소스에 삽입하거나, 프로그램 소스에서

Page 136: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

126 MCS-51 마이크로컴퓨터

정의해야 한다.

그림 3.41 A51 탭의 SFR명 정의 설정 창

소스 어셈블

소스 파일을 어셈블하려면, [그림 3.42]에서 보여주듯이 [Project]-[Build target]

혹은 [Rebuild all target files] 메뉴를 클릭하여 소스를 어셈블한다.

그림 3.42 어셈블 메뉴

Page 137: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제3장 KUT51 실습보드 127

어셈블이 진행되고, [그림 3.43]에 보이듯이 하단의 메시지 창에 '오류 없음'의

메시지를 확인한다면, 문법적인 오류 없이 소스 어셈블이 완료되었음을 의미한

다.

그림 3.43 어셈블 결과 화면

[그림 3.44]에서 어셈블 결과로 생성된 파일들의 목록을 확인할 수 있다. 생성된

파일들중 HEX 파일인 'TEST.hex' 파일은 실습 보드에 통신 프로그램을 통해

업로드할 목적 코드 파일이다.

그림 3.44 어셈블을 통해 생성된 파일들

Page 138: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

128 MCS-51 마이크로컴퓨터

리스트 파일인 'TEST.LST' 파일은 [그림 3.45]와 같은 텍스트 파일로 우측에

소스 코드, 좌측에는 메모리에 적재될 때의 메모리 주소와 번역된 머신 코드가

나열된다.

그림 3.45 리스트 파일의 구성

3.4 소스 작성, 어셈블 및 실행

일반적으로 컴퓨터는 CPU에 따라 고유 형식의 언어를 가지고 있으며, 프로그램

이 CPU에서 실행되기 위해서는 이러한 전용의 언어로 바뀌어야 한다. 프로그래

밍 언어에 있어서는 가장 낮은 수준의 언어를 기계어(machine language)라 하며,

기계어는 컴퓨터가 이해할 수 있는 유일한 언어이다. 기계어는 2진수로 나타내

며, 일반적으로 인간은 2진수 대신에 16진수를 사용한다. 그러나 인간이 2진수

또는 16진수 형태의 기계어를 사용하여 프로그래밍하기에는 너무 불편하므로, 일

상생활에서 사용하는 문자들을 사용하여 기계어에 직접 대응하는 기호화된 언어

를 사용한다. 이러한 기호화된 언어를 어셈블리 언어(assembly language)라 하

며, 기계어와 1대 1 대응하므로 마이크로프로세서에 따라 고유의 어셈블리 언어

Page 139: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제3장 KUT51 실습보드 129

가 존재한다. 어셈블리 언어로 작성된 프로그램이 실행되기 위해서는 기계어로

번역되어야 하고, 이 번역 과정을 어셈블(assemble)이라 한다. 이러한 어셈블리

언어의 프로그램을 어셈블하는 소프트웨어를 어셈블러(assembler)라 한다. 어셈

블리 언어로 작성된 프로그램을 원시(source) 프로그램이라 하고, 어셈블러에 의

해 번역된 프로그램을 목적(object) 프로그램이라 한다. 그러나 일반적으로 목적

프로그램은 바로 실행될 수 없고, 링커(linker)에 의해 실행(execute) 프로그램으

로 바뀌어야 실행 가능한 프로그램이 된다.

사용자는 우선, 프로그램의 소스를 작성하고, 작성한 소스 프로그램을 어셈블러

를 사용하여 컴파일 한 후, 생성된 목적 코드 파일을 실습 보드에 적재하여 실행

한다. 이 절에서는 DOS 실행 모드에서 실행되는 Metalink사의 8051

Cross-Assembler v.12i를 어셈블러로 사용한다는 전제 하에, 프로그램 개발 절차

에 대해 살펴본다. 이 어셈블러는 KUT51LCD 모니터 프로그램을 어셈블할 때

사용한 프로그램이다.

3.4.1 소스 프로그램 작성

프로그램 소스 작성은 텍스트를 편집할 수 있는 어떠한 편집기를 사용해도 무방

하다. 어셈블리 소스 파일의 확장자는 관례적으로 .ASM으로 한다. 독자의 시스

템 환경이 Windows라면 '메모장'을 사용하여 작성하여도 좋다.

모든 프로그래밍 언어는 각각 고유의 문법이 존재하며, 어셈블리 언어 역시 마찬

가지다. 또한 어셈블리 언어의 문법은 어셈블러의 개발사에 따라 조금씩 차이가

있을 수 있다. 일반적으로 어셈블리 소스 프로그램은 [그림 3.46]에서 보듯이 레

이블, 니모닉 코드 및 피연산자, 주석의 3개 영역으로 구성된다.

Page 140: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

130 MCS-51 마이크로컴퓨터

그림 3.46 소스 프로그램의 구성

레이블

프로그램 중에 기호 주소(symbolic address)를 지정할 필요가 있을 때 사용한다.

프로그램의 작성 과정에서 레이블(label)을 통하여 특정 위치를 지정할 수 있으

며, 프로그램의 분기 또는 점프할 곳의 어드레스 대신에 사용되거나, 기억장소의

어드레스 혹은 이름 또는 상수 값의 이름으로 사용된다. 이러한 레이블은 프로그

램 작성 때에 반드시 첫 칼럼부터 기술해야 하며, 일반적으로 영문자로 시작하는

문자열로 작성한다. 그러나 MCS-51 명령어와 어셈블러의 의사명령어로 사용된

문자열은 레이블로 사용하지 말아야 한다. 레이블의 끝은 콜론(:) 혹은 공백을 두

어 다음의 영역과 구분한다. 어셈블된 기계어 프로그램에서 모든 레이블은 어드

레스 혹은 데이터로 변환된다.

니모닉 코드와 피연산자

니모닉 코드(mnemonic code)는 명령어의 동작을 지시하는 부분이며, 필요에 따

라 명령어 수행에 필요한 피연산자를 동반하기도 한다. OP 코드는 문법상 첫 칼

럼을 제외한 어떠한 칼럼에 위치하여도 무방하지만, 일반적으로 레이블 영역 이

후에 위치하는 것이 바람직하다.

Page 141: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제3장 KUT51 실습보드 131

피연산자(operand)는 명령어의 동작을 지시하는 OP 코드의 연산 대상 또는 목적

이 되는 부분으로 명령에 따라 1개, 2개 혹은 생략되는 경우가 있다. 문법적으로

OP 코드와 피연산자 사이는 하나 이상의 공백이 있어야 하며, 두 개의 피연산자

간에는 콤마(,)를 두어 각각의 피연산자를 구분한다. 피연산자로 사용되는 즉치의

표기방법은 16진수의 경우는 H를, 10진수는 기호없이 혹은 D를, 2진수의 경우는

B문자를 즉치의 후미에 덧붙인다.

이외에 어셈블러 지시어라고 불리는 의사 명령어(pseudo command)가 있다. 의

사 명령어는 실행단계에서는 무의미한, 즉 실행에는 어떠한 영향도 주지 않으면

서 어셈블 과정에서 유용하게 활용되는 명령어다. 의사 명령어에는 다음과 같은

명령어들이 있다.

ORG(origin)

ORG 다음에 오는 명령의 시작주소를 지정하는 의사 명령어로, 어셈블러에게

절대 주소를 지정하기 위해서 사용된다. 다음의 코드 예에서 MOV 명령에 대

응하는 머신 코드의 첫 바이트가 8000H 번지에 위치하도록 번역된다.

ORG 8000HMOV A,#0FFH

EQU(equate)

특정 레이블에 데이터나 어드레스의 상수를 지정하기 위해 사용되며, 레이블

자체가 지정된 값을 가지므로 메모리를 차지하지는 않는다. 다음의 코드 예는

소스에서 MONITOR로 기술된 부분을 0000H로 대체하여 번역한다.

MONITOR EQU 0000H

DATA

8비트 길이의 주소대신 사용할 기호를 정의하는 명령어다. 다음의 예는 90H

번지를 지정하기 위해 기호 P1을 사용할 수 있도록 정의하는 것이다.

P1 DATA 090H

Page 142: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

132 MCS-51 마이크로컴퓨터

BIT

비트 주소지정 영역의 비트 주소대신 사용할 기호를 정의하는 명령어로, 다음

의 예는 비트 주소 088H대신 IT0라는 기호를 사용할 수 있도록 정의하는 것

이다.

IT0 BIT 088H

DB(define byte)

레이블 또는 어드레스로 지정할 수 있는 1바이트의 메모리를 확보하며, 확보

된 메모리에는 임시의 데이터를 기억시킬 수 있다.

SRC: DB 10H

DW(define word)

DB 의사 명령어와 유사한 성격의 의사 명령어이나 1워드(2바이트)의 메모리

를 확보하여 데이터를 기억시킬 수 있다.

RES: DW 00H, 00H

DS(define storage)

바이트 수를 지정하여 메모리를 확보하는 의사 명령어로 임의 데이터로 초기

화할 수 없다. 레이블 또는 어드레스로 확보된 메모리를 사용할 수 있다.

RES: DS

END

프로그램의 끝을 나타내는 의사 명령어로 실행의 끝을 나타내는 것이 아니라

어셈블 과정에서 프로그램 소스 코드의 끝임을 나타낸다. 따라서 END 이후에

나열된 명령어는 어셈블 과정에서 번역되지 않는다.

주석

주석(comment)은 프로그램의 전체적인 설명 및 각 명령어에 대하여 조건 또는

분석에 도움을 주기 위한 필요 정보를 표기하는 영역으로, 프로그램의 실행에는

Page 143: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제3장 KUT51 실습보드 133

무관하나 문서화하는 과정에서 필요한 부분이다. 어셈블러에 의해 번역되지 않는

부분이므로 반드시 필요한 부분은 아니나 충분히 활용하는 것이 바람직하다. 문

법적으로 주석 부분은 어느 칼럼에서든 시작될 수 있으며, 반드시 세미콜론(;) 문

자를 시작으로 하여 작성해야 한다. 어셈블러는 번역시 세미콜론 이후부터 그 라

인의 끝까지를 주석으로 간주하여 번역에서 제외한다.

실습 보드용 소스 작성시 주의점

특히, 제작된 KUT51 실습 보드를 통해 실행할 MCS-51 소스 프로그램을 작성

할 때 유의하여야 할 점들이 있다. 우선 앞에서 제작 실습 보드의 메모리 구성을

살펴보았듯이 사용자 프로그램은 실행을 위해 외부 데이터 메모리에 적재되어야

한다. 따라서 사용자 프로그램을 어셈블할 때, 머신 코드의 시작 주소는 외부 데

이터 메모리의 시작 주소와 동일하거나 커야 한다. 즉, 사용자 프로그램을 작성

할 때, 통상 다음과 같은 의사 명령을 사용하여 첫 명령이 8000H에 위치하도록

하여야 한다.

ORG 8000H ; 사용자 프로그램의 시작주소

또한, 사용자 프로그램의 실행 제어 흐름에 있어서 마지막 명령은 모니터 프로그

램이 실행될 수 있도록 하여야 한다. 즉, 다음과 같은 명령을 실행 흐름의 마지

막에 작성함으로서 사용자 프로그램의 실행이 완료된 후 모니터 프로그램이 실

행되도록 하고, 모니터 프로그램이 제공하는 내부 명령을 이용하여 실행 결과를

확인할 수 있도록 작성하여야 한다.

JMP 0000H ; 모니터 프로그램으로

또한, ASM51 어셈블러를 사용할 때 보조적으로 사용되는 'MOD51' 파일이 있

다. 'MOD51' 파일 내용의 일부를 [그림 3.47]에 보인다.

Page 144: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

134 MCS-51 마이크로컴퓨터

그림 3.47 MOD51 파일의 일부

이 파일은 각 SFR의 명칭과 그 절대 주소 그리고 비트 주소가 가능한 SFR의

비트 명칭과 그 비트 주소가 DATA, BIT 의사 명령어를 이용하여 정의되어 있

다. 따라서 소스 프로그램의 선두에 다음과 같은 라인을 추가하여 작성하면, 어

셈블할 때 'MOD51' 파일을 참조하여 해당 명칭들을 절대 주소로 바꾸어 준다.

$MOD51

3.4.2 소스 어셈블

여기서는 실습 보드를 제작할 때 ROM에 퓨징한 모니터 프로그램을 번역할 때

사용한 매크로 어셈블러의 사용을 통해 어셈블하는 과정을 보인다. 이 어셈블러

는 파일 크기가 작아 간편히 어셈블할 수 있어 유용하다.

소스 프로그램이 작성되면 ASM51 어셈블러를 이용하여 머신 코드로 어셈블한

다. 앞에서 작성된 소스 프로그램 'TEST.ASM'을 어셈블하는 명령은 다음과 같

다.

Page 145: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제3장 KUT51 실습보드 135

C:\MCS-51> ASM51 TEST.ASM

위 명령의 실행으로 소스 프로그램의 문법적인 오류 및 번역과정을 수행한다. 문

법적인 오류가 없다면 확장자가 .LST인 리스트 파일과 .HEX인 목적 코드 파일

이 생성된다. 문법적인 오류가 없다면 [그림 3.48]에 보이듯이 오류가 없다는 메

시지를 출력하면서 관련 파일들을 생성하며, 그렇지 않은 경우는 오류 메시지를

보내게 된다. 오류 메시지가 있게 되면 리스트 파일을 참조하여 오류를 수정하여

야 한다.

그림 3.48 ASM51 어셈블 및 생성 파일

어셈블 과정을 통하여 문법적인 오류가 발생하지 않았다면, [그림 3.48]과 같이

리스트 파일 'TEST.LST'와 목적 코드 파일 'TEST.HEX'이 생성된다. 목적 코

드인 'TEST.HEX' 파일은 실습 보드의 외부 데이터 메모리에 업로드되어 실행

될 파일이다. 생성된 리스트 파일인 'TEST.LST' 파일은 [그림 3.49]와 같이 우

측에는 프로그램 소스가 나타나고, 좌측에는 해당 명령에 대한 메모리 주소 및

머신 코드로 구성된다.

Page 146: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

136 MCS-51 마이크로컴퓨터

그림 3.49 리스트 파일

3.4.3 목적 코드 적재 및 실행

어셈블 과정을 통하여 생성된 목적 코드 파일을 실행을 위해 외부 데이터 메모

리에 적재된 후, 실행되어야 한다. 어셈블 과정을 통하여 생성된 목적 코드 파일

을 실행을 위해 외부 데이터 메모리에 적재하는 과정을 목적 코드의 업로딩이라

한다. 이는 전체 시스템에서 단말기인 개인용 컴퓨터 상의 목적 코드 파일을 실

습 보드에 적재하는 것이다.

이러한 목적 코드 파일인 HEX 파일의 내부 구조는 [그림 3.50]과 같이 데이터

레코드와 EOF 레코드로 구성되며, 각 데이터 레코드는 16 바이트의 데이터와 기

타의 적재할 주소, 전송오류 검사를 위한 부가 바이트 등으로 구성된다.

Page 147: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제3장 KUT51 실습보드 137

그림 3.50 HEX 파일의 구조

그림 3.51 목적 코드의 업로딩

목적 코드의 업로딩을 위해서는 통신 프로그램이 실행 중에 있어야 하며, [그림

Page 148: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

138 MCS-51 마이크로컴퓨터

3.51]과 같이 KUT51> 프롬프트에서 U(upload) 명령을 실행한다. 그런 후, 메뉴

의 [전송]-[텍스트파일 보내기]를 선택하고 이 화면에서 업로드할 Hex 파일을 선

택하면 업로드 과정을 보인 후 프롬프트가 나타난다.

그러면 업로딩 과정이 성공하였다고 볼 수 있으며, 업로딩 결과를 확인하기 위해

서는 [그림 3.52]와 같이 외부 데이터 메모리 영역의 내용을 출력하는 내부 명령

D를 사용한다. [그림 3.52]에서 역상으로 표시된 부분이 메모리에 적재된

'TEST.HEX'의 머신 코드 부분이다.

그림 3.52 적재된 목적 코드

적재된 사용자 프로그램을 실행하려면 [그림 3.53]과 같이 내부 명령 G를 사용하

면 된다. 이때 사용자 프로그램의 시작 주소를 적절히 설정할 필요가 있다. 프로

그램 코드는 8000H번지부터 적재되어 있으므로, 8000H를 시작 주소로 입력한다.

만일 순차적으로 수행되는 사용자 프로그램의 경우 실행을 완료한 후 마지막 명

령에 의해 모니터 프로그램이 수행될 것이므로, KUT51> 프롬프트가 나오게 된

다.

Page 149: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제3장 KUT51 실습보드 139

그림 3.53 사용자 프로그램 실행

그림 3.54 결과 확인 화면

Page 150: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

140 MCS-51 마이크로컴퓨터

데이터 메모리 영역에 결과를 기록하는 사용자 프로그램이라면 기록된 결과를

확인하기 위해 [그림 3.54]와 같이 내부 명령 D를 사용하여 그 결과를 확인할 수

있다. 물론 확인하기 위한 시작 주소를 설정하여야 한다.

예제 프로그램은 두 값을 더하여 80F0H번지에 그 결과를 기록하며, [그림 3.54]

의 역상 부분을 통하여 그 실행 결과를 확인할 수 있다.

3.5 실습과제

[실습1] KUT51 실습보드의 동작 검사 및 프로그래밍 절차 숙지

다음의 소스 프로그램은 2개의 데이터 합을 계산하는 프로그램이다. 세부적인 내

용은 추후 살펴보고, 일단 소스를 작성하여 어셈블하고 업로딩하여 실행 결과를

확인함으로써 KUT51 메인보드의 정상 동작과 프로그래밍 절차를 숙지한다.

;=================================

; TEST_MAIN.ASM

; Addition of two data

;=================================

$MOD51

ORG 8000H

MONITOR EQU 0000H ; 모니터 프로그램의 시작주소

;

START:

MOV R0,#20H ; OP1

MOV R1,#30H ; OP2

MOV A,R0

ADD A,R1 ; 덧셈

MOV DPTR,#RES

MOVX @DPTR,A ; 결과 저장

JMP MONITOR ; 모니터 프로그램으로

ORG 80F0H

RES: DB 00H ; 결과

Page 151: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제3장 KUT51 실습보드 141

END

[실습2] 입출력 모듈의 동작 검사

아래의 소스는 자체 제작한 LED 모듈과 버튼스위치 모듈의 정상적인 동작을 검

사하기 위한 프로그램이다. 버튼 스위치를 누르면 대응하는 LED가 ON되는 프로

그램이다. 단, LED 모듈은 P1의 하위니블 위치에, 버튼스위치 모듈은 P1의 상위

니블 위치에 연결한다.

;================================

; TEST_IO.ASM

; P1.L : LED MODULE

; P1.H : BUTTON MODULE

;================================

$MOD51

ORG 8000H

;

MOV P1,#0FFH ; CLEAR

;

LOOP: MOV A,P1 ; IN

SWAP A

ORL A,#0F0H

MOV P1,A ; OUT

SJMP LOOP

;

END

[실습3] 모니터 프로그램 내부명령

앞의 [표 3.3]을 참조하여 모니터 프로그램에서 제공하는 내부 명령들의 사용법

을 숙지한다.

[실습4] 예제 프로그램 분석 및 변경

앞의 [실습1]의 예제 프로그램을 분석하고, 데이터 및 연산 결과 저장 위치를 변

경하여 결과를 확인한다.

Page 152: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

142 MCS-51 마이크로컴퓨터

Page 153: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제4장 기초 연산 명령 143

제4장 기초 연산 명령

본 장에서는 기본 연산을 위해 사용되는 MCS-51 명령들에 대해 살펴보고, 이들

을 이용한 관련 응용 과제를 제시한다. 아래에서 전송 명령, 산술 연산 명령, 논

리 연산 명령, 회전 명령, 교환 명령, 비트 연산 명령들에 대해 살펴본다.

각각 지원되는 명령 형태를 제시하면서 사용하는 약어에 대해 살펴보면 다음과

같다. #data는 8비트의 즉치 데이터를 의미하며, 반드시 선두에 #을 앞세우며 진

법을 표시하기 위해 후미에 B, O, D, H를 붙일 수 있다.

#01010111B ; 2진수#247O ; 8진수#99 혹은 #99D ; 10진수#99H ; 16진수#0FFH ; A,..F로 시작되는 16진수

#data16은 16비트의 즉치를, direct는 직접 주소를 의미하며, Rn은 현재 선택된

레지스터 뱅크 내의 8개 레지스터 R7, R6, ..., R0를 의미한다. @Ri는 레지스터

뱅크 내의 R0, R1을 간접 주소 지정한 것을 나타낸다.

4.1 전송 명령

데이터 전송 명령에는 대상 메모리 공간에 따라 세 가지 명령이 지원된다. 내부

데이터 메모리간의 데이터 전송에는 MOV 명령이 사용되며, 내부 데이터 메모리

와 외부 메모리간, 외부 메모리와 외부 메모리간 전송 명령으로 MOVX 명령이

사용된다. 즉, 외부의 프로그램 메모리나 데이터 메모리가 데이터 근원지나 목적

지로 사용될 때는 필히 MOVX 명령을 사용하며, 그렇지 않은 경우만 MOV 명

령을 사용한다. 끝으로, 프로그램 메모리는 ROM이 사용되므로 이러한 메모리로

부터 판독의 기능만을 제공하는 MOVC 명령이 지원된다. 다음은 전송 명령의

사용 예를 보이고 있다.

Page 154: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

144 MCS-51 마이크로컴퓨터

MOV A,#40H ; A <- 40HMOVX @DPTR,A ; (DPTR) <- AMOVC A,@A+DPTR ; A <- ((A)+DPTR)

위의 명령 사례에서 #40H는 즉치를 나타내는 것으로 #을 생략하면 전혀 다른 의

미를 나타내므로 주의한다. 즉, 다음과 같이 사용하면 내부 데이터 메모리의 40H

주소 내용을 ACC로 전송하는 것이다.

MOV A,40H ; A <- (40H)

특히, MCS-51 MCU에서는 메모리 맵드 입출력(Memory mapped I/O) 방식을

사용하므로, 입출력 명령을 별도로 지원하지 않는다. 따라서 입출력 포트로 데이

터를 입출력할 때에도 데이터 전송 명령을 사용한다. 다음의 전송 명령은 입출력

포트 P1에 출력 및 입력하는 기능을 제공한다.

MOV P1,#0FFH ; 출력MOV A,P1 ; 입력

4.1.1 내부 데이터 메모리간의 전송 명령

내부 데이터 메모리간의 전송 명령으로는 다음과 같은 명령들이 지원되며, 모두

MOV 명령을 사용한다.

MOV A,#dataMOV A,directMOV A,@RiMOV A,Rn

MOV Rn,AMOV Rn,#dataMOV Rn,direct

MOV @Ri,A

Page 155: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제4장 기초 연산 명령 145

MOV @Ri,#dataMOV @Ri,direct

MOV direct,AMOV direct,#dataMOV direct,RnMOV direct,@RiMOV direct,directMOV DPTR,#data16

내부 데이터 메모리의 내용을 간접주소지정 방식에 의해 전송하는 경우에 간접

주소 지정으로 사용할 수 있는 범용 레지스터는 레지스터 뱅크 내의 R0와 R1뿐

이다. 다음 명령의 예는 ACC의 내용을 R0에 의해 간접 지정되는 주소로 전송하

는 명령이다.

MOV @R0,A

4.1.2 외부 데이터 메모리와의 전송 명령

외부 메모리 영역의 내용을 간접주소지정 방식으로 전송하는 경우라면 다음과

같이 DPTR을 이용하거나 포트 P2와 범용 레지스터 R0, R1을 이용할 수 있다.

MOVX A,@DPTR ; 판독MOVX A,@R0MOVX A,@R1

MOVX @DPTR,A ; 기록MOVX @R0,AMOVX @R1,A

다음은 DPTR을 이용한 간접 주소지정 방식을 사용하여 데이터를 읽어 들이는

코드로, 외부 메모리 8020H 주소에 있는 데이터를 ACC에 전송하는 코드이다.

Page 156: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

146 MCS-51 마이크로컴퓨터

MOV DPTR,#8020HMOVX A,@DPTR ; A <- (8020H)

반면, R0와 R1을 이용하는 경우라면 다음과 같이 사용할 수 있다. R0와 R1을 이

용하는 경우 외부 램의 주소지정을 위해 상위 바이트의 값은 P2에 미리 설정하

고 R0와 R1은 하위 바이트에 해당하는 값을 설정하여 외부 데이터 메모리의 주

소를 지정할 수 있다. 다음은 R1을 이용한 간접주소지정에 의해 8020H 주소에

A의 내용을 저장하는 코드이다.

MOV P2,#80H ; 주소의 상위 바이트(페이지 번호)MOV R1,#20H ; 주소의 하위 바이트MOVX @R1,A ; 8020H주소에 A값을 기록

4.1.3 프로그램 메모리와의 전송 명령

프로그램 메모리와의 전송 명령은 다음과 같은 형태로 사용된다. 프로그램 메모

리는 읽기만 가능하므로 해당 명령은 지시되는 위치의 내용을 읽어내기만 할 수

있다. 읽어낼 프로그램 메모리의 주소를 지정하기 위해 DPTR 혹은, PC의 위치

를 기준으로 ACC에 의한 간접 주소지정방식이 사용된다.

MOVC A,@A+DPTRMOVC A,@A+PC

이들 명령은 데이터 블록의 기준 위치가 설정된 DPTR이나 현재의 PC 값의 위

치를 기준으로 ACC에 설정된 값만큼 떨어진 메모리 주소의 값을 판독하고자 할

때 유용하게 사용될 수 있다.

4.2 산술 연산 명령

산술 연산 명령이 수행되면 그 결과를 반영하여 PSW(program status word)의

각 비트를 적절히 설정한다. PSW의 비트 패턴은 [그림 4.1]에 보인다.

Page 157: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제4장 기초 연산 명령 147

7 6 5 4 3 2 1 0C AC F0 RS1 RS0 OV - P

* F0 : 범용 플래그비트, P : Even Parity bit그림 4.1 PSW의 비트 패턴

C(carry) 플래그 비트는 산술 연산이 수행될 때 최상위 비트에서 자리 올림

(carry)이나 자리 빌림(borrow)이 발생되면 1로 설정되는 비트이며, 특히 회전 명

령에서 밀려나는 비트를 저장하기 위한 비트로 사용된다. AC(auxiliary carry) 플

래그 비트는 하위 니블(nibble)의 최상위 비트에서 자리 올림이나 자리 빌림이

발생되면 1로 설정되는 비트로, BCD 연산에서 유용하게 사용된다. F0 플래그 비

트는 범용 목적의 플래그 비트로 사용자가 임의 목적으로 사용할 수 있다. RS1

과 RS0 비트는 사용할 레지스터 뱅크를 설정하는데 이용되며, 리셋하였을 때 이

비트 값은 00으로 레지스터 뱅크 RB0가 선택된다. OV(overflow) 플래그 비트는

연산에 의해 오버플로가 발생하였을 때 1로 설정된다. 특히, 나눗셈 명령에서 제

수가 0인 경우 1로 설정된다. P(parity) 플래그 비트는 연산 결과의 각 비트를 입

력으로 하는 짝수(even) 패리티 비트 생성기의 결과로 설정되는 비트로, 연산 결

과에서 1이 홀수 개 나타나면 1로 설정된다.

만일 레지스터 뱅크를 변경하고자하는 경우는 다음과 같은 명령을 사용할 수 있

다. 다음의 명령은 레지스터 뱅크 RB2로 설정하는 명령이다.

⋮MOV R5, #55H ; (05H) <- 55HMOV PSW, #00010000B ; Register Bank 2 설정MOV R5, #55H ; (15H) <- 55H

또한, PSW 중 프로그램에서 수정 가능한 비트는 C 플래그 비트로 다음과 같은

명령을 통하여 C 플래그 비트를 0, 1, 혹은 비트 반전할 수 있다.

CLR C ; C <- 0SETB C ; C <- 1CPL C ; C <- NOT C

Page 158: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

148 MCS-51 마이크로컴퓨터

4.2.1 증감 명령

명령이 수행될 때마다 지정된 데이터 값을 1씩 증가 혹은 감소하는 다음과 같은

증감 명령이 지원된다.

INC AINC @RiINC RnINC directINC DPTR

DEC ADEC @RiDEC RnDEC direct

참고로, INC DPTR 명령은 지원되지만 DEC DPTR 명령은 지원되지 않으므로,

동일한 효과를 얻기 위해서는 DPTR을 바이트 별로 취급하여 DPH의 접근 없이

DEC DPL 명령을 사용해야 함을 유의한다.

4.2.2 산술 연산 명령

덧셈 명령으로는 캐리를 포함하여 연산하느냐의 여부에 따라 두 가지 형태가 지

원된다. 캐리를 포함하지 않는 두 피연산자 간의 덧셈 연산을 위한 ADD 명령에

는 다음의 형태가 지원된다.

ADD A,#dataADD A,@RiADD A,RnADD A,direct

캐리 비트를 연산에 포함시키는 ADDC의 명령에는 다음의 형태가 지원된다.

Page 159: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제4장 기초 연산 명령 149

ADDC A,#dataADDC A,@RiADDC A,RnADDC A,direct

반면, 뺄셈 명령은 빌림(borrow)을 포함하여 연산하는 다음과 같은 SUBB 명령

만이 지원된다.

SUBB A,#dataSUBB A,@RiSUBB A,RnSUBB A,direct

MCS-51 명령에는 곱셈 및 나눗셈을 위한 명령이 지원되며, 이들 명령은 ACC와

B 레지스터를 고정된 목적으로 사용한다. 다음과 같은 곱셈 명령은 ACC의 데이

터와 B 레지스터의 데이터를 곱하여 그 결과의 상위 바이트는 B 레지스터에, 하

위 바이트는 ACC에 저장한다.

MUL AB ; A*B 결과의 상위바이트는 B, 하위바이트는 A에

다음의 나눗셈 명령에서 피젯수는 ACC에 젯수는 B 레지스터에 미리 설정하고,

나눗셈 결과 중 몫은 ACC에 나머지는 B 레지스터에 저장한다.

DIV AB ; A/B 결과의 나머지는 B, 몫은 A에

또한 10진 보정 명령으로 DA A 명령을 지원한다. 이 명령은 그 결과가 ACC에

저장되는 산술 연산 명령이 수행된 직후에 필히 수행되도록 하여야 한다. 즉, 여

러 바이트로 구성되는 매우 큰 데이터에 대한 연산에서 매 바이트단위 연산 후

에 반드시 실행되어야 한다. 다음의 코드는 BCD 연산의 예로 십진수 98 + 91의

결과를 BCD로 보정한다.

MOV A,#98HADD A,#91HDA A ; decimal adjustment

Page 160: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

150 MCS-51 마이크로컴퓨터

4.3 논리 및 기타 연산 명령

4.3.1 논리 연산 명령

논리 연산 명령은 피연산자들 간의 연산에 있어 비트 단위로 논리 연산을 수행

하며, AND, OR, XOR, 비트 반전(CPL), 클리어(CLR) 등을 수행한다.

AND 논리 연산을 수행하는 명령들은 다음과 같은 형태로 지원된다.

ANL A,#dataANL A,@RiANL A,directANL direct,#dataANL direct,A

OR 논리 연산 명령과 XOR 논리 연산 명령들도 위와 동일한 형태로 지원되며,

ANL대신 ORL 혹은 XRL을 사용하면 된다.

비트 반전 및 클리어 관련 명령은 ACC를 대상으로 하는 다음 형태의 명령이 지

원된다.

CPL A ; A <- A의 비트반전CLR A ; A <- 0

4.3.2 회전 명령

회전 명령에는 ACC를 대상으로 하는 다음과 같은 명령들이 지원된다.

RL ARR ARLC ARRC A

Page 161: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제4장 기초 연산 명령 151

RL A와 RR A는 캐리 비트의 사용하지 않고 각각 1비트씩 좌회전 혹은 우회전

하는 명령이다. 따라서 밀려나간 비트는 소멸된다. 반면, RLC A와 RRC A 명령

은 C 비트까지 포함하여 각각 1비트씩 좌회전 혹은 우회전하는 명령이다.

4.3.3 교환 명령

교환 명령은 바이트 단위 혹은 니블 단위로 피연산자간의 데이터를 교환하는 명

령으로 다음과 같은 형태의 명령이 지원된다.

XCH A, @RiXCH A, RnXCH A, direct

XCHD A, @Ri

SWAP A

XCH 명령은 바이트 단위로 두 피연산자 간 교환을 수행하는 명령이며, XCHD

명령은 두 피연산자의 하위 니블만을 서로 교환하는 명령이다. SWAP 명령은

ACC를 대상으로 상위 니블과 하위 니블을 교환하는 명령이다.

4.3.4 비트 단위 명령

MCS-51 CPU는 비트 단위의 주소 지정 방식을 지원한다. 비트 주소 지정 형식

은 다음과 같이 내부 램의 주소와 비트 인덱스를 이용하거나, SFR 명과 비트 인

덱스를 이용하는 등의 방법이 있다.

20H.7 ; 20H주소의 비트인덱스 7 07H ; 20H.7의 비트어드레스

IP.4 ; IP SFR의 비트인덱스 40B8H.4 ; IP SFR의 비트인덱스 4PS ; IP SFR의 비트인덱스 40BCH ; IP SFR의 비트어드레스

Page 162: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

152 MCS-51 마이크로컴퓨터

비트 연산 명령에는 다음과 같이 해당 비트를 0으로 설정하는 CLR 명령과 1로

설정하는 SETB 명령, 그리고 해당 비트 반전을 수행하는 CPL 명령이 지원된다.

CLR <bit address>SETB <bit address>CPL <bit address>

또한, 비트 단위 논리 연산을 수행할 수 있는 다음과 같은 ANL, ORL 명령이 지

원된다. 이들 명령에서 비트 단위 논리 연산을 위한 피연산자 하나는 C 플래그

비트이다.

ANL C,<bit address>ANL C,/<bit address>ORL C,<bit address>ORL C,/<bit address>

위에서 두 번째 명령의 /<bit address>는 연산에 앞서 해당 비트주소의 내용을

읽어 비트 반전하라는 것을 의미한다. 즉, /25H.5와 같이 사용되었다면 내부 램

25H주소의 비트 인덱스 5의 한 비트를 읽어 비트 반전한 후에 해당 연산을 수행

함을 의미한다.

비트 단위 전송 명령으로 캐리 비트와 비트 주소로 구성되는 다음 형태의 명령

이 지원된다.

MOV C,<bit address>MOV <bit address>,C

추가로, 특정 비트를 검사하여 그 결과에 따라 분기할 수 있는 비트 검사 분기

명령이 지원되고 있다. 이들 명령은 다음과 같은 명령이 있으며, 보다 세부적인

내용은 다음 장에서 언급하도록 한다.

JB <bit address>,<8bit offset>JNB <bit address>,<8bit offset>JBC <bit address>,<8bit offset>

Page 163: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제4장 기초 연산 명령 153

4.4 실습과제

[실습1] 두 정수의 덧셈

다음의 소스 프로그램은 두 개의 1 바이트 데이터의 덧셈을 계산하는 프로그램

으로 앞 장에서 예제로 사용된 프로그램이다.

;=================================

; OPR_01.ASM

; Addition of two data

;=================================

$MOD51

ORG 8000H

MONITOR EQU 0000H

;

START:

MOV R0,#20H ; OP1

MOV R1,#30H ; OP2

MOV A,R0

ADD A,R1 ; 덧셈

MOV DPTR,#RES

MOVX @DPTR,A

JMP MONITOR ; 모니터 프로그램으로

ORG 80F0H

RES: DB 00H ; 결과

END

[실습2] 산술 연산 명령

다음의 소스 프로그램은 두 개의 1 바이트 데이터에 대해 산술 연산 명령들의

처리 결과를 확인할 수 있는 프로그램이다.

Page 164: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

154 MCS-51 마이크로컴퓨터

;=================================

; OPR_02.ASM

; 산술연산

;=================================

$MOD51

ORG 8000H

MONITOR EQU 0000H

;

START:

MOV R0,#89H ; OP1

MOV R1,#11H ; OP2

; 더하기

MOV A,R0

ADD A,R1 ; ADD

MOV DPTR,#RES ; 결과저장 위치설정

MOVX @DPTR,A ; 결과저장

; 빼기

CLR C

MOV A,R0

SUBB A,R1 ; SUBB

INC DPTR

MOVX @DPTR,A

; 곱하기

MOV A,R0

MOV B,R1

MUL AB ; MUL

INC DPTR ; low byte

MOVX @DPTR,A

INC DPTR

MOV A,B ; high byte

MOVX @DPTR,A

; 나누기

MOV A,R0

MOV B,R1

Page 165: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제4장 기초 연산 명령 155

DIV AB ; DIV

INC DPTR ; 몫

MOVX @DPTR,A

INC DPTR

MOV A,B ; 나머지

MOVX @DPTR,A

JMP MONITOR ; 모니터 프로그램으로

ORG 8100H

RES: DB 00H,00H,00H,00H ; 결과

DB 00H,00H,00H,00H

DB 00H,00H,00H,00H

DB 00H,00H,00H,00H

END

[실습3] 논리 연산 명령

본문에서 제시된 논리 연산 명령의 수행 결과를 볼 수 있는 프로그램을 작성한

다. 제반 필요한 사항은 사용자가 정의한다.

[실습4] 회전 및 교환 명령

본문에서 제시된 회전 명령과 교환 명령의 수행 결과를 볼 수 있는 프로그램을

작성한다. 제반 필요한 사항은 사용자가 정의한다.

[실습5] 다중 바이트 연산

여러 바이트로 구성되는 큰 수들을 덧셈하는 프로그램과 뺄셈하는 프로그램을

작성한다. 제반 필요한 사항은 사용자가 정의한다. 예로 745C7898H와

A9AD3432H와 같은 큰 수를 피연산자로 한다.

Page 166: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

156 MCS-51 마이크로컴퓨터

[실습6] 다중 바이트 BCD 연산

여러 바이트로 구성되는 BCD 덧셈을 수행하는 프로그램을 작성한다. 제반 필요

한 사항은 사용자가 정의한다. 예로 12345678와 56781234와 같은 큰 수를 피연산

자로 한다.

Page 167: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제5장 반복 처리 157

제5장 반복 처리

많은 데이터에 대하여 동일한 처리를 반복적으로 적용할 필요가 있을 때 반복

처리를 하는 것이 바람직하다. 이를 위해서는 실행의 흐름을 강제로 변경할 수

있어야 한다. 따라서 본 장에서는 이에 이용되는 분기 명령들에 대해 살펴본다.

또한 반복 처리를 필요로 하는 대표적인 문제인 데이터 블록의 전송, 특정 데이

터의 검색, 데이터의 정렬 문제를 통해 적용 방법을 살펴본다.

5.1 분기 명령 및 반복 처리

분기(jump) 명령은 프로그램에서 실행의 흐름을 바꾸는 명령으로, 조건 검사 여

부에 따라 무조건 분기 명령, 조건 분기 명령이 있으며, 비트 조건을 검사하는

분기 명령도 지원된다.

5.1.1 무조건 분기 명령

무조건 분기 명령은 조건 검사 없이 지정된 위치로 실행의 흐름을 변경하는 명

령으로 분기할 위치 지정 방법에 따라 절대 분기 명령과 상대 분기 명령이 지원

된다. 무조건 분기 명령의 형태는 다음과 같다.

AJMP <11bit Address>LJMP <16bit Address>SJMP <8bit offset>

AJMP(absolute jump) 명령은 11비트의 절대 주소를 사용하는 분기 명령으로, 현

재의 PC 값을 기준으로 2K바이트 범위 내의 위치로 분기할 수 있다. 실제의 분

기할 위치는 PC의 최상위 5비트와 레이블 표시된 위치의 최하위 11비트가 조합

되어 결정된다.

LJMP(long jump) 명령은 16비트 절대 주소를 사용하는 분기 명령으로 64KB 범

Page 168: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

158 MCS-51 마이크로컴퓨터

위의 어느 곳으로나 분기할 수 있다.

SJMP(short jump) 명령은 상대 분기 명령으로 현재의 PC 값에 8비트의 offset

값을 더한 위치로 분기한다. 즉, 현재의 PC 값으로부터 -128 ~ +127 범위 내의

주소로만 분기할 수 있다.

위의 분기 명령대신 아래와 같은 명령을 사용할 수 있으며, 이 경우 사용 어셈블

러가 위의 명령 중의 하나로 적절히 대체한다.

JMP Label

또한, 다음과 같은 간접 레지스터 주소 지정 방식의 무조건 분기 명령이 지원된

다. 이 명령은 A+DPTR의 위치로 분기하게 된다.

JMP @A+DPTR

5.1.2 조건 분기 명령

조건을 검사하여 지정된 위치로 분기하는 명령을 조건 분기 명령이라 하며,

MCS-51에서 이들 조건 분기 명령은 모두 상대 분기 명령이다.

다음의 명령은 이전 명령의 실행 결과 상태를 조건 검사하여 조건이 만족되었을

때만 지정된 위치로 분기하며, 그렇지 않은 경우는 바로 다음에 나타나는 명령을

실행한다.

JC <8bit offset> ; if C=1, jumpJNC <8bit offset> ; if C=0, jumpJZ <8bit offset> ; if A=0, jumpJNZ <8bit offset> ; if A≠0, jump

두 값을 비교하여 값이 같으면 지정된 위치로 분기하는 다음과 같은 조건 검사

분기 명령이 제공된다. CJNE 명령은 dst와 src의 값을 비교하여 동일하면 지정

된 위치로 분기한다. 그렇지 않은 경우 뒤따르는 명령을 수행한다.

Page 169: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제5장 반복 처리 159

CJNE <dst>,<src>,<8bit offset> ; if dst≠src, jump

5.1.3 비트검사 분기 명령

비트검사 분기 명령은 비트 주소 지정된 한 비트를 검사하여 조건을 만족할 때

지정된 위치로 분기하고, 그렇지 않은 경우 직후의 명령을 수행하는 명령이다.

이들 명령에는 다음과 같은 형태들이 있다.

JB <bit address>,<8bit offset>JNB <bit address>,<8bit offset>JBC <bit address>,<8bit offset>

JB 명령은 조건검사 비트가 1이면 지정된 위치로 분기하며, JNB 명령은 조건검

사 비트가 0이면 지정된 위치로 분기한다. 반면, JBC 명령은 조건검사 비트가 1

이면 그 비트를 0으로 설정하고 지정된 위치로 분기한다.

다음의 코드는 이들 명령을 사용하여 조건에 따라 여러 위치로 분기하는 루틴의

일부를 보이고 있다.

JB 00H,BR1JNB 20H.1,BR2JBC ACC.0,BR3 ⋮

BR1: ⋮⋮

BR2: ⋮⋮

BR3: ⋮

첫 명령은 비트 메모리의 첫 주소로 20H.0 비트를 검사하여 1이면 BR1으로 분

기하며, 두 번째 명령은 20H.1의 비트를 검사하여 1이면 BR2로 분기하고, 세 번

째 명령은 ACC의 최하위 비트를 검사하여 1이면 해당 비트를 0으로 설정한 후

BR3으로 분기한다.

Page 170: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

160 MCS-51 마이크로컴퓨터

5.1.4 반복 처리

반복 처리는 루틴의 일부를 지정된 횟수만큼 반복하여 처리하는 것이다. 반복 처

리의 기본 형식은 다음과 같이 반복 처리할 루틴의 첫 명령에 레이블을 부여하

고, 그 루틴의 마지막에 분기 명령을 사용한다. 레이블 이름은 예약어와 중복되

지 않는 문자열로 작성하면 된다.

LOOP: ⋮⋮⋮JMP LOOP

위에서 살펴본 코드는 무한 반복하도록 예시되었으나 실제 프로그램에서는 특수

한 경우를 제외하고 무한 반복하지 않도록 구현해야 한다.

특히, 반복 처리에서 보다 간편하게 사용할 수 있는 다음과 같은 DJNZ 명령이

지원된다. 첫 피연산자인 Rn 혹은 직접 주소에 순환될 횟수를 지정하면, DJNZ

명령이 실행될 때마다 그 값을 1씩 감소하면서 분기하여 반복하다가 그 값이 0

이 되면 반복을 종료하게 된다.

DJNZ Rn,<8bit offset> ; if (Rn-1)≠0, jumpDJNZ direct,<8bit offset> ; if (direct-1)≠0, jump

다음 코드는 R0에 반복할 횟수를 지정하고 DJNZ 명령을 사용한 반복 처리의 일

부를 보인다. 코드 블록을 16회 반복 실행한다.

MOV R0, #10HLOOP: ⋮

⋮⋮DJNZ R0, LOOP

아울러 위의 코드는 DJNZ 명령 대신 다음과 같이 구현함으로써 동일한 기능을

수행할 수 있다.

Page 171: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제5장 반복 처리 161

MOV A, #10HLOOP: ⋮

⋮⋮DEC AJNZ LOOP ; if ACC≠0, jump

또한 반복 처리 구조 내에 또 다른 반복 처리 구조를 갖는 다중의 중첩된 반복

처리(nested loop)도 가능하다. 다음의 코드는 2중으로 중첩된 반복 처리 구조를

보인 것이다.

MOV R1,#10HE_LOOP: ⋮

⋮MOV R0,#10H

I_LOOP: ⋮⋮⋮DJNZ R0,I_LOOPDJNZ R1,E_LOOP

특히, 중첩된 반복 처리 구조의 경우 내부의 반복 처리 구조와 외부의 반복 처리

구조가 교차하지 않도록 작성하는 것이 바람직하다. 즉, 다음과 같이 교차 구성

하는 것은 코드 분석도 용이치 않고 원치 않는 결과를 가져올 수 있으므로 권장

하지 않는다.

MOV R1,#10HE_LOOP: ⋮

⋮MOV R0,#10H

I_LOOP: ⋮⋮⋮DJNZ R1,E_LOOP⋮DJNZ R0,I_LOOP

Page 172: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

162 MCS-51 마이크로컴퓨터

5.2 데이터 블록 전송 및 합산

반복 처리 문제로 일정량의 데이터 블록을 메모리의 다른 곳으로 전송, 혹은 데

이터 블록 내의 데이터를 모두 덧셈하는 예제 프로그램을 살펴보자.

5.2.1 데이터 블록 전송

다음의 소스는 외부 데이터 메모리 내의 데이터 블록을 외부 데이터 메모리 내

의 또 다른 곳으로 블록 전송하는 프로그램이다.

1 ;====================================

2 ; LOOP_01.ASM

3 ; Block Transfer

4 ;====================================

5 $mod51

8000 6 ORG 8000H

0000 7 MONITOR EQU 0000H

8 ;

8000 9 BLOCK_TRANSFER:

8000 7B10 10 MOV R3,#10H ; 반복횟수

8002 7C00 11 MOV R4,#00H ; offset

8004 7D00 12 MOV R5,#00H ; 임시저장소

8006 13 LOOP:

8006 908100 14 MOV DPTR,#SRC ; 베이스주소

8009 E582 15 MOV A,DPL

800B 2C 16 ADD A,R4

800C F582 17 MOV DPL,A

800E E0 18 MOVX A,@DPTR

800F FD 19 MOV R5,A

20

8010 908200 21 MOV DPTR,#DST ; 베이스주소

8013 E582 22 MOV A,DPL

8015 2C 23 ADD A,R4

8016 F582 24 MOV DPL,A

8018 ED 25 MOV A,R5

8019 F0 26 MOVX @DPTR,A

27

801A 0C 28 INC R4

Page 173: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제5장 반복 처리 163

801B DBE9 29 DJNZ R3,LOOP

801D 020000 30 JMP MONITOR

31 ;

8100 32 ORG 8100H

8100 23455667 33 SRC: DB 23H,45H,56H,67H

8104 78891277 34 DB 78H,89H,12H,77H

8108 23455667 35 DB 23H,45H,56H,67H

810C 78891277 36 DB 78H,89H,12H,77H

8200 37 ORG 8200H

8200 00000000 38 DST: DB 00H,00H,00H,00H

8204 00000000 39 DB 00H,00H,00H,00H

8208 00000000 40 DB 00H,00H,00H,00H

820C 00000000 41 DB 00H,00H,00H,00H

42 END

위 코드의 12번 라인의 MOV DPTR,#SRC 명령은 MOV DPTR,#8100H와 동일한

명령이다. 또한, 이 명령의 머신 코드는 주소 순에서 90H, 81H, 00H로 번역된 것

을 확인할 수 있으며, 두 바이트의 즉치 8100H가 메모리상에 적재되는 방식을

의미하는 바이트 오더링(byte ordering) 방식으로 MCS-51 MCU는 빅 엔디안

(big endian) 방식을 채택하고 있음을 보여 주는 것이다. 반면, zilog사의 Z80

CPU에서는 이와 거꾸로인 리틀 엔디안(little endian) 방식으로 저장된다.

5.2.2 데이터 블록 합산

다음 소스는 메모리 공간에 연속해 저장된 10개의 데이터 합을 구하는 프로그램

이다.

1 ;=================================

2 ; LOOP_02.ASM

3 ; Addition of block data

4 ;=================================

8000 5 ORG 8000H ;

0000 6 ZERO EQU 00H

000A 7 COUNT EQU 10

8 ;

8000 7B0A 9 MOV R3,#COUNT

Page 174: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

164 MCS-51 마이크로컴퓨터

8002 908100 10 MOV DPTR,#SRC

8005 7900 11 MOV R1,#ZERO

8007 7A00 12 MOV R2,#ZERO

13

8009 E0 14 L2: MOVX A,@DPTR

800A 2A 15 ADD A,R2

800B FA 16 MOV R2,A

800C 400E 17 JC L1

18

800E A3 19 L3: INC DPTR

800F DBF8 20 DJNZ R3,L2

21

8011 908120 22 MOV DPTR,#RES ; 결과주소

8014 E9 23 MOV A,R1

8015 F0 24 MOVX @DPTR,A

8016 A3 25 INC DPTR

8017 EA 26 MOV A,R2

8018 F0 27 MOVX @DPTR,A

28

8019 020000 29 JMP #0000H ; go Monitor

30

801C 09 31 L1: INC R1

801D 80EF 32 SJMP L3

33

8100 34 ORG 8100H

8100 01020304 35 SRC: DB 1,2,3,4,5,6,7,8,9,10

8104 05060708

8108 090A

36

37

38

8120 39 ORG 8120H

8120 0000 40 RES: DB 0,0

41 END

5.3 검색 및 정렬

많은 데이터에 대하여 반복 처리하여야 할 대표적인 사례로 많은 데이터 가운데

Page 175: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제5장 반복 처리 165

특정 데이터의 유무를 판단하는 검색 처리, 오름차순 혹은 내림차순으로의 정렬

하는 정렬처리가 있다. 본 절에서는 반복 처리를 통해 이러한 문제를 해결하고자

한다.

5.3.1 순차 검색

특정 데이터 블록에 대해 임의의 데이터를 검색하는 알고리즘은 다양하다. 본 절

에서는 데이터 블록의 첫 데이터부터 검색 데이터와 하나씩 순차적으로 비교하

면서 검색하는 순차검색 알고리즘의 구현에 대해 살펴본다.

다음의 코드는 CJNE 명령을 사용하여 데이터를 검색하는 프로그램이다. 8100H

부터 16바이트의 데이터가 있는 데이터 블록에서 11H 값을 탐색하고, 탐색을 성

공하면 해당 주소를 8200H 번지에 저장하고, 그렇지 않으면 8200H 번지에

'FFH'를 기록한다. 탐색에 성공하면 해당 주소는 2바이트이기 때문에 8200H와

8201H 주소에 한 바이트씩 저장된다.

1 ;=================================

2 ; LOOP_03.ASM

3 ; Sequential Search

4 ;=================================

5 $mod51

8000 6 ORG 8000H

0000 7 MONITOR EQU 0000H

8 ;

8000 9 SEARCH_IN_BLOCK:

8000 7B10 10 MOV R3,#10H

8002 908100 11 MOV DPTR,#SRC

8005 12 LOOP:

8005 E0 13 MOVX A,@DPTR

8006 B41102 14 CJNE A,#11H,NOT_EQUAL ; 11H

8009 8005 15 JMP FOUND_IT

800B 16 NOT_EQUAL:

800B A3 17 INC DPTR

800C DBF7 18 DJNZ R3,LOOP

800E 800E 19 JMP NOT_FOUND_IT

8010 20 FOUND_IT:

8010 AE83 21 MOV R6,DPH

8012 AF82 22 MOV R7,DPL

Page 176: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

166 MCS-51 마이크로컴퓨터

8014 908200 23 MOV DPTR,#RES

8017 EE 24 MOV A,R6

8018 F0 25 MOVX @DPTR,A

8019 A3 26 INC DPTR

801A EF 27 MOV A,R7

801B F0 28 MOVX @DPTR,A

801C 8006 29 JMP TO_EXIT

801E 30 NOT_FOUND_IT:

801E 908200 31 MOV DPTR,#RES

8021 74FF 32 MOV A,#0FFH

8023 F0 33 MOVX @DPTR,A

8024 34 TO_EXIT:

8024 020000 35 JMP MONITOR

36 ;

8100 37 ORG 8100H

8100 23455667 38 SRC: DB 23H,45H,56H,67H

8104 11121315 39 DB 11H,12H,13H,15H

8108 21222325 40 DB 21H,22H,23H,25H

810C 31323335 41 DB 31H,32H,33H,35H

8200 42 ORG 8200H

8200 0000 43 RES: DB 00H,00H

44 END

위의 소스는 데이터 블록에서 찾고자 하는 데이터 '11H'가 두 번 이상 존재하더

라도 첫 번째 일치하는 데이터 검색 후 프로그램은 종료한다. 따라서 여러 개의

일치하는 데이터가 해당 블록에 존재하며 이를 모두 탐색하려면 그에 따른 부가

적인 구현이 요구된다는 점을 유의할 필요가 있다.

5.3.2 블록 정렬

데이터 블록내의 데이터를 오름차순 혹은 내림차순으로 정렬하는 방법으로 다양

한 알고리즘이 제시되어 있다. 여기서는 버블 정렬 알고리즘에 대해 살펴보고,

이를 활용하여 데이터 블록내의 데이터를 정렬할 수 있도록 프로그램을 구현한

다.

버블 정렬(bubble sort)

버블 정렬은 인접한 두 개의 데이터를 비교하여 오름차순 혹은 내림차순에 따라

Page 177: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제5장 반복 처리 167

두 데이터 위치의 내용을 교환하는 과정을 반복하며, 한 단계가 종료되면 최소

하나의 데이터 정렬을 보장하는 방식이다.

정렬 순서는 오름차순 혹은 내림차순 정렬이 있다. [그림 5.1]은 1바이트 크기의

9개 데이터가 있는 블록의 데이터를 오름차순으로 버블 정렬하는 과정을 보인

것이다.

그림 5.1 버블 정렬의 정렬 과정

이와 같이 오름차순 정렬인 경우, 인접한 두 데이터 i와 i+1 주소의 데이터를 비

교하여 i의 데이터가 i+1의 데이터보다 크면 두 데이터를 교환하며, 그렇지 않으

면 교환하지 않는다. 그런 후 다음 비교를 위해 i+1과 i+2 위치의 데이터를 비교

하여 동일한 처리를 반복한다. 만일 데이터 블록의 크기가 n이면 이와 같은 비교

는 n-1회 발생되며 이것이 정렬 과정에서 하나의 단계를 형성하게 된다. 각 단계

가 완료될 때마다 최소 하나씩의 데이터가 추가로 정렬되는 것을 보장한다. 이와

같이 n-1 단계를 처리하면 해당 데이터 블록의 정렬은 완료된다.

Page 178: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

168 MCS-51 마이크로컴퓨터

정렬의 최적화

[그림 5.2]는 n개의 데이터를 갖는 블록을 대상으로 버블 정렬에서 비교 횟수에

의해 최적화 정도를 세 가지 유형으로 나타낸 것이며, 다각형의 면적은 정렬 처

리에서의 인접 두 데이터간의 비교 횟수에 비례한다.

(a) (b) (c)

그림 5.2 버블 정렬의 최적화

첫째, 최적화를 고려하지 않은 경우로 [그림 5.2] (a)와 같이 n-1 회의 비교를

n-1 단계만큼 수행하는 경우이다. 앞에 제시된 코드는 이 방법으로 구현한 프로

그램이다.

둘째, 이미 정렬된 데이터의 비교 회피를 통한 최적화로 [그림 5.2] (b)와 같이

각 단계별로 최소한 하나씩의 데이터가 정렬된다는 점을 이용하여 각 단계별로

이미 정렬된 데이터에 대해 비교를 회피하여 비교 연산 횟수를 (a)의 경우보다

절반으로 줄이는 방법이다. 이러한 최적화는 이미 정렬된 데이터를 비교과정에서

배제하는 방법으로 해결할 수 있다. 이는 각 단계가 진행될 때마다 각 단계에서

의 비교횟수를 하나씩 감소하는 방법을 생각할 수 있다.

끝으로, 정렬 완료 이후의 단계 회피에 의한 최적화는 [그림 5.2] (c)와 같이 이

미 정렬된 데이터의 비교 회피뿐만 아니라 처리할 데이터가 역순으로 정렬된 경

우가 아닌 일반적인 상황에서 n-1 단계에 다다르기 이전에 이미 정렬 완료될 수

있음을 고려한 경우다. 이 경우는 이미 정렬이 되었다면 더 이상의 다음 단계를

진행할 필요 없고 그만큼 비교 연산의 횟수는 줄어든다. 이러한 형태의 최적화는

(b) 형태의 최적화뿐만 아니라 한 단계가 종료되는 시점에서 해당 단계 동안 교

환이 한번이라도 발생되었는지 여부를 통해서 해결 할 수 있다.

Page 179: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제5장 반복 처리 169

다음의 프로그램은 버블 정렬 방식에 의해 대상 블록 데이터를 오름차순으로 정

렬하는 프로그램으로, 최적화를 전혀 고려하지 않은 것이다. 최적화를 전혀 고려

하지 않은 코드이므로 비교 명령(여기서는 CJNE 명령)은 15x15=225회 수행된다.

1 ;====================================

2 ; LOOP_04.ASM

3 ; Bubble Sort ... Ascending

4 ;====================================

5 $mod51

8000 6 ORG 8000H

0000 7 MONITOR EQU 0000H

8 ;

8000 9 SORT_IN_BLOCK:

8000 7F0F 10 MOV R7,#0FH ;#Step

8002 11 STEP:

8002 7B0F 12 MOV R3,#0FH ;#Compare

8004 908100 13 MOV DPTR,#SRC

8007 14 LOOP:

8007 E0 15 MOVX A,@DPTR

8008 FC 16 MOV R4,A ;i

8009 A3 17 INC DPTR

800A E0 18 MOVX A,@DPTR ;i+1

800B B50400 19 CJNE A,04H,NEXT

800E 4007 20 NEXT: JC EXCHANGE

8010 DBF5 21 AAA: DJNZ R3,LOOP

8012 DFEE 22 DJNZ R7,STEP

8014 020000 23 JMP MONITOR

24 ;

8017 25 EXCHANGE:

8017 1582 26 DEC DPL

8019 F0 27 MOVX @DPTR,A

801A EC 28 MOV A,R4

801B A3 29 INC DPTR

801C F0 30 MOVX @DPTR,A

801D 80F1 31 JMP AAA

32 ;

8100 33 ORG 8100H

8100 45552382 34 SRC: DB 45H,55H,23H,82H

8104 12668882 35 DB 12H,66H,88H,82H

8108 39211177 36 DB 39H,21H,11H,77H

810C 43895634 37 DB 43H,89H,56H,34H

Page 180: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

170 MCS-51 마이크로컴퓨터

38 END

5.4 실습과제

[실습1] 다중 바이트 연산

여러 바이트로 구성되는 큰 수들을 덧셈하는 프로그램과 뺄셈하는 프로그램을

작성한다. 반복 처리를 활용하며, 제반 필요한 사항은 각자 정의한다.

[실습2] 블록 설정 및 전송

우선 외부 데이터 메모리에 한 뭉치의 데이터를 블록 설정한다. 이 데이터 블록

을 내부 램의 영역으로 전송한다. 그런 후, 내부 램에 전송된 데이터 블록을 다

시 외부 데이터 메모리의 또 다른 영역으로 전송한다. 이와 같은 처리를 통하여

데이터 블록을 설정하고, 내부 램과 외부 데이터 메모리간 데이터 블록 전송하는

프로그램을 작성한다. 제반 필요한 사항은 각자 정의한다.

[실습3] 순차 검색

내부 램 영역의 데이터 블록을 대상으로 원하는 데이터를 검색하는 프로그램을

작성한다. 단, 찾았을 때는 해당 주소를 기록하고, 그렇지 않은 경우는 FFH를 표

시한다. 제반 필요한 사항은 각자 정의한다.

[실습4] 버블 정렬

외부 데이터 메모리 영역의 데이터 블록을 대상으로 내림차순 정렬하는 프로그

램을 작성한다. 또한, 최적화 문제를 고려하여 프로그램하고, 각 경우의 비교 연

산 회수를 기록하여 비교하여 본다. 제반 필요한 사항은 각자 정의한다.

Page 181: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제6장 스택 및 서브루틴 171

제6장 스택 및 서브루틴

프로그램을 작성하다 보면, 특정 기능의 루틴이 반복 사용될 필요성이 있다. 이

러한 경우 코드의 재사용 및 편의를 위해 특정 기능의 코드를 하나의 루틴으로

정의하고, 필요할 때마다 호출하여 실행하는 것이 바람직하다. 본 장에서는 서브

루틴을 정의하는 방법과 그 호출 방법에 대해 살펴보고, 서브루틴의 호출시 필히

연관되는 스택 구조에 대해서 살펴본다. 아울러 코드 변환 문제를 통해 서브루틴

의 정의 및 호출 과정을 살펴본다.

6.1 스택과 서브루틴

스택(stack)은 서브루틴의 호출 및 반환이 이루어지는 상황에서 필수적으로 사용

되는 메모리 구조이다. 본 절에서는 이러한 스택과 서브루틴의 활용 방법에 대해

살펴보도록 한다.

6.1.1 스택 구조

스택은 삽입과 인출이 한쪽 끝에서만 발생하는 선형 리스트 형태의 메모리 구조

로 후입 선출 방식인 LIFO(last in first out) 정책을 입출력 정책으로 사용한다.

따라서 나중에 삽입된 데이터가 먼저 출력되게 사용된다. 흔히 스택은 산술 연

산, 서브루틴의 호출이나 인터럽트 처리에서 복귀 주소를 저장하는 용도로 사용

된다.

스택 영역은 메모리의 일부를 할당하여 사용하는데, 이를 위해서 스택 영역의 위

치를 지정하는 용도로 SP(stack pointer)를 사용하며, 적절한 메모리 주소로 SP

를 초기화하여야 한다.

특히 서브루틴의 호출시 현재의 PC(program counter) 값을 즉, 서브루틴의 수행

종료 후 반환될 주소를 스택에 저장하고, 서브루틴의 마지막 명령인 RET 명령에

의해 스택으로부터 저장한 값을 다시 PC에 설정함으로서 서브루틴 호출 명령의

Page 182: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

172 MCS-51 마이크로컴퓨터

다음 명령이 수행될 수 있게 한다.

MCS-51에서 이러한 스택은 내부 데이터 메모리에 위치하게 되며, 스택 영역을

지시하기 위해 8비트의 SP가 사용된다. 리셋 시 기본으로 설정되는 SP의 값은

07H로 초기의 내정된 레지스터 뱅크인 RB0 영역 다음부터의 메모리 영역을 스

택으로 사용하게 된다. 따라서 레지스터 뱅크를 다른 것으로 변경하여 사용할 경

우 스택 영역과 레지스터 뱅크 영역이 중첩되지 않도록 SP의 값을 적절히 재설

정해 줄 필요가 있다. 즉, 레지스터 뱅크 RB2를 사용할 것이라면 SP의 값도

RB2 영역을 피해서 적절히 설정하여 주어야 한다. MCS-51에서의 스택 구조는

PUSH 명령이 사용되면 스택은 주소가 증가하는 방향으로 확장된다. 따라서 다

음과 같이 SP를 설정하는 것이 바람직하다.

MOV PSW,#00010000B ; RB2 설정, #00010000BMOV SP,#17H ; SP 설정

스택에 데이터를 저장하거나 인출하는 다음과 같은 PUSH와 POP 명령이 지원되

며, 이들 명령은 직접 주소 지정된 메모리를 대상으로 1바이트 단위의 데이터를

스택에 저장하거나 읽어낸다.

PUSH <직접주소>POP <직접주소>

예로, 다음의 PUSH 명령은 우선 SP 값을 1 증가시킨 후, 40H 주소의 내용을

SP가 지시하는 스택 내에 저장한다.

PUSH 40H

반면, 다음의 POP 명령은 스택의 SP가 지시하는 곳의 내용을 40H 주소에 저장

한 후, SP의 값을 1 감소한다.

POP 40H

특히, 이들 명령에서 사용되는 피연산자는 반드시 직접 주소로 표현되어야 한다.

다음과 같은 예는 사용할 수 없으므로 주의한다.

Page 183: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제6장 스택 및 서브루틴 173

PUSH R0, POP R0 ; 사용 불허PUSH A, POP A ; 사용 불허PUSH B, POP B ; 사용 불허(컴파일러에 따라 허용)

위의 명령들은 다음과 같이 각각의 직접 주소 혹은 레지스터 이름을 보다 명확

히 하여 사용하여야 한다.

PUSH 00H, POP 00H ; 직접주소로PUSH ACC, POP ACC ; 0AH와 혼동 피하도록PUSH RB, POP RB ; 0BH와 혼동 피하도록

또한, DPTR의 값을 저장할 때에는 DPH, DPL로 나누어서 스택에 PUSH 하여야

하며, POP 할 때는 저장한 순서에 유의하여 그 반대 순으로 POP 하여야 한다.

다음은 스택의 동작을 살펴보기 위한 코드의 일부를 보인다.

MOV SP,#3FH ; SP 설정;

MOV DPTR,#8200H MOV 30H,#0A0H MOV A,#33H MOV R3,#22H MOV R2,#11H ; PUSH DPL ; 스택에 데이터 저장 PUSH DPH PUSH 30H PUSH ACC ; PUSH A 하지 말 것! PUSH 03H PUSH 02H ; POP 02H ; 스택의 데이터 인출 POP 03H POP ACC ; POP A 하지 말 것! POP 30H POP DPH POP DPL ;

Page 184: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

174 MCS-51 마이크로컴퓨터

위의 코드에서 PUSH 명령과 POP 명령의 실행에 따른 스택의 상태 변화를 살펴

보면, [그림 6.1]과 같이 동작한다.

:SP-> 3FH :

40H41H42H

: 3FH :

SP-> 40H 00H41H42H

: 3FH40H 00H

SP-> 41H 82H42H

SP 명령후 PUSH DPL 명령후 PUSH DPH 명령후(a) PUSH 명령의 동작

:3FH :40H 00H41H 82H42H A0H43H 33H44H 22H

SP-> 45H 11H 46H

: 3FH :40H 00H41H 82H42H A0H43H 33H

SP-> 44H 22H45H 11H46H

: 3FH40H 00H41H 82H42H A0H

SP-> 43H 33H44H 22H45H 11H46H

모든 PUSH 명령후 POP 02H 명령후 POP 03H 명령후(b) POP 명령의 동작

그림 6.1 스택에 대한 PUSH 및 POP의 동작

6.1.2 서브루틴

서브루틴(subroutine)의 정의는 다음과 같은 형식을 취한다. 서브루틴으로 구성할

루틴의 첫 명령어에 적절한 레이블을 부여한다. 부여된 레이블은 호출시 식별을

위해 사용되는 서브루틴의 이름이며 서브루틴이 위치한 주소이기도 하다. 서브루

틴의 마지막 명령으로 RET 명령을 사용하여 서브루틴의 정의를 마친다. 물론

RET 명령은 서브루틴 내에서 여러 차례 사용될 수 있다. RET 명령이 실행되면

반환할 주소 두 바이트를 스택으로부터 POP하여 PC에 설정한다.

Page 185: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제6장 스택 및 서브루틴 175

RTN: ⋮⋮⋮RET

메인 루틴에서 서브루틴을 호출할 때에는 다음과 같은 세 가지의 호출 명령중

하나를 사용할 수 있다.

ACALL RTNLCALL RTNCALL RTN

ACALL 명령은 호출할 서브루틴의 시작주소의 11비트를 사용하며, 호출할 주소

의 결정은 AJMP 명령과 유사하게 현재의 PC 값의 상위 5비트와 서브루틴의 주

소중 하위 11비트를 조합하여 호출할 서브루틴의 주소를 결정한다. ACALL 명령

이 실행되면 우선 현재의 PC 값을 스택에 PUSH하고, 상기와 같이 결정된 서브

루틴의 주소를 PC에 설정한다. LCALL 명령은 현재의 PC 값을 스택에 PUSH하

고, 서브루틴의 시작주소 2 바이트를 PC에 설정한다. 서브루틴의 실행은 다음 머

신 사이클에서 PC에 있는 값의 주소에 있는 명령을 가져오는 것으로 시작된다.

다음의 코드는 서브루틴을 호출하는 과정에서 스택의 상황을 살펴보기 위한 것

이다. RTN 서브루틴을 호출할 때, PC의 값은 8020H이고, SP는 45H라 가정한다.

⋮ACALL RTN ; call RTN ⋮ORG 8100H

RTN: ⋮ ⋮RET

위의 코드에서 RTN 서브루틴을 호출할 때와, 서브루틴을 벗어날 때의 PC 및 스

택의 상태는 [그림 6.2]와 같다.

Page 186: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

176 MCS-51 마이크로컴퓨터

PC 8020H PC 8100H PC 8020H:

SP-> 45H :46H47H48H

:45H :46H 20H

SP-> 47H 80H48H

:SP-> 45H :

46H 20H47H 80H48H

호출직전 ACALL RTN 실행후 RET 실행후그림 6.2 서브루틴 호출 및 복귀시 스택 상태

아울러, 호출된 서브루틴에서 또 다른 서브루틴을 호출하는 중첩된 서브루틴 호

출이 가능하다. 서브루틴을 호출하면서 처리할 데이터를 함께 넘겨주기 위해서는

서브루틴의 호출 전에 레지스터를 이용하여 설정하거나 스택에 미리 저장하여

서브루틴 내에서 적절히 이용할 수 있다.

만일 메인 루틴에서 사용되던 레지스터나 메모리 내의 데이터를 서브루틴의 수

행 이후에도 보존하여야 할 필요가 있을 경우, 서브루틴에서 이러한 레지스터나

메모리를 접근하여 수정하지 않도록 작성하여야 한다. 이러한 목적의 용도로 스

택이 유용하게 사용되며, 다음 코드는 서브루틴 호출전의 메인 루틴에서 A의 값

을 서브루틴 실행이 완료된 후에도 유지할 수 있도록 스택을 활용하여 구현한

것이다. 즉 보존이 필요한 레지스터나 메모리의 값은 서브루틴에 진입하자마자

스택에 저장하고, 서브루틴 내에서는 해당 레지스터나 메모리는 자유로이 사용한

다. 이후 서브루틴 종료직전에 복구한다. 만일 여러 개의 레지스터 내용을 퇴피

하는 경우 PUSH한 순서의 역으로 POP 해야 함을 유의한다.

⋮MOV A,#99H

MOV B,#77H

ACALL RTN ; call RTN ⋮ORG 8100H

RTN: PUSH ACC ; A 값 임시 퇴피PUSH RB ; B 값 임시 퇴피MOV A,#0FFH

Page 187: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제6장 스택 및 서브루틴 177

⋮ ⋮POP RB ; B 값 복구POP ACC ; A 값 복구RET

6.2 코드 변환

코드 변환은 하나의 코드를 또 다른 코드로 변환하는 것을 말한다. 한 예로 일상

적으로 사용하는 문자들은 컴퓨터에서 표현될 때 그에 따른 적절한 코드로 표현

될 필요가 있으며, ASCII 코드, EBCDIC 코드 등으로 표현된다. 역으로 컴퓨터에

서 표현되는 문서는 사람이 판독하기 용이하도록 한글이든 영문이든 표현될 수

있어야 한다.

일반적으로 이러한 코드 변환 방법으로 계산에 의한 방법과 LUT(Look-Up

Table)에 의한 방법이 사용된다. 계산에 의한 방법은 코드 변환 체계가 비교적

규칙적일 때 유용한 방법으로, 코드 변환 테이블을 위한 메모리 혹은 부가적인

하드웨어가 불필요한 방법이다. 하지만 변환 연산 과정에서 소프트웨어적인 처리

시간이 상대적으로 더 요구되기도 한다.

반면 LUT에 의한 방법은 메모리에 코드 변환 테이블을 저장하고 이를 이용한

방법으로, 코드 변환 체계가 불규칙적일 때 유용하며, 하드웨어 구현에 의한 고

속 변환이 가능한 방법이나, 코드 변환을 위한 코드 변환 테이블을 저장할 메모

리를 추가로 요구하는 단점을 가진다. 일반적으로 LUT은 메모리에 구성하며, 변

환하고자하는 코드를 메모리 주소 핀으로 투입하고 해당 메모리에 저장된 내용

을 바로 읽어냄으로써 변환 과정을 달성하게 된다. 흔히 고속 변환이 요구되는

상황에서 이러한 하드웨어적인 방법이 사용된다. [그림 4.18]은 LUT에 의한 방법

에 의해 'F'라는 문자에 대한 ASCII 코드로의 변환을 보이고 있다. 문자 'F'를

그 자체 숫자로 간주하여 이를 8비트 주소로 표현하면 0FH가 되고 메모리의

0FH 주소의 내용은 문자 'F'에 대한 ASCII 코드가 저장되어 있으므로 해당 주

소의 내용을 읽어내면 코드 변환이 완료된다.

Page 188: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

178 MCS-51 마이크로컴퓨터

그림 4.18 LUT에 의한 방법

코드 변환을 위해 특정 문자를 대응하는 ASCII 코드로 혹은 역으로 변환하는 과

제를 가정한다. 실습 키트에서 메모리 내에 저장된 정보를 눈으로 식별하기 위한

수단으로 16진수 표현을 위한 16개 문자만 가능하다. 즉, 문자 '0'부터 '9'와 'A'

부터 'F'까지의 16개 키를 문자라 가정하고, 이에 대한 대응하는 ASCII 코드만

을 대상으로 코드 변환과정을 살펴보도록 한다. [표 4.13]은 문자와 대응하는

ASCII 코드 테이블의 일부를 보인다.

표 4.13 ASCII 코드 변환 테이블

Char. ASCII Code 규칙성'0' 30H

Code=val(Char)+30H'1' 31H'2' 32H: :

'9' 39H'A' 41H

Code=val(Char)+30H+07H'B' 42H: :

'F' 46H

Page 189: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제6장 스택 및 서브루틴 179

6.2.1 계산에 의한 코드 변환

임의 문자 혹은 문자열에 대해 대응하는 16진수의 ASCII 코드로 변환할 때, [표

4.13]의 규칙성 란에서 보듯이 문자 '0'부터 '9'까지 그리고 'A'부터 'F'까지 두

군에서 나름대로 규칙성을 가지고 있다. 즉, 문자 '0'부터 '9'까지는 이 문자를

숫자로 취급하여 30H를 더하며, 그리고 'A'부터 'F'까지는 해당 문자를 16진 숫

자로 취급한 후 37H를 더하면 대응하는 ASCII 코드로 변환할 수 있다. 따라서

변환과정의 규칙성을 수식으로 표현하여, 수식의 계산에 의해 코드를 변환 할 수

있다. 이렇게 규칙성을 이용한 방법을 계산에 의한 코드 변환이라 한다.

다음 코드는 한 바이트로 표현되는 두 문자 'F'와 '9' 혹은 "F9"라는 두 문자로

구성되는 한 문자열을 대응하는 16진수의 ASCII 코드로 변환하는 프로그램이다.

1 ;==========================================

2 ; CC_01.ASM, Code Conversion

3 ; CHAR2HEX by calculating

4 ;==========================================

5 $mod51

8000 6 ORG 8000H

8000 758140 7 MOV SP,#40H

8003 74F9 8 MOV A,#0F9H ; 'F','9'

9

8005 F5F0 10 MOV B,A

8007 54F0 11 ANL A,#0F0H

8009 03 12 RR A ; SWAP A

800A 03 13 RR A

800B 03 14 RR A

800C 03 15 RR A

800D 1123 16 CALL TOHEX

800F F8 17 MOV R0,A

18

8010 E5F0 19 MOV A,B

8012 540F 20 ANL A,#0FH

8014 1123 21 CALL TOHEX

8016 F9 22 MOV R1,A

23

8017 908100 24 MOV DPTR,#8100H

801A E8 25 MOV A,R0

Page 190: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

180 MCS-51 마이크로컴퓨터

801B F0 26 MOVX @DPTR,A

27

801C 0582 28 INC DPL

801E E9 29 MOV A,R1

801F F0 30 MOVX @DPTR,A

31

8020 020000 32 JMP #0000H

33

34 ; subroutine

8023 C3 35 TOHEX: CLR C

8024 940A 36 SUBB A,#0AH ; -0AH

8026 4002 37 JC TO09 ; <10

8028 2407 38 ADD A,#07H ; +07H

802A 2430 39 TO09: ADD A,#'0' ; +30H

802C 240A 40 ADD A,#0AH ; 보상, +0AH

802E 22 41 RET

42

43 END

서브루틴 TOHEX를 살펴보면 우선 두 집단에 대해 각기 다른 계산 처리를 위해

0AH와의 비교를 시도한다. Carry가 발생하지 않으면 즉, 문자 'A'부터 'F'까지

이면 우선 7H를 더한 후 30H를 더하고 있다. 그렇지 않으면 문자 '0'부터 '9'까

지의 경우로 30H만 더하면 된다. 참고로, 코드에서 ADD A, '0'와 같이 '0'로 숫

자에 단일 인용부호를 사용하면 해당 문자에 대한 16진수의 ASCII 코드로 어셈

블러가 자동 변환하고 있음을 관찰할 수 있다.

다음 코드는 앞의 프로그램과 반대로 두 문자에 해당하는 16진수의 ASCII 코드

로 표현된 두 바이트에 대해 대응하는 문자로 변환하여, 한 바이트 형태로 표현

하는 코드 변환 프로그램이다.

1 ;==========================================

2 ; CC_02.ASM, Code Conversion

3 ; HEX2CHAR by calculating

4 ;==========================================

5 $mod51

8000 6 ORG 8000H

8000 758140 7 MOV SP,#40H

8

Page 191: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제6장 스택 및 서브루틴 181

8003 7844 9 MOV R0,#44H ; Hexa of 'D'

8005 7937 10 MOV R1,#37H ; Hexa of '7'

11

8007 E8 12 MOV A,R0

8008 111C 13 CALL TOCHAR

800A F5F0 14 MOV B,A

15

800C E9 16 MOV A,R1

800D 111C 17 CALL TOCHAR

800F 03 18 RR A ; SWAP

8010 03 19 RR A

8011 03 20 RR A

8012 03 21 RR A

8013 45F0 22 ORL A,B

23

8015 908100 24 MOV DPTR,#8100H

8018 F0 25 MOVX @DPTR,A

26

8019 020000 27 JMP #0000H

28

29 ; subroutine

801C C3 30 TOCHAR: CLR C

801D 9430 31 SUBB A,#'0' ; #30H

801F FF 32 MOV R7,A ; 퇴피

8020 C3 33 CLR C

8021 940A 34 SUBB A,#0AH

8023 4005 35 JC TO09

8025 EF 36 MOV A,R7 ; 복구

8026 C3 37 CLR C

8027 9407 38 SUBB A,#07H

8029 22 39 RET

802A EF 40 TO09: MOV A,R7 ; 복구

802B 22 41 RET

42

43 END

이 코드의 서브루틴 TOCHAR에서는 앞 소스의 서브루틴 TOHEX의 역 과정을

수행하도록 작성되었다.

Page 192: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

182 MCS-51 마이크로컴퓨터

6.2.2 LUT에 의한 코드 변환

앞에서의 코드변환 문제를 LUT을 이용하여 해결하는 방법에 관해 살펴본다.

LUT을 이용하려면 해당 코드 변환 테이블이 메모리에 미리 저장되어 있어야 한

다. 아울러 변환을 용이하게 하려면 적절한 메모리 주소에 LUT가 위치할 수 있

도록 고려할 필요가 있다.

다음 코드는 LUT을 이용하여 한 바이트로 표현되는 "F9"라는 두 문자로 구성되

는 한 문자열에 대해 대응하는 16진수의 ASCII 코드로 변환하는 프로그램이다.

1 ;==========================================

2 ; CC_03.ASM, Code Conversion

3 ; CHAR2HEX by LUT

4 ;==========================================

5 $mod51

8000 6 ORG 8000H

8000 758140 7 MOV SP,#40H

8003 74A7 8 MOV A,#0A7H ; 'A','7'

9

8005 F5F0 10 MOV B,A

8007 54F0 11 ANL A,#0F0H

8009 03 12 RR A ; SWAP A

800A 03 13 RR A

800B 03 14 RR A

800C 03 15 RR A

800D 1123 16 CALL TOHEX

800F F8 17 MOV R0,A

18

8010 E5F0 19 MOV A,B

8012 540F 20 ANL A,#0FH

8014 1123 21 CALL TOHEX

8016 F9 22 MOV R1,A

23

8017 908100 24 MOV DPTR,#8100H

801A E8 25 MOV A,R0

801B F0 26 MOVX @DPTR,A

27

801C 0582 28 INC DPL

801E E9 29 MOV A,R1

Page 193: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제6장 스택 및 서브루틴 183

801F F0 30 MOVX @DPTR,A

31

8020 020000 32 JMP #0000H

33

34 ; subroutine

8023 908050 35 TOHEX: MOV DPTR,#TABLE

8026 93 36 MOVC A,@A+DPTR

8027 22 37 RET

38

8050 39 ORG 8050H

8050 30313233 40 TABLE: DB 30H,31H,32H,33H

8054 34353637 41 DB 34H,35H,36H,37H

8058 38394142 42 DB 38H,39H,41H,42H

805C 43444546 43 DB 43H,44H,45H,46H

44 END

위의 코드에서 LUT은 8050H 주소부터 연속하여 위치하고 있다. 서브루틴

TOHEX에서는 LUT의 시작주소에 변환할 문자의 숫자 값을 더함으로써 LUT에

서의 대응 주소를 계산하고 있다. 그리고 단지 해당 주소의 값을 읽어냄으로서

코드 변환이 달성된다.

다음 코드는 LUT를 이용하여 두 문자에 해당하는 16진수의 ASCII 코드로 표현

된 두 바이트에 대해 대응하는 문자로 변환하여 한 바이트 형태로 표현하는 코

드 변환 프로그램이다.

1 ;==========================================

2 ; CC_04.ASM, Code Conversion

3 ; HEX2CHAR by LUT

4 ;==========================================

5 $mod51

8000 6 ORG 8000H

8000 75812F 7 BASE: MOV SP,#2FH

8

8003 7844 9 MOV R0,#44H ; Hexa of 'D'

8005 7937 10 MOV R1,#37H ; Hexa of '7'

11

8007 E8 12 MOV A,R0

8008 1119 13 CALL TOCHAR

Page 194: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

184 MCS-51 마이크로컴퓨터

800A F5F0 14 MOV B,A

15

800C E9 16 MOV A,R1

800D 1119 17 CALL TOCHAR

18

800F C4 19 SWAP A

20

8010 45F0 21 ORL A,B

8012 908100 22 MOV DPTR,#8100H

8015 F0 23 MOVX @DPTR,A

24

8016 020000 25 JMP #0000H

26

27 ; subroutine

8019 908000 28 TOCHAR: MOV DPTR,#BASE

801C 2582 29 ADD A,DPL

801E F582 30 MOV DPL,A

8020 E0 31 MOVX A,@DPTR

8021 22 32 RET

33

8030 34 ORG 8030H

8030 00010203 35 TABLE: DB 00H,01H,02H,03H

8034 04050607 36 DB 04H,05H,06H,07H

8038 0809 37 DB 08H,09H

38

8041 39 ORG 8041H

8041 0A0B 40 TABLE1: DB 0AH,0BH

8043 0C0D0E0F 41 DB 0CH,0DH,0EH,0FH

42

43 END

위의 코드에서 LUT는 메모리 공간 상에서 두 블록으로 나뉘어져 있는데, 이는

변환과정에서 읽어낼 주소를 쉽게 구하고자 함이다. 서브루틴 TOCHAR에서는

8000H를 기준으로 이 주소에 16진수로 표현된 ASCII 코드 값을 더하여 LUT 테

이블의 대응하는 주소를 결정하고 있다.

Page 195: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제6장 스택 및 서브루틴 185

6.3 실습과제

[실습1] 스택을 이용한 역순 재배열

16바이트의 데이터가 메모리에 저장되어 있다고 가정할 때, 스택을 이용하여 바

이트 단위로 역순으로 재배열하는 프로그램을 작성한다.

[실습2] CHAR2HEX 코드 변환 I

메모리 블록으로 저장된 임의 문자열에 대해(예, "F1FA2002") 각 문자에 해당하

는 ASCII 코드로 변환하는 프로그램을 작성한다. 단, 계산에 의한 방식으로 변환

하며, 주요 부분은 서브루틴으로 구성한다.

[실습3] CHAR2HEX 코드 변환 II

메모리 블록으로 저장된 임의 문자열에 대해(예, "F1FA2002") 각 문자에 해당하

는 ASCII 코드로 변환하는 프로그램을 작성한다. 단, LUT을 이용한 방식으로

변환하며, 주요 부분은 서브루틴으로 구성한다.

[실습4] HEX2CHAR 코드 변환 I

[실습2] 혹은 [실습3]의 프로그램 결과인 ASCII 코드의 메모리 블록에 대해 연속

된 문자로 변환하는 프로그램을 작성한다. 단, 계산에 의한 방식으로 변환하며,

주요 부분은 서브루틴으로 구성한다.

[실습5] HEX2CHAR 코드 변환 II

[실습2] 혹은 [실습3]의 프로그램 결과인 ASCII 코드의 메모리 블록에 대해 연속

된 문자로 변환하는 프로그램을 작성한다. 단, LUT에 의한 방식으로 변환하며,

주요 부분은 서브루틴으로 구성한다.

Page 196: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

186 MCS-51 마이크로컴퓨터

Page 197: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제7장 포트 입출력 187

제7장 포트 입출력

MCS-51 MCU는 8비트 단위의 양방향 입출력 포트 P0, P1, P2, P3 4개가 지원

된다. 본 장에서는 이들 입출력 포트의 하드웨어 구조 및 기능을 살펴보고, 보조

모듈을 입출력 포트에 연결하여 데이터의 입출력을 살펴볼 수 있는 응용 프로그

램을 제시한다.

7.1 입출력 포트

제공되는 입출력 포트들은 내부 램 영역의 주소 공간에 사상됨으로서 메모리 맵

I/O(memory mapped I/O) 방식으로 입출력을 제공한다. 따라서 입출력을 위한

별도의 명령이 지원되지 않고 일반 메모리로의 전송 명령을 통하여 입력 혹은

출력 처리를 하게 된다. 각 입출력 포트는 데이터의 입출력뿐만 아니라, 포트에

래취된 데이터에 대한 비트 처리, 바이트 처리 및 분기 명령에서의 이용이 가능

하다.

MCS-51 MCU가 제공하는 4개의 8비트 양방향 입출력 포트 P0, P1, P2, P3에

대해 보다 세부적으로 살펴보자.

7.1.1 포트 P0(P0.7,...,P0.0)

포트 P0의 각 핀은 [그림 7.1]과 같이 오픈 드레인 출력 방식의 양방향 입출력

핀으로 구성된다. 각 핀은 독립적으로 입력 혹은 출력으로 사용될 수 있다.

일반적으로 포트 P0는 외부 메모리를 연결할 때, 외부 메모리 주소의 하위 바이

트(A7,...,A0) 신호, 혹은 데이터(D7,...D0) 신호의 버스로 사용된다. 반면 외부 메

모리를 연결하지 않을 경우 순수한 입출력 포트의 용도로 사용될 수 있다. 입출

력 포트로 사용될 때는 외부에 풀업 저항을 연결하여 양방향 입출력용으로 사용

하여야 하며, 출력용으로 사용될 경우 각 핀마다 8개의 TTL 게이트를 구동할

수 있는 전류 능력을 가지고 있다.

Page 198: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

188 MCS-51 마이크로컴퓨터

그림 7.1 입출력 포트 P0의 구조

포트 P0를 주소 및 데이터 버스로 사용할 경우 BUS CYCLE TIMING 신호는 1

의 상태이어야 한다. 주소 출력 및 데이터 기록시 WRITE 펄스가 활성화된 상태

에서 내부 버스로부터 1이 설정되는 경우, 위쪽 MOS는 ON, 아래쪽 MOS는

OFF가 되어 입출력 핀으로 1을 출력하게 된다. 반면, 내부 버스로부터 0이 설정

되는 경우 위쪽 MOS는 OFF, 아래쪽 MOS는 ON이 되어 입출력 핀으로 0을 출

력하게 된다. 판독할 때, 즉, READ가 활성화되면 자동으로 D F/F의 입력이 1이

되고, 입출력 핀의 상태가 아래쪽 입력 버퍼를 통해 입력된다.

포트 P0가 입출력용으로 사용될 경우 BUS CYCLE TIMING 신호는 0의 상태를

가지며, 위쪽 MOS는 자동으로 OFF가 되어 오픈 드레인 구조를 형성하고, 일반

입출력용으로 사용하려면 각 입출력 핀의 외부에 풀업 저항을 연결하여야 한다.

1을 출력하는 경우 D는 1이고, 아래쪽 MOS는 OFF가 된다. 만일 외부 풀업저항

이 연결되어 있으면 이 경우 1이 입출력 핀에 출력된다. 0을 출력하는 경우 D는

0이고, 아래쪽 MOS는 OFF가 되어 외부 풀업저항이 연결된 입출력 핀에는 0이

출력된다.

입출력 핀으로 입력하는 경우는 2가지의 READ 형태가 있다. RMW 명령에 의한

입력과 NON RMW 명령에 의한 입력이다. RMW(read-modify-write) 명령이란

Page 199: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제7장 포트 입출력 189

목적 피연산자가 포트로 지정되는 INC P0, 혹은 DEC P0와 같은 명령들이다. 즉,

포트의 데이터를 읽어(read), 연산 처리(modify)하고, 그 결과를 다시 기록(write)

하는 형태의 명령들을 의미한다. 이들 명령의 경우는 입출력 핀의 상태가 아닌

D F/F의 상태를 위쪽 입력 버퍼를 통해 입력하는 것이다. 이러한 상황은 모든

입출력 포트에 적용된다.

NON RMW 명령에 의한 입력 시 아래쪽 MOS가 ON이면, 입출력 핀의 신호가

무엇이든 항상 0을 입력하게 되므로, 입력 시 아래쪽 MOS가 OFF가 되도록 해

야 한다. 이를 위해 포트에 1을 출력한 후, 아래쪽 입력 버퍼를 통하여 판독하여

야 한다. 이러한 사항 또한 MCS-51 MCU의 모든 입출력 포트에 해당하는 사항

이다.

7.1.2 포트 P1(P1.7,...,P1.0)

포트 P1의 각 핀은 [그림 7.2]와 같이 내부적으로 풀업된 양방향 입출력 핀으로

구성되며, 범용의 입출력 용도로 사용된다. 출력으로 사용할 때 각 핀은 4개의

LS TTL 게이트를 구동할 수 있는 전류 능력을 제공한다.

그림 7.2 입출력 포트 P1의 구조

Page 200: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

190 MCS-51 마이크로컴퓨터

P1의 Zero To One TRANSITION은 WRITE 펄스가 1인 동안 소프트웨어적으로

출력 비트의 래취 회로가 0에서 1로 변경될 때, 클록의 2 사이클 동안만 위쪽

MOS가 ON되도록 한다.

7.1.3 포트 P2(P2.7,...,P2.0)

포트 P2의 각 핀은 [그림 7.3]과 같이 내부적으로 풀업된 양방향 입출력 핀으로

구성된다. 출력으로 사용될 경우 각 핀은 4개의 LS TTL 게이트를 구동할 수 있

는 전류 능력을 제공한다. 외부 메모리를 연결할 경우 외부 메모리 주소의 상위

바이트(A15,...,A8) 신호를 위해 사용되며, 외부 메모리를 연결하지 않는 경우 범

용의 입출력용으로 사용된다.

그림 7.3 입출력 포트 P2의 구조

7.1.4 포트 P3(P3.7,...,P3.0)

포트 P3의 각 핀은 [그림 7.4]와 같이 내부적으로 풀업된 양방향 입출력 핀으로

구성되며, 출력으로 사용될 경우 4개의 LS TTL 게이트를 구동할 수 있는 전류

Page 201: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제7장 포트 입출력 191

능력을 제공한다.

그림 7.4 입출력 포트 P3의 구조

특히, 포트 P3의 각 핀들은 입출력 기능 이외에 [표 7.1]과 같은 특수한 기능을

함께 제공한다. 일반적으로 외부 인터럽트, 타이머/카운터, 시리얼 통신 등을 위

해 포트 P3의 이러한 특수 기능을 활용하는 방식으로 사용하고 있다.

표 7.1 포트 P3의 특수 기능

핀 별 칭 기 능P3.0 RxD 시리얼 수신 포트P3.1 TxD 시리얼 송신 포트P3.2 외부 인터럽트 0P3.3 외부 인터럽트 1P3.4 T0 타이머/카운터 0의 외부 입력P3.5 T1 타이머/카운터 1의 외부 입력P3.6 외부 데이터 메모리 기록 신호P3.7 외부 데이터 메모리 판독 신호

Page 202: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

192 MCS-51 마이크로컴퓨터

7.1.5 KUT51 보드에서의 입출력 포트

제작한 KUT51 실습 보드에서 각 포트의 사용은 [표 7.2]에 정리하였다. KUT51

보드에서 실제의 입출력을 위한 포트는 P1만이 사용되도록 설계되었다.

표 7.2 KUT51 실습 보드에서 입출력 포트의 용도

포트 비트어드레스 용 도P0 P0.7, ..., P0.0 주소의 하위 바이트용(A7, ..., A0)P1 P1.7, ..., P1.0 입출력용 포트 P2 P2.7, ..., P2.0 주소의 상위 바이트용(A15, ..., A8)

P3

P3.0 시리얼통신의 RxDP3.1 시리얼통신의 TxDP3.2 외부인터럽트 0용의 INT0P3.3 외부인터럽트 1용의 INT1P3.4 타이머/카운터 0용의 T0P3.5 타이머/카운터 1용의 T1

7.2 입출력 처리 및 시간지연

7.2.1 입출력 처리

MCS-51 MCU는 입출력을 위해 Z80 CPU에서와 같은 별도의 전용 입출력 명령

을 지원하지 않는다. 대신 메모리 맵 방식의 입출력을 지원하므로 메모리에 데이

터를 이동하는 명령인 전송 명령(MOV, MOVX)을 이용하여 입출력 효과를 얻을

수 있다.

이들 입출력 관련 명령들에는 다음과 같은 비트 단위 및 바이트 단위 입출력을

수행하는 명령들이 지원된다. 비트 단위로 입출력할 때에는 C(carry) 비트를, 바

이트 단위인 경우 ACC를 사용한다.

MOV C,P1.0 ; C <- P1.0, Bit InputMOV P1.1,C ; P1.1 <- C, Bit OutputMOV A,P1 ; A <- P1, Byte Input

Page 203: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제7장 포트 입출력 193

MOV P1,A ; P1 <- A, Byte Output

또한, 입출력 포트에 비트 단위로 1을 설정하거나 0을 설정하는 다음 명령들을

사용할 수 있다.

SETB P1.0 ; P1.0 <- 1CLR P1.1 ; P1.1 <- 0

7.2.2 시간지연 서브루틴

제작한 실습 보드에서는 시스템 클록 발생원으로 11.0592MHz의 수정 발진자를

사용한다. 또한 MCS-51 MCU의 명령 수행을 위한 머신 사이클(T)은 12 클록을

요구한다. 따라서 제작한 실습 보드에서 1T는 약 1 μSec에 해당한다.

이를 바탕으로 입출력용 프로그램에서 결과를 눈으로 확인하거나 일정 시간 지

연을 두어야 할 때, 원하는 만큼의 시간 지연을 달성하는 루틴을 구성할 수 있

다. 다음의 시간 지연 루틴을 살펴보자.

DELAY_25: ; approx. 0.25 Sec MOV R4,#249 ; 1T

LOOP2: MOV R5,#100 ; 1TLOOP1: NOP ; 1T*8

NOP NOP

NOP NOP

NOP NOP NOP

DJNZ R5,LOOP1 ; 2T DJNZ R4,LOOP2 ; 2T

RET ; 2T

위의 코드는 약 0.25Sec 정도의 시간 지연 효과를 얻을 수 있는 서브루틴으로,

지연 시간을 계산하면 다음과 같다.

Page 204: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

194 MCS-51 마이크로컴퓨터

1T + (1T + ((8T + 2T) x 100) + 2T) x 249 + 2T = 249750T = 249750 x 1 μSec ≅ 0.24975 Sec

7.3 입출력 모듈 제어

본 절에서는 자동제어 가로등, 멜로디 모듈 제어, DC 모터 제어 응용 프로그램

구현에 관해 살펴본다. 또한 이용된 관련 몇 가지 입출력 모듈의 제어 방법에 대

해 설명한다.

7.3.1 LED 점멸

포트 P1의 하위 니블에 LED 모듈을 연결하고, 이 모듈의 최하위 비트부터 좌로

이동하면서 네 개의 LED를 차례로 ON하기를 반복하는 프로그램은 다음과 같다.

여기서 LED 점등 간격은 약 1Sec로 한다.

1 ;======================================

2 ; IO_01.ASM

3 ; P1_L : LED MODULE

4 ;======================================

5 $mod51

8000 6 ORG 8000H

8000 758140 7 MOV SP,#40H

8 ;

8003 9 IO_USING_PORT1:

8003 74FE 10 MOV A,#11111110B

8005 F590 11 LOOP_M: MOV P1,A

8007 110F 12 CALL DELAY_100

8009 23 13 RL A

800A 20E4F8 14 JB ACC.4,LOOP_M

15 ;

800D 80F4 16 SJMP IO_USING_PORT1

17 ;

18 ; DELAY SUBROUTINES

Page 205: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제7장 포트 입출력 195

800F 19 DELAY_100:

800F 753004 20 MOV 30H,#4

8012 1118 21 LOOP100: ACALL DELAY_25

8014 D530FB 22 DJNZ 30H,LOOP100

8017 22 23 RET

24 ;

8018 25 DELAY_25: ; 0.25SEC

8018 7CF9 26 MOV R4,#249 ; 1T

801A 7D64 27 LOOP2: MOV R5,#100 ; 1T

801C 00 28 LOOP1: NOP ; 1T

801D 00 29 NOP

801E 00 30 NOP

801F 00 31 NOP

8020 00 32 NOP

8021 00 33 NOP

8022 00 34 NOP

8023 00 35 NOP

8024 DDF6 36 DJNZ R5,LOOP1 ; 2T

8026 DCF2 37 DJNZ R4,LOOP2 ; 2T

8028 22 38 RET

39 ;

40 END

7.3.2 스위치 상태 입출력

다음의 소스는 각 버튼을 누를 때마다 그 위치에 대응하는 LED를 ON하는 프로

그램이다. 포트 P1의 상위 니블에는 버튼 모듈을, 하위 니블에는 LED 모듈을 연

결한다.

1 ;================================

2 ; IO_02.ASM

3 ; P1_L : LED MODULE

4 ; P1_H : BUTTON MODULE

5 ;================================

6 $mod51

8000 7 ORG 8000H

8 ;

8000 7590FF 9 MOV P1,#0FFH ; LED OFF

Page 206: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

196 MCS-51 마이크로컴퓨터

10 ;

8003 E590 11 LOOP: MOV A,P1 ; IN

8005 C4 12 SWAP A

8006 44F0 13 ORL A,#0F0H

8008 F590 14 MOV P1,A ; OUT

800A 80F7 15 SJMP LOOP

16 ;

17 END

7.3.3 간단한 신호등 제어

다음의 프로그램은 신호등의 동작을 행하는 프로그램이다. 포트 P1의 하위 니블

에 LED 모듈을 연결하고, 각 LED의 위치에 따라 신호등의 R, Y, G를 가정하여

신호등의 동작을 수행하는 프로그램을 작성한다. 최하위 LED부터 RED,

YELLOW, GREEN 신호등이라 가정하여, RED 1초간 ON -> RED 2회 점멸

-> YELLOW .5초간 ON -> GREEN .75초간 ON하며, 이를 반복한다.

1 ;======================================

2 ; IO_03.ASM

3 ; P1_L : LED MODULE

4 ;======================================

5 $mod51

8000 6 ORG 8000H

8000 758140 7 MOV SP,#40H

8 ;

8003 9 IO_USING_PORT1:

8003 7590FE 10 MOV P1,#0FEH ; R ON

8006 1124 11 ACALL DELAY_100

12 ;

8008 75F004 13 MOV B,#4 ; BLINK

800B 7590FF 14 LOOP: MOV P1,#0FFH

800E 113F 15 ACALL DELAY_25

8010 7590FE 16 MOV P1,#0FEH

8013 113F 17 ACALL DELAY_25

8015 D5F0F3 18 DJNZ B,LOOP

19 ;

8018 7590FD 20 MOV P1,#11111101B ; Y ON

801B 1136 21 ACALL DELAY_50

Page 207: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제7장 포트 입출력 197

22 ;

801D 7590FB 23 MOV P1,#11111011B ; G ON

8020 112D 24 ACALL DELAY_75

25 ;

8022 80DF 26 SJMP IO_USING_PORT1

27 ;

28 ; DELAY SUBROUTINES

8024 29 DELAY_100:

8024 753004 30 MOV 30H,#4

8027 31 LOOP100:

8027 113F 32 ACALL DELAY_25

8029 D530FB 33 DJNZ 30H,LOOP100

802C 22 34 RET

35 ;

802D 36 DELAY_75:

802D 753003 37 MOV 30H,#3

8030 113F 38 LOOP75: ACALL DELAY_25

8032 D530FB 39 DJNZ 30H,LOOP75

8035 22 40 RET

41 ;

8036 42 DELAY_50:

8036 753002 43 MOV 30H,#2

8039 113F 44 LOOP50: ACALL DELAY_25

803B D530FB 45 DJNZ 30H,LOOP50

803E 22 46 RET

47 ;

803F 48 DELAY_25: ; 0.25SEC

803F 7CF9 49 MOV R4,#249 ; 1T

8041 7D64 50 LOOP2: MOV R5,#100 ; 1T

8043 00 51 LOOP1: NOP ; 1T

8044 00 52 NOP

8045 00 53 NOP

8046 00 54 NOP

8047 00 55 NOP

8048 00 56 NOP

8049 00 57 NOP

804A 00 58 NOP

804B DDF6 59 DJNZ R5,LOOP1 ; 2T

804D DCF2 60 DJNZ R4,LOOP2 ; 2T

804F 22 61 RET

62 ;

63 END

Page 208: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

198 MCS-51 마이크로컴퓨터

7.3.4 FND 모듈

[그림 7.5]는 흔히 7-세그먼트라 불리는 FND(flexible numeric display) 모듈의

회로도를 보인다.

그림 7.5 FND 모듈

FND 모듈에는 7-세그먼트 LED가 장착되어 있으며, 신호 입력에 따라 각 세그

먼트를 ON 혹은 OFF 하여 다양한 기호를 표현할 수 있다. 각 세그먼트는 이 모

듈의 입력 핀과 연결되어 있으며, 이 모듈의 입력 신호가 High이면 대응하는 세

그먼트는 ON되고, 그렇지 않으면 OFF된다. FND 모듈에 입력되는 신호는 8비트

이며, 7-세그먼트 LED의 각 세그먼트와 대응되는 비트 패턴은 [그림 7.6]과 같

다.

7 6 5 4 3 2 1 0a b c d e f g dp

그림 7.6 7-세그먼트 LED 및 비트 패턴

Page 209: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제7장 포트 입출력 199

[표 7.3]은 16진수에 해당하는 문자들의 패턴 코드를 정리한 것이다. 마지막의 패

턴은 모든 세그먼트를 소등하는 패턴을 나타낸다.

표 7.3 16진수 표현 문자의 패턴 코드

문자 a b c d e f g dp Hexa'0' 1 1 1 1 1 1 0 0 FCH'1' 0 1 1 0 0 0 0 0 60H'2' 1 1 0 1 1 0 1 0 DAH'3' 1 1 1 1 0 0 1 0 F2H'4' 1 0 1 0 0 1 1 0 A6H'5' 1 0 1 1 0 1 1 0 B6H'6' 1 0 1 1 1 1 1 0 BEH'7' 1 1 1 0 0 0 0 0 E0H'8' 1 1 1 1 1 1 1 0 FEH'9' 1 1 1 1 0 1 1 0 F6H'A' 1 1 1 0 1 1 1 0 EEH'b' 0 0 1 1 1 1 1 0 3EH'c' 0 0 0 1 1 0 1 0 1AH'd' 0 1 1 1 1 0 1 0 7AH'E' 1 0 0 1 1 1 1 0 9EH'F' 1 0 0 0 1 1 1 0 8EH

all Off 0 0 0 0 0 0 0 0 00H

'C', 'P', 'U'라는 문자 패턴을 FND 모듈에 출력하는 프로그램을 작성한다고 가

정할 때, 각 문자에 대한 패턴 코드는 [그림 7.7]과 같이 결정할 수 있다.

문자 a b c d e f g dp Hexa'C' 1 0 0 1 1 1 0 0 9CH'P' 1 1 0 0 1 1 1 0 CEH'U' 0 1 1 1 1 1 0 0 7CH

그림 7.7 “CPU”에 대한 비트 패턴

Page 210: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

200 MCS-51 마이크로컴퓨터

이렇게 결정된 패턴 코드를 이용하여 FND 모듈에 'C', 'P', 'U'라는 문자 패턴

을 반복하여 표시하는 프로그램을 아래에 보인다.

1 ;======================================

2 ; MAPP_01.ASM

3 ; P1 : FND MODULE

4 ;======================================

5 $mod51

8000 6 ORG 8000H

8000 758140 7 MOV SP,#40H

8 ;

8003 908100 9 E_LOOP: MOV DPTR,#PATTERN

8006 75F003 10 MOV B,#03H

8009 E0 11 I_LOOP: MOVX A,@DPTR

800A F590 12 MOV P1,A

800C 1115 13 CALL DELAY_100

800E 0582 14 INC DPL

8010 D5F0F6 15 DJNZ B,I_LOOP

8013 80EE 16 JMP E_LOOP

17

18 ; DELAY SUBROUTINES

8015 19 DELAY_100:

8015 753004 20 MOV 30H,#4

8018 111E 21 LOOP100: ACALL DELAY_25

801A D530FB 22 DJNZ 30H,LOOP100

801D 22 23 RET

24 ;

801E 25 DELAY_25: ; 0.25SEC

801E 7CF9 26 MOV R4,#249 ; 1T

8020 7D64 27 LOOP2: MOV R5,#100 ; 1T

8022 00 28 LOOP1: NOP ; 1T

8023 00 29 NOP

8024 00 30 NOP

8025 00 31 NOP

8026 00 32 NOP

8027 00 33 NOP

8028 00 34 NOP

8029 00 35 NOP

802A DDF6 36 DJNZ R5,LOOP1 ; 2T

802C DCF2 37 DJNZ R4,LOOP2 ; 2T

802E 22 38 RET

Page 211: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제7장 포트 입출력 201

39 ;

8100 40 ORG 8100H

8100 41 PATTERN:

8100 9C 42 DB 9CH ;'C'

8101 CE 43 DB 0CEH ;'P'

8102 7C 44 DB 7CH ;'U'

45 ;

46 END

7.3.5 자동형 가로등

밤과 낮에 따라 자동으로 점등 및 소등되는 가로등을 설계하고자 할 때 요구되

는 관련 모듈들에 대해 살펴본다. 이를 위해서는 낮과 밤으로 인한 밝기의 변화

를 감지하여 적절한 신호를 출력하는 광 센서와 높은 전압을 사용하는 가로등

점등 스위치를 제어할 수 있는 릴레이의 사용이 요구된다.

광 스위치 모듈

광 스위치 모듈은 밝기의 변화에 따라 Low 혹은 High 신호를 출력하는 모듈이

다. 이 모듈의 핵심 구성 소자는 밝기에 따라 내부 저항이 변하는 광 도전 셀이

다. 광 스위치 모듈에는 [그림 7.8]과 같이 5PK25B-T라는 광 도전 셀과 감도조

절용 가변저항이 장착되어 있으며, 출력 신호는 커넥터의 데이터 최하위 비트와

연결되어 있다.

그림 7.8 광 스위치 모듈의 회로도

Page 212: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

202 MCS-51 마이크로컴퓨터

어두울 때는 광 도전 셀의 내부 저항이 매우 커져 TR이 ON 상태가 되고 Low

레벨의 신호가 출력된다. 반면 밝을 때는 내부 저항이 작아져 TR은 OFF 상태가

되고 High 레벨의 신호가 출력된다.

릴레이 모듈

기본 시스템에서의 출력 신호로는 높은 전압을 요구하는 주변기기를 직접 제어

할 수 없다. 따라서 이러한 경우에 사용할 수 있는 모듈이 릴레이 모듈이다.

릴레이(relay) 모듈에는 [그림 7.9]와 같이 접점 용량이 AC 120V 3A인 IS1588이

장착되어 있으며, 제어를 위한 입력 신호는 데이터의 최하위 비트와 연결되어 있

으며, 접점 단자에는 제어하고자 하는 높은 전압을 요구하는 기기의 전원선 한쪽

을 절단하여 연결한다. 제어 입력 신호가 High 레벨이면 접점단자는 ON 되고

그렇지 않으면 OFF 된다.

그림 7.9 릴레이 모듈의 회로도

다음의 프로그램은 광 스위치와 릴레이 모듈을 이용하여 주간에 소등되고 야간

에 ON되는 자동 형태의 가로등 동작을 수행하는 프로그램이다.

1 ;======================================

2 ; MAPP_02.ASM

3 ; P1_H : Opt. sensor module(DARK LOW)

4 ; P1_L : Relay module(ACTIV HIGH)

5 ;======================================

6 $mod51

Page 213: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제7장 포트 입출력 203

8000 7 ORG 8000H

8000 758140 8 MOV SP,#40H

9 ;

8003 E590 10 LOOP: MOV A,P1

8005 F4 11 CPL A

8006 C4 12 SWAP A

8007 F590 13 MOV P1,A

8009 80F8 14 JMP LOOP

15

16 END

7.3.6 음 스위치 및 멜로디 모듈 응용

예를 들면 소리를 지르거나 박수소리에 따라 특정 멜로디를 연주하거나 중지하

는 응용 프로그램을 작성할 수 있다. 이러한 상황에서 입력되는 소리의 강도에

따라 적절한 출력을 내는 음 스위치와 그에 따라 멜로디를 연주할 수 있는 멜로

디 IC, 증폭회로, 스피커 등이 요구된다.

음 스위치 모듈

음 스위치 모듈은 입력되는 소리의 강도에 따라 적절한 레벨의 신호를 출력하며,

[그림 7.10]과 같이 출력신호는 커넥터의 최하위 비트와 연결되어 있다. 이 모듈

은 콘덴서형 마이크와 증폭기 및 감도 조절용 가변저항으로 구성된다.

그림 7.10 음 스위치 모듈의 회로도

Page 214: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

204 MCS-51 마이크로컴퓨터

멜로디 모듈

멜로디(melody) 모듈은 [그림 7.11]과 같이 미리 멜로디가 프로그램 된 IC 9630

이 장착되어 있으며, 데이터의 최하위 비트의 입력 신호에 따라 멜로디가 연주

혹은 정지하게 되며, 출력 신호는 데이터의 최하위 비트로 출력된다.

그림 7.11 멜로디 모듈의 회로도

멜로디 모듈만으로는 멜로디 소리를 들을 수 없기 때문에 앰프 모듈과 스피커

모듈을 함께 연결하여야 한다.

앰프 모듈

앰프(amp) 모듈은 미약한 신호를 입력받아 그 신호를 증폭시키는 기능을 한다.

일반적으로 멜로디 모듈에서 출력되는 미약한 신호를 입력받아 스피커를 울리는

용도로 사용된다. [그림 7.12]는 앰프 모듈의 회로를 보인다. 이 멜로디 모듈에는

KA2201이 장착되어 있으며, 입력신호는 데이터의 최하위 비트와 연결되어 있으

며, 출력신호 또한 데이터의 최하위 비트와 연결되어 있다.

그림 7.12 앰프 모듈의 회로도

Page 215: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제7장 포트 입출력 205

스피커 모듈

스피커(speaker) 모듈은 스피커가 장착되어 있으며, 전기신호를 인간이 들을 수

있는 가청 주파수 대의 소리로 변환하는 역할을 한다. [그림 7.13]은 스피커 모듈

의 회로도를 보인다. 사용된 스피커는 임피던스가 8Ω이고 출력이 0.2W인 휴대용

라디오용 소형 스피커다. 입력 신호는 데이터의 최하위 비트와 연결되어 있다.

그림 7.13 스피커 모듈의 회로도

일반적으로 멜로디 모듈을 응용하는 경우 [그림 7.14]와 같이 멜로디 모듈, 앰프

모듈, 스피커 모듈을 결합하여 사용한다.

그림 7.14 멜로디 모듈의 응용을 위한 모듈 연결도

다음은 이들 모듈들을 활용하여 일단 멜로디가 연주되다가, 일정 시간 후에 중지

하는 프로그램이다. 포트 P1의 상위 니블에 음 스위치 모듈을, 하위 니블에 [그

림 7.14]와 같이 스피커까지 연결된 멜로디 모듈을 연결한다.

1 ;======================================

2 ; MAPP_03.ASM

Page 216: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

206 MCS-51 마이크로컴퓨터

3 ; P1_H : 음스위치 Module(ACTIVE LOW가정)

4 ; P1_L : Melody module(ACTIV HIGH)

5 ;======================================

6 $mod51

8000 7 ORG 8000H

8000 758140 8 MOV SP,#40H

9 ;

8003 E590 10 LOOP: MOV A,P1

8005 54F0 11 ANL A,#0F0H

8007 B4E0F9 12 CJNE A,#0E0H,LOOP

13

800A D290 14 PLAY: SETB P1.0

800C 1112 15 CALL DELAY_100 ;1SEC

800E C290 16 CLR P1.0 ;STOP

8010 80F1 17 JMP LOOP

18

19 ; DELAY SUBROUTINES

8012 20 DELAY_100:

8012 753004 21 MOV 30H,#4

8015 111B 22 LOOP100: ACALL DELAY_25

8017 D530FB 23 DJNZ 30H,LOOP100

801A 22 24 RET

25 ;

26

801B 27 DELAY_25: ; 0.25SEC

801B 7CF9 28 MOV R4,#249 ; 1T

801D 7D64 29 LOOP2: MOV R5,#100 ; 1T

801F 00 30 LOOP1: NOP ; 1T

8020 00 31 NOP

8021 00 32 NOP

8022 00 33 NOP

8023 00 34 NOP

8024 00 35 NOP

8025 00 36 NOP

8026 00 37 NOP

8027 DDF6 38 DJNZ R5,LOOP1 ; 2T

8029 DCF2 39 DJNZ R4,LOOP2 ; 2T

802B 22 40 RET

41 ;

42 END

Page 217: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제7장 포트 입출력 207

7.3.7 DC 모터 제어

본 절에서는 DC 모터의 제어를 통하여 회전속도를 일정하게 유지시키기 위한

PWM(pulse width modulation) 개념 및 회전 속도를 검출하여 그에 따라 속도를

재조정하는 등의 응용을 시험해 볼 수 있다.

DC 모터 모듈

DC 모터 모듈은 [그림 7.15]와 같이 모터 구동회로와 회전 검출회로가 함께 구현

되어 있다. 모터 구동회로는 하나의 TR(transister)로 구성되며 모터에 가하는 전

압을 ON, OFF함으로써 그 회전율을 제어할 수 있다. 회전 검출회로는 모터에

붙어 있는 원판에 8개의 구멍이 있으며, 이를 통해 발광소자로부터의 빛을 수광

소자가 검출하고 그 신호를 증폭하여 출력한다. 이 출력된 신호를 계수하면 회전

수 등을 파악할 수 있다. 모터의 구동을 제어하는 입력신호는 DC 모터 모듈의

상위 니블의 최하위 비트로 입력되며, 회전 검출 회로의 출력은 하위 니블의 최

하위 비트로 출력된다.

그림 7.15 DC 모터 모듈의 회로도

Page 218: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

208 MCS-51 마이크로컴퓨터

회전 속도 조절

모터의 회전 속도는 일정한 시간의 한 주기 내에서 제어신호의 ON, OFF시간을

조절함으로써 달성할 수 있다. [그림 7.16]과 같이 한 사이클이 12개의 단위시간

으로 구성되고 이러한 사이클이 반복된다고 가정한다. 여기서 단위 시간은 일정

시간을 소요하는 시간 지연 루틴으로 구성할 수 있다. [그림 7.16]에서 한 사이클

을 이루고 있는 제어 신호가 단위 시간 4회의 ON과 8회의 OFF로 구성된 예를

보이고 있다. 한 사이클을 구성하는 단위 시간들에 대한 ON한 단위 시간의 비를

듀티비(duty ratio)라 한다. 이 경우 듀티비는 4/12 = 1/3이다.

그림 7.16 속도 제어를 위한 신호

이와 같이 한 사이클을 구성하는 ON과 OFF의 단위 시간 수를 조절함으로써 모

터의 회전 속도를 조절할 수 있다. [그림 7.17]은 한 사이클을 구성하는 듀티비를

달리하여 모터의 상대적인 속도를 표현한 것이다.

그림 7.17 듀티비(DR)에 따른 상대적 속도

Page 219: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제7장 포트 입출력 209

듀티비가 16/16=1에서와 같이 ON의 제어 신호만 보낼 경우, 일정한 시간이 지난

후부터 모터는 가능한 최대의 속도로 안정화될 것이다. 반면 8/16=0.5인 경우는

동일한 단위시간 수만큼 ON, OFF하는 사이클이 계속하여 반복되기 때문에 앞의

경우보다는 저속에서 안정화되게 된다. 이와 같은 방식으로 원하는 속도로 안정

적으로 회전할 수 있도록 제어하는 것이 가능하다.

다음 코드는 DC 모터를 구동하는 프로그램이다. R0 레지스터에 ON의 횟수 10

을, R1 레지스터에 OFF의 횟수 6을 설정하고 있으므로 이 프로그램에서 한 사

이클의 단위 시간 수는 16이 된다. 따라서 듀티 비는 10/16 이다.

1 ;======================================

2 ; MAPP_04.ASM

3 ; P1 : DC MOTOR Module

4 ; 1 CYCLE = 16 UNITS

5 ;======================================

6 $mod51

8000 7 ORG 8000H

8000 758140 8 MOV SP,#40H

9 ;

8003 780A 10 LOOP: MOV R0,#10 ; ON #

8005 7906 11 MOV R1,#06 ; OFF #

12

8007 74FF 13 ON: MOV A,#0FFH

8009 F590 14 MOV P1,A

800B 1117 15 CALL TIME_UNIT

800D D8F8 16 DJNZ R0,ON

17

800F C294 18 OFF: CLR P1.4

8011 1117 19 CALL TIME_UNIT

8013 D9FA 20 DJNZ R1,OFF

21

8015 80EC 22 JMP LOOP

23

24 ; time unit RTN

8017 25 TIME_UNIT:

8017 7D01 26 MOV R5,#1H

8019 00 27 LOOP1: NOP

801A 00 28 NOP

801B 00 29 NOP

Page 220: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

210 MCS-51 마이크로컴퓨터

801C 00 30 NOP

801D DDFA 31 DJNZ R5,LOOP1

801F 22 32 RET

33 ;

34 END

7.4 실습과제

[실습1] 스위치 입력 값만큼 점멸

포트 P1의 상위 니블에는 버튼 모듈을, 하위 니블에는 LED 모듈을 연결하고, 버

튼 모듈을 통해 눌려진 4비트의 값만큼 모든 LED가 점멸하는 프로그램을 작성

한다.

[실습2] 키에 따라 각기 다른 패턴 출력

포트 P1의 상위 니블에는 버튼 모듈을, 하위 니블에는 LED 모듈을 연결하고, 각

버튼에 따라 다른 동작을 하는 프로그램을 작성한다. 각 버튼이 눌려짐에 따라

각기 다른 LED 모듈의 점등 패턴 및 동작을 정의하여 서브루틴으로 구성하며,

시간 지연 루틴 또한 적절히 정의하고 그 지연 시간을 계산하여 제시한다. 단,

여러 개의 버튼이 동시에 눌려지는 상황은 고려치 않는다.

[실습3] FND 모듈 응용

FND 모듈을 연결하고, 자신의 이름 패턴을 연속하여 보이는 프로그램을 작성한

다.

[실습4] 자동형 가로등

점차 어두워지면서 가로등의 불을 켜고, 새벽이 되어 날이 밝으면 자동으로 소등

되도록 프로그램을 작성한다. 단 가로등의 등은 일반 가정용 백열 전구를 사용한

다고 가정한다. 이를 위해 광 센서 모듈과 릴레이 모듈을 포트 P1에 연결한다.

Page 221: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제7장 포트 입출력 211

[실습5] 음성 및 멜로디 모듈 응용 I

음 스위치 모듈 가까이서 소리를 치거나 박수를 치면 멜로디가 연주되도록 하고,

일단 멜로디가 연주되기 시작하여 약 10초 후에는 연주를 종료하도록 프로그램

을 작성한다.

[실습6] 음성 및 멜로디 모듈 응용 II

음 스위치 모듈 가까이서 소리를 치거나 박수를 치면 멜로디가 연주되도록 하고,

또 다시 소리를 지르면 연주를 멈추는 식으로 입력이 발생할 때마다 멜로디의

연주가 토글되도록 프로그램을 작성한다.

[실습7] DC 모터 제어

DC 모터를 구동할 때 서로 다른 몇 가지의 듀티비에 대해, 각 경우에 따른 회전

속도를 관찰하여 비교해 본다.

Page 222: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

212 MCS-51 마이크로컴퓨터

Page 223: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제8장 인터럽트 213

제8장 인터럽트

본 장에서는 MCS-51에서 제공하는 인터럽트 구조에 대한 개략적인 내용에 대해

살펴보며, 끝 절에서 외부 인터럽트에 대해 구체적으로 살펴보고 관련 응용 프로

그램을 작성해 본다. MCS-51은 외부 인터럽트 2개, 타이머 인터럽트 2개 그리고

시리얼 포트 인터럽트 1개의 총 5개 인터럽트를 기본 제공한다. 8051로부터 파생

되어 개발된 칩들은 여기에서 소개된 것 이외에 추가적인 인터럽트를 제공하기

도 한다.

8.1 인터럽트 개요

MCS-51은 마스커블 인터럽트만을 허용하며 그 가지 수도 여러 가지가 존재한

다. 인터럽트는 정상적인 프로그램 수행에 개입하는 어떤 이벤트를 말하는 것이

다.

일반적으로 프로그램의 흐름은 순차적으로 수행된다. 비록 몇몇 명령에 의해서

프로그램의 흐름을 명시적으로 변경하는 것이 가능하다. 그러나 인터럽트는 정상

적인 프로그램의 흐름을 멈추고, 서브루틴을 수행한 후 아무 일도 없었던 듯이

본래의 정상적인 프로그램 흐름을 재개하는 메커니즘을 제공한다. 이러한 특정

인터럽트 요청에 대한 서비스를 제공하는 서브루틴을 인터럽트 서비스 루틴이라

부르며, 어떤 사건에 의해 인터럽트가 발생되었을 때만 수행되는 루틴이다.

인터럽트는 타이머/카운터에서의 오버플로나 시리얼 포트를 통한 문자의 송수신,

혹은 외부로부터 발생되는 이벤트들 중 하나일 수 있다. MCS-51은 적절히 환경

설정됨으로써 이러한 이벤트의 어느 것이 발생되면 주 프로그램의 수행을 잠시

멈추고 미리 정해진 루틴으로 수행의 제어를 넘겨주게 된다. 물론 이때 수행되는

루틴은 해당 이벤트가 발생했을 때 그 이벤트와 관련된 기능을 수행되도록 예정

되어 있다. 일단 인터럽트 서비스 루틴의 수행이 종료되면 제어는 원래의 주 프

로그램으로 반환되어 실행을 재개한다. 주 프로그램은 무엇인가 개입되었다는 것

조차 알지 못한다.

Page 224: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

214 MCS-51 마이크로컴퓨터

8.1.1 인터럽트 유형

MCS-51 CPU에서 제공하는 5가지 인터럽트 유형의 원인은 다음과 같다.

▪ 외부 인터럽트 0

▪ 외부 인터럽트 1

▪ 타이머/카운터 0 오버플로

▪ 타이머/카운터 1 오버플로

▪ 시리얼 통신의 문자 송․수신

이들 인터럽트의 트리거 신호는 [표 8.1]과 같이 입출력 포트 P3의 특수 기능과

매우 밀접한 관련이 있다.

표 8.1 포트 P3의 특수 기능

핀 별 칭 기 능P3.0 RxD 시리얼 수신 포트P3.1 TxD 시리얼 송신 포트P3.2 INT0 외부 인터럽트 INT0의 입력P3.3 INT1 외부 인터럽트 INT1의 입력P3.4 T0 타이머/카운터 T/C0의 외부 입력P3.5 T1 타이머/카운터 T/C1의 외부 입력P3.6 WR 외부 데이터 메모리 기록 신호P3.7 RD 외부 데이터 메모리 판독 신호

외부 인터럽트는 P3.2 혹은 P3.3으로부터 입력되는 외부 이벤트를 인터럽트 요청

신호로 취급하는 인터럽트이다.

타이머/카운터 인터럽트는 내부 클록 혹은 P3.4 혹은 P3.5의 외부 이벤트를 계수

하는 업 카운터에서 오버플로가 발생하는 것을 인터럽트 요청 신호로 취급하는

인터럽트로, 일정시간 간격에 따라 혹은 외부 이벤트의 일정 발생 횟수에 따라

어떠한 처리를 수행하여야 할 때 유용하게 사용되는 인터럽트 형태이다.

Page 225: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제8장 인터럽트 215

시리얼 인터럽트는 시리얼 통신 케이블을 통하여 문자의 송신 혹은 수신시 이를

인터럽트 요청신호로 취급하는 인터럽트이다.

8.1.2 인터럽트 구조

[그림 8.1]은 MCS-51 MCU의 인터럽트 구조를 이해하는데 있어 중요한 그림으

로, 인터럽트 요청이 발생하였을 때 어느 인터럽트의 요청을 서비스할 것인가를

결정하기 위해 TCON, IE, IP SFR와 우선순위가 어떻게 동작되는가를 보여준다.

TF0

TF1

R1T1

INT0

INT1

IE001 IT0

IE101 IT1

EX0

ET0

EX1

ET1

E8EA

IE SFR

PX0

PT0

PX1

PT1

P8

IP SFR HIGHLOW

DefaultPriority

그림 8.1 MCS-51 MCU 인터럽트 구조

MCS-51에서의 인터럽트 우선순위는 두 가지 레벨을 제공한다. 리셋시 모든 인

터럽트는 Low 레벨의 우선순위를 가지며, 각각의 인터럽트는 내정된 우선순위를

따르도록 되어 있다. 특정 인터럽트의 우선순위를 변경하기 위해서는 IP SFR의

해당 인터럽트 비트를 1로 설정함으로써 우선순위를 높일 수 있다. 또한 인터럽

트 요청을 취급하도록 허용하기 위해서는 IE SFR의 해당 인터럽트 허용 비트를

1로 설정하여야 하며, 어느 하나의 인터럽트라도 취급하기 위해서는 IE SFR의

EA 비트를 필히 1로 설정하여야 한다. 또한 인터럽트 요청은 각 인터럽트 요청

플래그 비트의 설정여부로 판정되며, 이러한 비트들로는 외부 인터럽트를 위해

TCON SFR의 IE0, IE1, 타이머/카운터 인터럽트를 위해 TCON SFR의 TF0,

Page 226: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

216 MCS-51 마이크로컴퓨터

TF1이 있으며, 시리얼 통신 인터럽트의 경우 SCON SFR의 RI, TI 비트가 있다.

특히, 외부 인터럽트의 경우 신호 핀으로부터의 신호에 대해 레벨 트리거 방식과

에지 트리거 방식으로 취급할 수 있도록 TCON SFR의 IT0, IT1 비트가 사용된

다.

이러한 다양한 인터럽트를 취급하기 위해서는 분명히 여러 가지 인터럽트간의

식별 능력과 요청된 인터럽트에 따라 서로 다른 코드를 수행할 수 있어야 한다.

이는 각 인터럽트 요청시 인터럽트에 따라 내정된 고정주소로 분기함으로서 처

리된다. [표 8.2]는 8051에서 각 인터럽트가 발생하였음을 나타내는 플래그 비트

와 각 서비스 루틴이 적재되어 있어야 하는 내정된 시작 주소를 보이고 있다.

표 8.2 인터럽트별 서비스루틴의 시작주소

인터럽트 플래그비트명 ISR의 시작주소외부 인터럽트 0 TCON의 IE0 0003H타이머/카운터 0 TCON의 TF0 000BH외부 인터럽트 1 TCON의 IE1 0013H타이머/카운터 1 TCON의 TF1 001BH시리얼 인터럽트 SCON의 RI, TI 0023H

동작에서 모든 인터럽트 플래그는 매 머신 사이클의 S5동안에 인터럽트 제어 시

스템으로 래취된다. 샘플들은 다음 머신 사이클동안 폴링된다. 만일 인에이블된

인터럽트에 대한 플래그가 1인 것을 발견하면, 다른 어떤 조건이 그 인터럽트를

가로막지 않는 한, 인터럽트 시스템은 프로그램 메모리의 대응하는 위치로의

LCALL 명령을 생성한다. 인터럽트의 서비스를 가로막는 조건에는 동일한 우선

순위의 인터럽트나 보다 높은 우선순위의 인터럽트가 이미 서비스되는 상황과

같은 경우이다.

하드웨어에 의해 생성되는 LCALL 명령은 PC의 내용을 스택에 퇴피시키고, 서

비스 루틴의 시작 주소를 PC에 적재한다. 앞에서 언급하였듯이 각 인터럽트에

대한 서비스 루틴은 고정된 주소에서 시작되어야 한다.

서비스 루틴을 호출하면서 PC 값만이 스택에 자동으로 저장될 뿐, PSW나 다른

기타의 레지스터의 내용을 자동으로 스택에 저장되지 않는다. PC의 내용만을 자

Page 227: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제8장 인터럽트 217

동으로 저장하도록 함으로써, 다른 레지스터의 저장은 프로그래머가 결정할 몫이

다. 이는 프로그래머의 책임 부담을 증가시키지만 인터럽트 요청에 대한 응답 시

간을 향상시킨다. 결과적으로 MCS-51에서의 많은 인터럽트 기능은 다른 CPU에

서 요구하는 것보다 더 적은 인터럽트 응답시간을 제공한다.

8.1.3 인터럽트 취급

인터럽트가 요청되면 마이크로프로세서에 의해 다음의 동작이 자동으로 처리된

다.

▪ 현재의 PC(program counter)의 내용을 하위 바이트부터 스택에 저장하며,

이는 반환할 때 복귀 주소이다.

▪ 인터럽트 우선순위가 같거나 보다 하위의 인터럽트 요청은 블록킹

(blocking)된다.

▪ 타이머/카운터 인터럽트와 외부 인터럽트의 경우, 대응하는 인터럽트 플래

그가 0으로 설정된다.

▪ 프로그램 실행 제어가 대응하는 인터럽트 서비스 벡터 주소로 넘어간다.

▪ 인터럽트 서비스 루틴이 실행된다.

특히, 세 번째 단계에서 서비스할 인터럽트가 타이머/카운터 혹은 외부 인터럽트

인 경우 MCS-51은 인터럽트 서비스 루틴으로 제어를 넘기기 전에 자동적으로

인터럽트 플래그를 클리어한다. 이는 프로그램 코드에서 해당 플래그를 0으로 설

정할 필요가 없다는 것을 의미한다.

프로그램이 RETI(return from interrupt) 명령을 수행할 때 인터럽트 서비스 루

틴의 실행은 종료된다. RETI 명령이 수행될 때 마이크로프로세서에 의해 다음의

동작이 이루어진다.

▪ 스택에 저장되었던 두 바이트를 POP하여 PC에 저장함으로써 정규 프로그

램 실행이 재개되도록 한다.

▪ 인터럽트 상태는 그것의 인터럽트 이전의 상태로 복원한다.

모든 인터럽트 서비스 루틴에 적용되는 매우 중요한 규칙이 있다. 인터럽트를 취

Page 228: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

218 MCS-51 마이크로컴퓨터

급할 때, 주 루틴의 실행 중에 인터럽트 요청이 발생되어 인터럽트 서비스 루틴

이 수행될 수 있으며, 이러한 인터럽트 서비스 루틴의 실행 여부와 무관하게 주

루틴은 일관된 결과를 생성할 수 있도록 투명하게 실행되어야 한다는 것이다.

다음의 코드를 통하여 이러한 사실을 살펴보자.

; main routine ⋮CLR C MOV A,#25H ; 이 명령 실행시 인터럽트 요청 발생 가정!ADDC A,#10H ⋮

; interrupt service routineISR: MOV A,#0D0H

ADD A,#70HRETI

코드에서 인터럽트 요청 없이 주 루틴 내의 세 명령이 순차적으로 실행된 후

ACC는 35H의 값을 가진다. 그러나 MOV 명령 실행 중에 인터럽트가 요청되면,

이에 대한 인터럽트 서비스 루틴 ISR을 실행하게 되고, 이로 인해 캐리 비트가

1로 설정되고 ACC의 값이 40H로 변경된다. 인터럽트 서비스 루틴을 종료하고,

제어가 주 루틴으로 반환되었을 때 ADDC 명령은 캐리를 포함하여 10H와 40H

의 덧셈을 수행한다. 결국 ACC는 51H의 값을 가지게 된다. 이는 25H와 10H를

더했는데 51H라는 결과를 가지기 때문에 잘못된 것이다. 따라서 인터럽트에 친

숙하지 않은 프로그래머에게 있어서 인터럽트 취급은 수학적 계산 오류를 유발

할 수 있음을 유의해야 한다.

이의 해결책은 인터럽트 서비스 후에도 인터럽트가 요청되었을 때와 동일한 상

태로 프로세서의 상태를 유지시킬 수 있어야 한다. 즉, 인터럽트 서비스 루틴에

서 ACC를 사용한다면 인터럽트 서비스를 종료하기 전에 ACC의 값을 인터럽트

서비스를 받기 이전의 상태로 복구시켜야 한다는 것이다. 이는 일반적으로

PUSH와 POP 명령을 이용하여 보호할 값을 스택에 저장 혹은 복구로 해결한다.

Page 229: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제8장 인터럽트 219

다음은 위의 코드에서의 문제점을 해결한 코드이다.

ISR: PUSH ACC ; ACC 내용 퇴피PUSH PSW ; PSW 내용 퇴피MOV A,#0D0HADD A,#70HPOP PSW ; PSW 내용 복구POP ACC ; ACC 내용 복구RETI

일반적으로 주 루틴 내에서 사용되었을 수 있는 다음과 같은 레지스터들이 갖는

값을 인터럽트 서비스 루틴 내에서 보호할 수 있도록 조치하는 것이 바람직하다.

이는 서비스 루틴 내에 진입하자마자 스택에 저장하고, 서비스 루틴의 종료 직전

에 복구하여야 함을 의미한다.

▪ PSW ▪ DPTR(DPH/DPL) ▪ ACC ▪ B ▪ 범용 레지스터 R0, ..., R7

특히, 범용 레지스터를 다룰 때 그 이름으로의 접근이 허용되지 않으므로, 현재

사용되는 레지스터 뱅크를 고려하여 범용 레지스터에 대한 직접 주소로 접근하

여야 한다. 따라서, 현재 레지스터 뱅크 RB1이 사용되며 범용 레지스터 R0의 값

을 스택에 저장하려 한다면, PUSH R0 명령어 대신 다음과 같이 직접 주소를 사

용하는 명령을 사용해야 한다.

PUSH 08H ; RB1의 R0의 직접 주소

Page 230: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

220 MCS-51 마이크로컴퓨터

8.2 관련 SFR

어떠한 인터럽트든 취급하기 원한다면, IE와 IP SFR를 적절히 설정하여야 한다.

8.2.1 IE SFR

기본적으로 MCS-51이 리셋 되었을 때 모든 인터럽트는 허용되지 않도록 설정된

다. 따라서 사용자의 프로그램은 허용하고자 하는 인터럽트에 대해 명시적으로

MCS-51에 알려주어야 한다.

프로그램에서 IE(Interrupt Enable) SFR를 적절히 설정함으로서 원하는 인터럽트

요청을 허용하거나 불허할 수 있다. [그림 8.2]는 IE SFR의 구조를 나타낸다.

7 6 5 4 3 2 1 0EA - ET2 ES ET1 EX1 ET0 EX0

그림 8.2 IE SFR

[표 8.3]은 IE SFR의 각 비트의 기능을 요약한 것이다.

표 8.3 IE SFR의 각 비트 기능

비트 비트명 비트주소 기능7 EA AFH Global Interrupt Enable/Disable 6 - AEH Undefined5 ET2 ADH Enable Timer 2 Interrupt 4 ES ACH Enable Serial Interrupt3 ET1 ABH Enable Timer 1 Interrupt 2 EX1 AAH Enable External 1 Interrupt 1 ET0 A9H Enable Timer 0 Interrupt 0 EX0 A8H Enable External 0 Interrupt

MCS-51 인터럽트의 각각은 IE SFR에 그 자신의 비트를 하나씩 가진다. 대응하

는 비트를 1로 설정함으로써 주어진 인터럽트를 취급할 수 있도록 할 수 있다.

Page 231: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제8장 인터럽트 221

예로 T/C1 인터럽트의 요청을 허용하려면 다음과 같은 명령을 사용한다.

MOV IE,#00001000B 혹은, SETB ET1

위의 두 명령은 IE의 비트 인덱스 3의 비트를 1로 설정함으로써 T/C1 인터럽트

를 취급할 수 있게 한다. 그러나 T/C1 인터럽트가 실제 허용되도록 하려면 IE.7

비트를 1로 설정해야 한다.

IE.7은 모든 인터럽트를 허용할 것인가 말 것인가를 지시하기 위한 비트이다. 즉,

IE.7 비트가 0이면 IE의 다른 어떠한 비트가 1로 설정되었더라도 인터럽트를 취

급하지 않는다. IE.7 비트가 1로 설정되었을 때 IE의 다른 비트를 1로 설정하여

허용토록 한 인터럽트의 요청을 취급할 수 있게 된다. 이는 수행시간이 중요한

코드에서 유용한 기능이다. 어떠한 인터럽트의 개입없이 시작부터 끝까지 수행해

야 할 코드가 있을 경우 유용하다. 이를 위해 IE.7 비트를 0으로 설정하고 수행

시간이 중요한 코드를 수행한 후에 IE.7을 1로 설정함으로써 인터럽트를 취급할

수 있게 된다.

따라서 요약하면 T/C1 인터럽트를 취급하기 위해서는 다음과 같은 명령을 실행

하는 것이다.

SETB ET1SETB EA

혹은, MOV IE,#10001000B

이후에는 T/C1에서 오버플로가 발생하여 TF1 비트가 1로 설정되면, 001BH 주

소의 T/C1 인터럽트 서비스 루틴을 자동적으로 호출할 것이다.

8.2.2 IP SFR

MCS-51은 모든 명령이 수행될 때 인터럽트의 요청이 있었는지를 자동적으로 평

가한다. 별도의 우선순위가 설정되지 않은 경우나 동일한 우선순위가 설정된 인

터럽트 요청을 검사할 때 MCS-51은 각 인터럽트에 대해 [표 8.4]와 같은 내정된

Page 232: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

222 MCS-51 마이크로컴퓨터

우선순위에 따라 검사한다.

표 8.4 내정된 우선순위

인터럽트 유형 우선순위외부 인터럽트 0 1타이머/카운터 0 2외부 인터럽트 1 3타이머/카운터 1 4시리얼 인터럽트 5

이는 만일 외부 인터럽트 0와 시리얼 인터럽트가 동시에 요청되면, 외부 인터럽

트 0가 우선 서비스되고, 일단 외부 인터럽트 0에 대한 서비스가 종료되면 시리

얼 인터럽트를 서비스해 줌을 의미한다.

MCS-51은 High와 Low의 두 가지 레벨의 인터럽트 우선순위를 제공한다. IP

SFR를 적절히 설정함으로써 특정 인터럽트에 보다 높은 우선순위를 부여할 수

있다. 예를 들면, T/C1에서 오버플로가 발생할 때마다 자동적으로 T/C1 인터럽

트를 허용하도록 할 수 있다. 게다가 시리얼 포트를 통하여 하나의 문자가 수신

될 때마다 시리얼 인터럽트를 취급하게 할 수 있다. 그러나 문자의 수신을 타이

머/카운터 인터럽트보다 더 중요하게 취급하길 원할 수 있다. 이 경우 T/C1 인

터럽트가 이미 서비스 중에 있더라도 시리얼 인터럽트가 타이머/카운터 인터럽트

보다 우선 취급되길 원할 수 있다. 그리고 시리얼 인터럽트의 서비스가 종료되면

다시 제어를 타이머/카운터로 넘겨주고 마지막으로 주 프로그램으로 제어를 반환

하도록 원할 수 있다. 이렇게 하려면 시리얼 인터럽트에 보다 높은 우선순위를

부여하고 타이머/카운터 인터럽트에는 보다 낮은 우선순위를 부여하면 된다.

인터럽트의 수선순위는 IP(interrupt priority) SFR에 의해 통제되며, IP SFR의

각 비트는 [그림 8.3]과 같이 정의된다.

7 6 5 4 3 2 1 0- - PT2 PS RT1 PX1 PT0 PX0

그림 8.3 IP SFR

Page 233: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제8장 인터럽트 223

[표 8.5]는 IP SFR를 구성하는 각 비트의 기능을 설명한 것이다.

표 8.5 IP SFR의 각 비트 기능

비트 비트명 비트주소 기 능7 - - Undefined6 - - Undefined5 PT2 BDH Timer 2 Interrupt Priority4 PS BCH Serial Interrupt Priority 3 PT1 BBH Timer 1 Interrupt Priority2 PX1 BAH External 1 Interrupt Priority1 PT0 B9H Timer 0 Interrupt Priority0 PX0 B8H External 0 Interrupt Priority

특정 인터럽트의 우선순위를 높이기 위해서는 IP의 적절한 비트를 1로 설정하여

야 한다. 예로, 외부 인터럽트 1과 타이머/카운터 1의 우선순위를 High로 할 때

다음의 명령이 사용된다.

MOV IP,#00001100B ; 아래 두 명령과 동일혹은, SETB PT1 과

SETB PX1

인터럽트 우선순위를 고려할 때 다음의 규칙이 적용된다.

▪ 어떠한 인터럽트도 보다 높은 우선순위의 인터럽트 서비스 중에 개입할 수

없다.

▪ 높은 우선순위의 인터럽트는 보다 낮은 우선순위의 인터럽트에 개입할 수

있다.

▪ 낮은 우선순위 인터럽트는 이미 수행중인 다른 어떠한 인터럽트도 존재하

지 않을 때만 요청될 수 있다.

▪ 만일 두 개의 인터럽트가 동시에 요청되면, 보다 높은 우선순위의 인터럽

트가 우선 실행된다. 만일 두 인터럽트가 동일한 우선순위를 가진다면 기

본 우선순위에 입각해서 우선 서비스되는 인터럽트가 먼저 실행된다.

Page 234: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

224 MCS-51 마이크로컴퓨터

8.2.3 특정 인터럽트 관련 SFR

MCS-51에서는 크게 외부 인터럽트, 타이머/카운터 인터럽트, 시리얼 인터럽트를

취급한다. 이들 각각 인터럽트와 관련된 SFR에 대해 간략히 살펴보고, 보다 세

부적인 사항은 관련 절에서 살펴본다. 물론 앞에서 언급한 IE와 IP SFR는 모든

인터럽트와 관련하여 사용하는 SFR이다.

외부 인터럽트의 경우 인터럽트 플래그 비트와 트리거 모드 설정과 관련하여

TCON SFR가 사용된다.

타이머/카운터 인터럽트의 경우는 인터럽트 플래그 비트와 관련하여 TCON

SFR, 타이머/카운터의 모드 설정과 관련된 TMOD SFR, 이벤트를 계수하는 업

카운터(up-counter) 기능을 하는 TH0, TL0, TH1, TL0 SFR가 사용된다.

시리얼 인터럽트의 경우는 송수신되는 데이터를 임시 저장하고 있는 SBUF

SFR, 시리얼 인터럽트 플래그 비트와 시리얼 모드 설정과 관련된 SCON SFR,

시리얼 통신에서의 보 레이트와 관련하여 PCON SFR가 사용된다.

8.3 이벤트 취급 방식

어떤 이벤트가 발생했을 때 정상적인 프로그램 수행에 개입하는 능력은 특정 조

건을 취급하는데 있어 보다 쉽고 효과적인 방법을 제공한다. 만일 인터럽트가 제

공되지 않는다면 프로그램에서 타이머에 오버플로가 발생했는지, 혹은 시리얼 포

트로 새로운 문자가 도착했는지 등을 수동적으로 검사해야 한다. 이는 주 프로그

램을 복잡하고 해독하기 곤란하게 만들뿐만 아니라, 일반적으로 잘 발생하지 않

는 사건을 검사하기 위해 명령 사이클을 소모하기 때문에 비효율적이다.

이렇듯, MCS-51에서는 인터럽트 이벤트가 발생하였을 때 이를 취급하기 위해

폴링 방식과 인터럽트 구동 방식으로의 접근이 가능하다.

Page 235: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제8장 인터럽트 225

8.3.1 폴링 방식

이벤트가 발생하여 인터럽트가 요청되면, 각 인터럽트에 대한 요청 플래그 비트

가 1로 설정된다. 따라서 이러한 인터럽트 요청 플래그 비트를 프로그램에서 지

속적으로 검사하여 해당 플래그 비트가 1이 되면 이에 따라 적절한 처리를 통해

해당 인터럽트 요청을 서비스하는 것을 폴링(polling) 방식이라 한다. 이러한 폴

링 방식은 주 프로그램에서 해당 인터럽트의 요청 여부를 결정하기 위해 계속하

여 인터럽트 요청 플래그 비트를 검사하여야 하므로 다른 작업을 수행하기 곤란

하다.

예로 다양한 작업을 수행하기 위해 많은 서브루틴을 수행하는 16KB 크기의 프

로그램이 있으며, T/C0에서 오버플로가 발생할 때마다 P1.0 비트를 토글하길 원

한다 하자. 이러한 작업을 하는 코드는 다음과 같다.

JNB TF0,SKIP_TOGGLE ; TF0 pollingCPL P1.0CLR TF0

SKIP_TOGGLE: ⋮

TF0 플래그 비트는 T/C0에서 오버플로가 발생할 때마다 1로 설정되고, 위 코드

는 이 때 마다 P1.0 비트를 토글할 것이다. 이는 우리가 원하는 바이나 비효율적

이다. JNB 명령은 플래그 비트가 1이 아닌지를 결정하고 불필요한 코드를 수행

하기 위해 2개의 명령 사이클을 소모한다. 또한 T/C0에서 오버플로가 발생하면

CPL과 CLR 명령은 2개의 명령 사이클을 요구한다. 이를 쉽게 하기 위해서 프로

그램의 나머지 코드에서 98개의 명령 사이클을 요구한다 하자. 그러면 전체적으

로 이 코드는 100개의 명령 사이클을 소모한다. 만일 16비트의 타이머 모드에 있

다면, T/C0는 65536 머신 사이클마다 오버플로가 발생할 것이다. 이 과정에서

655번 JNB 명령을 수행하여 총 1310 명령 사이클과 해당 코드를 위해 추가의 2

개 명령 사이클을 요구한다. 따라서 목적 달성을 위해 1312 명령 사이클을 소모

할 것이다. 따라서 P1.0을 토글할 때를 검사하는 데에 단지 2%만을 소모하게 된

다. 또한 주 프로그램의 반복 처리에서 검사를 반복해야하기 때문에 코드가 복잡

해진다.

Page 236: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

226 MCS-51 마이크로컴퓨터

폴링 방식에 의한 인터럽트 취급은 단지 해당 인터럽트 요청 플래그 비트만을

주 프로그램에서 검사하여 그에 따른 서비스 처리를 행하면 된다. 따라서 다음의

인터럽트 방식에서와 같이 인터럽트 서비스 루틴의 내정된 시작 주소인 벡터 주

소나 서비스 루틴의 작성 형식을 따를 필요가 없다.

8.3.2 인터럽트 구동 방식

인터럽트 구동(interrupt driven) 방식은 어떤 이벤트가 발생했을 때 정상적인 프

로그램 수행을 잠시 멈추고, 해당 인터럽트 서비스 루틴을 수행한 후, 정상적인

프로그램의 수행을 재개하는 방식이다. 인터럽트를 이용하게 되면 이벤트의 발생

여부를 검사하는 부분을 고려하지 않아도 된다. MCS-51 자체가 이 조건을 스스

로 검사하고, 조건을 만족하면 인터럽트 서비스 루틴으로 분기하여 해당 코드를

수행하고 반환된다.

앞의 폴링 방식에서 예시된 루틴은 다음의 서비스 루틴으로 대체할 수 있다.

CPL P1.0RETI

우선 CLR TF0 명령이 사용되지 않았음을 볼 수 있다. 이는 MCS-51이 T/C0의

인터럽트 서비스 루틴을 실행할 때, 자동적으로 TF0 플래그를 1로 설정하기 때

문이다. 또한 일반 서브루틴의 RET 명령대신 RETI 명령을 사용한 것을 볼 수

있다. RETI 명령은 RET 명령과 동일한 기능을 하지만 8051에게 인터럽트 서비

스 루틴이 종료됨을 알려준다. 항상 인터럽트 서비스 루틴은 RETI로 종결해야

한다.

따라서 매 65,536 명령 사이클마다 CPL 명령과 RETI 명령이 수행된다. 두 명령

은 총 3개의 명령 사이클을 요구하면서, 1312 명령 사이클을 요구하는 첫 번째

예와 동일한 기능을 달성할 수 있다. P1.0가 토글될 때까지의 효율을 살펴볼 때

437배 더 효과적이다. 물론 코드의 이해나 판독이 용이한 것은 두말할 필요도 없

다. 이와 같이 단지 인터럽트를 허용하도록 설정하기만 하면 MCS-51이 필요할

때마다 적절한 루틴을 수행하게 된다.

시리얼 포트를 통해 데이터를 수신할 때에도 이와 동일한 개념이 적용된다. 무한

Page 237: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제8장 인터럽트 227

순환 속에서 RI 플래그의 상태를 계속하여 검사하는 방법이 있다. 또한 보다 큰

순환의 일부로서 RI 플래그를 검사할 수 있을 것이다. 그러나 후자의 경우 문자

를 놓치는 위험에 빠질 수 있다. 즉, 한 문자를 수신하고 RI 플래그를 검사한 후,

프로그램의 나머지를 수행하고 RI를 검사하기 전에 두 번째 문자가 수신되는 경

우이다. 이 경우 첫 번째 문자를 잃게 된다. 인터럽트를 사용하면 MCS-51은 주

프로그램의 수행을 정지하고 한 문자의 수신을 담당하는 특별한 루틴을 호출한

다. 따라서 주 프로그램에서의 잘못된 검사나 문자를 소실하는 상황을 피할 수

있다.

인터럽트 방식에 의해 요청된 인터럽트를 취급하기 위한 프로그램의 작성은 다

음과 같다. 주 루틴에서 각 인터럽트를 취급여부 및 우선순위를 설정하기 위하여

IE 및 IP SFR를 적절히 설정하여야 한다. 이 과정은 모든 유형의 인터럽트 취급

에서 공통으로 적용된다. 그리고 각 인터럽트 유형에 따라 관련 SFR를 적절히

설정하여야 한다.

인터럽트 서비스 루틴은 각 인터럽트 유형에 따라 내정된 주소에서 시작하여 마

지막 명령은 RETI 명령으로 완결되어야 한다. 다음은 외부 인터럽트 INT0에 대

한 인터럽트 서비스 루틴의 작성 형식이다.

ORG 0003HISR_INT0: ⋮

⋮RETI

하지만, 각 인터럽트 서비스 루틴의 내정된 시작 주소간의 간격이 8바이트이므로

서비스 루틴의 크기가 8바이트 이내라면 위와 같이 작성하여도 무방하나, 일반적

으로 8바이트보다 큰 경우는 다른 인터럽트 서비스 루틴이 위치해야 할 주소 공

간과 충돌하게 되므로, 일반적으로 다음과 같이 작성한다.

ORG 0003HISR_INT0: SJMP REAL_ISR

;ORG 8100H

REAL_ISR: ⋮

Page 238: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

228 MCS-51 마이크로컴퓨터

⋮RETI

실질적인 서비스 루틴인 REAL_ISR은 다른 인터럽트 서비스 루틴의 내정된 주

소 영역과 충돌하지 않을 기억 장소에서 구현하고, 인터럽트 벡터 주소에는 그

서비스 루틴으로의 분기 명령을 위치시킨다.

8.4 실습 보드에서의 인터럽트

MCS-51에서는 각 인터럽트를 취급하기 위한 서비스 루틴의 시작 주소가 이미

결정되어 있다. 그러나 이들 내정된 주소는 제작한 KUT51 실습보드에서 모니터

프로그램이 적재된 외부 프로그램 메모리 영역에 해당하기 때문에 사용자가 각

인터럽트 서비스 루틴을 작성하여 적재할 수 없다. 따라서 외부 프로그램 메모리

에 구워진 모니터 프로그램에서 각 서비스 루틴의 시작 주소는 분기 명령을 통

하여 외부 프로그램 메모리 영역으로 분기하도록 구현되어 있다. 아래의 예는 외

부인터럽트 서비스 루틴이 시작되어야 할 주소 0003H 주소에서 외부 데이터 메

모리 영역의 8003H 주소로 분기하도록 작성된 것이다.

0003H LJMP 8003H ; 데이터 메모리 공간으로

외부 인터럽트 요청에 의해 서비스 루틴의 실행을 위해 자동으로 0003H 주소로

분기하면 위의 명령에 의해 실제의 서비스 루틴이 위치하는 8003H 주소로 분기

하게 된다. 따라서 실습 보드에서는 외부 인터럽트 0의 서비스 루틴은 8003H 주

소부터 작성되어 있어야 할 것이다. [표 8.6]은 KUT51 실습 보드에서 정의된

ISR의 시작 주소를 보인 것이다.

Page 239: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제8장 인터럽트 229

표 8.6 KUT51 보드에서의 ISR 시작 주소

인터럽트 MCS-51 KUT51 KIT외부 인터럽트 0 0003H 8003H타이머/카운터 0 000BH 800BH외부 인터럽트 1 0013H 8013H타이머/카운터 1 001BH 801BH시리얼 인터럽트 0023H 8023H

따라서 이들 제공하는 모든 인터럽트를 취급한다고 가정하면, 메인 루틴과 각 인

터럽트 서비스 루틴은 다음과 같이 구성하여야 한다.

ORG 8000HSJMP MAIN;ORG 8003H ; INT0 ISR

INT0_ISR: SJMP INT0⋮ORG 800BH ; TC0 ISR

TC0_ISR: SJMP TC0⋮ORG 8013H ; INT1 ISR

INT1_ISR: SJMP INT1⋮ORG 801BH ; TC1 ISR

TC1_ISR: SJMP TC1⋮ORG 8023H ; SI ISR

SI_ISR: SJMP SIORG 8100H

MAIN: ⋮⋮⋮JMP 0000H ; Monitor Program으로; Interrupt Service Routines

INT0: ⋮ ⋮RETI

Page 240: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

230 MCS-51 마이크로컴퓨터

;TC0: ⋮

⋮RETI;

INT1: ⋮⋮RETI;

TC1: ⋮⋮RETI;

SI: ⋮⋮RETI;END

실습 보드에서 인터럽트를 취급할 수 있도록, 입출력 포트 P3의 핀 중 P3.2는 외

부인터럽트 INT0를 위해, P3.4는 타이머/카운터 T/C0를 위한 신호원으로 사용할

수 있도록 스위치가 연결되어 있다.

MCS-51 CPU에서는 외부 인터럽트로 INT0, INT1의 두 가지를 지원한다. 이는

포트 P3이 특수 용도로 사용될 경우 P3.2와 P3.3 핀의 트리거 신호에 의해 인터

럽트를 요청하는 것을 말한다.

Page 241: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제8장 인터럽트 231

8.5 외부 인터럽트

MCS-51은 외부 인터럽트로 INT0, INT1의 2개를 제공하며, 본 절에서는 외부

인터럽트의 구조, 관련 레지스터, 예제를 제시한다.

8.5.1 외부 인터럽트 구조

MCS-51은 [그림 8.4]와 같이 두 개의 외부 인터럽트를 가지고 있으며, 외부 인

터럽트 INT0은 INT0(P3.2) 단자, 외부 인터럽트 INT1은 INT1(P3.3) 단자를

통해 입력되는 신호에 따라 제어된다.

INT0

INT1

IE001 IT0

IE101 IT1

EX0

EX1EA

IE SFR

PX0

PX1

IP SFR

(P3.2)

(P3.3)

TCON SFR

그림 8.4 외부 인터럽트의 구조

이들 인터럽트를 요청하는 트리거 신호는 TCON SFR의 인터럽트 트리거 모드

설정 비트인 IT0와 IT1 비트 값에 따라 에지 트리거 방식과 레벨 트리거 방식의

두 가지 형태가 있다. 즉, TCON SFR의 IT0 비트를 1로 설정하면 에지 트리거

방식을 사용하겠다는 것이며, 외부 인터럽트 INT0는 인터럽트 입력단자 INT0

(P3.2)의 값이 High 레벨에서 Low 레벨로 변하는 하강 에지에서 외부 인터럽트

발생을 인지하게 된다. 그러나 IT0 비트를 0으로 설정하면 레벨 트리거 방식의

경우로 인터럽트 입력단자 INT0(P3.2)의 값이 Low 레벨로 유지됨에 의해 외부

인터럽트 발생을 인지하게 된다. 이러한 사항들은 외부 인터럽트 INT1에 대해서

Page 242: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

232 MCS-51 마이크로컴퓨터

도 유사하게 적용된다.

외부 인터럽트의 요청 상태를 나타내는 플래그 비트로 TCON SFR의 IE0와 IE1

이 있다. 이 플래그 비트는 외부 인터럽트 모드가 에지 트리거 모드인 경우에만

영향을 받으며, 인터럽트가 발생하면 1로 설정된다. 그러나 레벨 트리거 모드에

서는 플래그 비트 IE0와 IE1은 인터럽트가 발생하더라도 영향받지 않음을 주의

한다.

외부 인터럽트는 각 머신 사이클 마다 T10번째 클록에서 한번 검사되기 때문에

적어도 1 머신 사이클(12 clock) 이상 동안 Low 레벨 혹은 High 레벨을 유지하

여야 한다.

에지 트리거 모드의 경우 8051의 입력 단자( INT0 , INT1)의 값이 적어도 1 머

신 사이클 이상 동안 High 레벨 상태를 유지한 후, 한 머신 사이클 이상 동안

Low 레벨을 유지하여야 한다.

레벨 트리거 모드인 경우에는 요구된 인터럽트가 발생할 때까지 Low 레벨을 유

지하여야 하며, 인터럽트 서비스 루틴이 종료되거나 다른 인터럽트가 발생되기

전에 High 레벨 상태가 되어야 한다.

인터럽트 요청 신호가 입력되고 난 후, 그 요청 신호가 수락되어 인터럽트 서비

스 루틴을 수행하려면 현재 실행중인 명령이 종료하여야 한다. 그리고 현재의 사

이클이 실행중인 명령의 마지막 사이클에서 서비스 루틴을 호출하는 2 머신 사

이클의 CALL 명령이 수행된다.

8.5.2 관련 SFR

외부 인터럽트를 취급하기 위해 소요되는 SFR는 IE, IP, 그리고 TCON SFR이

다.

IE(Interrupt Enable) SFR

[그림 8.5]는 IE SFR의 구성을 보여주며, 특히 외부 인터럽트와 관련된 비트는

역상으로 표시하였다.

Page 243: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제8장 인터럽트 233

7 6 5 4 3 2 1 0EA - ET2 ES ET1 EX1 ET0 EX0

그림 8.5 IE SFR

인터럽트를 취급하고자 할 경우는 인터럽트의 유형에 무관하게 항상 EA 비트를

1로 설정하여야 한다. 또한 외부 인터럽트 INT0를 프로그램에서 취급하고자 할

때 EX0 비트를, 외부 인터럽트 INT1을 취급하고자 할 때에는 EX1 비트를 1로

설정한다.

다음의 예는 외부 인터럽트 INT0를 취급하고자 할 때, 주 루틴에서 사용하여야

할 IE SFR와 관련된 명령이다.

SETB EX0SETB EA

혹은, MOV IE,#10000001B

IP(Interrupt Priority) SFR

각 인터럽트 유형에 대하여 내정된 우선순위를 가지는데, IP SFR는 이러한 내정

된 우선순위와 다르게 취급하고자 할 때 사용한다. [그림 8.6]은 IP SFR의 비트

구조를 보여주며, 외부 인터럽트와 관련된 비트는 역상으로 표시하였다.

7 6 5 4 3 2 1 0- - PT2 PS RT1 PX1 PT0 PX0

그림 8.6 IP SFR

리셋시 IP SFR의 설정은 모든 비트가 0으로 설정되어 있어 모든 인터럽트 유형

에 대해 동등한 우선순위를 가지므로 내정된 우선순위에 의해 처리된다. 하지만

내정된 우선순위에 반하여 외부 인터럽트 INT0의 우선순위를 높이려면 PX0를 1

로, 외부 인터럽트 INT1의 우선순위를 높이려면 PX1을 1로 설정하여 High 레벨

로 설정하면 된다.

다음의 예는 외부 인터럽트 INT1의 우선순위를 High 레벨로 설정하는 명령이다.

Page 244: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

234 MCS-51 마이크로컴퓨터

SETB PX1혹은, SETB IP.2

TCON(Timer Control) SFR

TCON SFR는 여러 가지 인터럽트에 대한 요청 플래그 비트를 포함하고 있다.

[그림 8.7]은 TCON SFR에서 외부 인터럽트와 관련된 비트를 역상으로 보여주

고 있다.

7 6 5 4 3 2 1 0TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

그림 8.7 TCON SFR

특히, 외부 인터럽트의 경우 인터럽트 트리거 신호로 Low 레벨 트리거 방식과

하강 에지 트리거 방식 중 선택할 수 있다. 이는 TCON SFR의 IT0, IT1 비트의

설정 값에 의해 결정된다.

외부 인터럽트 INT0의 트리거 신호로 Low 레벨 트리거 방식을 사용하려면 IT0

비트를 0으로 설정하고, 하강 에지 트리거 방식을 사용하려면 1로 설정한다. 외

부 인터럽트 INT1에 대해서도 동일하게 트리거 신호로 Low 레벨 트리거 방식을

사용하려면 IT1 비트를 0으로 설정하고, 하강 에지 트리거 방식을 사용하려면 1

로 설정한다.

IE0, IE1 비트는 각각 외부 인터럽트 INT0, INT1의 인터럽트 요청 플래그 비트

로 인터럽트 요청 신호가 입력되면 자동으로 1로 설정됨으로서 외부 인터럽트가

요청되었음을 표시하게 된다. 이들 플래그 비트는 에지 트리거 모드에서는 인터

럽트 서비스 루틴이 호출되면서 0으로 자동 소거되는 반면, 레벨 트리거 모드의

경우 자동 소거되지 않음을 유의한다.

8.5.3 프로그램 구성

KUT51 실습 보드에서 외부 인터럽트 INT0를 인터럽트 방식에 의하여 취급하는

프로그램 구성은 다음과 같은 형식을 취하게 된다.

Page 245: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제8장 인터럽트 235

ORG 8000HSJMP MAIN;ORG 8003H ; INT0

INT0_ISR: SJMP INT0;ORG 8100H

MAIN: ⋮⋮⋮JMP 0000H ; Monitor Program으로; Interrupt Service Routine

INT0: ⋮⋮⋮RETI

8.5.4 예제 프로그램

인터럽트 방식

다음의 예제는 외부 인터럽트 INT0를 이용하여 인터럽트 방식에 의해 구현한 것

으로 Normal 상태에서는 아무 동작도 하지 않다가 외부 인터럽트가 발생할 때마

다 최하위의 LED부터 하나씩 차례로 ON하는 프로그램이다. P1의 하위 니블에

LED 모듈을 연결한다고 가정한다.

1 ;====================================

2 ; EINT_01.ASM

3 ; BY INTERRUPT USING INT0

4 ;====================================

5 $mod51

8000 6 ORG 8000H

8000 803E 7 SJMP START

8 ;

8003 9 ORG 8003H ;INT0 ISR ADDR

8003 804D 10 SJMP I_SER

11 ;

8040 12 ORG 8040H

Page 246: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

236 MCS-51 마이크로컴퓨터

8040 758150 13 START: MOV SP,#50H

8043 D2B8 14 SETB IP.0

8045 D2AF 15 SETB EA

8047 D2A8 16 SETB IE.0

8049 D288 17 SETB TCON.0

804B 74EE 18 MOV A,#11101110B

804D F590 19 MOV P1,A

20 ;

804F 00 21 LOOP: NOP

8050 80FD 22 SJMP LOOP

23 ;

24 ; INTERRUPT SERVICE RTN

8052 23 25 I_SER: RL A

8053 F590 26 MOV P1, A

8055 32 27 RETI

28 ;

29 END

폴링 방식

다음의 예제는 위의 예제와 동일한 동작을 하도록 외부 인터럽트 INT0를 이용하

여 폴링 방식에 의해 구현한 것이다.

1 ;==============================

2 ; EINT_02.ASM

3 ; BY POLLING USING INT0

4 ;==============================

5 $mod51

8000 6 ORG 8000H

7 ;

8000 D288 8 SETB IT0

8002 74EE 9 LOOP: MOV A,#11101110B

8004 C289 10 L2: CLR IE0

8006 F590 11 MOV P1,A

12 ;

8008 3089FD 13 JNB IE0,$

14 ;

800B 23 15 RL A

800C 20E4F5 16 JB ACC.4,L2

800F 80F1 17 SJMP LOOP

Page 247: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제8장 인터럽트 237

18 ;

19 END

8.6 실습과제

[실습1] 외부 인터럽트 INT0 처리

포트 P1의 하위 니블에 LED 모듈을 연결하고, Normal 상태에서는 최하위의

LED부터 하나씩 차례로 ON하다가 외부 인터럽트가 발생하면 모든 LED를 4회

점멸하는 프로그램을 작성한다. 단, 외부 인터럽트 INT0를 이용하되 시간지연이

필요하면 사용하도록 하고 인터럽트 방식에 의해 구현한다. 또한 동일한 동작을

폴링 방식에 의해 재 구현한다.

[실습2] LED 상태 횟수만큼 점멸

포트 P1의 하위 니블에 LED 모듈을 연결하고, Normal 상태에서는 최하위의

LED부터 하나씩 차례로 ON하다가 외부 인터럽트가 발생하면 그때의 LED 상태

값의 횟수만큼 모든 LED를 점멸하는 프로그램을 작성한다. 단, 외부 인터럽트

INT0을 이용하되 시간지연이 필요하면 사용하도록 하고 인터럽트 방식에 의해

구현한다. 또한 동일한 동작을 폴링 방식에 의해 재 구현한다.

[실습3] FND 모듈을 이용한 자모음 패턴 출력

포트 P1에 FND 모듈을 연결하고, Normal 상태에서는 본인 이름의 자모음 패턴

을 반복하여 출력하다가, 외부 인터럽트 INT0가 발생하면 이성 친구 이름의 자

모음 패턴을 1회 출력하는 프로그램을 작성한다. 단, 인터럽트 방식에 의해 구현

하며, 시간지연이 필요하면 사용하도록 한다. 또한 동일한 동작을 수행하도록 폴

링 방식에 의해 재 구현한다.

Page 248: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

238 MCS-51 마이크로컴퓨터

Page 249: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제9장 타이머/카운터 239

제9장 타이머/카운터

MCS-51은 두 개의 타이머/카운터 인터럽트를 제공하며, 각각은 독립적으로 프

로그래머가 제어할 수 있다. 타이머/카운터 인터럽트는 일반적으로 세 가지 기능

을 제공한다. 일정 시간을 지연하거나 외부 이벤트들 간의 시간 간격을 측정하는

타이머 기능, 외부의 이벤트를 계수하는 카운터 기능, 그리고 시리얼 통신을 위

한 적절한 보 레이트(baud rate) 생성 기능이다.

타이머/카운터 인터럽트의 세 가지 사용법은 서로 구별된다. 처음의 두 용법은

본 장에서 언급하고, 보 레이트 생성 기능은 시리얼 통신과 관련된 장에서 언급

한다.

9.1 타이머/카운터의 용도

타이머/카운터가 계수하는 방법은 매우 간단하다. 타이머는 항상 업 카운팅을 한

다. 즉, 타이머/카운터가 타이머로써, 카운터로써 혹은 보 레이트 생성기로 사용

되는 것과 무관하게 타이머/카운터는 이벤트가 발생할 때마다 항상 프로세서에

의해 증가된다.

몇몇 8051로부터 파생된 칩은 실제로 프로그램이 타이머/카운터를 업 카운팅할

것인지 다운 카운팅할 것인지를 허용하기도 한다. 그러나 표준의 MCS-51 MCU

는 업 카운팅만을 제공한다.

[그림 9.1]은 타이머/카운터 T/C0에 대한 인터럽트의 요청 구조를 보인다. TH0,

TL0는 각각 8비트 길이를 가지며 타이머/카운터의 동작 모드 설정에 따라 8비트

에서 16비트 길이까지의 계수 값을 저장하는 레지스터로, 내부 머신 사이클 혹은

외부 이벤트가 발생될 때마다 1씩 업 카운팅을 한다. TH0, TL0에서 오버플로가

발생되었을 때 TCON SFR의 타이머/카운터 인터럽트 플래그 비트인 TF0는 1로

설정되고, 이는 인터럽트가 요청되었음을 의미한다. 동작 모드 설정은 TMOD

SFR의 M0_1, M0_0의 두 비트에 의해 설정되며, [그림 9.1]에서는 모드 0의 예로

Page 250: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

240 MCS-51 마이크로컴퓨터

13비트 길이를 가지는 경우를 보인다.

GATE0

TR0

T0

1/12

5BitP3.4

INT0Clock

C/T0=1

C/T0=0

8Bit TF0

TH0

TL0

그림 9.1 타이머/카운터 인터럽트 요청 구조

업 카운팅을 위한 이벤트는 내부 머신 사이클 혹은 외부 핀으로부터 입력일 수

있다. 만일 TMOD SFR의 C/T0 비트가 0이면 하나의 머신 사이클을 하나의

이벤트로 취급하는 타이머 모드로 사용하는 것이며, C/T0 비트가 1이면 외부

핀 T0(P3.4)에서 입력되는 신호를 이벤트로 취급하는 카운터 모드로 사용하는 것

이다. 타이머 모드이든 카운터 모드이든 이들 이벤트에 대한 업 카운팅을 수행하

기 위해서는 TCON SFR의 TR0 비트가 1로 설정되어야 한다. TMOD SFR의

GATE0 비트는 게이트 모드를 위한 것으로, 타이머/카운터가 동작되고 있는 동

안 외부에서 업 카운팅을 정지 혹은 재개할 수 있도록 제어하고자 할 때 1로 설

정하고, 제어는 외부 인터럽트 신호원으로 사용되던 INT0(P3.2)를 사용한다.

위와 같은 구조는 타이머/카운터 T/C1에도 유사하게 적용된다. 아래에서 타이머/

카운터의 용도에 대해 사례를 들어 설명한다.

9.1.1 타이머 모드

타이머/카운터의 중요한 용도의 하나는 시간을 계측하는 것이다. 타이머/카운터

가 시간 계측의 목적으로 사용될 때 두 이벤트 간의 시간 간격을 계측하는 것이

기 때문에 인터벌 타이머(interval timer)라고 부르기도 하며, 이는 타이머/카운터

를 타이머 모드로 사용하는 것이다.

Page 251: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제9장 타이머/카운터 241

타이머 모드에서는 매 머신 사이클마다 계수값이 1씩 증가한다. 하나의 머신 사

이클은 12개의 내부 클록 펄스로 구성된다. 따라서 수행중인 타이머는 11,059,000

/ 12 = 921,583로 초당 921,583번 증가될 것이다. 타이머가 0부터 50,000까지 계수

하였다면, 50,000 / 921,583 = .0542로 .0542초가 소요된 것이다.

실제로, 0.0542초가 소요되었다는 것을 아는 것은 그리 유용한 것은 못된다. 만일

초당 1번의 이벤트를 발생하도록 한다면 타이머가 0부터 50000까지 계수하기를

18.45번 할 때까지 기다려야 할 것이다. 그러면 0.45번만큼 대기할 수 있는 방법

은 없다. 따라서 다음과 같은 계산법이 바람직하다.

타이머가 .05초 동안 얼마만큼 계수할 수 있는 가를 계산하는 것이다. 이는 .05 *

921,583 = 46,079.15로 대략 0부터 46079까지 계수하는데 0.05초가 소요됨을 의미

한다. 정확히는 .049999837이 소요되나 이는 실제 환경에서 충분히 의미를 가진

다. 만일 8051로 디지털 시계를 제작할 경우 위의 계산 결과를 적용하면 매 2개

월마다 단지 1초의 차이만 발생할 것이므로 대부분의 응용에서 충분히 정확하다

고 생각할 수 있다.

이를 이용해 매 초당 어떤 이벤트를 실행하기 원한다면, 타이머가 0부터 46079까

지 계수하는데 0.05초가 소요되므로 이를 20회 반복하는 동안 단순히 대기하면

될 것이다.

9.1.2 카운터 모드

외부에서 발생된 이벤트를 계수하는 목적으로도 타이머/카운터를 사용할 수 있

다. 이는 타이머/카운터를 카운터 모드로 사용하는 것이다.

예로, 도로상의 교통량을 측정하는 응용 프로그램을 생각해 보자. 도로를 가로질

러 센서를 설치하고 자동차가 지날 때마다 하나의 펄스를 보낸다고 가정하자. 그

리고 이 센서를 MCS-51의 입출력 핀 하나에 연결하고 지속적으로 모니터링함으

로써, 하향 펄스가 검출될 때 타이머/카운터를 증가시킬 수 있다. 센서를 P1.0에

연결했다고 가정할 때 통행하는 자동차를 계수하기 위한 코드는 다음과 같을 것

이다.

Page 252: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

242 MCS-51 마이크로컴퓨터

JNB P1.0,$ JB P1.0,$ INC COUNTER

위의 코드는 통행량을 계수하는 것과 동시에 다른 일을 할 수 없다. 다행히도,

MCS-51은 타이머/카운터가 이벤트를 계수할 수 있는 방법을 제공한다. 이는 매

우 구현이 쉬우며 단지 부가적인 한 비트만 환경 설정하면 된다.

타이머/카운터 T/C0를 사용하여 통행하는 자동차의 수를 계수한다고 가정하자.

TCON SFR의 C/T0 비트가 0이면 T/C0는 매 머신 사이클마다 계수된다. 이는

이미 살펴보았던 타이머의 용도로 사용되는 것이다. 그러나 C/T0를 1로 설정하

면 P3.4 핀을 모니터링하게 된다. 매 머신 사이클을 계수하는 것이 아니라, P3.4

핀에서의 이벤트를 계수하게 된다. 따라서 센서를 P3.4에 연결하고, 교통량을 파

악하기 위해서는 T/C0의 계수 값을 읽으면 된다.

이 과정에서 타이머/카운터 T/C0가 실제로 계수하는 것은 P3.4 핀에서의 하향

에지 신호를 계수한다. 이는 자동차가 센서를 지날 때 입력으로 High의 신호가

들어오고, 지나간 후에 Low의 신호로 바뀌게 되며, 이 하강 에지 신호에 의해

타이머/카운터 T/C0는 계수값을 1 증가하게 된다.

9.1.3 게이트 모드

MCS-51은 이벤트간의 시간 간격을 측정할 수 있는 기능을 제공한다. 즉, 타이머

/카운터의 계수를 외부의 신호에 의해 정지 및 재개할 수 있도록 함으로서 시간

간격을 측정하는 것이 가능하다.

예로, 사무실에서 전기사용량에 대한 통계치를 얻고자 매일 전등을 몇 시간씩 사

용하는지 측정하려한다. 즉, 전등이 켜졌을 때 시간 측정을 진행하고, 소등하였을

때는 시간 계측을 하지 않도록 하면 된다. 이를 위해 전등 스위치를 입출력 포트

의 핀에 접속하고 지속적으로 해당 핀으로부터 읽어, 그 상태에 따라 타이머/카

운터를 동작 혹은 정지시키는 것이다. 하지만 MCS-51은 이와 같은 상황에서 보

다 용이한 방법을 제공한다.

Page 253: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제9장 타이머/카운터 243

타이머/카운터의 환경설정에서 게이트 모드로 설정하면 가능하다. 지금까지 외부

핀의 상태와 상관없이 타이머/카운터를 동작시켰기 때문에 항상 0으로 설정해왔

던 TMOD SFR의 GATEn비트를 1로 설정하면 해당 타이머/카운터의 계수를 외

부 핀에 의해 제어할 수 있다. 이때 타이머/카운터의 계수를 정지하거나 재개하

기 위해 사용하는 외부 핀은 INTn이 사용된다. 이 핀으로부터 0이 입력되면

타이머/카운터의 계수를 정지하고, 1이 입력되면 계수를 계속하게 된다.

따라서, 전기 사용량을 측정하기 위해서 타이머/카운터 T/C0를 사용한다면 전등

스위치를 MCS-51의 INT0(P3.2) 핀에 접속하고, GATE0 비트를 1로 설정한다.

전등 스위치가 ON이면 연결된 INT0(P3.2) 핀에 High 신호가 인가된다고 가정

한다. 이렇게 GATE0가 1로 설정되면, 타이머/카운터 T/C0는 전원 스위치가 ON

되어 INT0가 1인 경우만 계수 동작을 수행하고, 전원 스위치 OFF되어 INT0

가 0이 되면 자동적으로 계수를 정지한다. 따라서 부가적인 코드 없이 외부 핀

INT0으로 T/C0의 동작 및 정지를 제어할 수 있다.

9.2 관련 SFR

MCS-51 CPU는 각각 근본적으로 동일한 방식의 기능을 가지는 두 개의 타이머/

카운터 T/C0와 T/C1을 보유하고 있다. 이 두 타이머/카운터는 환경 설정을 위해

TMOD와 TCON SFR을 공유하며, 각각의 계수 값을 보관하기 위해 두 개씩의

SFR를 가진다. 타이머/카운터 T/C0를 위한 계수 값을 유지하는데 TH0, TL0

SFR가 사용되며, 타이머/카운터 T/C1을 위한 계수 값을 유지하는데 TH1, TL1

SFR가 사용된다. 물론 이외에도 모든 인터럽트와 관련된 IE, IP SFR가 관여한

다. 타이머/카운터 인터럽트와 관련된 SFR는 [표 9.1]과 같다.

Page 254: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

244 MCS-51 마이크로컴퓨터

표 9.1 타이머/카운터 관련 SFR

SFR 명 주소 용 도TH0 8CH T/C0의 상위 바이트TL0 8AH T/C0의 하위 바이트TH1 8DH T/C1의 상위 바이트TL1 8BH T/C1의 하위 바이트

TCON 88H Timer ControlTMOD 89H Timer Mode

사용하는 SFR에 참조하기 용이하도록 이름을 부여하였으나 실제로 SFR는 절대

주소를 가지며, 그들의 주소를 기억하는 것이 유용할 수도 있다. SFR의 이름을

소스에서 사용하면 어셈블러에서 내부적으로 직접 주소로 변환한다. 예로 다음

명령들은 25H 값으로 TH0 SFR를 초기화한다.

MOV TH0,#25H 혹은, MOV 8CH,#25H ; TH0 SFR의 절대주소는 8CH

이제, 타이머/카운터로 돌아가서 타이머/카운터 0에 대해 살펴보자. T/C0는 자신

전용의 두 개 SFR TH0와 TL0를 사용한다. 이는 타이머의 계수 정보를 저장할

상위 바이트와 하위 바이트를 구성하는 SFR이다. 즉, T/C0가 0의 값을 가질 때,

TH0와 TL0는 모두 0을 가지고 있다. T/C0가 1000H를 가지면, TH0는 10H를

TL0는 00H를 가진다. T/C0가 1000을 가지면, 다음 계산과 같이 TH0는 3을

TL0는 232를 가진다.

TH0 * 256 + TL0 = 10003 * 256 + 232 = 1000

T/C1도 동일하게 전용의 두 SFR인 TH1과 TL1을 가진다. 이와 같이 각 타이머

/카운터의 값을 위한 전용의 SFR를 가지고 있다. 이들이 가질 수 있는 최대값은

16비트로 표현할 수 있는 최대값인 65535이다. 만일 최대값인 FFFFH를 가지고

있으면 다음 사건에 의해 증가되면 다시 0000H로 설정될 것이다. 이는 오버플로

가 발생한 것이며, 타이머/카운터 인터럽트 요청신호로 작용한다.

Page 255: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제9장 타이머/카운터 245

9.2.1 TMOD(Timer Mode) SFR

TMOD는 두 타이머/카운터의 동작 모드를 제어하는데 이용한다. [그림 9.2]와 같

이 TMOD의 각 비트는 타이머/카운터를 실행하는 방법에 관한 정보를 제공하며,

상위 니블은 타이머/카운터 T/C1과 관련 있으며, 하위 니블은 타이머/카운터

T/C0와 관련된 기능을 제공한다.

7 6 5 4 3 2 1 0GATE1 C/T1 M1_1 M1_0 GATE0 C/T0 M0_1 M0_0

그림 9.2 TMOD SFR

TMOD의 각 비트의 기능은 [표 9.2]와 같다.

표 9.2 TMOD SFR의 비트별 기능

비트명 관련T/C 기 능GATE1 T/C1 1이면 T/C1는 INT1(P3.3)이 1일 때만 동작함.

0이면 T/C1는 INT1의 상태와 관계없이 동작함C/T1 T/C1 1이면 T/C1는 T1(P3.5)에서의 이벤트를 계수하

며, 0이면 T/C1는 머신 사이클마다 1씩 증가함M1_1 T/C1 T/C1의 동작 모드 비트M1_0 T/C1 T/C1의 동작 모드 비트

GATE0 T/C0 1이면 T/C0는 INT0(P3.2)이 1일 때만 동작함. 0이면 T/C0는 INT0의 상태와 관계없이 동작함

C/T0 T/C0 1이면 T/C0는 T0(P3.4)에서의 이벤트를 계수하며, 0이면 T/C0는 머신 사이클마다 1씩 증가함

M0_1 T/C0 T/C0의 동작 모드 비트M0_0 T/C0 T/C0의 동작 모드 비트

만일 GATEn 비트를 0으로 설정하면 계수여부를 외부 신호에 의해 제어

할 수 없다. 반면 GATEn 비트를 1로 설정하면 해당 타이머/카운터를 게이트 모

드로 사용하는 것으로, 이 경우 대응하는에 의해 타이머/카운터의 계수를

정지 및 재개할 수 있다.이 0이면 업 카운팅을 정지하고 1이면 업 카운팅

Page 256: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

246 MCS-51 마이크로컴퓨터

을 재개한다. 비트는 해당 타이머/카운터의 용도를 설정하는 비트로 1로

설정되면 내부 머신 사이클을 계수하는 타이머 모드로 사용하는 것이며, 0으로

설정되면 외부 핀 Tn의 이벤트를 계수하는 카운터 모드로 사용하게 된다.

Mn_x비트는 해당 타이머/카운터의 4가지 동작 모드를 표시하는 것으로, 계수 값

을 저장하기 위한 계수기의 길이와 밀접한 관련이 있다. [표 9.3]은 4가지 동작

모드를 보이고 있다. 보다 구체적인 설명은 다음 절에서 한다.

표 9.3 타이머/카운터 모드

Mn_1 Mn_0 모드 기 능0 0 0 13-bit 타이머/카운터 모드0 1 1 16-bit 타이머/카운터 모드1 0 2 8-bit Auto-reload 타이머/카운터 모드1 1 3 Split 타이머/카운터 모드

TMOD SFR는 바이트 단위로만 접근이 허용된다. 따라서 다음 명령과 같이 사

용해야 한다.

MOV TMOD,#00011111B ; 0001 1111

위의 명령은 타이머/카운터 T/C1는 타이머 모드로서, 동작 모드는 16비트 계수

기가 사용되고, 게이트모드가 아니므로 외부 제어가 허용되지 않도록 설정하는

것이며, 타이머/카운터 T/C0는 카운터 모드로서 동작 모드는 8비트 스플리트 모

드로 사용하고 게이트 모드이므로 외부 핀 INT0에 의해 계수의 정지 및 재개

를 제어할 수 있다.

9.2.2 TCON(Timer Control) SFR

두 타이머/카운터를 제어하는데 사용되는 또 다른 SFR로 [그림 9.3]과 같은 구조

의 TCON이 있으며, 타이머/카운터와 관련된 비트는 상위 니블의 비트들이다.

Page 257: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제9장 타이머/카운터 247

7 6 5 4 3 2 1 0TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

그림 9.3 TCON SFR

[표 9.4]는 TCON의 관련 비트들의 기능을 보이고 있다.

표 9.4 TCON의 관련 비트의 기능

비트명 관련T/C 비트주소 기 능TF1 T/C1 8FH 타이머/카운터 T/C1 오버플로TR1 T/C1 8EH 타이머/카운터 T/C1 런TF0 T/C0 8DH 타이머/카운터 T/C0 오버플로TR0 T/C0 8CH 타이머/카운터 T/C0 런

TFn은 각 타이머/카운터의 업 카운팅 과정에서 오버플로가 발생하면 1로 설정되

어 해당 인터럽트가 발생하였다는 것을 표시하는 플래그 비트로 ISR에 진입하면

자동으로 0으로 설정이며, TRn은 해당 타이머/카운터의 업 카운팅을 정지 및 재

개하기 위한 비트로 이 비트가 1이면 해당 타이머/카운터는 업 카운팅을 개시하

며 0이면 정지하게 된다. 제반 환경 설정이 완료된 후 실제 업 카운팅을 개시하

도록 TRn비트를 1로 설정하는 명령을 사용하여야 비로소 타이머/카운터가 계수

를 시작한다.

TCON은 바이트 단위는 물론 비트 단위 주소지정이 가능하다. 즉 다음과 같은

바이트 단위 명령을 통하여 TR1 비트를 1로 설정하려면 나머지 비트들의 현 상

태도 고려하여 설정하여야 한다.

MOV TCON, #01000000B ; 바이트단위 설정

따라서, 통상 타이머/카운터를 시작하거나 정지시킬 때 TCON SFR의 다른 비트

들에는 영향을 주지 않는 것이 바람직하므로 다음과 같이 비트 주소 지정하는

명령을 사용하는 것이 바람직하다.

SETB TR1 ; 비트단위 설정혹은, SETB TCON.6 ; 비트단위 설정

Page 258: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

248 MCS-51 마이크로컴퓨터

9.2.3 TH0/TL0, TH1/TL1 SFR

각 타이머/카운터 인터럽트를 취급하기 위해서는 이벤트가 발생될 때마다 업 카

운팅하여 오버플로를 발생시키는 업 카운터가 요구된다. 이들 업 카운터로 사용

되는 SFR에는 타이머/카운터 T/C0를 위해 사용되는 TH0, TL0 SFR와 타이머/

카운터 T/C0를 위해 TH1, TL1 SFR가 사용된다.

이들의 사용은 타이머/카운터의 동작 모드에 따라 다르다. 만일 일정 시간 간격

마다 타이머/카운터 인터럽트가 발생되어야 한다면, 이들 SFR에 적절한 초기 상

수값을 설정할 필요가 있다. 또한 이들 SFR에서 오버플로가 발생하게 되면 0의

값을 가지게 되기 때문에, 초기의 상수가 0이 아닌 경우는 인터럽트 서비스 루틴

을 종료하기 직전에 초기의 상수로 재 설정하여야 일정한 시간 간격마다 타이머/

카운터 인터럽트를 발생시킬 수 있음을 유의할 필요가 있다.

9.3 타이머/카운터의 동작 모드

타이머/카운터의 동작모드는 TCON SFR의 Mn_1, Mn_0 비트를 적절히 설정함

에 따라 네 가지의 동작 모드를 지원하며, 계수값을 보관하는 타이머/카운터의

길이와 밀접한 관련이 있다.

9.3.1 13 비트 모드(Mode 0)

모드 0은 [그림 9.4]와 같이 13비트 크기의 타이머/카운터로 사용하는 것이다.

타이머/카운터가 13비트 모드인 경우, TLn의 하위 5비트와 THn의 8비트의 총

13비트가 계수를 위해 사용된다. 만일 초기 계수값을 0으로 설정하면, 8192 머신

사이클이 지난 후에 오버플로가 발생하게 된다.

Page 259: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제9장 타이머/카운터 249

GATE0

TR0

T0

1/12

5BitP3.4

INT0Clock

C/T0=1

C/T0=0

8Bit TF0

TH0

TL0

GATE1

TR1

T1 5BitP3.5

INT1

C/T1=0

C/T1=1

8Bit TF1

TL1

TH1

SerialPort

그림 9.4 13비트 모드(Mode 0)

만일 초기 계수값이 0이 아닌 경우이면서 계속하여 일정한 시간 간격 후에 오버

플로가 발생되도록 하려면 처음 오버플로가 발생하여 인터럽트 서비스 루틴으로

진입하면서 일단 계수 값이 0으로 되기 때문에 규정된 시간에 오버플로가 발생

하여 인터럽트를 요청할 수 있도록 하려면 인터럽트 서비스 루틴의 끝에서 초기

의 계수값을 재설정하여야 한다.

9.3.2 16 비트 모드(Mode 1)

모드 1은 [그림 9.5]와 같이 16비트 크기의 계수 기능을 가짐을 의미한다. 이는

가장 일반적으로 사용하는 모드로 TLn의 8비트와 THn의 8비트의 총 16비트가

계수를 위해 사용된다. 만일 초기 계수값을 0으로 설정하면, 65536 머신 사이클

이 지난 후에 오버플로가 발생하게 된다.

만일 초기 계수값이 0이 아닌 경우이면서 계속하여 일정한 시간 간격 후에 오버

플로가 발생되도록 하려면 처음 오버플로가 발생하여 인터럽트 서비스 루틴으로

진입하면서 일단 계수 값이 0으로 되기 때문에 규정된 시간에 오버플로가 발생

하도록 인터럽트 서비스 루틴의 끝에서 초기의 계수값을 재설정하여야 한다.

Page 260: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

250 MCS-51 마이크로컴퓨터

GATE0

TR0

T0

1/12

P3.4

INT0Clock

C/T0=1

C/T0=0TF0

TH0 TL0

GATE1

TR1

T1P3.5

INT1

C/T1=0

C/T1=1TF1

TL1TH1 SerialPort

16Bit

16Bit

그림 9.5 16비트 모드(Mode 1)

9.3.3 8비트 자동 재적재 모드(Mode 2)

타이머/카운터의 모드 2는 [그림 9.6]과 같이 8비트 자동 재적재 모드이다. 타이

머/카운터가 모드 2에서 동작할 때, THn은 재적재할 초기 계수값을 저장하고 있

으며, TLn은 계수에 이용된다. 따라서 TLn에서 오버플로가 발생하게 되면 다른

모드에서와 달리 0으로 설정하는 것이 아니라 THn에 저장된 값을 자동으로 재

적재하게 된다. 일반적으로 자동 재적재 모드는 시리얼 통신을 하는데 있어 동기

클록을 생성할 때 주로 이용된다.

예를 들면, 타이머/카운터 T/C0를 모드 2로 사용하는 상황에서 다음의 코드와

같이 TH0의 값이 FDH로 설정되어 있고, TL0의 값이 FEH로 초기 설정되어 있

다고 하자.

Page 261: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제9장 타이머/카운터 251

GATE0

TR0

T0

1/12

P3.4

INT0Clock

C/T0=1

C/T0=0TF0

TH0

TL0

GATE1

TR1

T1P3.5

INT1

C/T1=0

C/T1=1TF1

TL1

TH1

SerialPort

SerialPort

AutoReload

AutoReload

그림 9.6 8비트 자동 재적재 모드(Mode 2)

MOV TMOD,#00000110BMOV TH0,#FDHMOV TL0,#FEHSETB TR0

다음은 위의 코드의 실행에 의해 머신 사이클에 따라 변화하는 계수값의 일부를

보여준다.

Machine Cycle TH0 TL0초기설정 FDH FEH 1 FDH FEH 2 FDH FFH 3 FDH FDH ; 오버플로발생, 자동재적재4 FDH FEH 5 FDH FFH 6 FDH FDH ; 오버플로발생, 자동재적재7 FDH FEH

Page 262: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

252 MCS-51 마이크로컴퓨터

위에서 보듯이 TH0의 값은 변경되지 않는다. 실제로 모드 2를 사용할 때 대부분

THn에는 이미 결정된 어떤 값을 설정하고, TLn만을 계수에 이용한다.

따라서 자동 재적재 모드는 계수값을 저장하기 위한 최대 길이가 8비트로 모드

0나 모드 1보다는 작다는 제약이 있으나, THn에 설정된 초기 계수값이 오버플로

가 발생하게 되면 자동으로 TLn에 재적재되므로 오버플로가 발생하였을 때 이

값을 재설정하는 과정에 프로그래머가 개입할 필요가 없다는 잇점을 제공한다.

9.3.4 스플리트 모드(Mode 3)

[그림 9.7]은 모드 3인 스플리트 모드(split mode)의 구조를 보여준다. 기존 타이

머/카운터 T/C0가 모드 3으로 사용될 경우에 두 개의 분리된 8비트 길이의 타이

머/카운터로 사용된다. 하나는 계수정보를 저장하는 용도로 하위바이트(TL0) 8비

트만을 사용하는 형태로 관련 제어비트는 기존 T/C0에서와 동일하게 사용된다.

또 다른 하나는 계수정보를 저장하는 용도로 상위 바이트(TH0) 8비트를 사용하

면서, 다른 모드에서 타이머/카운터 T/C1을 위해 사용하던 관련 제어비트를 이

용하는 타이머로서 역할을 한다. 이 경우 내부 머신 사이클을 이벤트로 취급한

다. 이들 두 타이머/카운터는 계수정보를 위해 8비트 길이를 가지므로 0부터 255

까지 계수하고 오버플로가 발생하면 0으로 설정된다.

GATE0

TR0

T0

1/12

P3.4

INT0Clock

C/T0=1

C/T0=0TF0

TH0

TL0

T1P3.5

C/T1=0

C/T1=1

TF1

TL1TH1

SerialPort

8Bit

TR1

8Bit

그림 9.7 스플리트 모드(Mode 3)

기존 타이머/카운터 T/C0가 스플리트 모드에 있을 때, 기존 타이머/카운터 T/C1

Page 263: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제9장 타이머/카운터 253

은 모드 0, 모드 1, 모드 2 중 어느 하나로 설정될 수 있다. 그러나 기존 T/C1의

계수정보를 담고 있는 TH1, TL1의 업 카운팅을 정지 혹은 재개할 수 없다. 그

이유는 이러한 기능을 하는 TR1이 이미 기존 타이머/카운터 T/C0의 상위 바이

트(TH0) 타이머/카운터를 위해 사용되고 있기 때문이다. 따라서 기존의 타이머/

카운터 T/C1은 단지 매 머신 사이클마다 증가될 것이다.

타이머/카운터를 스플리트 모드로 사용하는 경우는 두 개의 구분되는 타이머/카

운터와 동시에 보 레이트 생성기를 필요로 할 때이다. 이러한 경우 T/C1은 보

레이트 생성용으로 사용되며, 기존 타이머/카운터 T/C0를 위한 TH0와 TL0는

각각 8비트의 서로 다른 두 개의 타이머/카운터로 사용된다.

9.4 예제 프로그램

아래에서 타이머/카운터 인터럽트를 취급하는 예제 프로그램을 각 용법에 따라

살펴보도록 하겠다.

9.4.1 타이머 모드

다음 프로그램은 포트 P1의 하위 니블에 LED 모듈을 연결하고, 일정 시간이 지

날 때마다 LED를 차례로 ON하는 타이머 모드의 프로그램으로 인터럽트 방식에

의해 구현한 것이다. 타이머/카운터 T/C0를 이용하여 동작 모드 0으로 사용하고

있으며, 초기 계수값은 0으로 설정되어 있으므로 모드 0에서 지원하는 최대 시간

에서 오버플로가 발생된다.

1 ;========================================

2 ; TC_01.ASM

3 ; T/C0,NO_GATE,TIMER,MODE0 : #00100000B

4 ;========================================

5 $mod51

8000 6 ORG 8000H

8000 803E 7 SJMP START

8

800B 9 ORG 800BH ; ISR

Page 264: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

254 MCS-51 마이크로컴퓨터

800B 804E 10 SJMP ISR

11

8040 12 ORG 8040H

8040 758150 13 START: MOV SP,#50H

14 ;

8043 758920 15 MOV TMOD,#00100000B ; *

8046 758C00 16 MOV TH0,#0

8049 758A00 17 MOV TL0,#0

804C D2B9 18 SETB IP.1

804E D2A9 19 SETB IE.1

8050 D2AF 20 SETB EA

21 ;

8052 74EE 22 MOV A,#11101110B

8054 F590 23 MOV P1,A

24 ;

8056 D28C 25 SETB TCON.4 ; T/C0 RUN

26 ;

8058 00 27 LOOP: NOP ; Normal

8059 80FD 28 SJMP LOOP

29

30 ; Interrupt Service Routine

805B C28C 31 ISR: CLR TCON.4 ; T/C0 STOP

32 ;

805D 23 33 RL A

805E F590 34 MOV P1,A

35 ;

8060 D28C 36 SETB TCON.4 ; T/C0 RUN

8062 32 37 RETI

38 ;

39 END

프로그램 소스에서 보듯이 일단 제반 환경이 설정된 후에 계수를 개시하기 위해

22번 라인과 같은 명령을 사용하여 TR0를 1로 설정하여야 한다. 또한, 일반적으

로 ISR 진입 직 후에 TR0를 0으로 설정하여 업 카운팅을 정지시키고, 종료 직전

에 개시하도록 TR0를 1로 설정하는 방식으로 사용하나, 경우에 따라서는 이러한

방식을 취하지 않아도 된다.

만일 각 동작모드에서 지원하는 최대 시간보다 작은 일정 시간마다 인터럽트가

요청되도록 하려면 다음과 같이 인터럽트 서비스 루틴을 종료하기에 앞서 계수

Page 265: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제9장 타이머/카운터 255

초기 값을 THn, TLn에 설정하는 루틴을 포함하여야 한다. 만일 이를 설정하지

않으면 최초에는 원하는 시간대에 인터럽트가 발생하나 그 이후부터는 오버플로

가 발생됨에 따라 THn, TLn은 0으로 설정되므로 각 동작모드에서 제공하는 최

대 시간마다 인터럽트가 발생된다. 단, 자동 재적재 모드는 예외이다.

다음의 프로그램은 위의 프로그램을 수정하여 16번의 내부 머신 사이클이 지나

면 오버플로가 발생하여 인터럽트를 요청하도록 구현한 것이다. 인터럽트 서비스

루틴을 종료하기 직전에 THn, TLn의 값을 재설정하는 부분을 주목할 필요가 있

다.

1 ;========================================

2 ; TC_02.ASM

3 ; T/C0,NO_GATE,TIMER,MODE0 : #00100000B

4 ;========================================

5 $mod51

8000 6 ORG 8000H

8000 803E 7 SJMP START

8

800B 9 ORG 800BH ; ISR

800B 804E 10 SJMP ISR

11

8040 12 ORG 8040H

8040 758150 13 START: MOV SP,#50H

14 ;

8043 758920 15 MOV TMOD,#00100000B

8046 758CFF 16 MOV TH0,#0FFH

8049 758AF0 17 MOV TL0,#0F0H

804C D2B9 18 SETB IP.1

804E D2A9 19 SETB IE.1

8050 D2AF 20 SETB EA

21 ;

8052 74EE 22 MOV A,#11101110B

8054 F590 23 MOV P1,A

24 ;

8056 D28C 25 SETB TCON.4 ; T/C0 RUN

26 ;

8058 00 27 LOOP: NOP ; Normal

8059 80FD 28 SJMP LOOP

29

Page 266: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

256 MCS-51 마이크로컴퓨터

30 ; Interrupt Service Routine

805B C28C 31 ISR: CLR TCON.4 ; T/C0 STOP

32 ;

805D 23 33 RL A

805E F590 34 MOV P1,A

35 ;

8060 758CFF 36 MOV TH0,#0FFH ; 재설정

8063 758AF0 37 MOV TL0,#0F0H

8066 D28C 38 SETB TCON.4 ; T/C0 RUN

8068 32 39 RETI

40 ;

41 END

9.4.2 게이트 모드

위 예제 중 첫 번째 예제의 15번 줄을 다음과 같이 게이트 모드로 설정하면, 외

부에서 업 카운팅의 중지 및 재개를 제어할 수 있다.

8043 758920 15 MOV TMOD,#00101001B ; *

이때 사용되는 타이머/카운터는 T/C0이므로 이와 관련된 외부 통제용 신호단자

는 INT0(P3.2)가 사용된다. 게이트모드로 설정된 경우 [그림 9.8]에서 GATE0

는 1의 신호가 인가된 것이며, OR 게이트의 이 입력 단에는 Low신호가 입력되

게 되어 OR 게이트의 출력은 INT0 신호에 의해 결정된다. INT0 단자에 연

결된 스위치를 누르면 Low 신호가 입력되어 업 카운팅을 중지하며, 스위치를 놓

으면 High 신호가 입력되어 업 카운팅을 재개하게 된다.

그림 9.8 게이트 모드의 동작

Page 267: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제9장 타이머/카운터 257

9.4.3 카운터 모드

다음의 프로그램은 P3.4인 T0로부터 입력되는 외부 신호를 계수하는 카운터 모

드를 사용하는 타이머/카운터 T/C0 인터럽트용 프로그램으로 폴링 방식에 의해

구현한 것이다. 외부 신호가 발생할 때마다 인터럽트 서비스를 위한 루틴을 수행

하게 된다.

1 ;========================================

2 ; TC_03.ASM

3 ; T/C0,NO_GATE,COUNTER,MODE2

4 ; : #00000110B, POLLING

5 ;========================================

6 $mod51

8000 7 ORG 8000H

8 ;

8000 758906 9 MOV TMOD,#00000110B ; *

8003 758CFF 10 MOV TH0,#255

8006 758AFF 11 MOV TL0,#255

12 ;

8009 74FF 13 LOOP: MOV A,#11111111B

800B F590 14 LP: MOV P1,A

15 ;

800D C28D 16 CLR TF0

800F D28C 17 SETB TR0

18 ;

8011 308DFD 19 JNB TF0,$ ; 폴링

20 ;

8014 C28C 21 CLR TR0

8016 C3 22 CLR C

8017 33 23 RLC A

8018 30E4EE 24 JNB ACC.4,LOOP

801B 80EE 25 SJMP LP

26 ;

27 END

Page 268: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

258 MCS-51 마이크로컴퓨터

9.5 실습과제

[실습1] 타이머 모드 응용

포트 P1에는 FND 모듈을 연결하고, Normal 상태에서는 각 세그먼트를 하나씩

차례로 ON하기를 반복하다가, 타이머/카운터 T/C0가 발생하면 본인 이름의 자

모음 패턴을 1회 출력하는 프로그램을 작성한다. 단, 인터럽트 방식에 의해 구현

하며, 동작 모드는 모드 1을 설정하며, 외부 통제가 가능하도록 구현한다. 시간지

연이 필요하면 사용하도록 한다.

[실습2] 타이머 모드 응용

[실습1]에 대해 동작 모드를 달리하여 모드 0, 모드 2, 모드 3에 대해 동일한 기

능을 하도록 재 구현한다.

[실습3] 카운터 모드 응용(교통량 측정)

T0 핀으로부터의 신호를 자동차 이동이라고 가정하여, 자동차의 교통량을 계측

하는 프로그램을 작성한다. 단, 1대의 차량이 이동하였을 때마다 오버플로가 발

생하도록 하여 이를 FND 모듈에 표시하며, 기타 제반 필요한 사항은 임의로 정

의한다.

Page 269: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제10장 시리얼 통신 259

제10장 시리얼 통신

MCS-51 MCU의 특징 중 하나는 시리얼 포트로 알려진 UART(universal

asynchronous receiver/transmitter)가 통합되어 있다는 것이다. 통합된 시리얼 포

트를 가지고 있다는 사실은 시리얼 포트로 값을 쉽게 기록하고 읽어 들일 수 있

음을 의미한다. 만일 통합된 시리얼 포트가 제공되지 않는다면 시리얼 포트로 한

바이트를 기록하기 위해서 스타트 비트, 스톱 비트 그리고 패리티 비트를 포함한

각 비트를 적절한 클록에 맞추어 연속적으로 출력하는 과정을 요구할 것이다.

그러나 MCS-51에서는 이러한 과정 없이 시리얼 포트의 동작 모드와 보 레이트

(baud rate)를 적절히 설정해 주기만 하면 된다. 일단 설정이 되면, 시리얼 포트

로 기록할 값을 해당 SFR에 기록하거나 시리얼 포트로부터 수신된 데이터를 갖

고 있는 SFR로부터 데이터를 읽어오면 된다. 사용자가 기록한 문자의 전송이 끝

났을 때와 데이터가 수신되었을 때를 자동적으로 알려주기 때문에, 코딩 및 처리

할 때 비트 수준에서의 전송에 대해 프로그래머는 고려할 필요가 없다.

10.1 시리얼 통신 모드

본 절에서는 시리얼 통신과 관련된 통신 모드에 대해 살펴본다. 시리얼 통신 모

드에는 통신 모드 비트의 설정에 따라 4가지가 제공되고 있다.

10.1.1 동기 통신 모드

통신 모드 0는 입출력 확장용의 동기식 통신 모드라 하며, TxD(P3.0) 단자로 출

력되는 공통 클록에 동기되어 RxD(P3.1) 단자로 직렬 방식에 의해 8비트 데이터

를 송신 혹은 수신하게 된다. 이는 송신측과 수신측이 공통의 동기 클록을 사용

하게 되므로 비동기 통신 방식에서 요구하는 스타트 비트 또는 스톱 비트가 불

필요하다. 이 방식에서 사용하는 동기 클록은 1개 명령 사이클과 동기되며, 보

레이트는 발진 주파수의 12분주로 고정되어 있다.

Page 270: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

260 MCS-51 마이크로컴퓨터

데이터의 송신은 데이터를 SBUF에 기록하면서 시작된다. SBUF의 데이터는 한

명령 사이클이 경과됨에 따라 한 비트씩 RxD 단자를 통해 수신측으로 차례로

전송된다. 내부적으로 동기 클록에 맞추어 우 쉬프트 방식으로 수신측에 전달되

는 것이다. 8번의 사이클이 경과되면 8비트의 데이터는 수신측에 모두 전달이 되

고 송신측은 송신 완료를 나타내는 TI 플래그를 1로 설정한다.

데이터의 수신은 REN 비트를 1로 설정하고, RI 플래그를 0으로 설정하면, 데이

터의 수신을 시작한다. 수신데이터의 각 비트는 동기 클록이 동기되어 최상위 비

트부터 시리얼 포트의 내부 수신 쉬프트 레지스터에 RxD 단자를 통해 입력된다.

내부적으로 수신 쉬프트 레지스터는 클록에 동기되어 좌 쉬프트 동작에 의해 8

비트를 수신하게 된다. 최종 수신이 완료되면 내부 쉬프트 레지스터에 담겨진 수

신 데이터는 SBUF로 저장되고 RI 플래그는 1로 설정된다.

10.1.2 비동기 통신 모드

비동기 통신 모드는 동기를 위해 스타트 비트 및 스톱 비트로 구성되는 프레임

형태로 통신하는 방식으로, 고정 혹은 가변의 보 레이트로 데이터를 송수신한다.

[그림 10.1]은 비동기 통신 모드인 모드 1, 2, 3에서의 프레임 패턴을 보여준다.

모드 1은 10비트 프레임의 보 레이트 가변 비동기식 통신 모드를, 모드 2는 11비

트 프레임의 보 레이트 고정 비동기식 통신 모드를, 모드 3은 11비트 프레임의

보 레이트 가변 비동기식 통신 모드를 의미한다.

Start D0 D1 D2 D3 D4 D5 D6 D7 Stop(a) 모드 1(10비트)

Start D0 D1 D2 D3 D4 D5 D6 D7 TB8 Stop(b) 모드 2(11비트)

Start D0 D1 D2 D3 D4 D5 D6 D7 TB8 Stop(c) 모드 3(11비트)

그림 10.1 각 모드에 따른 프레임 패턴

Page 271: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제10장 시리얼 통신 261

10.1.3 멀티프로세서 시스템

모드 2와 3에서 SCON의 SM2 비트를 1로 설정하면, 프레임을 수신하더라도 9번

째 데이터 비트가 1로 되어 있지 않으면 인터럽트 요청을 하지 않는다. 이 기능

을 이용하여 여러 개의 MCS-51 CPU를 시리얼 포트로 상호 연결하여 멀티프로

세서 시스템을 구성하게 된다.

데이터 전송 형식은 [그림 10.2]에서 보인다.

Start A0 A1 A2 A3 A4 A5 A6 A7 1 Stop(a) 주소 정보 프레임

Start D0 D1 D2 D3 D4 D5 D6 D7 0 Stop(b) 데이터 정보 프레임

그림 10.2 멀티프로세서 시스템에서의 프레임

1개의 마스터(master) 프로세서와 여러 개의 슬레이브(slave) 프로세서를 구성하

여, 마스터 프로세서가 슬레이브 프로세서로 데이터를 송신하는 멀티프로세서 시

스템의 통신 프로토콜은 다음과 같다.

단계1. 모든 슬레이브 프로세서는 SM2 비트를 1로 설정하고, 마스터 프로세

서가 어드레스 정보를 송신하는 것을 기다린다.

단계2. 마스터 프로세서는 TB0를 1로 함으로서 전송 프레임의 9번째 비트를

1로 하고 주소 정보를 함께 송신한다.

단계3. 모든 슬레이브 프로세서는 주소 프레임을 수신 후 인터럽트를 요청하

여 수신된 주소 정보가 자신의 주소인지를 판별한다.

단계4. 자신의 주소로 판단된 슬레이브 프로세서만이 SM2를 0으로 설정하

고, 마스터 프로세서가 전송하는 데이터를 기다린다.

단계5. 마스터 프로세서는 TB8을 0으로 하여, 전송 프레임의 9번째 비트가 0

인 데이터 프레임을 송신한다.

단계6. SM2가 0이 되어 수신측으로 결정된 슬레이브 프로세서는 마스터 프

로세서가 전송하는 모든 데이터를 수신하게 된다. 반면, SM2가 1인

Page 272: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

262 MCS-51 마이크로컴퓨터

나머지 슬레이브 프로세서는 이러한 데이터들을 모두 무시하고 주소

정보 프레임이 수신되는지를 기다리게 된다.

단계7. 전송되는 모든 데이터를 수신한 슬레이브 프로세서는 SM2를 1로 설

정하여, 다음에 오게 될 주소 정보 프레임을 기다린다.

10.2 관련 SFR

시리얼 통신 관련 SFR에는 SBUF, SCON, PCON이 있다.

10.2.1 SBUF SFR

SBUF(serial buffer) SFR는 송신할 데이터나 수신한 데이터를 일시적으로 저장

하기 위한 SFR이다.

데이터를 송신하기 위해서는 다음과 같은 명령을 통하여 전송할 수 있다.

MOV A,#0FEHMOV SBUF,A

혹은, MOV SBUF,#0FEH

데이터를 수신할 경우에는 다음과 같이 SBUF의 데이터를 읽어 들이면 된다.

MOV A,SBUF

특히, 데이터를 수신하는 경우에는 RI가 1로 설정된 것을 확인한 후에 읽어 들여

야 함을 유의한다.

10.2.2 SCON SFR

SCON(serial control) SFR는 시리얼 인터럽트가 발생하였을 경우 송신 혹은 수

신 인터럽트인지를 판단할 수 있는 비트와 시리얼 통신 모드를 설정하는 비트들

Page 273: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제10장 시리얼 통신 263

로 구성된다. SCON SFR는 [그림 10.3]과 같은 비트 패턴을 가진다.

7 6 5 4 3 2 1 0SM0 SM1 SM2 REN TB8 RB8 TI RI9FH 9EH 9DH 9CH 9BH 9AH 99H 98H

그림 10.3 SCON SFR

SCON SFR의 각 비트가 정의하는 의미를 [표 10.1]에서 요약한다.

표 10.1 SCON의 비트

비트명 비트주소 기 능SM0 9FH 시리얼 통신 모드 설정 비트 0 SM1 9EH 시리얼 통신 모드 설정 비트 1 SM2 9DH 멀티프로세서 통신 인에이블REN 9CH Receiver Enable.

문자를 수신하려면 필히 1로 설정되어야 함TB8 9BH Transmit bit 8.

모드 2, 3에서 전송할 9번째 비트RB8 9AH Receive bit 8.

모드 2, 3에서 수신할 9번째 비트TI 99H Transmit Flag.

한 바이트의 전송이 완료되었을 때 1로 설정RI 98H Receive Flag.

한 바이트의 수신이 완료되었을 때 1로 설정

SCON SFR는 다음과 같이 바이트 단위 접근이 가능하며, 비트 단위 접근 또한

가능하다.

MOV SCON,#01010010B

SM0와 SM1에 의해 정의되는 시리얼 통신 모드는 시리얼 통신에 사용하는 시리

얼 클록과 밀접한 관련이 있다. 각 시리얼 통신 모드에서의 보 레이트는 [표

10.2]와 같다.

Page 274: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

264 MCS-51 마이크로컴퓨터

표 10.2 시리얼 통신 모드

SM0 SM1 Mode 보 레이트 비고0 0 0 8-bit Shift Register Oscillator / 12 0 1 1 8-bit UART Set by Timer 1 *1 0 2 9-bit UART Oscillator / 64 *1 1 3 9-bit UART Set by Timer 1 *

* 만일 PCON.7(SMOD)이 1이면, 보 레이트는 제시한 것의 두배

SCON SFR의 SM0와 SM1 비트는 시리얼 통신 모드를 설정하는 비트들로, 이

비트들의 설정에 따른 4가지 시리얼 통신 모드는 [표 10.2]에서 살펴보았다. 표에

서 보듯이 시리얼 모드를 선택하는 것은 동작 모드(8-bit/9-bit, UART or shift

register)를 선택하는 것이며, 또한 보 레이트의 계산 방법을 결정한다. 모드 0와

2는 보 레이트가 오실레이터의 주파수에 기반해서 고정되어 있다. 모드 1과 3은

보 레이트가 타이머/카운터의 오버플로에 따라 가변된다.

SM2 비트는 멀티프로세서 통신을 위한 플래그이다. 일반적으로 한 바이트가 수

신될 때마다 MCS-51은 RI 플래그 비트를 1로 설정할 것이다. 이는 프로그램에

게 한 바이트가 수신되었으니 그것의 후속 처리를 요구한다는 것을 알리는 것이

다. 그러나 SM2가 1일 때는 수신된 9번째 비트가 1일 때만 RI 플래그를 1로 한

다. 즉, 만일 SM2가 1이고 9번째 비트가 0인 한 바이트가 수신되면, RI 플래그는

결코 1로 설정되지 않는다. 이는 고급의 시리얼 통신 응용에서 유용하게 이용된

다. 일반적인 응용에서는 항상 SM2 비트를 0으로 설정하여, 어떤 문자가 수신되

었을 때 항상 RI 플래그가 영향을 받도록 하는 것이 안전할 것이다.

REN(receiver enable) 비트는 시리얼 포트를 통해 데이터를 수신하고자 할 경우

에 필히 1로 설정한다. 사용자는 대부분의 경우에 REN 비트를 1로 설정하여 사

용할 것이다.

나머지 4비트는 동작 비트이다. 이들은 시리얼 포트의 환경설정을 위한 것이 아

니라 실제로 데이터가 송수신될 때 이용되는 비트이다.

TB8 비트는 모드 2와 3에서 이용된다. 모드 2와 3에서는 총 9비트의 데이터가

전송된다. 처음 8개 데이터 비트는 전송할 순수한 데이터 8비트이고 9번째 비트

Page 275: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제10장 시리얼 통신 265

는 TB8로부터 취해진다. 만일 TB8이 1이고 데이터가 시리얼 포트로 전송되면,

데이터 비트에 뒤따르는 9번째 비트를 1로 하여 전송할 것이다. 만일 TB8이 0이

면 9번째 비트는 0으로 전송할 것이다.

RB8 비트도 모드 2와 3에서 근본적으로 TB8과 동일한 방법의 기능으로 사용하

나 그러나 수신시에 이용된다. 모드 2와 3에서 한 바이트를 수신할 때 총 9비트

가 수신되며, 수신된 처음 8비트는 수신된 시리얼 데이터이고 9번째 비트의 값은

RB8에 저장된다.

TI는 전송 인터럽트를 의미한다. 프로그램이 시리얼 포트에 값을 기록할 때, 해

당 바이트의 각 비트들이 시리얼 포트로 출력되기 전에 얼마간의 시간이 소요된

다. 만일 프로그램이 한 바이트가 완전히 출력되기 전에 시리얼 포트로 또 다른

바이트를 기록하려 한다면 전송되는 데이터는 손실을 입게 된다. 따라서 8051은

TI 비트를 1로 설정함으로써 최근 바이트가 출력되었음을 프로그램에 알려준다.

TI 비트가 1로 설정되면 프로그램은 시리얼 포트를 이용할 수 있다고 가정하고

다음 바이트를 전송할 준비를 한다.

끝으로, RI는 수신 인터럽트를 의미한다. TI 비트와 유사한 기능을 하지만 이는

한 바이트가 이미 수신되었음의 지시한다. 즉, 8051이 완전한 한 바이트를 수신

할 때마다 RI 비트를 1로 설정함으로써 또 다른 바이트가 수신되기 전에 이미

수신된 바이트를 빨리 읽어 들일 필요가 있다는 것을 알린다.

10.2.3 PCON SFR

PCON(power control) SFR는 [그림 10.4]와 같은 비트 패턴을 가지며, 시리얼 인

터럽트와 관련된 비트는 SMOD 비트뿐이다.

7 6 5 4 3 2 1 0SMOD - - - GF1 GF0 PD IDL

그림 10.4 PCON SFR

PCON SFR는 다음과 같이 바이트 단위의 접근만 가능하다.

Page 276: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

266 MCS-51 마이크로컴퓨터

MOV PCON,#10000000B

시리얼 클록 발생회로는 T/C1과 PCON의 SMOD 비트를 이용하여 보 레이트를

생성하며, SMOD 비트의 설정에 따른 각 시리얼 모드에서의 보 레이트를 [표

10.3]에 정리한다. SMOD 비트가 1로 설정되면 각 시리얼 모드에서의 보 레이트

를 2배로 하게 된다.

표 10.3 SMOD에 따른 각 모드에서의 기능

모드 SMOD='0' SMOD='1'0 사용안됨 사용안됨1 T/C1 오버플로의 1/2 T/C1 오버플로우2 XTAL의 1/4 XTAL의 1/23 T/C1 오버플로의 1/2 T/C1 오버플로우

10.3 보 레이트 설정 및 송수신

10.3.1 보 레이트 설정

일단 시리얼 포트의 모드가 설정되면, 프로그램은 시리얼 포트의 보 레이트를 설

정해야 한다. 이는 단지 시리얼 포트 모드 1과 3에만 적용된다. 시리얼 포트 모

드 0과 2에서 보 레이트는 오실레이터의 주파수에 의해 결정된다. 모드 0에서 보

레이트는 항상 오실레이터 주파수를 12분주한 것을 사용한다. 이는 만일 수정 발

진자가 11.059Mhz이면 모드 0의 보 레이트는 항상 921583이 될 것이다. 모드 2

에서 보 레이트는 오실레이터 주파수를 64분주한 것을 사용한다. 따라서

11.059Mhz 수정 발진자가 사용되는 경우 172,797의 보 레이트를 사용한다.

모드 1과 3에서 보 레이트는 타이머/카운터 1이 얼마나 빈번하게 오버플로를 발

생하느냐에 의해 결정된다. 오버플로가 보다 빈번히 발생할수록 보 레이트는 보

다 높아진다. 하나의 보 레이트를 결정하는데 있어 타이머/카운터 1이 오버플로

를 발생하게 하는 방법은 다양하다. 그러나 가장 일반적인 방법은 타이머/카운터

의 모드 2인 8비트의 자동 재 적재 모드를 이용하는 방법이다. 이는 특정 보 레

Page 277: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제10장 시리얼 통신 267

이트를 생성하기에 적절한 빈도로 타이머/카운터 1이 오버플로를 발생하도록 재

적재할 값을 TH1에 설정하면 된다.

주어진 보 레이트를 생성하기 위해 TH1에 저장할 값을 결정하려면, 다음 식을

이용하면 된다. 여기서 PCON.7(SMOD)는 0이라고 가정한다.

TH1=256- Crystal384×Baud ; SMOD=0

만일 PCON.7을 1로 설정하면, 보 레이트는 효과면에서 두 배이다. 따라서 이 경

우의 식은 다음과 같다.

TH1=256- Crystal192×Baud ; SMOD=1

예로, 만일 11.059Mhz 수정발진자를 사용하고 시리얼 포트를 19200 보 레이트로

설정한다면 첫 번째 식에 의해 다음과 같다.

TH1=256- 11059000384×19200

= 256- 28,79919200

= 256-1.5= 254.5

결과처럼, 11.059Mhz 수정발진자를 이용할 때 19200 보 레이트를 얻으려면 TH1

의 값을 254.5로 설정해야 한다. 만일 254로 설정한다면 14400 보 레이트를 얻을

수 있고, 255로 설정한다면 28800 보 레이트를 얻을 수 있다.

그러나, 정확한 19200 보 레이트를 얻으려면 PCON.7(SMOD)을 1로 설정할 필요

가 있다. 이 경우 보 레이트는 두 배가 되므로 두 번째 식을 이용할 수 있다.

TH1=256- 11059000192×19200 = 256- 57699

19200 = 256-3=253

이 식으로부터 정수의 TH1의 값을 계산할 수 있다. 그러므로 11.059MHz 수정발

진자를 사용하는 시스템에서 19200 보 레이트를 얻기 위해서는 시리얼 포트의

모드는 1혹은 3으로, 타이머/카운터 1은 타이머 모드 2로 설정하고, 19200 보 레

이트를 위한 정확한 시상수인 253(FDH)을 TH1에, 그리고 두배의 보 레이트를

Page 278: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

268 MCS-51 마이크로컴퓨터

생성하도록 PCON.7(SMOD)를 1로 설정하면 된다.

[표 10.4]는 시리얼 통신에서의 보 레이트 생성과 관련한 인자값의 설정을 정리

한 것을 보이며, 시리얼 통신에서 대부분 T/C1의 자동재적재(auto reload) 모드

를 사용하여 9600bps로 통신을 수행하는 것이 일반적이다. 하지만 KUT51 실습

보드에서는 19,200bps로 설정해야 하므로 추가적으로 SMOD 비트를 1로 설정하

여야 한다.

표 10.4 보 레이트 설정관련 인자 및 그 값

보 레이트(bps) 시스템클록 SMOD T/C1C/T Mode TH1

Mode0 Max : 1M 12㎒ x x x xMode2 Max : 375K 12㎒ 1 x x xMode1,3 : 62.5K 12㎒ 1 0 2 FFH19.2K 11.0592㎒ 1 0 2 FDH9.6K 11.0592㎒ 0 0 2 FDH4.8K 11.0592㎒ 0 0 2 FAH2.4K 11.0592㎒ 0 0 2 F4H1.2K 11.0592㎒ 0 0 2 E8H137.5 11.0592㎒ 0 0 2 1DH110 6㎒ 0 0 2 72H110 12㎒ 0 0 1 FEEBH

10.3.2 시리얼 송수신

시리얼 송신

일단 시리얼 포트가 적절히 설정되었으면, 그 시리얼 포트는 데이터를 송신하거

나 수신할 수 있는 준비가 된 것이다.

시리얼 포트에 한 바이트를 전송하기 위해서는 보낼 데이터를 SBUF 특수 기능

레지스터에 기록하면 된다. 예로 문자 'A'(41H)를 시리얼 포트로 전송한다면 다

음과 같이 하면 된다.

MOV SBUF,#41H ; 'A'

Page 279: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제10장 시리얼 통신 269

위의 명령이 수행될 때, 시리얼 포트를 통해 그 문자를 전송하기 시작할 것이다.

전송은 일순간에 일어나는 것이 아니라 어느 정도의 시간을 요구할 것이다. 그리

고 MCS-51은 시리얼 출력 버퍼를 가지고 있지 않기 때문에 다음 문자를 전송하

려 시도하기 전에 전송한 데이터가 완전히 전송되었는지를 확인할 필요가 있다.

MCS-51은 문자의 전송이 완료되었음을 SCON의 TI 비트를 1로 설정함에 의해

알린다. 이 비트가 1이면 최근 전송된 문자가 잘 전송되었다는 것을 알게 되고

다음 문자를 전송할 수 있을 것이다. 다음의 코드를 살펴보자.

JNB TI,$ ; wait until TI set, 전송 완료CLR TI ; clear TIMOV SBUF,#42H ; transmit

위 세 명령은 하나의 문자를 성공적으로 전송할 것이다 그리고 계속 진행하기에

앞서 TI 비트가 1로 설정될 때까지 대기한다.

첫 번째 명령 JNB TI,$는 TI 비트가 1이 아니면 현재 명령을 다시 실행하라는

의미로 다음과 동일한 기능을 한다.

LOOP: JNB TI,LOOP

대부분의 어셈블러에서 $는 현재 명령과 동일한 주소라는 의미이다. 따라서

MCS-51은 문자가 잘 전송되었을 때 TI 비트가 MCS-51에 의해 1로 설정될 때

까지 JNB 명령을 반복 수행할 것이다.

시리얼 수신

데이터의 수신이 완료되면 MCS-51 MCU가 자동적으로 SCON의 RI 플래그를 1

로 설정하므로, 그 후에 SBUF SFR에 저장된 값을 읽어 들이면 된다. 예로 사용

자 프로그램이 수신할 문자를 기다리다, 그것을 어큐뮬레이터로 읽어 들이고자

한다면 다음의 코드와 같이 작성할 수 있다.

JNB RI,$ ; wait until RI set, 수신 완료MOV A,SBUF ; readCLR RI ; clear RI

Page 280: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

270 MCS-51 마이크로컴퓨터

위 코드의 첫 명령은 RI 플래그가 1로 설정될 때까지 대기하는 것이다. 시리얼

포트를 통하여 문자를 수신하면 RI 플래그는 자동적으로 1로 설정된다. 따라서

이 비트가 1로 설정되지 않는 한 프로그램은 JNB 명령을 계속해서 반복할 것이

다. 일단 문자 수신으로 인해 RI 비트가 1로 설정되면 수신 데이터를 읽기 위한

MOV 명령이 실행된다.

시리얼 통신 인터럽트

시리얼 통신 인터럽트는 지금까지 살펴본 인터럽트와는 다르게 취급하여야 한다.

이는 하나의 시리얼 인터럽트에 대해 두 개의 인터럽트 플래그 RI와 TI가 있기

때문이다. 두 플래그 비트의 어느 하나라도 1이면, 시리얼 인터럽트가 요청된 것

이다. RI 비트는 시리얼 포트를 통해 한 바이트가 도착했을 때 1로 설정된다. 반

면 TI 비트는 한 바이트를 전송하였을 때 1로 설정된다.

이것이 의미하는 바는 시리얼 인터럽트가 요청될 때는 RI 플래그가 1로 설정되

었을 수도 있고, TI 플래그가 1로 설정될 수도 있다는 것이다. 혹은 두 플래그가

모두 1로 되었을 수 도 있다. 따라서 프로그램에서 시리얼 통신 인터럽트가 발생

하더라도 적절한 서비스를 하기 위해서는 이들 플래그의 상태를 검사해야 한다.

또한 MCS-51은 이 인터럽트에 대한 서비스가 이루어지더라도 RI와 TI 플래그

를 자동적으로 0으로 설정하기 않기 때문에 프로그래머가 인터럽트 서비스 루틴

내에서 이들 비트를 0으로 설정해야한다.

간단한 시리얼 인터럽트 서비스 루틴의 코드 예를 보이면 다음과 같다.

INT_SERIAL: JNB RI,CHECK_TI ; check RI MOV A,SBUF

CLR RI CHECK_TI: JNB TI,EXIT_INT ; check TI

CLR TI MOV SBUF,#40H

EXIT_INT: RETI

코드에서 보듯이, 우선 두 인터럽트 플래그의 상태를 검사하여 RI, TI의 어느 것

에 대한 서비스를 할 것인지 결정한다. 만일 두 플래그들이 1로 설정되어 있다면

코드의 두 부분이 모두 실행될 것이다. 또한 코드의 각 부분에서 그에 대응하는

Page 281: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제10장 시리얼 통신 271

인터럽트 플래그를 0으로 설정하는 것을 볼 수 있다. 만일 이들 인터럽트 플래그

비트를 0으로 설정하는 것을 잊으면, 해당 비트를 0으로 설정할 때까지 반복해서

시리얼 인터럽트가 요청된 것으로 인지하여 서비스 하게 될 것이다. 따라서 시리

얼 인터럽트 서비스 루틴에서 인터럽트 플래그들을 항상 0으로 설정하는 것이

중요하다.

10.4 예제 프로그램

10.4.1 인터럽트 방식에 의한 문자 반송

MCS-51에 내장된 시리얼 포트를 이용하여 단말기에서 입력하는 문자를 수신하

고, 이를 단말기에 반송하는 프로그램을 구성한다. 단, 인터럽트 방식에 의하여

구현한다.

1 ;====================================

2 ; SERIAL_01.ASM

3 ; Char ECHO, Interrupt

4 ;====================================

5 $mod51

8000 6 ORG 8000H

8000 803E 7 SJMP START

8 ;

8023 9 ORG 8023H

8023 803C 10 SJMP SERIAL_ISR

11 ;

8040 12 ORG 8040H

8040 75813F 13 START: MOV SP,#3FH

8043 C2D5 14 CLR PSW.5

8045 114A 15 ACALL SERIAL_INIT

16 ;

8047 00 17 LOOP: NOP ; normal

8048 80FD 18 SJMP LOOP

19 ;

804A 20 SERIAL_INIT:

804A C2AF 21 CLR EA

Page 282: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

272 MCS-51 마이크로컴퓨터

804C 758920 22 MOV TMOD,#00100000B

804F 758780 23 MOV PCON,#80H ; SMOD

8052 758DFD 24 MOV TH1,#0FDH

8055 D28E 25 SETB TR1

26 ;

8057 759850 27 MOV SCON,#01010000B

805A D2BC 28 SETB PS

805C D2AC 29 SETB ES

805E D2AF 30 SETB EA

8060 22 31 RET

32 ;

8061 33 SERIAL_ISR: ; interrupt service routine

8061 34 RX_ISR:

8061 30980B 35 JNB RI,TX_ISR

8064 C2AF 36 CLR EA

8066 E599 37 MOV A,SBUF

8068 C298 38 CLR RI

806A D2D5 39 SETB PSW.5

806C D2AF 40 SETB EA

806E 32 41 RETI

42 ;

806F 43 TX_ISR:

806F 10D501 44 JBC PSW.5,TX_CHR

8072 32 45 RETI

46 ;

8073 47 TX_CHR:

8073 C2AF 48 CLR EA

8075 C299 49 CLR TI

8077 F599 50 MOV SBUF,A

8079 D2AF 51 SETB EA

807B 32 52 RETI

53 ;

54 END

10.4.2 폴링 방식에 의한 문자 반송

MCS-51에 내장된 시리얼 포트를 이용하여 단말기에서 입력하는 문자를 수신하

고 이를 단말기에 반송하는 프로그램을 구성한다. 단 폴링 방식에 의해 구현한

다.

Page 283: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제10장 시리얼 통신 273

1 ;====================================

2 ; SERIAL_02.ASM

3 ; Char ECHO, Polling

4 ;====================================

5 $mod51

8000 6 ORG 8000H

8000 75813F 7 MOV SP,#3FH

8 ;

8003 110B 9 ACALL SERIAL_INIT

8005 111F 10 LOOP: ACALL RX_CHR

8007 1127 11 ACALL TX_CHR

8009 80FA 12 SJMP LOOP

13 ;

800B 14 SERIAL_INIT:

800B C2AF 15 CLR EA

800D 758920 16 MOV TMOD,#00100000B

8010 758780 17 MOV PCON,#80H ; SMOD

8013 758DFD 18 MOV TH1,#0FDH

8016 D28E 19 SETB TR1

20 ;

8018 759850 21 MOV SCON,#01010000B

801B 759900 22 MOV SBUF,#0

801E 22 23 RET

24 ;

801F 25 RX_CHR:

801F 3098FD 26 JNB RI,$

8022 E599 27 MOV A,SBUF

8024 C298 28 CLR RI

8026 22 29 RET

30 ;

8027 31 TX_CHR:

8027 3099FD 32 JNB TI,$

802A C299 33 CLR TI

802C F599 34 MOV SBUF,A

802E 22 35 RET

36 ;

37 END

Page 284: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

274 MCS-51 마이크로컴퓨터

10.4.3 폴링 방식에 의한 문자열 반송

MCS-51에 내장된 시리얼 포트를 이용하여 단말기에서 입력하는 문자열을 수신

하고 이를 단말기에 반송하는 프로그램을 구성한다. 문자열의 끝은 Enter 키에

의해 표현된다. 즉, 단말기에서 Enter 키가 들어올 때까지 전송되는 문자들을 보

관하고 있다가 Enter 키의 코드 값이 수신되면 수신된 문자열을 반송하도록 하

는 것이다. Enter 키는 '\r' 문자로 수신된다. 단, 폴링 방식에 의해 구현한다.

1 ;====================================

2 ; SERIAL_03.ASM

3 ; LINE ECHO, Polling

4 ;====================================

5 $mod51

6 ;

000D 7 CR EQU 0DH

000A 8 LF EQU 0AH

8100 9 ALINE EQU 8100H

10 ;

8000 11 ORG 8000H

8000 75813F 12 MOV SP,#3FH

13 ;

8003 110F 14 ACALL SERIAL_INIT

8005 1123 15 LOOP: ACALL RX_LINE

8007 113B 16 ACALL TX_LF

8009 1130 17 ACALL TX_LINE

800B 113B 18 ACALL TX_LF

800D 80F6 19 SJMP LOOP

20 ;

800F 21 SERIAL_INIT:

800F C2AF 22 CLR EA

8011 758920 23 MOV TMOD,#00100000B

8014 758780 24 MOV PCON,#80H ; SMOD

8017 758DFD 25 MOV TH1,#0FDH

801A D28E 26 SETB TR1

27 ;

801C 759850 28 MOV SCON,#01010000B

801F 759900 29 MOV SBUF,#0

8022 22 30 RET

31 ;

8023 32 RX_LINE:

Page 285: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제10장 시리얼 통신 275

8023 908100 33 MOV DPTR,#ALINE

8026 34 RX_LOOP:

8026 1140 35 ACALL RX_CHR

8028 F0 36 MOVX @DPTR,A

8029 A3 37 INC DPTR

802A 1148 38 ACALL TX_CHR

802C B40DF7 39 CJNE A,#CR,RX_LOOP

802F 22 40 RET

41 ;

8030 42 TX_LINE:

8030 908100 43 MOV DPTR,#ALINE

8033 44 TX_LOOP:

8033 E0 45 MOVX A,@DPTR

8034 1148 46 ACALL TX_CHR

8036 A3 47 INC DPTR

8037 B40DF9 48 CJNE A,#CR,TX_LOOP

803A 22 49 RET

50 ;

803B 51 TX_LF:

803B 740A 52 MOV A,#LF

803D 1148 53 ACALL TX_CHR

803F 22 54 RET

55 ;

8040 56 RX_CHR:

8040 3098FD 57 JNB RI,$

8043 E599 58 MOV A,SBUF

8045 C298 59 CLR RI

8047 22 60 RET

61 ;

8048 62 TX_CHR:

8048 3099FD 63 JNB TI,$

804B C299 64 CLR TI

804D F599 65 MOV SBUF,A

804F 22 66 RET

67 ;

68 END

Page 286: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

276 MCS-51 마이크로컴퓨터

10.5 실습과제

[실습1] 문자 반송

예제 프로그램 10.4.1을 참조하여 문자를 반송하되, +2한 문자를 반송하는 프로그

램을 작성하되 이를 폴링 방식으로 구현하며, 또한 인터럽트 방식으로도 구현하

여 결과를 고찰한다.

[실습2] 문자열 반송

예제 프로그램 10.4.3의 프로그램과 동일한 기능을 하도록 재 구현한다. 단, 인터

럽트 방식에 의해 구현한다.

[실습3] 문자열 반송 응용

몇 개의 문자열을 메모리 공간에 준비 해 놓고, 상대측에서 특정 번째 문자열을

요구할 때 그에 대한 문자열을 전송하는 프로그램을 작성한다. 단, 제반 필요사

항 등은 각자 정의한다.

[실습4] 원격 디바이스 제어

실습의 포트 P1에 LED 모듈을 연결하고, 이를 원격에서 제어하는 프로그램을

구현한다. 통신 프로그램에서 '!'문자를 첫 문자로 하여 전달하는 메시지는 실습

보드 상의 LED를 제어하는 명령이며, 뒤이어 전달하는 문자는 LED에 출력할 패

턴이라고 가정한다. 단, 제반 필요한 사항은 각자 정의한다.

Page 287: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제11장 CLCD 제어 277

제11장 CLCD 제어

간단한 문자 패턴을 표시하기 위한 출력장치로 CLCD(Character LCD)가 사용된

다. 이 장에서는 KUT51 실습 보드와 함께 사용되는 16x2 CLCD에 대해 소개하

고 이를 동작시키기 위한 응용 프로그램을 살펴본다.

11.1 CLCD 개요

본 절에서는 TLCD의 핀 기능, 기록 및 판독 타이밍, 내부 구성 요소들에 대해

살펴본다.

11.1.1 CLCD 모듈의 특징 및 핀 기능

CLCD 모듈의 블록도는 [그림 11.1]과 같다. 16문자씩 2라인을 출력할 수 있는

LCD 패널과 이를 제어하기 위한 컨트롤러로 구성된다.

그림 11.1 CLCD 모듈의 블록도

Page 288: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

278 MCS-51 마이크로컴퓨터

CLCD 모듈은 다음과 같은 특징을 가진다.

▪ 5V의 단일 전원으로 구동된다.

▪ 5x7, 5x10 도트 크기의 문자들을 표현할 수 있다.

▪ 8비트 혹은 4비트의 데이터버스 방식으로 구동된다.

▪ CG(character generator) RAM, CG ROM, DD(display data) RAM을 내장

하고 있다.

또한, CLCD 모듈의 각 핀 기능은 [표 11.1]과 같다.

표 11.1 CLCD의 핀 기능

핀번호 기 호 신호레벨 기 능1 Vss - Gnd2 Vdd - +5V3 V0 밝기조절4 RS H/L H : 데이터 입력

L : 명령입력(내부레지스터 선택) 5 R/W H/L H : Read(TLCD로부터 CPU로)

L : Write(CPU로부터 TLCD로)6 E H Enable Signal7 DB0 H/L 데이터버스

8비트모드 : 하위니블 4비트모드 : 사용않됨

8 DB1 H/L9 DB2 H/L10 DB3 H/L11 DB4 H/L 데이터버스

8비트모드 : 상위니블 4비트모드 : 상/하위니블

12 DB5 H/L13 DB6 H/L14 DB7 H/L15 LEDA +5V LED 백라이트용 전원16 LEDK 0V LED 백라이트용 전원

각 핀들의 기능을 보다 구체적으로 살펴보면 다음과 같다.

E(Enable) 신호

이 신호는 CLCD의 동작을 활성화하는 입력 신호이다. MCU가 CLCD 모듈의 동

작을 개시하기 위해서는 이 핀에 High 신호를 주어야 한다.

Page 289: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제11장 CLCD 제어 279

R/W(Read/Write) 신호

CLCD 모듈로 데이터 혹은 명령을 기록/판독하기 위해 사용되는 입력 신호이다.

RS(Register Select) 신호

레지스터를 선택하기 위한 입력 신호로 사용된다. CLCD 모듈이 원하는 기능을

수행하기 위해서는 CLCD에서 제공하는 명령 셋을 참조하여야 한다.

DB7 - DB0(Data Bus 7 - 0)

MCU와 CLCD 모듈간의 데이터를 주고받기 위한 버스로 사용된다. 8비트 모드

에서는 8비트 모두 사용되나, 4비트 모드에서는 상위 4비트만이 사용된다.

LEDA, LEDK

LED 백라이트 전원 공급용으로 사용된다.

11.1.2 CLCD의 타이밍

8비트 인터페이스의 판독 타이밍

[그림 11.2]는 CLCD 모듈의 판독 타이밍도를 보인다.

그림 11.2 판독 타이밍도

Page 290: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

280 MCS-51 마이크로컴퓨터

8비트 인터페이스의 기록 타이밍

[그림 11.3]은 CLCD 모듈의 기록 타이밍도를 보인다.

그림 11.3 기록 타이밍도

4비트 인터페이스의 기록/판독 타이밍

4비트 인터페이스로 하드웨어를 구현한 경우, CLCD 모듈을 제어할 때의 기록

및 판독 타이밍도를 [그림 11.4]에서 보인다.

그림 11.4 4비트 인터페이스 모드에서의 기록/판독 타이밍도

Page 291: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제11장 CLCD 제어 281

11.1.3 CLCD의 내부 구성

CLCD 모듈의 내부 구성 요소들에 대해서 살펴보자.

IR 및 DR 레지스터

CLCD 컨트롤러는 2개의 8비트 레지스터 IR(instruction register)와 DR(data

register)이 제공되며, RS(register select) 신호에 의해 이들 두 레지스터 중 어느

것이 선택되는지 결정된다.

IR 레지스터는 컨트롤러에 기록하는 기능만을 제공하며, 화면 클리어, 커서 쉬프

트 등의 인스트럭션 코드와 DD(display data) RAM 및 CG(character generator)

RAM의 주소 정보를 저장하는 역할을 한다.

DR 레지스터는 DD RAM, CG RAM으로 기록할 데이터 및 DD RAM, CG

RAM에서 읽어낸 데이터를 일시적으로 저장하는 역할을 수행한다. CPU에서 DD

RAM 혹은 CG RAM으로 기록할 경우, DR 레지스터에 기록된 데이터는 컨트롤

러의 내부 동작에 따라 자동적으로 DD RAM 혹은 CG RAM으로 데이터가 기록

된다. 필요한 주소 정보를 IR 레지스터에 기록하면 내부 동작에 의해 DD RAM

혹은 CG RAM에서 읽혀진 데이터는 DR 레지스터에 저장된다. DR 레지스터로

부터 판독이 수행된 후, 다음 주소의 DD RAM 혹은 CG RAM 내의 데이터는

다음 판독 사이클 동안 DR 레지스터에 전송된다.

BF 비트

BF(busy flag) 비트는 CLCD 모듈이 다음 인스트럭션을 수신할 수 있는지의 상

태를 알려준다. 이는 RS=0, R/W=1인 조건에서 판독 동작이 수행될 때, BF 비트

는 DB7 비트로 출력된다. 따라서 이 비트를 검사함으로서 BF 비트가 1이면

CLCD 모듈이 내부 동작 중으로 다음 인스트럭션을 수신할 수 없다. 반면 BF 비

트가 0이면 다음 인스트럭션을 받을 수 있는 상태임을 나타낸다. 따라서 BF 비

트가 0으로 될 때까지 다음 인스트럭션이 출력되지 않아야 한다.

결국, 인스트럭션을 기록할 경우 BF 비트의 상태를 확인하여 0인 경우 다음 인

스트럭션을 기록하든지, 현재 인스트럭션의 실행시간 동안 대기한 후에 다음 인

스트럭션을 기록하든지 해야 한다.

Page 292: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

282 MCS-51 마이크로컴퓨터

AC

주소 계수기 AC(address counter)는 DD RAM용의 AC와 CG RAM용의 AC가

제공된다. 이들 AC는 DD RAM 혹은 CG RAM에 있는 데이터를 기록 혹은 판

독할 때 주소를 계수하는 용도로 사용된다.

인스트럭션의 주소가 IR 레지스터에 기록되었을 때, 주소정보는 IR 레지스터로부

터 AC에 전송된다. 또한 DD RAM 혹은 CG RAM의 어느 것의 선택인가는 동

일한 인스트럭션에 의해 동시에 결정된다. DD RAM 혹은 CG RAM으로부터 판

독 혹은 기록 후, AC는 엔트리 모드 설정 명령의 I/D 비트 설정에 따라 자동적

으로 1 증가 혹은 1 감소된다. RS=0이고 판독 동작이 수행될 때, AC 내용은

DB0 - DB6 데이터버스로 출력된다.

DD RAM

DD(display data) RAM은 8비트 문자 코드로 표현되는 디스플레이 데이터를 저

장한다. 컨트롤러의 DD RAM은 최대 80x8 비트의 용량을 가진다. 즉 8비트 문

자 80개를 기억할 수 있는 용량이다. 디스플레이 데이터를 위해 사용되지 않는

DD RAM은 일반 데이터 RAM으로 사용될 수 있다.

DD RAM 주소는 AC에 설정되고 16진수로 표현된다. 주소 계수기는 Set DD

RAM address 명령에 의해 기록될 수 있고, Read BF & Address 인스트럭션을

이용하여 판독될 수 있다. 각 경우에, 데이터 비트 DB0 - DB6 는 DD RAM 주

소를 표현한다. 판독 동작에서 비트 DB7은 BF 비트를 표현한다.

DD RAM의 주소와 CLCD의 표시 라인과의 관계는 [그림 11.5]와 같다. CLCD의

첫 라인에 할당되는 DD RAM 주소는 00H-27H이며 두 번째 라인에 할당되는

DD RAM 주소는 40H-67H이다. 보듯이 첫 라인과 둘째 라인에 할당되어 있는

DD RAM의 주소는 불연속이다. CLCD가 초기화되었을 때 첫 라인의 16개 문자

분에 해당하는 00H-0FH 주소와 두 번째 라인의 16개 문자분에 해당하는

40H-4FH 주소가 의미를 가지며, [그림 11.5]의 역상으로 표시된 부분은 실제

CLCD의 화면 배치를 보여주는 것이다.

Page 293: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제11장 CLCD 제어 283

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ... 401행 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 ... 27

2행 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 ... 67

그림 11.5 CLCD의 DD RAM 주소 체계

[그림 11.6]은 좌 쉬프트와 우 쉬프트의 경우 DD RAM과 CLCD의 표시 행간의

주소 관계를 보여준다.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

1행 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10

2행 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50

좌 쉬프트

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

1행 27 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E

2행 67 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E

우 쉬프트

그림 11.6 쉬프트경우 CLCD의 DD RAM 주소 체계

CG ROM

CG(character generator) ROM은 8비트 문자 코드로부터 5x7 혹은 5x10 도트의

문자 패턴을 생성한다. 192개의 5x7 도트의 문자 패턴을 생성할 수 있으며, 32개

의 5x10 도트의 문자패턴을 생성할 수 있다. [그림 11.7]은 CG ROM의 문자코드

와 해당 표준 문자 폰트의 문자 패턴간의 관계를 나타낸다.

이들 CG ROM의 문자 패턴을 CLCD로 표시하는 과정은 다음과 같다. 우선

CLCD로 표시하고자 하는 주소를 계산하고 DD RAM용의 AC에 DD RAM의 주

소를 설정한 후, DD RAM으로 문자 패턴에 대한 CG ROM의 주소를 기록한다.

Page 294: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

284 MCS-51 마이크로컴퓨터

그림 11.7 CG ROM의 문자패턴

Page 295: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제11장 CLCD 제어 285

CG RAM

CG(character generator) RAM은 사용자가 프로그램 상에서 필요로 하는 문자패

턴을 정의하여 저장할 수 있는 64x8 비트 크기의 RAM이다. 하나의 컨트롤러에

서 8개의 5x7 도트의 문자 패턴을 혹은 4개의 5x10 도트의 문자패턴을 정의하여

저장할 수 있다. CG RAM으로부터 이전에 정의된 문자를 DD RAM에 기록하려

면, 00H-07H 범위의 문자코드가 사용된다. 사용되지 않는 CG RAM 공간은 일

반 목적의 RAM으로 사용될 수 있다.

[그림 11.8]은 CG RAM 주소와 데이터 그리고 표시되는 문자간의 관계를 보인

다. 문자코드의 D2-D0 비트는 CG RAM 주소 A5-A3 비트와 일치하며, 8가지

유형을 지시한다. CG RAM 주소 A2-A0 비트는 문자 패턴내의 라인 위치를 가

리킨다. 8번째 라인은 커서 위치이며, 표시는 8번째 라인과 커서의 논리합에 의

해 결정된다.

문자코드(DD RAM 데이터) CG RAM 주소 CG RAM 데이터 패턴번호D7 D6 D5 D4 D3 D2 D1 D0 A5 A4 A3 A2 A1 A0 P7 P6 P5 P4 P3 P2 P1 P0

0 0 0 0 x 0 0 0 0 0 0 0 0 0 x x x 1 1 1 1 0

패턴1

0 0 0 0 0 1 x x x 1 0 0 1 00 0 0 0 1 0 x x x 1 1 1 1 00 0 0 0 1 1 x x x 0 0 0 0 00 0 0 1 0 0 x x x 0 0 1 0 00 0 0 1 0 1 x x x 0 0 1 1 10 0 0 1 1 0 x x x 0 0 1 0 00 0 0 1 1 1 x x x 0 0 1 0 0

: : : : : : : : : : : : : : : : : : : : : : :

0 0 0 0 x 1 1 1 1 1 1 0 0 0 x x x 1 1 1 1 1

패턴8

1 1 1 0 0 1 x x x 0 0 1 0 01 1 1 0 1 0 x x x 0 0 1 0 01 1 1 0 1 1 x x x 0 0 1 0 01 1 1 1 0 0 x x x 0 0 1 0 01 1 1 1 0 1 x x x 0 0 1 0 01 1 1 1 1 0 x x x 0 0 1 0 01 1 1 1 1 1 x x x 0 0 0 0 0

그림 11.8 CG RAM의 5x7 dots 문자패턴 정의

Page 296: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

286 MCS-51 마이크로컴퓨터

11.2 CLCD 제어 명령

본 절에서는 CLCD에서 제공하는 명령들과 KUT51 실습 보드에서 CLCD를 제어

하기 위한 메모리 맵을 살펴본다.

11.2.1 인스트럭션 셋

[표 11.2]에 CLCD를 제어하는 인스트럭션의 제어 신호, 비트 패턴 및 실행 시간

에 대해 정리하였으며, [표 11.3]은 각 비트의 설정에 따른 기능을 보인다.

표 11.2 CLCD 인스트럭션 셋

기 능 제어신호 제어명령 실행시간RS RW DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0Clear Display 0 0 0 0 0 0 0 0 0 1 1.52msReturn Home 0 0 0 0 0 0 0 0 1 x 1.52msEntry Mode Set 0 0 0 0 0 0 0 1 I/D S 37usDisplay On/Off control 0 0 0 0 0 0 1 D C B 37usCursor or Display Shift 0 0 0 0 0 1 S/C R/L x x 37usFunction Set 0 0 0 0 1 DL N F x x 37usSet CG RAM Address 0 0 0 1 CG RAM Address 37usSet DD RAM Address 0 0 1 DD RAM Address 37usRead BF and Address 0 1 BF Address Counter 0usWrite Data to CG/DD RAM 1 0 Data 37usRead Data to CG/DD RAM 1 1 Data 37us

Page 297: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제11장 CLCD 제어 287

표 11.3 인스트럭션 셋에서의 비트 기능

비트명 설 명0 1

I/D Decrement cursor position Increment cursor positionS No display shift Display shiftD Display OFF Display ONC Cursor OFF Cursor ONB Cursor blink OFF Cursor blink ON

S/C Move cursor Shift displayR/L Shift left Shift rightDL 4-bit interface 8-bit interfaceN 1 line 2 linesF 5x7 dots 5x10 dots

BF can accept instruction Internal operation in progressx don't care don't care

각 인스트럭션의 기능에 대하여 보다 구체적으로 살펴보면 다음과 같다.

Clear Display

모든 DD RAM 주소에 공백 코드인 20H를 기록함에 의해 전체 화면 데이터를

지우고, 주소 카운터에 00H를 넣음으로써 DD RAM 주소 00H로 설정한다. 커서

를 원점으로, 즉 표시창의 좌상단으로 위치시킨다. 이 명령의 실행은 엔트리 모

드를 증가모드(I/D=1)로 설정한다. 이 명령이 실행 완료되는데 소요되는 시간은

최소 1.52ms이다.

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB00 0 0 0 0 0 0 0 0 1

Return Home

DD RAM의 AC를 0으로 설정하고, 만일 디스플레이 쉬프트되었다면 본래의 위

치로 변경한다. DD RAM의 내용은 변경하지 않고 커서를 Home 위치로 한다.

이 명령이 실행 완료되는데 소요되는 시간은 최소 1.52ms이다.

Page 298: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

288 MCS-51 마이크로컴퓨터

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB00 0 0 0 0 0 0 0 1 x

Entry Mode Set

커서와 디스플레이의 이동 방향을 설정한다. 데이터를 read하거나 write할 경우

에 커서의 위치를 증가(I/D=1)시킬 것인가 감소(I/D=0)시킬 것인가를 결정하며,

또한 화면을 쉬프트할 것인지(S=1) 아닌지(S=0)를 결정한다. 이 명령이 실행 완

료되는데 소요되는 시간은 최소 37us이다.

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB00 0 0 0 0 0 0 1 I/D S

Display On/Off control

화면 표시를 On/Off 하거나(D), 커서를 On/Off 하거나(C), 커서를 깜빡이게 할

것인가(B) 여부를 지정한다. 이 명령이 실행 완료되는데 소요되는 시간은 최소

37us이다.

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB00 0 0 0 0 0 1 D C B

Cursor or Display Shift

화면(S/C=1) 또는 커서(S/C=0)를 오른쪽(R/L=1) 또는 왼쪽(R/L=0)으로 쉬프트한

다. 이 명령이 실행 완료되는데 소요되는 시간은 최소 37us이다.

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB00 0 0 0 0 1 S/C R/L x x

Function Set

인터페이스에서 데이터의 길이를 8비트 모드(DL=1) 또는 4비트 모드(DL=0), 화

면 표시 행수를 2행(N=1) 또는 1행(N=0), 문자 폰트를 5x10 dot(F=1) 또는 5x7

dot(F=0)으로 지정한다. 참고로 2행 디스플레이는 5x10 dot를 지원하지 않는다.

또한 이 명령은 Busy 플래그 관련 명령을 제외한 다른 명령보다 우선 실행되어

야 한다. 이 명령이 실행 완료되는데 소요되는 시간은 최소 37us이다.

Page 299: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제11장 CLCD 제어 289

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB00 0 0 0 1 DL N F x x

Set CG RAM Address

CG RAM의 주소를 AC에 설정한다. 이후에 데이터는 CG RAM과 기록/판독하게

된다. 이 명령이 실행 완료되는데 소요되는 시간은 최소 37us이다.

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB00 0 0 1 CG address

Set DD RAM Address

DD RAM의 주소를 AC에 설정한다. 이후에 데이터는 DD RAM과 기록/판독하

게 된다. 1행 디스플레이의 경우 주소는 00H-4FH이나, 2행 디스플레이의 경우 1

행은 00H-27H이고, 2행은 40H-67H까지의 주소를 가진다. 이 명령이 실행 완료

되는데 소요되는 시간은 최소 37us이다.

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB00 0 1 DD address

Read Busy Flag and Address

LCD 모듈이 내부 동작 중임을 나타내는 BF 비트 및 주소 카운터 내용을 판독

한다. BF=1이면, 내부 동작 진행 중으로 그 다음 명령을 받을 수 없다. 반면

BF=0이면 다음 명령을 받을 수 있다. BF 상태는 매 기록 동작에 앞서 검사되어

야 한다. 동시에 주소의 값도 읽혀진다. 주소 계수기는 CG 및 DD RAM 모두에

의해 이용되며, 그것의 값은 이전 인스트럭션에 의해 결정된다.

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB00 1 BF Adress counter

Write Data to CG or DD RAM

DD RAM 혹은 CG RAM에 8비트 데이터를 기록한다. DD RAM 혹은 CG

RAM의 선택은 이전 주소 설정 인스트럭션에 따라 결정되며, 데이터를 기록한

후에 주소는 엔트리모드 설정에 따라 +1 혹은 -1된다. 이 명령이 실행 완료되는

Page 300: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

290 MCS-51 마이크로컴퓨터

데 소요되는 시간은 최소 37us이다.

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB01 0 data

Read Data from CG or DD RAM

DD RAM 혹은 CG RAM으로부터 8비트 데이터를 읽는다. 이전의 주소 설정 인

스트럭션은 CG 혹은 DD RAM의 어느 것이 읽혀질지를 결정한다. 읽기에 앞서

필히 DD RAM 혹은 CG RAM 주소 설정 인스트럭션을 수행하여야 한다. 판독

후 주소는 엔트리 모드에 따라 자동으로 +1 혹은 -1된다. 이 명령이 실행 완료되

는데 소요되는 시간은 최소 37us이다.

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB01 1 data

11.2.2 사용자 패턴 정의 및 표시

사용자 패턴을 정의하여 CG RAM에 기록하고, 이를 표시하는 것에 대해서 살펴

본다.

사용자 문자 패턴 정의

5x7 문자 패턴을 CG RAM에 프로그램하고 이를 표시하려면 다음의 절차를 따

라야 한다. 문자 코드 00H로 접근하기 위한 [그림 11.9]와 같은 사용자 패턴을

정의한다고 가정한다.

Page 301: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제11장 CLCD 제어 291

P7 P6 P5 P4 P3 P2 P1 P0 Hexax x x 1 1 1 1 0 1EHx x x 1 0 0 1 0 12Hx x x 1 1 1 1 0 1EHx x x 0 0 0 0 0 00Hx x x 0 0 1 0 0 04Hx x x 0 0 1 1 1 07Hx x x 0 0 1 0 0 04Hx x x 0 0 1 0 0 04H

그림 11.9 사용자 문자 패턴 정의 예

▪ CG RAM 포인터를 문자코드 00H의 첫 번째 라인(주소 00H)을 지정하기

위해 CG RAM 주소가 40H인 Set CG RAM address 명령을 사용한다.

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB00 0 0 1 0 0 0 0 0 0

▪ 정의된 문자의 첫 줄을 기록하기 위해 Write Data to CG or DD RAM 명

령을 사용한다.(문자 패턴 데이터의 하위 5비트만이 의미를 가진다). Entry

Mode Set 명령에서 I/D 비트가 1로 설정되었다면 CG RAM 주소는 자동

적으로 증가된다. 이 같은 경우 정의된 문자의 모든 라인이 기록될 때까지

패턴을 변경하면서 현 단계를 반복한다.

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB01 0 1EH

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB01 0 12H

사용자 문자 패턴의 표시

앞에서 정의한 사용자 패턴을 CLCD에 표시하는 절차를 살펴본다. 이를 위해서

는 다음의 절차를 따라 표시할 수 있다. 단, 정의된 패턴을 2행의 첫 번째에 표

Page 302: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

292 MCS-51 마이크로컴퓨터

시한다고 가정한다.

▪ DD RAM 위치에 대한 주소 계수기(AC)를 반환하도록 'Set DD RAM

address' 명령을 사용한다. 2행의 첫 위치 주소는 40H이다. 따라서 다음과

같은 명령을 사용한다.

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB00 0 1 1 0 0 0 0 0 0

▪ 위에서 정의한 문자를 표시하려면 DD RAM 주소에 있는 문자를 표시하기

위해 00H라는 데이터를 갖는 'Write Data to CG or DD RAM' 명령을 사

용한다.

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB01 0 00H

11.2.3 실습 보드에서의 CLCD 제어

KUT51 실습 보드에서 CLCD 제어를 위한 회로도는 [그림 11.10]과 같다.

그림 11.10 CLCD 제어 회로 연결도

Page 303: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제11장 CLCD 제어 293

KUT51 실습 보드에서 CLCD 모듈을 제어하기 위한 메모리 맵은 [표 11.4]와 같

으며, 이러한 주소를 디코딩하여 CLCD를 제어할 수 있다. 이후의 프로그램 코드

들은 주소 디코딩을 통하여 구현한 것이다.

표 11.4 실습 보드에서 CLCD 모듈의 메모리 맵

E A1 A0 주소 기 능R/W RS1 0 0 0F800H LCD_COMMAND_WR1 0 1 0F801H LCD_DATA_WR1 1 0 0F802H LCD_COMMAND_RD1 1 1 0F803H LCD_DATA_RD

11.3 CLCD의 초기화

CLCD 컨트롤러는 4비트 혹은 8비트 모드로 동작될 수 있다. 4비트 모드로 동작

중일 때, 데이터는 데이터 비트 DB4-DB7을 이용하여 2번의 4비트 동작들로 전

달되며, DB0-DB3은 사용되지 않는다. 4비트 모드를 사용할 때 데이터는 인스트

럭션 사이클이 완료되기 전에 두 차례 전달된다. 상위의 4비트가 우선 전달되고,

하위 4비트가 후속하여 전달된다. 하나의 인스트럭션이 4비트 데이터로 2차례 전

달된 후 BF 비트를 검사한다. 2차례의 4비트 동작은 그때 BF 비트와 주소 카운

터 데이터를 전달할 것이다. 8비트 모드로 동작할 때, 데이터는 DB0-DB7의 전

체 비트를 이용하여 전달된다.

11.3.1 내부 리셋 회로에 의한 초기화

전원이 ON되었을 때 CLCD는 내부의 리셋 회로를 이용하여 다음 순서의 명령들

로 초기화된다. Busy 플래그는 초기화가 종료될 때까지 Busy 상태를 유지한다.

Busy 플래그는 Vcc가 4.5V에 이른 후, 10msec에서 활성화된다.

Page 304: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

294 MCS-51 마이크로컴퓨터

▪Display ClearRS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB00 0 0 0 0 0 0 0 0 1

▪Function SetRS R/W DB7 DB6 DB5 DL N F DB1 DB00 0 0 0 1 1 0 0 x x

DL=1, N=0, F=0(8비트모드, 1라인, 5x7 dots)▪Display ON/OFF Control

RS R/W DB7 DB6 DB5 DB4 DB3 D C B0 0 0 0 0 0 1 0 0 0

D=0, C=0, B=0(Display OFF, Cursor OFF, Blink OFF)▪Entry Mode Set

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 I/D S0 0 0 0 0 0 0 1 1 0

I/D=1, S=0(increment, no shift)

만일 내부 전원 공급 리셋 타이밍이 부적합하다면 내부 리셋 회로는 정상적으로

동작되지 않고, 따라서 초기화도 되지 않을 것이다. 이러한 경우 CLCD는 다음

절과 같이 소프트웨어적으로 초기화하여야 한다.

11.3.2 소프트웨어적 초기화

소프트웨어적으로 초기화하는 방법은 데이터 인터페이스에 따라 8비트 모드와 4

비트 모드가 있다. 이는 데이터 버스에 실리는 명령 혹은 데이터의 길이가 8비트

냐 4비트냐에 따라 구분된다.

8비트 모드의 초기화

8비트 모드의 소프트웨어적인 초기화는 다음의 순서로 이루어진다.

▪Power ON▪Vdd가 4.5V된 후 15mSec이상 대기

Page 305: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제11장 CLCD 제어 295

▪Function SetRS R/W DB7 DB6 DB5 DL N F DB1 DB00 0 0 0 1 1 1 0 x x

▪37uSec이상 대기▪Display ON/OFF Control

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB00 0 0 0 0 0 1 D C B

▪37uSec이상 대기

▪Display ClearRS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB00 0 0 0 0 0 0 0 0 1

▪1.52mSec이상 대기

▪Entry Mode SetRS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB00 0 0 0 0 0 0 1 I/D S

8비트 모드의 초기화 과정을 서브루틴으로 구성하면 다음의 코드와 같다. 이 루

틴에서 호출되는 LCD_COMMAND_WRITE_8 서브루틴은 ACC에 설정된 명령

을 8비트 단위로 데이터 버스에 전달하고, 40uSec의 시간지연을 행하도록 구성된

다.

; INITIALIZE CLCD, 8bit modeLCD_INIT_8:

MOV A,#150 CALL DELAY100US

MOV A,#38H ; SET 8-BIT, 2-LINE, 5X8 FONTCALL LCD_COMMAND_WRITE_8

MOV A,#0EH ; DISPLAY ON, CURSOR ON, BLINK OFF CALL LCD_COMMAND_WRITE_8

MOV A,#01H ; CLEAR DISPLAY, HOME CURSOR

Page 306: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

296 MCS-51 마이크로컴퓨터

CALL LCD_COMMAND_WRITE_8MOV A,#16 ; REQUIRE 1.53MS

CALL DELAY100US MOV A,#06H ; CURSOR INC.(MOVERIGHT), NO SHIFT CALL LCD_COMMAND_WRITE_8

RET

; SEND COMMAND TO LCD; INPUT : A = OUTPUT COMMANDLCD_COMMAND_WRITE_8: PUSH DPL PUSH DPH MOV DPTR,#LCD_COMMAND_WR MOVX @DPTR,A CALL DELAY40US POP DPH POP DPL

RET

4비트 모드의 초기화

4비트 모드의 경우 데이터 버스의 하위 4비트 신호는 영향을 주지 않는다. 따라

서 모든 명령 및 데이터는 상위 4비트를 통하여 이루어져야 한다. 4비트 모드의

소프트웨어적인 초기화 절차는 다음의 순서와 같다.

▪Power ON▪Vdd가 4.5V된 후 15mSec이상 대기

▪Function SetRS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB00 0 0 0 1 0 x x x x0 0 0 0 1 0 x x x x0 0 1 0 x x x x x x

Page 307: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제11장 CLCD 제어 297

▪37uSec이상 대기▪Display ON/OFF Control

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB00 0 0 0 0 0 x x x x0 0 1 D C B x x x x

▪37uSec이상 대기

▪Display ClearRS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB00 0 0 0 0 0 x x x x0 0 0 0 0 1 x x x x

▪1.52mSec이상 대기

▪Entry Mode SetRS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB00 0 0 0 0 0 x x x x0 0 0 1 I/D S x x x x

상기의 4비트 모드의 초기화 과정을 서브루틴으로 구성하면 다음의 코드와 같다.

이 루틴에서 호출되는 LCD_COMMAND_WRITE_4 서브루틴은 ACC에 설정된

명령을 4비트 단위로 상위 니블부터 데이터 버스에 전달한 후, 하위 니블을 전달

하며, 40uSec의 시간지연을 행하도록 구성된다.

; INITIALIZE CLCD, 4bit modeLCD_INIT_4:

MOV A,#150 CALL DELAY100US

MOV A,#00100000B ; *Function Set #0010 xxxx CALL LCD_COMMAND_WRITE_4 ; SET 4-BIT ModeMOV A,#00101000B ; Function Set #0010 10xx CALL LCD_COMMAND_WRITE_4 ; 4-BIT, 2-LINE, 5X8 fo.

MOV A,#00001100B ; Display ON/OFF #0000 1DCB CALL LCD_COMMAND_WRITE_4

Page 308: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

298 MCS-51 마이크로컴퓨터

MOV A,#00000001B ; Display Clear CALL LCD_COMMAND_WRITE_4

MOV A,#16 ; REQUIRE 1.53MS CALL DELAY100US MOV A,#00000110B ; Entry mode, #0000 0 1 I/D S CALL LCD_COMMAND_WRITE_4

RET

; SEND COMMAND TO LCD; INPUT : A = OUTPUT COMMANDLCD_COMMAND_WRITE_4: PUSH DPL PUSH DPH MOV DPTR,#LCD_COMMAND_WR MOVX @DPTR,A ; higher nibble

SWAP A ; MOVX @DPTR, A ; lower nibble CALL DELAY40US POP DPH POP DPL

RET

11.4 예제 프로그램

11.4.1 문자열 출력 I(8비트 모드, Delay RTN)

두 줄의 문자열을 CLCD의 각 라인에 표시하는 프로그램을 작성한다. 단, 8비트

모드로 제어하고, 각 인스트럭션의 수행에 요구되는 지연을 시간지연 루틴으로

구성하는 방식으로 구현한다.

Page 309: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제11장 CLCD 제어 299

;========================================

; CLCD_01.ASM

; 8bit Mode & Delay

;========================================

$MOD51

; PORT DEFINITION

LCD_COMMAND_WR EQU 0F800H

LCD_DATA_WR EQU 0F801H

LCD_COMMAND_RD EQU 0F802H

LCD_DATA_RD EQU 0F803H

STACK EQU 40H

ORG 8000H

START: MOV SP,#STACK

CALL LCD_INIT_8

MOV A,#01H ; CLEAR DISPLAY, HOME CURSOR

CALL LCD_COMMAND_WRITE_8

MOV A,#16 ; REQUIRE 1.53MS

CALL DELAY100US

MOV DPTR,#MSG1 ; DISPLAY 1ST LINE

CALL LCD_PRINT

MOV A,#0C0H ; CURSOR TO SECOND LINE HOME

CALL LCD_COMMAND_WRITE_8

MOV DPTR,#MSG2 ; DISPLAY 2ND LINE

CALL LCD_PRINT

JMP $

MSG1: DB ' KUT51-LCD-8/D ',00H

MSG2: DB 'WELLCOME TO KUT!',00H

; INITIALIZE TLCD, 8bit mode

LCD_INIT_8:

MOV A,#38H ; SET 8-BIT, 2-LINE, 5X8 FONT

CALL LCD_COMMAND_WRITE_8

MOV A,#0EH ; DISPLAY ON, CURSOR ON, BLINK OFF

Page 310: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

300 MCS-51 마이크로컴퓨터

CALL LCD_COMMAND_WRITE_8

MOV A,#01H ; CLEAR DISPLAY

CALL LCD_COMMAND_WRITE_8

MOV A,#16 ; REQUIRE 1.53MS(SPEC. SHEET)

CALL DELAY100US

MOV A,#06H ; CURSOR INCRE.(MOVES RIGHT), NO SHIFT

CALL LCD_COMMAND_WRITE_8

RET

; SEND DATA TO LCD

; INPUT : A = OUTPUT CHARACTER

LCD_DATA_WRITE_8:

PUSH DPL

PUSH DPH

MOV DPTR,#LCD_DATA_WR

MOVX @DPTR,A

CALL DELAY40US

POP DPH

POP DPL

RET

; SEND COMMAND TO LCD

; INPUT : A = OUTPUT COMMAND

LCD_COMMAND_WRITE_8:

PUSH DPL

PUSH DPH

MOV DPTR,#LCD_COMMAND_WR

MOVX @DPTR,A

CALL DELAY40US

POP DPH

POP DPL

RET

; SEND A STRING TO LCD

Page 311: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제11장 CLCD 제어 301

; INPUT: DPTR = STRING ADDRESS

LCD_PRINT:

MOV A,#0 ; MOVC INDEX = 0

MOVC A,@A+DPTR ; READ CHAR.

JZ LCD_PRINT01 ; STRING END '00'

CALL LCD_DATA_WRITE_8

INC DPTR

SJMP LCD_PRINT ; REPEAT LOOP

LCD_PRINT01:

RET

; 40 MICROSECOND DELAY

; 11.0592MHZ = 1 MACHINE CYCLE = 1.085 US

; 2(CALL) + 35 = 37 (40.145 US)

DELAY40US:

PUSH 1 ; (2) SAVE REGISTER R1

MOV R1,#13 ; (1) 20 DJNZ INSTR = 40US

LL4: DJNZ R1, LL4 ; (2 X 14) = 28

POP 1 ; (2) RESTORE REGISTER R1

RET ; (2)

; ACC*100US DELAY

; INPUT: ACC = ? (100 US APPROX.)

; 2(CALL) + 100 = 102 (110 US)

DELAY100US:

PUSH 1 ; (1) SAVE REGISTER R1

DELAY100US01:

MOV R1,#46 ; (1) 46X2 DJNZX1.085=99.82us

LL1: DJNZ R1,LL1 ; (2 X 46) = 92

DJNZ ACC,DELAY100US01 ; (2)

POP 1 ; (2)

RET ; (2)

END

Page 312: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

302 MCS-51 마이크로컴퓨터

11.4.2 문자열 출력 II(8비트 모드, BF 검사)

두 줄의 문자열을 CLCD의 각 라인에 표시하는 프로그램을 작성한다. 단, 8비트

모드로 제어하고, 다음 인스트럭션의 수행을 위해 Busy Flag 비트를 검사하는

방식으로 구현한다.

;========================================

; CLCD_02.ASM

; 8bit Mode & BF check

;========================================

$MOD51

; PORT DEFINITION

LCD_COMMAND_WR EQU 0F800H

LCD_DATA_WR EQU 0F801H

LCD_COMMAND_RD EQU 0F802H

LCD_DATA_RD EQU 0F803H

STACK EQU 40H

ORG 8000H

START: MOV SP,#STACK

CALL LCD_INIT_8

MOV A,#01H ; CLEAR DISPLAY, HOME CURSOR

CALL LCD_COMMAND_WRITE_8

MOV DPTR,#MSG1 ; DISPLAY 1ST LINE

CALL LCD_PRINT

MOV A,#0C0H ; CURSOR TO SECOND LINE HOME

CALL LCD_COMMAND_WRITE_8

MOV DPTR,#MSG2 ; DISPLAY 2ND LINE

CALL LCD_PRINT

JMP $

MSG1: DB ' KUT51-LCD-8/BF ',00H

MSG2: DB 'WELLCOME TO KUT!',00H

Page 313: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제11장 CLCD 제어 303

; INITIALIZE CLCD, 8bit mode

LCD_INIT_8:

MOV A,#38H ; SET 8-BIT, 2-LINE, 5X8 FONT

CALL LCD_COMMAND_WRITE_8

MOV A,#0EH ; DISPLAY ON, CURSOR ON, BLINK OFF

CALL LCD_COMMAND_WRITE_8

MOV A,#01H ; CLEAR DISPLAY, HOME CURSOR

CALL LCD_COMMAND_WRITE_8

MOV A,#06H ; CURSOR INCRE.(MOVES RIGHT), NO SHIFT

CALL LCD_COMMAND_WRITE_8

RET

; SEND DATA TO LCD

; INPUT : A = OUTPUT CHARACTER

LCD_DATA_WRITE_8:

PUSH DPL

PUSH DPH

CALL LCD_READY ; BF Check

MOV DPTR,#LCD_DATA_WR

MOVX @DPTR,A

POP DPH

POP DPL

RET

; SEND COMMAND TO LCD

; INPUT : A = OUTPUT COMMAND

LCD_COMMAND_WRITE_8:

PUSH DPL

PUSH DPH

CALL LCD_READY ; BF Check

MOV DPTR,#LCD_COMMAND_WR

MOVX @DPTR, A

POP DPH

Page 314: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

304 MCS-51 마이크로컴퓨터

POP DPL

RET

; WAIT UNTIL LCD READY BIT SET

LCD_READY:

PUSH ACC

MOV DPTR,#LCD_COMMAND_RD

LCD_READY0:

MOVX A,@DPTR

JB ACC.7,LCD_READY0 ; LOOP IF BF=1

POP ACC

RET

; SEND A STRING TO LCD

; INPUT: DPTR = STRING ADDRESS

LCD_PRINT:

MOV A,#0 ; MOVC INDEX = 0

MOVC A,@A+DPTR ; READ CHAR.

JZ LCD_PRINT01 ; STRING END '00'

CALL LCD_DATA_WRITE_8

INC DPTR

SJMP LCD_PRINT ; REPEAT LOOP

LCD_PRINT01:

RET

END

11.4.3 문자열 출력 III(4비트 모드)

두 줄의 문자열을 CLCD의 각 라인에 표시하는 프로그램을 작성한다. 단, 4비트

모드로 제어하는 방식으로 구현한다.

;========================================

; CLCD_03.ASM

; 4bit Mode & Delay

;========================================

Page 315: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제11장 CLCD 제어 305

$MOD51

; PORT DEFINITION

LCD_COMMAND_WR EQU 0F800H

LCD_DATA_WR EQU 0F801H

LCD_COMMAND_RD EQU 0F802H

LCD_DATA_RD EQU 0F803H

STACK EQU 40H

ORG 8000H

START: MOV SP,#STACK

CALL LCD_INIT_4

MOV A,#00000001B ; Display Clear : #0000 0001

CALL LCD_COMMAND_WRITE_4

MOV A,#16 ; REQUIRE 1.52MS

CALL DELAY100US

MOV DPTR,#MSG1 ; DISPLAY 1ST LINE

CALL LCD_PRINT

MOV A,#0C0H ; #0C0H, CURSOR TO 2nd LINE

CALL LCD_COMMAND_WRITE_4

MOV DPTR,#MSG2 ; DISPLAY 2ND LINE

CALL LCD_PRINT

JMP $

MSG1: DB ' KUT51-LCD-4/D ',00H

MSG2: DB 'WELLCOME TO KUT!',00H

; INITIALIZE LCD, 4bit mode

LCD_INIT_4:

MOV A,#00100000B ; *Function Set #0010 xxxx

CALL LCD_COMMAND_WRITE_4 ; SET 4-BIT

MOV A,#00101000B ; Function Set #0010 10xx

CALL LCD_COMMAND_WRITE_4 ; SET 4-BIT, 2-LINE, 5X8 FONT

MOV A,#00001100B ; Display ON/OFF #0000 1DCB

CALL LCD_COMMAND_WRITE_4

Page 316: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

306 MCS-51 마이크로컴퓨터

MOV A,#00000001B ; Display Clear #0000 0001

CALL LCD_COMMAND_WRITE_4

MOV A,#16

CALL DELAY100US

MOV A,#00000110B ; Entry mode #0000 0 1 I/D S

CALL LCD_COMMAND_WRITE_4

RET

; SEND COMMAND TO LCD

; INPUT : A = OUTPUT COMMAND

LCD_COMMAND_WRITE_4:

PUSH DPL

PUSH DPH

MOV DPTR,#LCD_COMMAND_WR

MOVX @DPTR,A ; higher nibble

SWAP A ;

MOVX @DPTR, A ; lower nibble

CALL DELAY40US

POP DPH

POP DPL

RET

; SEND DATA TO LCD

; INPUT : A = OUTPUT CHARACTER

LCD_DATA_WRITE_4:

PUSH DPL

PUSH DPH

MOV DPTR,#LCD_DATA_WR

MOVX @DPTR,A ; higher nibble

SWAP A ;

MOVX @DPTR, A ; lower nibble

CALL DELAY40US

POP DPH

POP DPL

RET

Page 317: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제11장 CLCD 제어 307

; SEND A STRING TO LCD

; INPUT: DPTR = STRING ADDRESS

LCD_PRINT:

MOV A,#0 ; MOVC INDEX = 0

MOVC A,@A+DPTR ; READ CHAR.

JZ LCD_PRINT01 ; STRING END '00'

CALL LCD_DATA_WRITE_4

INC DPTR

SJMP LCD_PRINT ; REPEAT LOOP

LCD_PRINT01:

RET

; 40 MICROSECOND DELAY

; 11.0592MHZ = 1 MACHINE CYCLE = 1.085 US

; 2(CALL) + 35 = 37 (40.145 US)

DELAY40US:

PUSH 1

MOV R1,#13

LL4: DJNZ R1,LL4

POP 1

RET

; ACC*100US DELAY

; INPUT: ACC = ? (100 US APPROX.)

; 2(CALL) + 100 = 102 (110 US)

DELAY100US:

PUSH 1

DELAY100US01:

MOV R1,#46

LL1: DJNZ R1,LL1

DJNZ ACC,DELAY100US01

POP 1

RET

END

Page 318: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

308 MCS-51 마이크로컴퓨터

11.4.4 사용자 문자 패턴의 출력

사용자가 CLCD에 보일 문자 패턴을 정의하여 CG RAM에 기록하고 이 정의된

문자를 CLCD에 출력하는 프로그램을 작성한다. 다음 프로그램은 '마이크로프로

세서'라는 문자열에 대한 사용자 패턴을 정의하여 등록한 후, CLCD에 표시하는

프로그램이다.

;===========================================

; CLCD_04.ASM

; 8bit Mode & BF Check & User Pattern

;===========================================

$MOD51

; PORT DEFINITION

LCD_COMMAND_WR EQU 0F800H

LCD_DATA_WR EQU 0F801H

LCD_COMMAND_RD EQU 0F802H

LCD_DATA_RD EQU 0F803H

STACK EQU 40H

ORG 8000H

START: MOV SP,#STACK

CALL LCD_INIT_8

CALL REG_PATTERN

MOV A, #01H ; #01H, CLEAR DISPLAY, HOME CURSOR

CALL LCD_COMMAND_WRITE_8

MOV DPTR, #MSG1 ; DISPLAY 1ST LINE

CALL LCD_PRINT

MOV A, #0C4H ; #0C4H, CURSOR TO 2ND LINE

CALL LCD_COMMAND_WRITE_8

CALL PRT_PATTERN ; DISPLAY USER PATTERN

JMP $

Page 319: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제11장 CLCD 제어 309

MSG1: DB ' USER PATTERN ',00H

PAT0: DB 1EH, 12H, 1EH, 00H, 04H, 07H, 04H, 04H ; 마

PAT1: DB 09H, 15H, 09H, 01H, 01H, 01H, 01H, 01H ; 이

PAT2: DB 1FH, 01H, 07H, 01H, 00H, 1FH, 00H, 00H ; 크

PAT3: DB 1FH, 01H, 1FH, 10H, 1FH, 00H, 04H, 1FH ; 로

PAT4: DB 1FH, 0AH, 0AH, 1FH, 00H, 1FH, 00H, 00H ; 프

PAT5: DB 1FH, 01H, 1FH, 10H, 1FH, 00H, 04H, 1FH ; 로

PAT6: DB 04H, 0AH, 11H, 00H, 05H, 1DH, 05H, 05H ; 세

PAT7: DB 04H, 0AH, 11H, 00H, 01H, 1FH, 01H, 01H ; 서

; INITIALIZE TLCD

LCD_INIT_8:

MOV A,#38H ; SET 8-BIT, 2-LINE, 5X8 FONT

CALL LCD_COMMAND_WRITE_8

MOV A,#0CH ; DISPLAY ON, CURSOR OFF, BLINK OFF

CALL LCD_COMMAND_WRITE_8

MOV A,#06H ; CURSOR INCRE.(MOVES RIGHT), NO SHIFT

CALL LCD_COMMAND_WRITE_8

RET

; Save CGRAM defined Pattern

REG_PATTERN:

MOV DPTR,#PAT0

MOV R5,#64

MOV R6,#40H ; CG RAM address

MOV R7,#0 ; R7 <- OFFSET

LP_R: MOV A,R6

ADD A,R7 ; A <- R6 + R7

CALL LCD_COMMAND_WRITE_8

INC R7 ; OFFSET +1

;

CLR A

MOVC A,@A+DPTR

CALL LCD_DATA_WRITE_8

INC DPTR

DJNZ R5,LP_R

RET

Page 320: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

310 MCS-51 마이크로컴퓨터

; Display Pattern "마이크로프로세서"

PRT_PATTERN:

MOV R2,#08H

MOV A, #00H ; CG RAM address

LP_P: CALL LCD_DATA_WRITE_8

INC A

DJNZ R2, LP_P

RET

; WAIT UNTIL LCD READY BIT SET

LCD_READY:

PUSH ACC

MOV DPTR,#LCD_COMMAND_RD

LCD_READY0:

MOVX A,@DPTR

JB ACC.7,LCD_READY0 ; LOOP IF BF=1

POP ACC

RET

; SEND DATA TO LCD

; INPUT : A = OUTPUT CHARACTER

LCD_DATA_WRITE_8:

PUSH DPL

PUSH DPH

CALL LCD_READY

MOV DPTR,#LCD_DATA_WR

MOVX @DPTR,A

POP DPH

POP DPL

RET

; SEND COMMAND TO LCD

; INPUT : A = OUTPUT COMMAND

LCD_COMMAND_WRITE_8:

PUSH DPL

PUSH DPH

CALL LCD_READY

MOV DPTR,#LCD_COMMAND_WR

Page 321: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제11장 CLCD 제어 311

MOVX @DPTR, A

POP DPH

POP DPL

RET

; SEND A STRING TO LCD

; INPUT: DPTR = STRING ADDRESS

LCD_PRINT:

MOV A,#0 ; MOVC INDEX = 0

MOVC A,@A+DPTR ; READ CHAR.

JZ LCD_PRINT01 ; STRING END '00'

CALL LCD_DATA_WRITE_8

INC DPTR

SJMP LCD_PRINT ; REPEAT LOOP

LCD_PRINT01:

RET

END

Page 322: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

312 MCS-51 마이크로컴퓨터

11.5 실습과제

[실습1] CLCD 제어 I

앞의 11.4.4절에서 제시된 예제 프로그램에서 문자열을 좌로, 우로 반복 이동하도

록 하는 기능을 추가하여 재 구현하고, 그 결과를 관찰한다.

[실습2] CLCD 제어 II

앞의 11.4.3절에서 제시된 4비트 모드 제어의 예제 프로그램을 시간지연 루틴 대

신 비지플래그 비트를 검사하는 방식으로 재구현하여 그 결과를 관찰한다.

[실습3] 사용자 패턴 등록 및 표시 I

앞의 11.4.4절에서 제시된 예제 프로그램에서 각 패턴의 정의 위치를 랜덤하게

하여 등록하고, 이를 맞는 순서에 맞게 표시하는 프로그램을 작성한다. 예를 들

어 ‘로세크마로이프서’순으로 등록한 후, ‘마이크로프로세서’로 표시되도록 구현한

다. 단, 4비트 제어 모드로 구현한다.

[실습4] 사용자 패턴 등록 및 표시 II

각자 자신의 이름에 대한 사용자 패턴을 설계하고, 이를 표시하는 프로그램을 작

성한다. 단, 제반 필요한 사항은 각자 정의한다.

[실습5] 시리얼 수신 문자열 표시

시리얼 통신을 통해 상대측에서 수신한 문자를 CLCD에 표시하는 프로그램을 작

성한다. 단, 제반 필요한 사항은 각자 정의한다.

Page 323: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제12장 C51 컴파일러 313

제12장 C51 컴파일러

Keil C 컴파일러는 표준 ANSI C에 MCS-51 하드웨어를 제어하기 위해 메모리

모델, 특수 기능 레지스터의 접근, 인터럽트와 외부 메모리 확장을 위한 포인터

부분을 보강한 컴파일러다. 따라서 C51 프로그램을 작성하려면, MCS-51 MCU

를 제어하기 위해 확장된 사항들을 숙지해야 한다.

본 장에서는 표준 ANSI C의 문법에 익숙하다고 가정하고, MCS-51 MCU를 제

어하기 위해 Keil C51 컴파일러에서 확장된 부분을 중심으로 설명한다.

12.1 C51 개요

C 프로그래밍 언어는 코드 효용성, 구조화된 프로그래밍, 그리고 풍부한 연산자

를 제공하는 다목적의 프로그래밍 언어이다. C 언어를 사용하면 다양한 응용 프

로그램을 손쉽고 효과적으로 개발할 수 있다.

MCS-51 응용 프로그램을 개발하는데 사용되는 C51 컴파일러는 어셈블리 언어

로 개발된 동일 기능의 프로그램과 대등한 실행 속도, 코드 효용성 및 유연성을

소프트웨어 개발자에게 제공한다. C 언어를 사용하면 어셈블리 프로그래밍에 비

해 다음과 같은 장점들이 있다.

▪ 레지스터 할당과 주소 지정 방식이 컴파일러에 의해 처리된다.

▪ 어셈블리 프로그래밍에 비해서 프로그램 개발 시간과 디버깅 시간이 획기

적 개선된다.

▪ 서식 지정 입출력, 데이터 변환, 부동소수점 연산 등과 같은 다양한 표준

함수를 정의하는 라이브러리 파일을 응용 프로그램에서 사용할 수 있다.

표준 C 언어의 문법 외에 MCS-51 C 컴파일러에서 확장된 기능은 다음과 같다.

다음 절들에서 이들에 대하여 자세하게 살펴본다.

Page 324: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

314 MCS-51 마이크로컴퓨터

▪ 데이터 형

▪ 메모리 형 및 메모리 모델

▪ 일반 포인터 및 메모리 지정 포인터

▪ 인터럽트 함수 및 재진입 함수

▪ 어셈블리 소스 파일과의 혼용

12.2 데이터 형

C51 컴파일러에서는 표준 C 컴파일러에서 지원하는 데이터 유형 이외에

MCS-51 MCU 환경에 맞는 추가적인 데이터 형 bit, sfr, sfr16, sbit를 정의하고

있다. [표 12.1]은 C51 컴파일러에서 제공되는 데이터 유형을 정리한 것이다.

표 12.1 데이터 유형

데이터유형 길이(bit) 값 영역 및 주소 범위(signed) char 8 -128 ~ 127unsigned char 8 0 ~ 256(signed) short 16 -32678 ~ +32677unsigned short 16 0 ~ 65535(signed) int 16 -32678 ~ +32677unsigned int 16 0 ~ 65535

long 32 -214783648 ~ +214783647unsigned long 32 0 ~ 4294967295

float 32 ±1.175494E-38~±3.402823E+38double 32 ±1.175494E-38~±3.402823E+38

long double 32 ±1.175494E-38~±3.402823E+38bit 1 0, 1 비트주소영역,00H~7FHsfr 8 0 ~ 256 SFR영역,80H~FFH

sfr16 16 0 ~ 65535 SFR영역일부sbit 1 0, 1 SFR비트주소영역,80H~FFH

아래에서 C51 컴파일러에 추가된 데이터 유형에 대해 보다 구체적으로 설명한

Page 325: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제12장 C51 컴파일러 315

다. bit 데이터 형은 내부 데이터 메모리의 비트 주소 가능 영역을, sbit, sfr,

sfr16 데이터 형은 특수 기능 레지스터 영역을 접근하는데 사용한다.

12.2.1 bit 형

비트 주소 지정이 가능한 내부 데이터 메모리의 20H ~ 2FH 주소 영역은 비트

주소 00H ~ 7FH로 지정 가능하다. 이들 영역을 대상으로 비트 단위 변수는 bit

형으로 선언하여야 한다. 즉, bit 형의 변수를 사용하는 경우, 비트 변수는 내부

데이터 메모리의 비트 주소 영역에 저장되며, 최대 128개 비트 변수를 선언하여

사용할 수 있다.

다음의 코드와 같이 bit 데이터 형의 변수를 선언 및 초기화하여 사용한다.

: unsigned char xdata * resPtr = 0x8100; // 결과 저장 위치 bit b1; // bit 형 선언, 비트 주소 영역에 위치 bit b2 = 1; // bit 형 선언 및 초기화 b1 = 0; // 값 설정 if(b1==0) *resPtr = 0x66;

:

특히, bit 형의 변수를 사용할 때 주의할 점은 다른 데이터 형의 변수와 달리 아

래에 보듯이 포인터나 배열로 선언할 수 없다는 것이다.

bit * ptr; // 잘못된 사용, error!bit arr[4]; // 잘못된 사용, error!

12.2.2 sfr 형

sfr 형은 주소 80H부터 FFH까지의 SFR 영역의 주소에 대해 1 바이트 길이의

변수를 선언하는 데이터 형이다. sfr 형과 sbit형을 정의한 'reg51.h' 헤더 파일을

Page 326: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

316 MCS-51 마이크로컴퓨터

포함하여 사용하는 경우 사용자는 선언할 필요 없다. 이 데이터 형을 선언할 때

는 반드시 전역적으로 선언되어야 하며, sbit 형도 마찬가지이다. 다음과 같이 sfr

데이터 형 변수는 해당 SFR의 절대 주소를 지정하여 선언한다. 또한 선언된 변

수의 활용 예도 보이고 있다.

sfr P1 = 0x90; // 90H의 SFR를 P1으로 선언P1 = 0xFF; // 포트 P1에 0xFF를 출력 ch = SBUF; // 수신 버퍼 SBUF로부터 판독

다음의 코드는 통상 sfr 형의 변수 P1으로 정의되는 절대 주소 0x90에 변수 명

을 달리하여 선언하여 사용한 사례이다.

:sfr LEDPORT = 0x90; // P1 SFR의 절대주소void main(void){ unsigned char pat = 0x0F; // 출력 패턴 while(1) { LEDPORT = pat; // P1 = pat;도 가능 delay(50000); pat = ~pat; }}

12.2.3 sbit 형

SFR 영역 내의 일부 SFR의 경우 비트 주소 지정이 가능하다. 이러한 SFR 상의

각 비트를 주소 지정할 때 사용하는 데이터 형이 sbit 형이다. 또 다른 용도로 데

이터 메모리내의 비트 주소 영역에 대해 특정 비트위치를 지칭해 접근할 때도

sbit 형으로 선언하면 된다. sbit 형의 선언은 반드시 전역적으로 선언되어야 함

을 유의한다.

sbit 형의 변수를 선언할 때, 비트 위치를 지정하는 방법은 다음과 같이 세가지

Page 327: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제12장 C51 컴파일러 317

가 있으며, PSW의 CY 비트 선언을 예로 보인다.

▪ SFR_name^bit_index sbit CY = PSW^7; // SFR 명과 비트 위치를 ^으로

▪ SFR_address^bit_indexsbit CY = 0xD0^7; // SFR의 절대주소와 비트 위치를 ^으로

▪ bit_addresssbit CY = 0xD7; // 비트 주소 가능한 SFR의 비트 주소로

다음은 sbit 데이터 형의 변수를 선언하고, 활용하는 사례를 보인다.

sbit ET1 = 0xA8; // IE.0을 ET1으로 선언sbit EA = 0xAF; // IE.7을 EA로 선언ET1 = 1;EA = 1;CY = 0;

sbit 형의 또 다른 용도는 내부 데이터 메모리내의 비트 주소 영역을 비트 단위

로 접근하는데 사용된다. 특히, 변수 내에서 원하는 비트를 지정할 수 있는 장점

이 있다. 이러한 비트 단위의 변수는 bdata 영역에 대해서만 적용되며, 접근시

비트 혹은 바이트 단위로 접근 가능하다.

비트 단위 변수 선언을 위해서는 우선 bdata 메모리 형 지정자를 통해 바이트

혹은 워드 단위의 변수를 선언하여야 한다. 아래 코드에서 보듯이, 두 변수

bitAddrInt, bitAddrArr는 비트 지정 가능한 변수가 되며, 추후 이들 변수에 대한

비트별 접근이 가능하다. 이렇게 bdata 메모리 형을 사용하여 선언된 변수 내의

특정 비트를 비트 단위로 접근하려면, sbit 형의 새로운 비트 형 변수를 선언하여

야 한다. 다음의 코드는 이러한 선언과 활용 사례를 보인다.

int bdata bitAddrInt; // bdata 영역에 int형(2바이트)char bdata bitAddrArr[4]; // bdata 영역에 char형(4바이트)

sbit bAInt0 = bitAddrInt^0; // bit 0 of bitAddrIntsbit bAInt12 = bitAddrInt^12; // bit 12 of bitAddrInt

Page 328: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

318 MCS-51 마이크로컴퓨터

sbit bAArr03 = bitAddrArr[0]^3; // bit 3 of bitAddrArr[0]sbit bAArr27 = bitAddrArr[2]^7; // bit 7 of bitAddrArr[2]

bAInt0 = 1; // bit 단위 접근bAArr27 = 0; // bit 단위 접근bitAddrArr[0] = 'J'; // byte 단위 접근

다음 예제를 통하여, sfr 형과 sbit 데이터 형의 선언 및 활용 방법을 보다 명확

히 이해할 수 있을 것이다. 앞서 언급하였지만 sfr 형과 sbit 형 변수는 전역적으

로 선언되어야 함을 유의한다.

//=================================// data type : sfr and sbit //=================================#include <reg51.h>// sfr 형 및 sbit 형 선언sfr PORT = 0x90; // 절대 주소 설정으로 선언sbit p0 = PORT^0;// 특정 비트 위치의 접근을 위한 sbit 선언unsigned char bdata bPat; // bdata 메모리 형으로 선언sbit bPat0 = bPat^0; // sbit 형 선언sbit bPat1 = bPat^1;sbit bPat2 = bPat^2;sbit bPat3 = bPat^3; void main(void){ unsigned char pat; bPat0 = 0; // 비트별 값 설정, 비트 단위 접근 bPat1 = 1; bPat2 = bPat0; bPat3 = bPat1; pat = bPat; // 바이트 단위 접근 while(1) { PORT = pat; // PORT 변수는 P1을 의미

Page 329: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제12장 C51 컴파일러 319

delay(50000); pat = ~pat; }}

12.2.4 형 선언 헤더파일

C51 컴파일러에서는 SFR 및 SFR 영역중 비트 주소 지정 가능한 SFR에 대한

비트 주소 등을 sfr, sbit 등의 형 지정을 통해 "reg51.h" 헤더 파일로 선언하고

있다. 참고로 8051용으로 “reg51.h” 헤더 파일과, 8052용으로 "reg52.h" 헤더 파일

이 제공된다. 따라서 프로그램 작성자는 소스 프로그램의 선두에서 다음과 같은

전처리기 지시자를 삽입함으로써 컴파일에 앞서 해당 헤더 파일의 내용을 삽입

하여 사용할 수 있다.

#include <reg51.h>

12.3 메모리 형 및 모델

메모리는 ROM 혹은 RAM이냐, MCU 내부에 장착 혹은 외부에 확장 연결하느

냐에 따라 다양한 형태의 메모리로 구성되고, 이러한 영역을 규정하기 위한 메모

리 형과 메모리 모델에 관련된 사항을 살펴본다.

12.3.1 메모리 형

MCS-51 MCU는 메모리 영역으로 내부 데이터 메모리, 외부 프로그램 메모리,

외부 데이터 메모리를 가진다. 따라서 C51 프로그램에서 선언된 변수가 이들 메

모리 영역의 어디에 위치할 것인가를 구분하여 지정할 수 있어야 한다. 각 변수

는 메모리 형(memory type)을 함께 지정함으로써 특정 메모리 공간에 할당하는

것이 가능하다. 즉, 변수를 선언할 때 메모리 형 지정자를 명시함으로써 변수가

저장될 메모리 공간을 지정할 수 있다. C51 컴파일러가 제공하는 메모리 형 지

Page 330: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

320 MCS-51 마이크로컴퓨터

정자를 정리하여 나타내면 [표 12.2]와 같다.

표 12.2 메모리 형

메모리형 설 명 주소범위data 직접주소지정 가능한 내부 데이터 메모리 영

역으로, 변수 접근시 가장 빠른 접근 가능 0x00 ~ 0xFF

bdata 비트주소지정 가능한 내부 데이터 메모리 영역(바이트주소 20H ~ 2FH 영역) 0x00 ~ 0x7F

idata 간접주소지정 가능한 내부 데이터 메모리 영역으로, 내부 데이터 메모리 전체 영역 0x00 ~ 0xFF

pdataMOVX @Ri 명령으로 접근 가능한 외부 데이터 메모리 영역으로, 256바이트 단위로 접근

0x00 ~ 0xFF

xdata MOVX @DPTR 명령으로 접근 가능한 외부 데이터 메모리 영역 0x0000 ~ 0xFFFF

code MOVC @A+DPTR 명령으로 접근 가능한 프로그램 메모리 영역 0x0000 ~ 0xFFFF

[그림 12.1]은 메모리 영역별 가능한 메모리 형들을 그림으로 나타낸 것이다. 여

기서, bdata 메모리 형은 내부 데이터 메모리의 비트 주소 지정 가능한 영역을

의미한다.

그림 12.1 메모리 유형별 가능한 메모리 형

변수를 사용할 때, 내부 데이터 메모리를 접근하는 것이 외부 데이터 메모리를

Page 331: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제12장 C51 컴파일러 321

접근하는 것보다 상당히 빠르다. 이런 이유로 자주 사용되는 변수는 내부 데이터

메모리에 위치시키고, 사용 빈도가 적은 변수는 외부 데이터 메모리에 위치시키

는 것이 바람직하다. 즉, 자주 사용되는 변수는 내부 데이터 메모리 영역의 data,

혹은 idata 메모리 형 지정자를 사용하여 선언하는 것이 접근 속도 면에서 바람

직하다.

변수를 선언할 때, 메모리 형의 지정은 다음과 같은 형식을 따른다.

data_type [memory_type] var_name = initial_value;

다음의 코드는 메모리 형을 지정한 char 형의 변수 선언 및 활용을 살펴볼 수

있는 프로그램으로, 지정된 메모리 형은 해당 변수가 위치하는 메모리 영역을 결

정하게 된다.

//=================================// memory type specific variable//=================================#include <reg51.h>void main(void){ unsigned char xdata * resPtr = 0x8200; // 결과 저장 시작 주소 unsigned char data d1 = 0x11; // data영역내 임의주소에 값 0x11 unsigned char data d2 = 0x22; unsigned char data d3 = 0x33; unsigned char data d4 = 0x44; unsigned char idata d5 = 0x55; // idata 영역내 임의주소에 값 0x55 unsigned char bdata d6 = 0x66; // bdata 영역내 임의주소에 값 0x66 unsigned char xdata d7 = 0x77; // xdata 영역내 임의주소에 값 0x77 unsigned char code d8; // code 영역내 선언만 *(resPtr++) = d1; // 외부 메모리에 저장 *(resPtr++) = d2; *(resPtr++) = d3; *(resPtr++) = d4; *(resPtr++) = d5; *(resPtr++) = d6; *(resPtr++) = d7;

Page 332: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

322 MCS-51 마이크로컴퓨터

*(resPtr++) = d8; *(resPtr++) = d1 + d2; // 연산 *(resPtr++) = d5 + d6; *(resPtr++) = &d7; // 변수가 저장된 위치 }

메모리 형 지정자를 생략하여 변수를 선언하는 경우에는 내정된 혹은 묵시적 메

모리 형으로 자동 지정되며, 함수 인자나 레지스터에 위치하지 않는 자동 변수

또한 내정된 메모리 영역에 저장된다. 이러한 내정된 메모리 영역의 지정은 다음

절에서 언급하는 메모리 모델에 의해 결정된다.

12.3.2 메모리 모델

메모리 모델(memory model)은 함수 인자, 자동 변수, 메모리 형이 명시되지 않

은 변수 등의 선언에서 사용하게 될 내정된 메모리 형을 결정한다. C51 컴파일

러는 small, compact, large의 3가지 메모리 모델을 제공한다. [표 12.3]은 각 메

모리 모델에서 변수 유형별 내정된 메모리 형을 나타낸다.

표 12.3 메모리 모델별 기본 메모리 영역

메모리모델 함수인자,자동변수 전역변수 상수변수

small data data datacompact pdata pdata pdata

large xdata xdata xdata

small 모델

small 모델에서 기본적으로 모든 변수들을 data 메모리 형으로 선언된 것처럼 내

부 데이터 메모리 내에 위치한다. 이 메모리 모델에서 변수 접근은 매우 효율적

이다. 그러나 다른 메모리 영역에 위치되도록 명시되지 않은 다른 모든 객체들이

나, 여러 함수들의 호출에 따른 중첩 정도에 의존하여 크기가 변동되어야 하는

스택이 내부 데이터 메모리 영역 내에 존재해야 한다. 따라서 한정된 내부 데이

터 메모리 크기로는 제약이 따른다. 이 모델은 링커에 의해 변수들을 내부 데이

Page 333: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제12장 C51 컴파일러 323

터 메모리로 지정하는 경우에 최적의 모델이다.

compact 모델

compact 모델에서는 기본적으로 모든 변수는 마치 pdata 메모리 형으로 선언된

것처럼 한 페이지(256 바이트 단위)의 외부 데이터 메모리에 존재한다. 이러한

제약은 R0, R1 레지스터를 통한 간접 주소 지정 방식에 기인한다. 이 메모리 모

델은 small 모델만큼 효율적이진 못하다. 그리고 변수 접근은 그리 빠르지 않으

나 large 모델보다는 빠르다. compact 모델을 이용할 때, C51 컴파일러는 @R0와

@R1을 이용하는 명령으로 외부 메모리를 접근한다. R0와 R1은 바이트 크기의

레지스터이고 주소의 하위 바이트만을 전달한다. 만일 사용 시스템이 256 바이트

이상의 외부 메모리를 가지면, 상위 바이트 주소(페이지)는 포트 P2를 통해 제공

한다. 적절한 외부 메모리 페이지를 포트 P2에 초기화하고 링커에게 pdata를 위

한 시작 주소를 명시해야 한다.

large 모델

large 모델에서 기본적으로 모든 변수는 xdata 메모리 형으로 선언된 것처럼 외

부 데이터 메모리에 존재한다. 외부 메모리를 주소 지정하는데 사용되는 DPTR

을 통한 메모리 접근은 비효율적이고 느리다. 특히 2 바이트 이상의 변수에서는

더욱 그러하며, 앞서 살펴본 다른 모델들에 비해 생성되는 코드가 길어진다.

12.3.3 메모리 모델 선언

메모리 모델의 선언은 소스 프로그램에서 #pragma 지시자를 이용하여 메모리 모

델을 명시할 수 있다. 다음은 small 메모리 모델을 사용하도록 선언한 예이다.

#pragma small :

char var; // data 메모리 형

위 코드에서 메모리 형의 지정없이 선언된 변수 var의 위치는 #pragma 지시자에

서 선언된 메모리 모델에 따라, small 모델이므로 data 메모리 영역 위치한다. 반

면 compact 모델로 선언된 경우는 pdata 메모리 영역에, large 모델로 선언된 경

우는 xdata 메모리 영역에 위치한다.

Page 334: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

324 MCS-51 마이크로컴퓨터

또한 각각의 함수 단위로 메모리 모델을 지정할 수 있는데, 함수 선언시에 메모

리 모델을 명시하는 방식으로 행한다. 다음의 함수 정의에서 메모리 모델이

large로 선언되었으므로, 함수 내에서 선언된 var 변수는 xdata 메모리 영역에

위치한다.

void func(void) large {unsigned char var;:

}

일반적으로 가장 빠르고 효율적인 코드를 생성하려면, small 메모리 모델을 사용

하는 것이 바람직하다. 사용자 응용 프로그램에 적합하지 않거나 small 메모리

모델을 사용할 수 없을 경우만 다른 메모리 모델로 변경하길 권고한다.

12.4 포인터

포인터(pointer)는 메모리 주소에 대한 기호화된 표현이라고 정의할 수 있다. 포

인터 자체는 변수 혹은 상수이므로 C51 소스에서 사용되면, 포인터 자체가 어느

메모리 영역에 저장되고, 포인팅되는 변수가 어느 메모리 영역에 존재하는지를

알 수 없다. 따라서, 포인터를 선언할 때 포인터 자체가 저장되는 위치뿐만 아니

라 포인터가 가리키고 있는 변수가 어느 메모리 영역에 위치하는지를 확실히 할

필요가 있다. C51 컴파일러에서 제공하는 포인터는 ANSI C에서 포인터가 행하

는 모든 기능과 동일하게 이용할 수 있다. 그러나 MCS-51 MCU의 고유 구조로

인하여 C51 컴파일러는 두가지 다른 형태의 포인터를 제공한다. 일반 포인터와

메모리 지정 포인터가 그것이다.

12.4.1 일반 포인터

일반 포인터(generic pointer)는 ANSI C에서 사용하는 포인터와 동일하게 메모

리의 위치에 상관없이 원하는 변수를 접근할 수 있는 포인터다. 즉, 포인터가 지

시하는 메모리 위치를 C51 컴파일러가 알아서 결정하기 때문에 프로그래머가 지

Page 335: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제12장 C51 컴파일러 325

정해 줄 필요가 없다. 따라서 일반 포인터를 사용하면 데이터가 메모리의 어느

곳에 저장되어 있든 접근할 수 있다는 장점을 가진다.

일반 포인터는 표준 C의 포인터처럼 다음과 같이 선언할 수 있다.

unsigned char *ptr;

위와 같이 선언된 일반 포인터는 항상 3 바이트 길이로 저장된다. 첫 바이트는

메모리 형을, 두 번째 바이트는 가리킬 데이터가 있는 주소의 상위 바이트를, 세

번째 바이트는 가리킬 데이터가 있는 주소의 하위 바이트를 나타낸다. [그림

12.2]는 xdata 영역의 메모리 0x8100 주소를 지시하는 포인터 구조를 나타낸다.

Mem Type higher Byte lower Byte0x02 0x81 0x00그림 12.2 일반 포인터의 구조 예

포인터 구조에서 지시할 위치의 메모리 형을 표시하는 방법으로, 메모리 영역에

대한 상수 값을 사용하는데, [표 12.4]와 같이 정의되어 있다.

표 12.4 일반 포인터의 메모리 형에 대한 상수값

메모리 형 idata xdata(default) pdata data,

bdata code상수값 0x01 0x02 0x03 0x04 0x05

이러한 일반 포인터는 MCS-51 메모리 공간에서 지시할 변수가 저장된 위치에

상관없이 어떠한 변수든 접근하는데 사용될 수 있다. 이런 이유로 C51 컴파일러

라이브러리 루틴의 많은 부분에서 일반 포인터가 사용된다.

다음의 예와 같이 우선 포인터 변수와 지시할 변수가 선언된 후, 일반 포인터에

그 변수의 메모리 형과 주소가 할당된다.

unsigned char * nptr; // unsigned char 변수에 대한 포인터 선언unsigned char xdata x; // xdata 영역의 char 변수 선언

Page 336: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

326 MCS-51 마이크로컴퓨터

nptr = &x; // x 변수의 메모리 형과 주소 할당

일반 포인터의 내정된 메모리 형은 xdata 형이다. 즉, 일반 포인터는 메모리 형

을 xdata 형으로 하고, 2바이트의 주소를 가지는 구조로 다음 명령과 같이 초기

화된다.

unsigned char * nptr = 0x028100L;

이를 명확히 메모리 형을 지정하여 선언한다면, 다음의 선언과 동일하다.

unsigned char xdata * nptr = 0x8100;

이와 같이 지시할 변수의 메모리 영역을 선언하면, 컴파일러는 포인터가 어디에

위치하는지 알 수 있기 때문에 메모리 형 지정을 위한 1 바이트를 작성할 필요

없다.

일반 포인터는 표준 C 포인터처럼 다음과 같이 선언할 수 있는데, 선언된 모든

일반 포인터 자체가 저장되는 위치는 MCS-51 MCU의 내부 데이터 메모리에 저

장된다. 즉, 일반 포인터 자체의 저장 위치는 기본적으로 내부 데이터 메모리 영

역인 data 영역이며, 아래에 보인 모든 포인터들은 내부 데이터 메모리에 위치하

게 된다.

char * strptr; // char ptr int * numptr; // int ptrlong * varptr; // long ptr

반면, 메모리 형 지정자를 이용하여 *와 포인터 변수 명 사이에 메모리 형을 명

시함으로써 일반 포인터 자체가 위치할 메모리 영역을 다음과 같이 지정할 수

있다.

char * xdata c_ptr; // generic ptr stored in xdata int * data i_ptr; // generic ptr stored in data long * idata l_ptr; // generic ptr stored in idata c_ptr = &ch; // ptr in xdata to var in xdata

Page 337: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제12장 C51 컴파일러 327

이들은 메모리 모델에 따라 결정되는 변수가 위치한 메모리 영역에 상관없이 해

당 변수를 포인팅할 수 있는 포인터이다. 그러나 포인터 자체는 각각 xdata,

data, idata 영역에 저장된다.

다음 코드와 같이 선언되었을 때, 아래의 문장들에서 일반 포인터 자체는 내부

데이터 메모리에 위치하면서, 각각 해당 메모리 영역에 있는 변수를 포인팅하고

있다.

char * c_ptr; // generic ptr stored in datachar data d_ch; // data varchar xdata x_ch; // xdata varchar code c_ch; // code varc_ptr = &d_ch; // ptr to var in datac_ptr = &x_ch; // ptr to var in xdatac_ptr = &c_ch; // ptr to var in code

일반 포인터의 경우 메모리 영역이 실행시간에 결정되므로 메모리 접근을 최적

화할 수 없으며, 어떠한 메모리 영역이든 접근할 수 있는 일반적인 코드를 생성

해야만 한다. 이로 인해 일반 포인터로 생성된 코드는 메모리 지정 포인터로 생

성된 동일 기능의 코드보다 실행 속도가 느리다. 만일 실행 속도가 중요하다면

일반 포인터보다는 메모리 지정 포인터를 사용할 것을 권고한다.

12.4.2 메모리 지정 포인터

메모리 지정 포인터(memory specific pointer)는 포인터 선언에서 항상 메모리

형을 명시하여야 하며, 이후 명시된 메모리 영역만을 항상 참조한다. 메모리 지

정 포인터를 선언하는 형식은 다음과 같다.

data_type data_mem_tyrpe * [ptr_mem_type] ptr_name[=address];

다음의 포인터들 자체는 메모리 모델에 따른 내정된 메모리 영역에 위치한다. 즉

small 모델인 경우, 다음의 모든 포인터 변수는 data 영역에 위한다. compact 모

델은 pdata 영역에, large 모델의 경우 xdata 영역에 위치한다.

Page 338: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

328 MCS-51 마이크로컴퓨터

char data * str; // ptr to string in data int xdata * numtab; // ptr to int(s) in xdata long code * powtab; // ptr to long(s) in code

다음의 예제 프로그램을 통하여 메모리형 지정 포인터의 선언, 초기화 및 활용

방법을 보다 명확히 할 수 있을 것이다.

//=================================// memory type specific pointer//=================================#include <reg51.h>void main(void){ unsigned char xdata * resPtr = 0x8200; // 결과 시작 위치 unsigned char data * ptr1 = 0x40; // ptr to 40H in data unsigned char data * ptr2 = 0x41; unsigned char data * ptr3 = 0x42; unsigned char data * ptr4 = 0x43; unsigned char idata * ptr5 = 0x50; // ptr to 50H in idata unsigned char bdata * ptr6 = 0x20; // ptr to 20H in bdata unsigned char xdata * ptr7 = 0x8240; // ptr to 8240H in xdata unsigned char code * ptr8 = 0x0003; // ptr to 0003H in code *ptr1 = 0x11; // (40H) <- 0x11 *ptr2 = 0x22; *ptr3 = 0x33; *ptr4 = 0x44; *ptr5 = 0x55; // (50H) <- 0x55 *ptr6 = 0x66; // (20H) *ptr7 = 0x77; // (8240H) *ptr8; // can not write *(resPtr++) = *ptr1; // (8200H) <- (40h), 0x11 *(resPtr++) = *ptr2; *(resPtr++) = *ptr3; *(resPtr++) = *ptr4; *(resPtr++) = *ptr5; *(resPtr++) = *ptr6;

Page 339: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제12장 C51 컴파일러 329

*(resPtr++) = *ptr7; *(resPtr++) = *ptr8; *(resPtr++) = *ptr1 + *ptr2; // 연산 *(resPtr++) = *ptr5 + *ptr6; }

일반 포인터처럼 *와 포인터 변수 사이에 메모리 형을 지정함으로써 다음과 같

이 메모리 지정 포인터 자체가 저장될 메모리 영역을 지정할 수 있다.

char data * xdata str; // ptr in xdata to data char int xdata * data numtab; // ptr in data to xdata int long code * idata powtab; // ptr in idata to code long

메모리 지정 포인터는 선언된 메모리 영역에 있는 변수만 접근할 수 있다. 메모

리 형이 컴파일 타임에 결정되기 때문에, 일반 포인터와 같이 메모리 형 지정을

위한 1 바이트는 필요치 않다. 즉, 메모리 지정 포인터는 1 바이트(idata, data,

bdata, pdata 경우) 혹은 2 바이트(code, xdata 경우) 크기로 저장되고, 보다 작

은 크기의 코드를 생성한다. 메모리 지정 포인터로 생성된 코드는 메모리 영역이

실행시가 아니라 컴파일시에 결정되기 때문에 일반 포인터로 생성된 동일한 기

능의 코드보다 고속으로 실행된다. 메모리 지정 포인터는 데이터를 접근하는 가

장 효율적인 방법이지만 유연성은 떨어진다. 만일 실행 속도가 중요하다면 가능

한 일반 포인터보다는 메모리 지정 포인터를 사용하는 것이 바람직하다.

12.4.3 메모리 지정 포인터와 일반 포인터간 비교

메모리 지정 포인터를 이용함으로써 C51 프로그램의 수행을 상당 부분 가속화할

수 있다. [표 12.5]는 세가지 유형의 포인터 선언에 따른 코드 및 데이터 크기와

실행 시간에 대한 비교 결과를 보여준다.

Page 340: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

330 MCS-51 마이크로컴퓨터

표 12.5 포인터간 생성 코드 크기 및 실행시간 비교

구 분 idata pointer xdata pointer generic pointer소스

char idata *ip;char val;val = *ip;

char xdata *xp;char val;val = *xp;

char *p;char val;val = *p;

어셈블리코드

MOV R0,ipMOV val,@R0

MOV DPL,xp+1MOV DPH,xpMOVX A,@DPTRMOV val,A

MOV R1,p+2MOV R2,p+1MOV R3,pCALL CLDPTR

포인터크기 1 byte 2 bytes 3 bytes코드크기 4 bytes 9 bytes 11bytes+library call실행시간 4 cycles 7 cycles 13 cycles

CLDPTR : 시스템 루틴

12.5 외부 메모리 및 입출력 디바이스 접근

MCS-51 MCU는 입출력 디바이스 식별을 위해 메모리 맵 방식을 채택하여, 외

부 메모리 주소 공간의 일부를 입출력 디바이스들을 접근하는데 할당하여 사용

한다. 결국 입출력 디바이스들과 외부 메모리의 접근은 동일한 주소 체계를 사용

하게 된다. C51 컴파일러에서 제공하는 외부 메모리 및 입출력 디바이스를 접근

하는 방법으로는 해당 주소 설정을 어떻게 하는가에 따라 메모리 지정 포인터,

일반 포인터, 매크로, _at_ 키워드를 활용한 네 가지 방법이 있으며, 이들 중 포

인터를 사용하는 방법이 가장 일반적으로 사용된다. 아래에서 이들 접근 방법에

대해 세부적으로 살펴본다.

12.5.1 메모리 지정 포인터에 의한 접근

xdata 포인터를 사용하여 외부 메모리 및 입출력 디바이스 주소를 지정하여 접

근하는 방법이다. 가장 일반적으로 사용되는 접근 방법이기도 하다.

다음의 코드는 xdata 메모리 지정 포인터를 사용하여 메모리 혹은 입출력 디바

Page 341: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제12장 C51 컴파일러 331

이스를 접근하는 예를 보여준다.

#define EMEM (* (unsigned char xdata *)0x9000) // xdata mem. 9000H#define SW (* (unsigned char xdata *)0xE000) // io device E000H#define LED (* (unsigned char xdata *)0xE800) // io device E800H

⋮unsigned char in;in = SW; // 디바이스로부터 입력 값을 변수 in에 저장LED = in; // in 값을 디바이스에 출력LED = EMEM; // 메모리의 값을 디바이스에 출력

12.5.2 일반 포인터에 의한 접근

다음 코드와 같이 일반 포인터 형의 구조를 이용하여 접근하는 것도 가능하다.

즉, 일반 포인터의 구조는 3 바이트로 구성되며, 첫 바이트는 메모리 형을, 나머

지 두 바이트 주소를 나타내는 구조이다. 즉 3바이트의 일반 포인터 구조로 표현

하는 방법이다.

#define CODE_MEM ((char *)0x051000) // code mem. 1000H#define SW ((char *)0x02E000) // io device E000H#define LED_PTR (*(char *)0x02E800) // ptr to io device E800Hunsigned char val, in; val = CODE_MEM; LED_PTR = val;in = SW; LED_PTR = in;

12.5.3 매크로에 의한 접근

매크로에 의한 접근은 "absacc.h" 헤더 파일에 정의되어있는 매크로에 메모리 및

입출력 장치의 절대 주소를 지정하여 접근하는 방법이다. 이들 매크로에는 1 바

Page 342: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

332 MCS-51 마이크로컴퓨터

이트 데이터를 접근하는 xBYTE의 매크로와 2 바이트 데이터를 접근할 수 있는

매크로 xWORD가 정의되어 있다. 여기서 x는 메모리 영역을 의미하는 c(code),

d(data), p(pdata), x(xdata)의 축약문자가 사용된다. 이들 매크로가 정의된

"absacc.h" 헤더 파일의 일부를 아래에 보인다.

/*-------------------------------------------ABSACC.HDirect access to 8051, extended 8051 and Philips 80C51MX memory areas.Copyright (c) 1988-2001 Keil Elektronik GmbH and Keil Software, Inc.All rights reserved.-------------------------------------------*/#define CBYTE ((unsigned char volatile code *) 0) // 1byte r/w#define DBYTE ((unsigned char volatile data *) 0)#define PBYTE ((unsigned char volatile pdata *) 0)#define XBYTE ((unsigned char volatile xdata *) 0)#define CWORD ((unsigned int volatile code *) 0) // 2bytes r/w#define DWORD ((unsigned int volatile data *) 0)#define PWORD ((unsigned int volatile pdata *) 0)#define XWORD ((unsigned int volatile xdata *) 0)

이들 매크로를 사용하기 위해서는 해당 헤더 파일을 포함하도록 소스 프로그램

의 앞부분에 #include <absacc.h>을 추가 작성하여야 한다. 다음은 매크로를 이

용한 메모리 및 입출력 디바이스를 접근하는 코드의 예를 보여준다.

#include <absacc.h> // include macro header file#define MEM 0x9000 // memory#define SW 0xE000 // io device#define LED 0xE800 // io deviceunsigned char val_8;unsigned int val_16;val_8 = XBYTE[SW]; // input a byte from io device E000HXBYTE[LED] = val_8; // write a byte to io device 8100H

Page 343: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제12장 C51 컴파일러 333

XWORD[MEM] = 0xFF99; // write 2 bytes to mem. 9000H, 9001Hval_16 = XWORD[0x9100]; // read 2 bytes from mem 9100H, 9101HXWORD[0x9200] = val_16; // write 2 bytes to mem. 9200H, 8201H

12.5.4 _at_ 키워드에 의한 접근

_at_ 키워드는 메모리의 절대 주소를 지정하는 키워드로서, 메모리 혹은 입출력

장치를 접근하고자 할 때, 해당 절대 주소를 지정하여 사용하는 방법이다. 다음

의 코드는 _at_ 키워드에 의해 메모리 및 입출력 장치를 접근하는 예를 보이고

있다.

unsigned char xdata MEM _at_ 0x9000; // memory unsigned char xdata SW _at_ 0xE000; // io deviceunsigned char xdata LED _at_ 0xE800; // io deviceunsigned char in;LED = 0xF0; // output to io devicein = SW; // input from io deviceLED = in; // output to io deviceMEM = SW; // input from io device & store into memory

12.6 함수

C51 컴파일러에서의 함수는 표준 C에서와 동일한 일반 함수 외에, MCS-51

MCU의 인터럽트를 취급하기 위한 인터럽트 취급 함수가 있다. 또한 재귀적인

특성을 가지는 재진입 함수의 정의를 허용한다. 본 절에서는 이러한 함수들의 정

의에 대해 살펴본다.

Page 344: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

334 MCS-51 마이크로컴퓨터

12.6.1 일반 함수

C51 소스의 일반 함수 정의는 다음의 형식을 취한다.

[return_type] func_name([args]) [ {small | compact | large }] [reentrant] [using regbank_no]

함수 정의시 반환 유형을 명시하지 않으면 int 형을 기본 반환하는 것으로 가정

한다. 함수명은 ANSCI C의 함수 명 정의 규칙을 따른다. reentrant는 해당 함수

가 재진입 함수임을 나타낸다. using 구는 해당 함수 내에서 사용할 범용 레지스

터 뱅크를 지정하는 용도로 사용되며, regbank_no에 레지스터 뱅크 번호를 명시

한다. 다음은 레지스터 뱅크 1을 사용하는 일반 함수의 정의 예를 보이고 있다.

void generalFunc(void) using 1 {⋮

}

12.6.2 인터럽트 취급 함수

MCS-51 MCU는 외부 이벤트에 따른 인터럽트, 타이머/카운터 인터럽트, 시리얼

인터페이스를 이용한 데이터의 송수신 등에 이용될 수 있는 몇가지 하드웨어 인

터럽트를 제공한다. 인터럽트 취급 함수를 정의할 때 [표 12.4]에 제시된 인터럽

트 번호를 interrupt 구에 명시함으로써 인터럽트 유형을 구분하게 되며, 이를 통

해 인터럽트 벡터 주소가 결정된다.

표 12.4 MCS-51 MCU의 표준 인터럽트

인터럽트번호 기 능 주 소0 외부 인터럽트 INT0 0003H1 타이머/카운터 인터럽트 T/C0 000BH2 외부 인터럽트 INT1 0013H3 타이머/카운터 인터럽트 T/C1 001BH4 시리얼 통신 인터럽트 0023H

Page 345: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제12장 C51 컴파일러 335

C51 컴파일러에서 이들 인터럽트의 요청에 대해 그 서비스를 수행할 함수를 정

의하는 경우, 일반 함수와는 다르게 정의한다. 다음은 C51에서 인터럽트 서비스

루틴을 위한 함수 정의의 기본 구조를 보여준다. 인터럽트 함수 명(isr_name)은

일반 함수 명을 정의하는 것과 동일하며, 인터럽트 벡터 번호(vector_no)는 [표

12.4]와 같이 각 인터럽트 유형에 따라 정의되어 있다. 또한 using 구문은 인터럽

트 서비스 루틴 내에서 사용할 범용 레지스터 뱅크의 번호(regbank_no)를 설정

하는 용도로 사용되는데, 내정된 레지스터 뱅크를 사용하는 경우는 생략 가능하

다.

// 인터럽트 서비스 루틴 정의void isr_name(void) interrupt vector_no [using regbank_no] {

⋮}

다음 코드는 타이머/카운터 0의 인터럽트 함수 정의 예를 보인 것으로, 해당 인

터럽트 서비스 루틴 내에서 레지스터 뱅크 2를 사용하도록 정의하고 있다.

// Timer/Counter 0 ISRvoid timer0(void) interrupt 1 using 2 {

⋮}

인터럽트 서비스 루틴의 함수를 정의할 때, 다음의 규칙들을 준수해야 한다.

▪ 인터럽트 함수는 매개 변수로 정보를 전달할 수 없다. 인자 항목은 void

여야 한다.

▪ 인터럽트 함수 선언은 반환 값을 포함할 수 없다. 함수 선언은 void로 선

언 되어야 한다.

▪ 인터럽트 서비스 함수에서 호출되는 일반 함수들은 인터럽트 함수에서 사

용한 레지스터 뱅크와 동일한 레지스터 뱅크를 사용하는 함수여야 한다.

▪ 컴파일러는 인터럽트 함수를 직접적으로 호출하는 것을 허용하지만, 의미

없다.

▪ 컴파일러는 각 인터럽트 함수에 대한 인터럽트 벡터를 인지하며, 이는 컴

파일 후 해당 인터럽트 함수의 시작 주소를 결정한다.

▪ Keil C51 컴파일러는 현재 32개 인터럽트를 취급할 수 있도록 0부터 31까

Page 346: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

336 MCS-51 마이크로컴퓨터

지의 interrupt 번호를 허용한다. 하지만 어떠한 인터럽트가 가용한지는 사

용하는 MCU 관련 문서를 참조한다.

interrupt 구로 인해 인터럽트 함수의 목적 코드에서 다음과 같은 사항들에 영향

을 미친다.

▪ 필요할 때, ACC, B, DPH, DPL, PSW의 내용은 인터럽트 함수 호출시 스

택에 저장한다.

▪ 만일 using 속성으로 레지스터 뱅크가 명시되지 않는다면 인터럽트 함수

내에서 사용되는 모든 범용 레지스터들은 스택에 저장된다.

▪ 인터럽트 함수 종료 전에 스택에 저장되었던 범용 레지스터와 SFR는 복구

된다.

▪ 인터럽트 함수는 RETI 명령에 의해 종료된다.

다음 예제 프로그램은 타이머/카운터 0 인터럽트 서비스 함수의 정의를 보이고

있다. 아울러 C51 소스에 대한 어셈블리 소스를 제시함으로써 인터럽트 함수에

대한 생성된 코드가 어떠한 형태로 이루어지는 지를 보인다. 아래 코드에서

ACC와 PSW 레지스터의 값이 스택에 저장되었다 복구되는 것을 관찰할 수 있

으며, 인터럽트 종료를 위해 RETI 명령이 자동 생성됨을 확인할 수 있다.

1 extern bit alarm; 2 int alarm_count; 3 4 // Timer/Counter 0 ISR 5 void alarmISR(void) interrupt 1 { 6 1 alarm_count *= 2; 7 1 alarm = 1; 8 1 }

ASSEMBLY LISTING OF GENERATED OBJECT CODE ; FUNCTION alarmISR (BEGIN)0000 C0E0 PUSH ACC0002 C0D0 PUSH PSW ; SOURCE LINE # 5

Page 347: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제12장 C51 컴파일러 337

; SOURCE LINE # 60004 E500 MOV A,alarm_count+01H0006 25E0 ADD A,ACC0008 F500 MOV alarm_count+01H,A000A E500 MOV A,alarm_count000C 33 RLC A000D F500 MOV alarm_count,A ; SOURCE LINE # 7000F D200 SETB alarm ; SOURCE LINE # 80011 D0D0 POP PSW0013 D0E0 POP ACC0015 32 RETI ; FUNCTION falarmISR (END)

12.6.3 재진입 함수

재진입 함수(reentrant function)는 여러 다른 함수에 의해 동시에 호출되거나, 함

수 자체가 재귀적으로 호출되는 함수를 의미한다. 재진입 함수로 전달되는 매개

변수는 해당 함수에 지정된 메모리 스택에 의존하며, 스택의 위치는 함수에 의해

선택된 메모리 모델에 의존한다. 재진입 함수는 다음 코드와 같이 함수 선언에서

reentrant 구를 덧붙여 정의한다.

int func(int x, int y) large reentrant {int z;z = x * y;return z;

}

매개 변수 x, y와 지역 변수 z는 함수의 메모리 스택에 있기 때문에 xdata 영역

에 위치하게 된다. 함수에 대해 선택된 메모리 모델은 large 모델로 함수의 지역

변수가 저장되어야 하는 위치뿐만 아니라, 매개 변수 전달과 함수 재진입에 사용

되는 메모리 스택의 위치를 xdata 영역으로 결정한다.

재진입 함수에서의 재진입 스택 영역은 메모리 모델에 따라 내부 메모리나 외부

Page 348: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

338 MCS-51 마이크로컴퓨터

메모리로 변경될 수 있으며, 다음과 같은 규칙을 따른다. small 모델에서 재진입

함수는 재진입 스택을 idata 영역으로 변경하며, compact 모델에서는 pdata 영역

으로, large 모델에서는 xdata 영역으로 변경한다.

재진입 함수는 일반적으로 실시간 응용 프로그램이나, 인터럽트 코드와 비인터럽

트 코드가 하나의 함수를 공유해야 하는 상황에서 주로 사용한다.

12.7 C와 어셈블리 소스간 인터페이싱

C 소스에서 어셈블리 소스로 작성된 함수를 호출하는 등의 C 소스와 어셈블리

소스가 함께 존재하는 프로그램을 작성하는 경우는 유의해야 할 사항이 있다.

함수간의 데이터 전달은 호출되는 함수의 매개 변수와 호출 함수로 반환되는 값

을 통해 이루어진다. 함수는 code 메모리 영역에 위치하는 코드 블록인 반면, 변

수는 여러 메모리 형으로 지정된 데이터 메모리에 위치한다. 이들 변수의 메모리

형은 변수가 소속된 함수의 메모리 형 혹은 변수의 성격에 따라 달라진다. 함수

의 지역 변수나 인자는 함수가 속해 있는 메모리 형으로 결정되며, 일반적으로

스택 영역에 위치하게 된다. 특히 8051에서 내부 메모리는 128바이트인 경우가

일반적이므로 스택 영역만으로는 제약이 있다. 따라서 매개 변수를 전달할 수 있

는 다른 방법이 고려되어야 하며, 이를 위해 레지스터를 활용하거나 메모리를 활

용하는 방법이 있을 수 있다.

12.7.1 레지스터를 통한 매개 변수 전달

C51 컴파일러에서 함수로 전달되는 매개 변수는 기본적으로 범용 레지스터를 사

용하여 3개까지 전달할 수 있다. 레지스터에 위치할 수 없는 매개 변수는 자동적

으로 호출되는 함수에서 지정한 메모리 영역을 통해 전달된다. 3개의 매개변수를

전달하는데 사용되는 레지스터는 특정 레지스터 뱅크 내의 범용 레지스터 8개로

제한되어 있다. 또한 최대 3개의 매개 변수가 어떠한 순서로 전달될지 모르므로

규칙이 있어야 한다.

Page 349: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제12장 C51 컴파일러 339

함수의 호출시 인자의 나열 순서 및 인자 유형에 따라 사용되는 범용 레지스터

는 [표 12.5]와 같은 규칙을 따라야 한다.

표 12.5 인자 전달에 사용되는 범용 레지스터

인자순서 char,1byte ptr

int, 2byte ptr

long, float generic ptr

1st R7 R6, R7 R4 ~ R7 R1 ~ R32nd R5 R4, R5 R4 ~ R7 R1 ~ R33rd R3 R2, R3 R1 ~ R3

다음의 함수가 호출되는 경우 첫 번째 인자는 int형으로 R6, R7을 통해 전달되

며, 2번째 인자는 char형이므로 R5를 통해 전달된다.

int func(int a, char b) ;

또한, 함수로부터 반환 값을 어떠한 레지스터에 저장하여야 하는지는 반환 유형

에 따라 [표 12.6]의 규칙을 준수해야 한다. 위의 함수 호출에서 반환형으로는 int

형이므로 R6, R7을 통해 반환된다.

표 12.6 반환 값에 사용되는 범용 레지스터

반환 유형 레지스터 저장 형식bit Carrychar,unsigned char,1-byte pointer R7 int,unsigned int,2-byte pointer R6, R7 MSB=R6, LSB=R7long,unsigned long R4 - R7 MSB=R4, LSB=R7float R4 - R7 32-Bit IEEE format Generic pointer R1 - R3 Mem.type=R3, MSB=R2, LSB=R1

C 소스와 어셈블리 소스간 인터페이싱을 위해 이러한 규칙을 준수하여 프로그램

Page 350: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

340 MCS-51 마이크로컴퓨터

을 작성하여야 한다.

아래 예제 프로그램을 통하여 C 소스와 어셈블리 소스가 혼용된 프로그램에서의

상호 인터페이싱에 대해 살펴보자. 다음의 소스 프로그램은 2개의 C 소스 파일

과 하나의 어셈블리 소스로 구성된다. addIntChar() 함수의 호출과 함께 전달되

는 매개 변수는 정수형, 문자형 각 1개로, 정수형은 R6, R7 레지스터를 통해, 문

자형은 R5 레지스터로 전달된다. 또한 반환형도 정수형이므로 R6, R7을 통해 반

환된다. 그리고 이에 대한 어셈블리 서브루틴에서 이들 레지스터의 내용으로 2바

이트 덧셈 연산한 후 반환하고 있다.

//======================================// file : C51nASM.C//======================================extern int addIntChar(unsigned int, unsigned char); // assembly funcextern void writeMem8100(unsigned int); // assembly funcextern int subIntChar(unsigned int val1, unsigned char val2); // C funcvoid main(void) {

unsigned int xdata *mem = 0x8120;unsigned int opr1, res;unsigned char opr2;opr1 = 0x1189; // intopr2 = 0x80; // charres = addIntChar(opr1, opr2);

// 인자로 unsigned int와 unsigned char를 전달// opr1은 R6, R7로, opr2는 R5로 전달, res는 R6, R7로 반환

writeMem8100(res); // res은 R6, R7로 전달res = subIntChar(opr1, opr2);*mem = res;

}

;======================================; file : Assem.ASM;======================================addIntChar SEGMENT CODE

PUBLIC _addIntCharRSEG addIntChar

Page 351: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제12장 C51 컴파일러 341

_addIntChar: ; (R6, R7) <- (R6, R7) + (#0, R5)MOV A, R7ADD A, R5MOV R7, AMOV A, R6ADDC A, #0MOV R6, ARET

writeMem8100 SEGMENT CODEPUBLIC _writeMem8100RSEG writeMem8100

_writeMem8100: ; (8100H) <- (R6, R7)MOV DPTR,#08100HMOV A, R6MOVX @DPTR, AINC DPTR

MOV A, R7MOVX @DPTR, ARETEND

//======================================// file : SUB.C//======================================int subIntChar(unsigned int val1, unsigned char val2) {

unsigned int tmp;tmp = val1 - val2;return tmp;

}

C51 소스 프로그램과 어셈블리 루틴의 인터페이싱은 크게 어렵지 않으며, C51

소스에서 어셈블리 루틴을 호출하거나, 어셈블리 루틴에서 PUBLIC으로 선언된

변수를 C51 소스에서 사용할 수 있다. 이와 같이 C51 소스에서 어셈블리 루틴을

Page 352: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

342 MCS-51 마이크로컴퓨터

호출하는 방법을 통하여 처리 속도를 향상시키거나, SFR를 접근하거나, 메모리

맵 방식의 입출력 디바이스를 직접 제어하는 것이 가능하다.

C51 소스에서 어셈블리 루틴을 호출할 때에 주의할 점은 매개 변수의 전달에 있

다. C51 컴파일러는 기본적으로 최대 3개까지의 매개 변수는 레지스터로 전달하

고, 그 이외의 것은 내정된 메모리 영역을 사용한다. 그러나 3개까지의 매개 변

수도 레지스터를 통해 전달하지 않으려면, NOREGPARMS 지시어를 사용하면

된다.

레지스터로 매개 변수를 전달하는 함수는 C51 컴파일러에 의해 함수 명에 언더

스코어(_) 문자가 첨부된다. 또한, 내정된 메모리 영역을 통해 전달되는 함수의

매개 변수는 세그먼트 이름이 ?function_name?BYTE 혹은 ?function_name?BIT

형태로 정의된다. 내정된 메모리 영역은 사용되는 메모리 모델에 따라 내부 데이

터 메모리일 수도 있고, 외부 데이터 메모리일 수 있다. 반면 함수에서 반환되는

값은 범용 레지스터를 사용하며, 이는 앞서 [표 12.6]에서 살펴보았다.

12.7.2 메모리를 통한 매개 변수 전달

레지스터를 통해 함수의 매개 변수를 전달하는 것은 시간적 제약을 받는 응용에

서 일반적으로 사용된다. 이는 데이터를 접근하는데 있어 레지스터 접근은 보다

고속으로 이루어지기 때문이다. 하지만 레지스터로 전달하는데 있어서는 레지스

터가 8개로 제한되기 때문에 필요한 모든 매개 변수를 레지스터를 통해 전달할

수 없다. 또한 비트형의 정보는 레지스터를 통해 전달할 수 없다. 따라서 C51 컴

파일러는 고정된 메모리 위치를 통해 매개 변수를 전달하는 방법을 제공하고 있

다.

시간적 제약이 없는 경우 프로그램 작성자의 의도에 따라 모든 매개 변수를 고

정된 메모리를 통해 전달하는 것이 가능하다. 이를 위해 NOREGPARMS 지시어

를 제공하고 있다. 이 지시어를 사용하면 내정된 매개 변수 전달 모드인 레지스

터를 사용하지 않고, 모든 매개 변수의 전달에 있어 메모리 영역을 사용하게 된

다. 이와 반대로 내정된 매개 변수 전달 모드인 레지스터 전달 모드로 전환하는

경우는 REGPARMS 지시어를 사용할 수 있다.

Page 353: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제12장 C51 컴파일러 343

아래의 코드는 메모리를 통한 매개 변수 전달 방법의 이해를 돕기 위한 것이다.

코드의 첫 번째 #pragma 지시자를 제거하였을 때, 즉, 레지스터를 통한 전달시

코드 크기가 미미하게 늘어나나 무시할 정도이며, 메모리 보다는 레지스터 접근

이 보다 고속이므로 레지스터를 통한 방법이 효과적이다.

//=================================// parameter transfer by register/memory//=================================#include <stdio.h>int areaRect(int ii, int jj);#pragma NOREGPARMS // 이후, 메모리 통한 전달을 설정int lengthOfCircle(float pi, int r) { return (pi * 2. * r);}void main(void) { int val1, val2; float PI = 3.14159; int r1 = 10; int r2 = 20; val1 = lengthOfCircle(PI, r1);

// PI, r1은 메모리로, val1은 레지스터로 전달 val2 = areaRect(r1, r2); // r1, r2, val2는 레지스터로 전달 printf("%d %d\n", val1, val2); // 시리얼 통신으로 통신프로그램에 출력}#pragma REGPARMS // 이후, 레지스터 통한 전달int areaRect(int r, int c) { return (r * c);}

Page 354: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

344 MCS-51 마이크로컴퓨터

Page 355: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제13장 C51 프로그래밍 345

제13장 C51 프로그래밍

본 장에서는 C51 프로그래밍을 통하여 기본 적인 산술 연산, 논리 연산 등 기초

적인 연산 프로그램을 작성한 후, 블록전송, 검색, 정렬 등의 응용 프로그램을 작

성한다. 또한, 앞 장들에서 어셈블리 프로그램으로 작성하였던 포트 입출력, 외부

인터럽트, 타이머/카운터 인터럽트, 시리얼 인터럽트 관련 및 CLCD 제어 응용

프로그램에 대해 살펴본다. 우선, C51 프로그램을 작성하여 컴파일하는 과정에서

필요한 KEIL C51 컴파일러의 추가적인 사용 방법을 살펴본다.

13.1 C51 프로그래밍 절차

C51 프로그래밍을 진행하기 위한 전체적인 과정은 제3장에서 살펴본 어셈블리

프로그래밍 절차에서 언급한 절차를 따르면 된다. C51 프로그래밍을 할 때는 아

래에서 언급하는 몇 가지를 추가 고려하여야 한다.

13.1.1 스타트업 코드의 추가

스타트업(startup) 코드란 MCU를 리셋한 직 후 실행되는 코드를 의미한다. C51

소스 프로그램을 작성할 때는 스타트업 코드 파일을 추가한 후, 실습 보드의 환

경에 따라 필요한 부분을 수정하여야 한다. C51 소스 프로그램을 작성하기 위해

프로젝트를 생성할 때, 프로젝트 명 입력 후 [그림 13.1]과 같이 나타나는 스타트

업 코드의 복사 및 추가 질의 창에서 반드시 스타트업 코드 파일인

'STARTUP.A51'을 프로젝트에 추가 될 수 있도록 해야 한다. 특히 인터럽트를

취급하는 응용 프로그램을 작성할 때는 반드시 추가하도록 한다.

그림 13.1 스타트업 코드 복사 및 추가 질의 창

Page 356: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

346 MCS-51 마이크로컴퓨터

'STARTUP.A51' 파일은 KEIL 툴이 설치된 KEIL\LIB 폴더에 위치하며, 스타트

업 코드의 복사 및 추가 질의 창에서 '예'를 선택하면 이 파일을 프로젝트 폴더

로 복사한 후, 프로젝트에 추가하게 된다. [그림 13.2]는 스타트업 코드 파일이

프로젝트에 추가된 상태를 보여준다.

13.2 STARTUP.A51 파일 추가 후

스타트업코드 파일을 추가한 후, 실습 보드의 환경에 따라 필요한 부분을 수정하

여야 한다. KUT51 실습 보드 맞는 목적 코드 파일을 생성하도록 컴파일하려면,

'STARTUP.A51' 파일의 125번째 라인인 CSEG AT 라인에서 0을 프로그램 코

드가 적재될 주소인 8000H로 수정하여야 한다. 다음의 코드는 'STARTUP.A51

' 파일의 내용 일부를 나열한 것으로, 실습 보드에 맞게 수정한 것을 보인다.

:PUBLIC ?C_STARTUP

CSEG AT 8000H // for KUT51 board?C_STARTUP: LJMP STARTUP1

:

Page 357: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제13장 C51 프로그래밍 347

13.1.2 C51 소스 작성

C51 소스를 작성하는데 있어 사용되는 헤더 파일들을 KEIL\INC 폴더에 위치한

다. 특히 'reg51.h' 헤더 파일은 특수 기능 레지스터들과 몇몇 비트 주소 지정 가

능한 특수 기능 레지스터의 비트들에 대한 이름과 주소의 사상 관계를 정의하고

있다. C51 소스 프로그램을 작성할 때 이 헤더 파일을 소스 파일에 삽입하도록

다음 코드와 같은 전처리 지시자를 포함하도록 작성한다.

#include <reg51.h>

아래에서 'reg51.h' 헤더 파일의 내용을 일부 보인다. sfr 형과 sbit 형을 통해 특

수 기능 레지스터와 몇몇 특수 기능 레지스터 내의 비트 주소를 일대일 사상하

도록 정의하고 있음을 관찰할 수 있다.

/*-----------------------------------------REG51.HHeader file for 8051.Copyright (c) 1988-1997 Keil Elektronik GmbH and Keil Software, Inc.All rights reserved.------------------------------------------*//* BYTE Register */sfr P0 = 0x80;sfr P1 = 0x90;sfr P2 = 0xA0;sfr P3 = 0xB0;sfr PSW = 0xD0;sfr ACC = 0xE0;sfr B = 0xF0;sfr SP = 0x81;sfr DPL = 0x82;sfr DPH = 0x83;sfr PCON = 0x87;sfr TCON = 0x88;sfr TMOD = 0x89;sfr TL0 = 0x8A;sfr TL1 = 0x8B;sfr TH0 = 0x8C;sfr TH1 = 0x8D;sfr IE = 0xA8;sfr IP = 0xB8;sfr SCON = 0x98;sfr SBUF = 0x99;

Page 358: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

348 MCS-51 마이크로컴퓨터

/* BIT Register *//* PSW */sbit CY = 0xD7;sbit AC = 0xD6;sbit F0 = 0xD5;sbit RS1 = 0xD4;sbit RS0 = 0xD3;sbit OV = 0xD2;sbit P = 0xD0;/* TCON */sbit TF1 = 0x8F;sbit TR1 = 0x8E;sbit TF0 = 0x8D;sbit TR0 = 0x8C;sbit IE1 = 0x8B;sbit IT1 = 0x8A;:

13.1.3 컴파일 환경 설정

C51 소스 프로그램을 컴파일하기에 앞서 실습 보드의 메모리 구성에 맞도록 컴

파일될 수 있게 하려면 적절히 컴파일 환경 설정을 하여야 한다. 환경 설정할 때

유의할 것은 사용자 프로그램의 시작 주소 설정과 인터럽트 서비스 루틴을 취급

할 때, 스타트업 코드의 수정 부분이다. 물론 아래에서 언급하는 유의 사항이외

의 사용 방법은 어셈블리 소스를 어셈블 할 때와 동일하다.

사용자 프로그램의 시작 주소 설정

특히, 실습보드에서 사용자 프로그램은 외부 데이터 메모리의 주소 8000H번지부

터 적재될 수 있도록 컴파일 되어야 한다.

이를 설정하기 위해 [Project]-[Options for Target 'Target 1'] 메뉴를 클릭한

후, [그림 13.3]과 같은 'Target' 탭을 열어 아래의 항목을 다음과 같이 설정한다.

▪ Memory Model : small:variables in DATA▪ Code ROM Size : Large:64K program▪ Off-chip Code memory : Eprom start 0x8000

'Off-chip Code memory' 부분의 'start' 항에 0x8000 값을 설정하는 것은 외부

Page 359: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제13장 C51 프로그래밍 349

데이터 메모리 영역인 8000H번지부터 HEX 파일이 적재되도록 컴파일하라는 의

미이며, KUT51 실습 보드를 위해서 반드시 필요한 설정이다. 이는 어셈블리 소

스 프로그램에서는 의사명령어 ORG(origin)를 통해 코드의 적재 위치를 지시할

수 있는 반면, C51 소스 프로그램에서는 이를 지시할 수 있는 방법이 없기 때문

에 위와 같이 환경 설정하여야 한다.

그림 13.3 Target 탭의 메모리 주소 설정

다음으로 [그림 13.4]와 같이 'Output' 탭을 선택한 후, 목적 코드 파일로 HEX

파일을 생성할 수 있도록, 'Create HEX file'항목에 체크한다.

그림 13.4 Target 탭의 HEX 파일 생성 체크

Page 360: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

350 MCS-51 마이크로컴퓨터

끝으로 [그림 13.5]와 같이 'C51' 탭을 선택한 후, 창의 우측 항목들 중 인터럽트

벡터의 시작주소 설정부분인 'Interrupt vector at address'에 0x0000으로 설정되

어 있고, 체크되었는지를 확인할 필요가 있다. 특히, 인터럽트를 취급하는 C51 소

스 프로그램을 컴파일할 때 필히 확인한다.

그림 13.5 C51 탭의 인터럽트 벡터 시작 주소 설정

인터럽트 서비스 루틴관련 환경 설정

특히, C51 프로그램에서 인터럽트 요청시 서비스를 위한 인터럽트 서비스 루틴

을 함수로 정의하게 되는데, 컴파일될 때 그 시작 주소가 결정되어야 한다. 이를

위한 기본 골격은 “/Keil/LIB/STARTTUP.A51” 파일로 제공된다. 이 파일을 참

조하여 타깃 보드에 맞게 EXTRN CODE 부분과 CSEG 부분을 적절히 변경하여

야 한다.

표 13.1 인터럽트 함수의 주소 및 이름 정의

번호 인터럽트 interrupt 속성 주소 함수명

0 외부 인터럽트 0 Interrupt 0 8003H INT0_ISR

1 타이머 인터럽트 0 Interrupt 1 800BH TC0_ISR

2 외부 인터럽트 1 Interrupt 2 8013H INT1_ISR

3 타이머 인터럽트 1 Interrupt 3 801BH TC1_ISR

4 시리얼 인터럽트 Interrupt 4 8023H SERIAL_ISR

Page 361: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제13장 C51 프로그래밍 351

KUT51 실습 보드에서 각 인터럽트 서비스 루틴의 시작 주소는 [표 13.1]과 같

다. 또한 각 인터럽트 서비스 루틴의 이름은 [표 13.1]과 같이 사용하기로 하자.

이를 참조하여 KUT51 실습 보드에 맞게 'STARTUP.A51' 파일을 수정한 일부

부분을 보이면 다음과 같다.

;======================================; File : startup.a51;======================================IDATALEN EQU 80HXDATASTART EQU 0HXDATALEN EQU 0HPDATASTART EQU 0HPDATALEN EQU 0H

NAME ?C_STARTUP?C_C51STARTUP SEGMENT CODE?STACK SEGMENT IDATA

RSEG ?STACKSTACK: DS 1

EXTRN CODE (?C_START); EXTRN CODE (INT0_ISR); EXTRN CODE (TC0_ISR); EXTRN CODE (INT1_ISR); EXTRN CODE (TC1_ISR); EXTRN CODE (SERIAL_ISR)

PUBLIC ?C_STARTUPCSEG AT 8000H ; start address of user program

?C_STARTUP: LJMP STARTUP1; CSEG AT 8003H; LJMP INT0_ISR; CSEG AT 800BH; LJMP TC0_ISR; CSEG AT 8013H

Page 362: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

352 MCS-51 마이크로컴퓨터

; LJMP INT1_ISR; CSEG AT 801BH; LJMP TC1_ISR; CSEG AT 8023H; LJMP SERIAL_ISR

RSEG ?C_C51STARTUPSTARTUP1:IF IDATALEN <> 0 ; idata clear

MOV R0,#IDATALEN-1CLR A

IDATALOOP: MOV @R0,ADJNZ R0,IDATALOOP

ENDIF⋮⋮

“STARTUP.A51” 파일에서 주석으로 표기된 부분을 보면, 각 인터럽트 함수 명

이 정의한 함수명과 동일함을 확인할 수 있다. 여기서 사용되는 인터럽트 함수들

의 이름은 변경 가능하지만, “STARTUP.A51” 파일과 C51 소스 파일에서 모두

동일한 이름이 사용되도록 하여야 한다.

이 파일을 활용하여, 만약 외부 인터럽트 0을 사용하고자 한다면 EXTRN CODE

부분과 대응하는 CSEG 부분에서 다음과 같이 주석 처리를 제거하여 활성화한

다.

⋮EXTRN CODE (INT0_ISR)

⋮⋮

CSEG AT 8003H LJMP INT0_ISR

Page 363: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제13장 C51 프로그래밍 353

참고로, 만일 인터럽트를 취급하기 위해 함수를 정의하지 않고 각 인터럽트의 플

래그를 검사하여 인터럽트를 취급하는 폴링 방식으로 처리하는 경우,

“STARTUP.A51” 파일을 프로젝트에 포함하지 않아도 된다.

Page 364: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

354 MCS-51 마이크로컴퓨터

13.2 C51 기초 실습

본 절에서는 앞 장에서 소개한 C51 프로그래밍과 관련하여 데이터 형, 메모리

형 지정 변수 및 포인터, C51 소스와 어셈블리 소스간 인터페이싱 등의 제시된

예제를 실습하고, 이를 바탕으로 응용 과제를 구현함으로써 관련 개념들을 이해

한다.

13.2.1 관련 개념

데이터 형

C51 컴파일러에서 추가 도입된 데이터 형인 bit, sfr, sbit 데이터 형의 선언 및

활용 방법과 관련한 예제를 실습한다.

메모리 형 지정 변수

각 변수의 메모리 형을 지정함으로써, 데이터가 저장되는 메모리 영역에 대한 개

념을 이해하는 예제 프로그램을 작성해 본다. 이러한 예제로 블록 데이터 전송

예제를 활용한다.

메모리 형 지정 포인터

일반 포인터와 메모리 형 지정 포인터의 선언 및 활용 방법에 관련한 예제를 실

습한다.

외부 메모리 및 입출력 장치 접근 방법

외부 메모리 및 입출력 장치를 접근하는 방법으로 제공되는 포인터, 매크로, _at_

키워드를 활용하여 데이터의 전송 및 데이터 입출력을 수행하는 예제를 실습한

다.

C와 어셈블리 소스간 인터페이싱

C51 소스 프로그램과 어셈블리 소스 프로그램이 혼합되어 구성된 상황에서의 인

터페이싱을 이해하기 위한 예제 프로그램을 작성한다.

블록 데이터 처리

블록 데이터의 전송, 블록 데이터 내에서 특정 데이터의 검색, 블록 데이터의 정

Page 365: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제13장 C51 프로그래밍 355

렬과 관련한 예제 프로그램을 실습한다. 이들 블록 데이터를 처리하려면 반복 처

리를 위한 for, while, do..while의 반복 제어문을 활용하여 구현할 수 있다.

13.2.2 예제 프로그램

데이터 형 : sfr, sbit

다음 프로그램은 C51에서 추가 도입된 데이터 형들 중 sfr와 sbit 형의 선언 및

활용에 대한 예제로 sbit 형의 변수 선언과 초기화를 동시에 할 수 있도록 구현

한 것이다. 실습을 위해 P1의 하위 니블에 LED 모듈을 연결한다.

//=================================// C51_01.C// data type : sfr and sbit // P1_L : LED module//=================================#include <reg51.h>// sfr 형 및 sbit 형 선언sfr PORT = 0x90; // 절대 주소 설정으로 선언sbit p0 = PORT^0;// 특정 비트 위치의 접근을 위한 sbit 선언unsigned char bdata bPat; // bdata 메모리 형으로 선언sbit bPat0 = bPat^0; // sbit 형 선언 및 초기화 병행sbit bPat1 = bPat^1;sbit bPat2 = bPat^2;sbit bPat3 = bPat^3;void delay(unsigned int t) { while(t--);} void main(void){ unsigned char pat; bPat0 = 0; // 비트별 값 설정, 비트 단위 접근 bPat1 = 1;

Page 366: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

356 MCS-51 마이크로컴퓨터

bPat2 = bPat0; bPat3 = bPat1; pat = bPat; // 바이트 단위 접근 while(1) { PORT = pat; // PORT 변수는 P1을 의미 delay(50000); pat = ~pat; }}

데이터 형 : sfr, bit

다음 프로그램은 위의 예제와 동일한 기능을 하는 프로그램으로, bit형 변수를 선

언하여 구현한 것이다. 이 경우 bit형 선언과 초기화 과정을 분리하여 구현하여

야 한다.

//=================================// C51_02.C// data type : sfr and bit // P1_L : LED module//=================================#include <reg51.h>// sfr 형 및 sbit 형 선언sfr PORT = 0x90; // 절대 주소 설정으로 선언sbit p0 = PORT^0;// 특정 비트 위치의 접근을 위한 sbit 선언unsigned char bdata bPat; // bdata 메모리 형으로 선언bit bPat0; // bit형 변수 선언bit bPat1;bit bPat2;bit bPat3;void delay(unsigned int t) { while(t--);} void main(void){

Page 367: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제13장 C51 프로그래밍 357

unsigned char pat;bPat0 = bPat^0; // bit형 변수의 초기화bPat1 = bPat^1;bPat2 = bPat^2;bPat3 = bPat^3;

bPat0 = 0; // 비트별 값 설정, 비트 단위 접근 bPat1 = 1; bPat2 = bPat0; bPat3 = bPat1; pat = bPat; // 바이트 단위 접근 while(1) { PORT = pat; // PORT 변수는 P1을 의미 delay(50000); pat = ~pat; }}

메모리 형 지정 변수

다음 프로그램은 char 형 변수에 대해 각기 다른 메모리 형을 지정함으로써, 데

이터가 저장되는 메모리 영역에 대한 개념을 이해할 수 있는 예제이다.

//=================================// C51_03.C// memory type specific variable//=================================#include <reg51.h>extern void gotoMonitor(void);void main(void){ unsigned char xdata * resPtr = 0x8200; // 결과 저장 시작 주소 unsigned char data d1 = 0x11; // data영역내 임의주소에 값 0x11 unsigned char data d2 = 0x22; unsigned char data d3 = 0x33; unsigned char data d4 = 0x44; unsigned char idata d5 = 0x55; // idata 영역내 임의주소에 값 0x55

Page 368: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

358 MCS-51 마이크로컴퓨터

unsigned char bdata d6 = 0x66; // bdata 영역내 임의주소에 값 0x66 unsigned char xdata d7 = 0x77; // xdata 영역내 임의주소에 값 0x77 unsigned char code d8; // code 영역내 선언만 *(resPtr++) = d1; // 외부 메모리에 저장 *(resPtr++) = d2; *(resPtr++) = d3; *(resPtr++) = d4; *(resPtr++) = d5; *(resPtr++) = d6; *(resPtr++) = d7; *(resPtr++) = d8; *(resPtr++) = d1 + d2; // 연산 *(resPtr++) = d5 + d6; *(resPtr++) = &d7; // 변수가 저장된 위치 gotoMonitor(); // 모니터프로그램으로}

아래의 소스는 C51 소스의 실행 결과를 확인할 수 있도록, 모니터프로그램으로

실행의 흐름을 변경하기 위한 어셈블리 소스이다.

;=================================; monitor.ASM;=================================gotoMonitor SEGMENT CODE

PUBLIC _gotoMonitorRSEG gotoMonitor

_gotoMonitor:JMP 0000H ; 실행의 흐름을 모니터 프로그램으로RETEND

Page 369: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제13장 C51 프로그래밍 359

메모리 형 지정 포인터

다음 프로그램은 char 형 데이터를 지시하는 메모리 형 지정 포인터의 선언 및

활용 방법에 관련한 예제이다. 이 예제를 일반 포인터 변수에 적용하여 재구현한

후, 그 결과도 관찰하여 보자.

//=================================// C51_04.C// memory type specific pointer//=================================#include <reg51.h>extern void gotoMonitor(void);void main(void){ unsigned char xdata * resPtr = 0x8200; // 결과 시작 위치 unsigned char data * ptr1 = 0x40; // ptr to 40H in data unsigned char data * ptr2 = 0x41; unsigned char data * ptr3 = 0x42; unsigned char data * ptr4 = 0x43; unsigned char idata * ptr5 = 0x50; // ptr to 50H in idata unsigned char bdata * ptr6 = 0x20; // ptr to 20H in bdata unsigned char xdata * ptr7 = 0x8240; // ptr to 8240H in xdata unsigned char code * ptr8 = 0x0003; // ptr to 0003H in code *ptr1 = 0x11; // (40H) <- 0x11 *ptr2 = 0x22; *ptr3 = 0x33; *ptr4 = 0x44; *ptr5 = 0x55; // (50H) <- 0x55 *ptr6 = 0x66; // (20H) *ptr7 = 0x77; // (8240H) *ptr8; // can not write *(resPtr++) = *ptr1; // (8200H) <- (40h), 0x11 *(resPtr++) = *ptr2; *(resPtr++) = *ptr3; *(resPtr++) = *ptr4; *(resPtr++) = *ptr5; *(resPtr++) = *ptr6; *(resPtr++) = *ptr7; *(resPtr++) = *ptr8;

Page 370: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

360 MCS-51 마이크로컴퓨터

*(resPtr++) = *ptr1 + *ptr2; // 연산 *(resPtr++) = *ptr5 + *ptr6; gotoMonitor(); // 모니터프로그램으로}

데이터 전송

다음 프로그램은 외부 데이터 메모리 8100H 주소의 1바이트를 내부 데이터 메모

리 50H 주소에 전달하였다가, 다시 외부 데이터 메모리 8120H 번지로 전송하는

프로그램이다. 여기서 각 메모리 주소 지정을 위해 메모리 형 지정 포인터가 사

용되고 있음을 관찰할 수 있다.

//==============================// C51_05.C// data transfer//==============================#include <reg51.h>extern void gotoMonitor(void);void main(void) {

unsigned char xdata *src = 0x8100;unsigned char data *tmp = 0x50;unsigned char xdata *dst = 0x8120;// a data transfer*src = 0xF0; // 데이터 F0H *tmp = *src;*dst = *tmp;

gotoMonitor(); // 모니터프로그램으로}

Page 371: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제13장 C51 프로그래밍 361

외부 메모리 및 입출력 장치 접근 방법

다음의 프로그램들은 앞의 데이터 전송 예제를 바탕으로, 외부 메모리를 접근할

때에 각각 메모리 지정 포인터, 일반 포인터, 매크로, _at_ 키워드를 활용하여 접

근하도록 구현한 것이다.

//==============================// C51_06_1.C// data transfer ... using memory specific pointer//==============================#include <reg51.h>extern void gotoMonitor(void);// using memory specific pointer#define SRC (* (unsigned char xdata *)0x8101) #define DST (* (unsigned char xdata *)0x8141) void main(void) {

unsigned char data *tmp = 0x50;// a data transferSRC = 0x99; // 데이터 99H *tmp = SRC;DST = *tmp;

gotoMonitor(); // 모니터프로그램으로}

//==============================// C51_06_2.C// data transfer ... using generic pointer//==============================#include <reg51.h>extern void gotoMonitor(void); // using generic pointer#define SRC ((unsigned char *)0x028102) // xdata 8102H #define DST_PTR (*(unsigned char *)0x028142) // ptr xdata 8142H

Page 372: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

362 MCS-51 마이크로컴퓨터

void main(void) {unsigned char data *tmp = 0x50;// a data transfer*SRC = 0x99; // 데이터 99H *tmp = *SRC;DST_PTR = *tmp;

gotoMonitor(); // 모니터프로그램으로}

//==============================// C51_06_3.C// data transfer ... using Macro//==============================#include <reg51.h>#include <absacc.h> // include macro header fileextern void gotoMonitor(void);#define SRC 0x8103 // xdata memory#define TMP 0x50 // data memory 50H#define DST 0x8143 // xdata memoryvoid main(void) {

// a data transfer XBYTE[SRC] = 0x77; // xdata Macro XBYTE[]DBYTE[TMP] = XBYTE[SRC]; // data Macro DBYTE[]XBYTE[DST] = DBYTE[TMP];

gotoMonitor(); // 모니터프로그램으로}

//==============================// C51_06_4.C// data transfer ... using _at_ keyword//==============================#include <reg51.h>

Page 373: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제13장 C51 프로그래밍 363

extern void gotoMonitor(void);// using _at_ keywordunsigned char xdata SRC _at_ 0x8104; // memory unsigned char xdata DST _at_ 0x8144; // memory void main(void) {

unsigned char data *tmp = 0x50;// a data transferSRC = 0x99; // 데이터 99H *tmp = SRC;DST = *tmp;

gotoMonitor(); // 모니터프로그램으로}

블록 데이터 설정 및 전송

내부 데이터 메모리에 블록 데이터를 설정한 후, 외부 데이터 메모리로 블록 전

송함으로써, 메모리 형이 지정되지 않은 blk[] 배열이 내부 데이터 메모리에 위치

함을 확인할 수 있는 프로그램이다. 현재 내정된 메모리 모델은 small 모델이므

로 배열 blk[]는 내부 데이터 메모리에 위치하도록 컴파일러에 의해 형 지정된다.

//==============================// C51_07.C// block transfer//==============================#include <reg51.h>extern void gotoMonitor(void);void main(void) {

unsigned char blk[16]; // 내부 데이터 메모리에 위치 unsigned char xdata *dst = 0x8200;unsigned char i;// arr transferfor(i=0; i<16; i++) // data set

Page 374: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

364 MCS-51 마이크로컴퓨터

blk[i] = i*2;for(i=0; i<16; i++) // data transfer

*(dst+i) = blk[i]; gotoMonitor(); // 모니터프로그램으로}

비트 단위 전송

다음 프로그램은 비트 단위 전송 프로그램으로, 비트 주소 영역의 임의 주소에 1

바이트 데이터를 저장한 후, 이를 비트 단위로 접근하여 또 다른 임의 비트주소

영역의 번지에 역순으로 전송한 후, 그 결과를 확인하는 프로그램이다.

//==============================// C51_08.C// bit transfer//==============================#include <reg51.h>extern void gotoMonitor(void);unsigned char bdata src; sbit src0 = src^0;sbit src1 = src^1;sbit src2 = src^2;sbit src3 = src^3;sbit src4 = src^4;sbit src5 = src^5;sbit src6 = src^6;sbit src7 = src^7;unsigned char bdata dst;sbit dst0 = dst^0;sbit dst1 = dst^1;sbit dst2 = dst^2;sbit dst3 = dst^3;sbit dst4 = dst^4;sbit dst5 = dst^5;sbit dst6 = dst^6;

Page 375: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제13장 C51 프로그래밍 365

sbit dst7 = dst^7;void main(void) {

unsigned char xdata *res = 0x8100; src = 0x69; *(res++) = src; dst0 = src7; // bit transfer by reverse dst1 = src6; dst2 = src5; dst3 = src4; dst4 = src3; dst5 = src2; dst6 = src1; dst7 = src0; *(res++) = dst; *(res++) = &src; // get address of src *(res++) = &dst; gotoMonitor(); // 모니터프로그램으로}

C와 어셈블리 소스간 인터페이싱

C51 소스 프로그램과 어셈블리 소스 프로그램이 혼합되어 구성된 상황에서의 인

터페이싱을 이해하기 위한 예제 프로그램을 작성하고, 결과를 관찰한다. 특히, 함

수 호출에서 인자의 전달과 반환에 사용되는 레지스터들에 유의한다.

//======================================// C51_09.C// main c51 file ... interfacing c51 and asm files//======================================extern void gotoMonitor(void);extern int addIntChar(unsigned int, unsigned char); // assembly funcextern void writeMem8100(unsigned int); // assembly funcextern int subIntChar(unsigned int val1, unsigned char val2); // C funcvoid main(void) {

unsigned int xdata *mem = 0x8120;

Page 376: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

366 MCS-51 마이크로컴퓨터

unsigned int opr1, res;unsigned char opr2;opr1 = 0x1189; // intopr2 = 0x80; // charres = addIntChar(opr1, opr2);

// 인자로 unsigned int와 unsigned char를 전달// opr1은 R6, R7로, opr2는 R5로 전달, res는 R6, R7로 반환

writeMem8100(res); // res은 R6, R7로 전달res = subIntChar(opr1, opr2);*mem = res;

gotoMonitor(); // 모니터프로그램으로}

;======================================; C51_09_A.ASM; sub asm file ... interfacing c51 and asm files;======================================addIntChar SEGMENT CODE

PUBLIC _addIntCharRSEG addIntChar

_addIntChar: ; (R6, R7) <- (R6, R7) + (#0, R5)MOV A, R7ADD A, R5MOV R7, AMOV A, R6ADDC A, #0MOV R6, ARET

writeMem8100 SEGMENT CODEPUBLIC _writeMem8100RSEG writeMem8100

_writeMem8100: ; (8100H) <- (R6, R7)MOV DPTR,#08100HMOV A, R6MOVX @DPTR, AINC DPTR

Page 377: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제13장 C51 프로그래밍 367

MOV A, R7MOVX @DPTR, ARETEND

//======================================// C51_09_C.C// sub c51 file ... interfacing c51 and asm files//======================================int subIntChar(unsigned int val1, unsigned char val2) {

unsigned int tmp;tmp = val1 – val2;return tmp;

}

13.2.3 실습과제

[실습1] 블록 설정 및 전송

우선 외부 데이터 메모리에 한 뭉치의 데이터를 블록 설정한다. 이 데이터 블록

을 내부 데이터 영역으로 전송한다. 그런 후, 내부 데이터 메모리에 전송된 데이

터 블록을 다시 또 다른 외부 데이터 메모리 위치로 전송한다. 제반 필요한 사항

은 각자 정의한다.

[실습2] C와 어셈블리 소스와의 인터페이싱

본문에서 예시된 C51_09.C 소스를 실행하여 결과를 관찰한다. 또한 다음과 같이

인자의 순서를 바꾸어 호출할 때 동일한 기능을 하도록 어셈블리 소스를 재 구

현하여 보자.

res = addIntChar(opr2, opr1); // opr2는 int형, opr1은 char형

Page 378: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

368 MCS-51 마이크로컴퓨터

[실습3] C와 어셈블리 소스와의 인터페이싱

본문에서 예시된 C51_09.C 소스에 대하여 어셈블리로 작성된 서브루틴은 C51 함

수로, C51 소스로 작성된 함수는 어셈블리 소스로 재 구현한다.

[실습4] 순차 검색

내부 데이터 메모리에 데이터 블록을 대상으로 원하는 데이터를 검색하는 프로

그램을 C와 어셈블리 소스의 혼합형으로 작성한다. 단, 검색 시는 해당 위치 정

보를 기록하고, 그렇지 않은 경우는 FFH를 표시한다. 제반 필요한 사항은 각자

정의한다.

[실습5] 버블 정렬

외부 데이터 메모리에 데이터 블록을 대상으로 정렬하는 프로그램을 C와 어셈블

리 소스의 혼합형으로 작성한다. 또한, 최적화 문제를 고려하여 프로그램하고, 각

경우의 비교 연산 회수를 기록하여 비교하여 본다. 제반 필요한 사항은 각자 정

의한다.

Page 379: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제13장 C51 프로그래밍 369

13.3 포트 입출력

본 절에서는 입출력 포트로의 데이터 입출력과 관련하여 LED 제어와 관련한 시

간 지연 루틴 및 버튼 스위치 제어와 관련한 디바운싱 방법을 살펴보고, 관련 예

제 프로그램 및 응용 프로그램을 작성한다.

13.3.1 입출력

KUT51 실습 보드에서 입출력을 위해 사용할 수 있는 포트는 P1이다. 이 입출력

포트에 다양한 주변 모듈을 연결하여 해당 디바이스를 제어할 수 있다. 다음의

포트 입출력의 소스 예를 보인다. 즉, 포트를 대상으로 읽어오거나, 값을 출력하

는 것으로 입출력을 수행한다.

unsigned char tmp;tmp = P1; // input from P1P1 = 0x69; // output to P1

또한, 특정 버튼의 입력을 검사하거나 특정 핀으로 출력 경우, 마스킹 처리를 할

필요가 있다. 다음은 포트 P1의 하위 니블의 4비트에 스위치가 연결되어 있는 경

우라 가정하고 스위치 입력만 고려하는 경우의 마스킹 처리 예이다.

tmp = P1 & 0x0F; // 유효 하위 니블의 값만 tmp로 입력

또한, 디바이스의 구동이 정논리 혹은 부논리인가에 따라, 다음과 같이 처리하는

요령도 필요하다. 부논리의 디바이스가 연결된 경우로 포트로부터 입력받은 값을

비트 반전한 후, 활용하는 것이 바람직하다.

tmp = (~P1) & 0x0F; // 유효 하위 니블의 값만 tmp로 입력

특히 대표적인 출력 디바이스인 LED 모듈을 통해 결과를 시각적으로 확인할 수

있으며, 이 과정에서 시간 지연 루틴은 반드시 필요하다. 또한 입력 디바이스인

버튼 스위치를 누르거나 뗄 때, 기계적인 접점 형성으로 인한 채터링이 발생된

Page 380: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

370 MCS-51 마이크로컴퓨터

다. 이러한 채터링은 제거되어야 하며 이러한 과정을 디바운싱(debouncing)이라

한다. 다음의 두 절을 통하여 이러한 시간 지연 루틴과 디바운싱과 관련하여 설

명한다.

13.3.2 시간 지연 루틴

포트로의 입출력을 처리하는데 있어 유용한 루틴은 시간 지연 루틴이다. 예를 들

면, 어떤 데이터들을 연속으로 입출력 포트로 출력하는 경우 출력된 데이터를 사

람이 인지하도록 하는 것이 중요하다. 이 경우 인지할 수 있는 충분한 시간을 확

보하기 위해 데이터를 출력 후, 시간 지연 함수를 호출하는 방식으로 처리할 수

있다.

소프트웨어적인 시간 지연의 기본 원리는 다음과 같다. 각 명령마다 실행에 일정

량의 머신 사이클이 소요된다. 따라서 실행 흐름상 프로그램의 기능에 영향주지

않는 루틴을 반복 실행함으로써 그만큼의 시간 지연 효과를 얻게 되는 방식이다.

delay() 함수

다음의 시간 지연 함수는 인자로 넘겨받은 t값을 1씩 감소하여 0이 될 때까지의

소요 시간으로 시간 지연 효과를 주는 함수이다.

void delay(unsigned int t) {while(t--);

}

인자로 넘겨주는 t 값에 따라 어느 정도의 시간 지연이 발생하는지 궁금할 것이

다. 위의 함수 호출로 인하여 지연된 시간의 정확한 계산은 어셈블리 언어 수준

에서 분석해야 한다. 이 함수에 대한 어셈블리 소스는 다음과 같다.

MOV t,R6 ; 2T x 1MOV t+01H,R7 ; 2T x 1

?C0001:MOV A,t+01H ; 1T x (256 x R6 + R7 +1)DEC t+01H ; 1T x (256 x R6 + R7 +1)MOV R6,t ; 2T x (256 x R6 + R7 +1)JNZ ?C0104 ; 2T x (256 x R6 + R7 +1)

Page 381: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제13장 C51 프로그래밍 371

DEC t ; 1T x (R6 +1)?C0104:

MOV R7,A ; 1T x (256 x R6 + R7 +1)MOV A,R7 ; 1T x (256 x R6 + R7 +1)ORL A,R6 ; 1T x (256 x R6 + R7 +1)JNZ ?C0001 ; 2T x (256 x R6 + R7 +1)RET ; 2T x 1

위 루틴의 총 머신 사이클 합계에 대한 계산식은 다음과 같다.

(2817 x R6 + 11 x R7 + 18) T

위의 함수 호출 delay(0x1000)의 경우 R6에는 10H, 즉 16, 그리고 R7에는 00H,

즉 0이 설정되어 전달된다. 이를 위 수식에 대입하면 총 (2817 x 16 + 11 x 0 +

18) = 2817 x 16 + 18 = 45,090 T이다. 12MHz 발진자를 사용하는 실습 보드에

서 머신 사이클 1T는 1usec 이므로, 위의 시간 지연은 45,090usec이므로 약

0.45sec 정도이다.

그러면, 역으로 약 0.5sec의 시간 지연을 하기 위해서 인자 값을 얼마로 하여 호

출하여야 하는지 살펴보자. 실습 보드에서는 0.5sec를 위해서는 총 500,000T가

필요하다. 일단 R6의 값을 설정하기 위해 계수 2817로 나누면 177.49정도이므로,

R6에는 177, 즉 B1H로 설정한다. 이제 R6의 값을 177로 확정하고 R7의 값을 구

해 보면 다음과 같다.

2817 x 177 + 11 x R7 + 18 = 500000R7 = (500000 - (498609 + 18)) / 11 = 1373 /11 = 124.818 = 125 = 7DH

정확한 시간 지연이 곤란하므로 역으로 검산하여 차이를 살펴보면 2817 x 177 +

11 x 125 + 18 = 500002T로 의도했던 것보다 2T가 초과되나 무시하자. 따라서

다음과 같이 t 값으로 B17DH를 전달하여 호출하면, 500,002T로 약 0.5sec의 시

간 지연을 얻을 수 있으며, 이 t 값은 십진수로 45,437이다.

delay(0xB17D); // 약 0.5sec, t≅45,000

Page 382: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

372 MCS-51 마이크로컴퓨터

msec_delay() 함수

종종 단위 시간으로 시간 지연을 행하는 것이 편리한 경우가 있다. 다음의 함수

는 msec 단위의 시간 지연 함수를 정의한 것이다.

void msec_delay(unsigned int ms) {unsigned int i, j;for(i=1; i<=ms; i++)

for(j=1; j<=125; j++) ; // 1msec}

13.3.3 디바운싱

디바운싱(debouncing)은 [그림 13.6]과 같이 버튼 스위치와 같은 디바이스에서 접

점을 형성하는 과정에서 발생하는 떨림 현상, 즉, 기계적인 진동에 의해 접점이

형성되었다, 떨어졌다하는 현상인 채터링(chattering) 현상을 제거하는 처리를 말

한다. 이러한 채터링 현상은 스위치의 한번 눌림에 대해 MCU가 여러 번 눌린

것으로 오인할 우려가 있으므로 제거하는 것이 바람직하다. 일반적으로 이러한

진동은 스위치를 누를 때와 뗄 때 약 20~30ms정도 지속되는 것으로 알려져 있

다.

그림 13.6 채터링 효과

디바운싱 처리는 소프트웨어적으로는 두 가지 정도의 방법이 있으며, 하드웨어적

인 방법으로 슈미트 트리거를 이용한 디바운싱 회로를 구성하는 방법이 있다. 여

기서는 소프트웨어적인 방법으로 채터링을 제거하는 방법에 대해 소개한다.

Page 383: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제13장 C51 프로그래밍 373

시간 지연 루틴 활용

채터링은 대략 20~30msec동안 지속된다는 경험적인 지식을 바탕으로, 버튼 스위

치가 눌린 후 채터링 현상이 나타나는 시간동안 시간 지연을 두고, 뗄 때에도 채

태링 현상이 나타나는 시간동안 시간 지연을 두어 채터링을 제거하는 방법이다.

다음의 코드는 이와 같은 방법을 통해 포트 P1의 최상위 비트 위치의 버튼 스위

치에서 발생되는 채터링을 제거하는 디바운싱 루틴을 보여준다. 단 눌렸을 때

Low 신호가 인가된다고 가정한다.

:while((~P1 & 0x80) != 0x80) ; // 눌릴 때까지 대기msec_delay(30); // 30msec delay, 눌릴 때 디바운싱while((~P1 & 0x80) == 0x80) ; // 뗄 때까지 대기msec_delay(30); // 30msec delay, 뗄 때 디바운싱

:

다수 판독에 의한 안정화

이 방법은 일정한 시간 간격을 두고 여러 차례 읽어서 연속 같은 값이 나오면

안정화되었다고 간주하여, 그 때의 상태로서 버튼 스위치의 입력 여부를 결정하

는 방법이다. 다음의 코드는 스위치 신호에 대해 이러한 방법에 의해 안정된 입

력 값을 취해 이후의 처리를 진행하는 코드를 보여준다. 다음 소스에서 보듯이 2

차례의 판독과 1차 판독 이전 상태까지 고려하므로, 판독 상태가 바뀌고 2회의

판독시 동일한 값이 읽혀지면 새로운 입력이 들어 왔으며 안정되었다고 판단하

여 그 값을 입력 값으로 취급한다

// debouncing & inputunsigned char sw, sw1, psw=0;while(1) {

sw = P1 & 0x0F; // 1차 판독while(1) {

msec_delay(30); // 시간 지연sw1 = P1 & 0x0F; // 2차 판독if(sw == sw1) // 안정화

break;sw = sw1;

}

Page 384: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

374 MCS-51 마이크로컴퓨터

if(psw != sw) { // 1차 판독 이전과 상태 다른 경우만:// 안정화된 입력값 sw를 확보 함!!:

}psw = sw;

}

13.3.4 소프트웨어 모듈화

앞의 절에서 언급된 시간지연 루틴과 관련된 함수들은 포트 입출력과 관련하여

빈번히 사용될 수 있다. 따라서 이 함수들을 하나의 소프트웨어 모듈로 작성하여

재사용하는 것이 보다 효과적일 수 있다. 따라서 언급된 함수들을 하나의 파일로

묶어 다음과 같이 저장한다.

//======================================// delay.h// prototypes & delay routines//======================================#ifndef __INOUT_H__#define __INOUT_H__void delay(unsigned int t);void msec_delay(unsigned int ms);void delay(unsigned int t) {

while(t--);}void msec_delay(unsigned int ms) {

unsigned int i, j;for(i=1; i<=ms; i++)

for(j=1; j<=125; j++) ; // 1msec}#endif

Page 385: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제13장 C51 프로그래밍 375

위의 헤더 파일에는 함수 프로토타입과 함수 정의가 모두 하나의 파일에 포함되

어 있다. 이는 다음과 같이 프로토타입과 함수 정의 부분을 나누어서 두 개의 파

일로 재 표현할 수 있다.

//======================================// delay.h//======================================#ifndef __INOUT_H__#define __INOUT_H__void delay(unsigned int t);void msec_delay(unsigned int ms);#endif

//======================================// delay.c//======================================#include "delay.h"void delay(unsigned int t) {

while(t--);}void msec_delay(unsigned int ms) {

unsigned int i, j;for(i=1; i<=ms; i++)

for(j=1; j<=125; j++) ; // 1msec}

13.3.5 예제 프로그램

LED 제어

다음의 소스 코드는 일정 시간 주기, 즉 0.5sec 마다 포트 P1에 연결된 LED 모

듈의 최하위 비트부터 하나씩 이동 점등하기를 반복하는 프로그램이다. 포트 P1

Page 386: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

376 MCS-51 마이크로컴퓨터

의 하위 니블에 LED 모듈을 연결한다. LED 모듈은 Low 신호를 인가할 때 ON

됨을 상기한다.

//======================================// INOUT_01.C// LED control// P1_L : LED module //======================================#include <reg51.h>#include "delay.h"void main(void) {

unsigned char led;led = 0x01;while(1) {

P1 = ~led;delay(0xB17D); // 0.5secled = (led << 1); if(led == 0x10)

led = 0x01;}

}

버튼 입력에 대응하는 LED 점등

다음의 소스 코드는 스위치 모듈의 눌린 위치에 대응하여 LED 모듈의 대응

LED가 점등되는 프로그램이다. 포트 P1의 상위 니블 위치에 버튼 스위치 모듈

을 연결하고, 하위 니블 위치에 LED 모듈을 연결한다. 스위치가 눌렸을 때 Low

신호가 입력됨을 유의한다. 버튼 모듈에 슬라이드 스위치가 있다면 Gnd 쪽으로

위치시킨다.

//======================================// INOUT_02.C// Button switch & LED control// P1_H : Button module, P1_L : LED module //======================================#include <reg51.h>

Page 387: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제13장 C51 프로그래밍 377

void main(void) {unsigned char pat;pat = 0xFF; // initial pattern, all LED OFFP1 = pat;while(1) {

pat = P1; // input P1P1 = (pat >> 4) | 0xF0;

// output, swap high and low nibble}

}

채터링 현상

다음 프로그램은 버튼 모듈의 최상위 버튼을 누를 때마다, 패턴 이동이 발생하도

록 프로그램을 작성한 것이다. 하지만 한 번의 버튼 눌림에도 여러 차례 패턴이

이동되는 채터링 현상을 관찰할 수 있는 프로그램이다.

//======================================// INOUT_03.C// bouncing effect// P1_H : Button module, P1_L : LED module //======================================#include <reg51.h>void main(void) {

unsigned char pat;unsigned char in; pat = 0x01; // 정논리 패턴while(1) {

P1 = ~pat; while((~P1 & 0x80)) ; // wait until MSB release while(!(~P1 & 0x80)) ; // wait until MSB press

pat = (pat << 1);if(pat == 0x10)

pat = 0x01;

Page 388: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

378 MCS-51 마이크로컴퓨터

}}

디바운싱

다음 프로그램은 버튼 모듈의 어떠한 버튼이든 키를 눌렀다가 떼는 순간 LED

점등 패턴이 이동하는 프로그램으로 채터링 현상을 제거한 프로그램이다. 포트

P1의 상위 니블에는 버튼 모듈을, 하위 니블에는 LED 모듈을 연결한다.

//======================================// INOUT_04.C// debouncing ... using delay// P1_H : Button module, P1_L : LED module //======================================#include <reg51.h>#include "delay.h"void main(void) {

unsigned char pat;pat = 0x01;while(1) {

P1 = ~pat; // 패턴 출력 while(!(~P1 & 0xF0)) ; // 눌릴 때까지 대기

msec_delay(30); // 눌릴 때 디바운싱while(~P1 & 0xF0) ; // 뗄 때까지 대기msec_delay(30); // 뗄 때 디바운싱pat = (pat << 1);if(pat == 0x10)

pat = 0x01;}

}

이 예제에서 디바운싱 처리는 키 눌림 때와 키 놓음 때에 처리하고 있다. 키 눌

림 때의 채터링 제거는 다음 코드 부분과 같이 키 눌림이 발생할 때까지 대기하

다가 키 눌림이 발생하면 이후 경험적인 채터링 지속시간 만큼 시간 지연을 두

Page 389: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제13장 C51 프로그래밍 379

고 있다. 이 시간 지연으로 버튼이 눌린 후의 떨림 현상을 무시함으로써 디바운

싱하고 있다.

while(!(~P1 & 0xF0)) ; // 눌릴 때까지 대기msec_delay(30); // 눌릴 때 디바운싱

키 놓음 때의 채터링 제거는 다음 코드 부분과 같이 키 놓음이 발생할 때까지

대기하다가 키 놓음이 발생하면 이후 경험적인 채터링 지속시간 만큼 시간 지연

을 두고 있다. 이 시간 지연으로 버튼을 뗀 후의 떨림 현상을 무시함으로써 디바

운싱하고 있다.

while(~P1 & 0xF0) ; // 뗄 때까지 대기msec_delay(30); // 뗄 때 디바운싱

버튼이 눌리는 시점에서 패턴을 이동하도록 수정하려면, 패턴 출력 부분을 두 디

바운싱 처리 사이에 위치시키면 될 것이다.

13.3.6 실습과제

[실습1] 다수 판독에 의한 안정화로 디바운싱

제시된 디바운싱 처리 예제 프로그램을 활용하여, 다수 판독에 의한 안정화 처리

로 디바운싱하는 응용 프로그램을 작성한다.

[실습2] C51과 어셈블리 소스간 인터페이싱

예제 프로그램 중 시간 지연 함수를 호출하는 하나의 프로그램을 선택하여 동일

기능을 행하는 프로그램을 작성하되, 시간 지연 함수를 어셈블리 소스로 대체 작

성한다.

Page 390: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

380 MCS-51 마이크로컴퓨터

[실습3] FND 모듈 응용

FND 모듈에 16진수 숫자 패턴을 표시하는 프로그램을 작성한다. 단, 1sec마다

하나씩 증가된 16진 숫자 패턴이 출력되도록 하고, 포트 P1에 FND 모듈을 연결

한다. 또한 16진수 패턴은 배열에 초기 설정하여 사용한다.

[실습4] 스위치 입력 값만큼 LED 점멸

버튼 모듈을 통해 눌려진 4비트를 수치 값으로 간주하고, 이 수치 값만큼 모든

LED를 점멸하는 프로그램을 작성한다. 단, 포트 P1의 상위 니블에는 버튼 모듈

을, 하위 니블에는 LED 모듈을 연결한다.

[실습5] 버튼에 따라 다른 동작

각 버튼에 따라 각기 다른 동작을 하는 프로그램을 작성하되, 버튼에 따른 LED

모듈의 점등 패턴 및 동작을 함수로 정의한다. 단, 여러 개의 버튼이 동시에 눌

려지는 상황은 고려하지 않으며, 포트 P1의 상위 니블에는 버튼 모듈을, 하위 니

블에는 LED 모듈을 연결한다.

Page 391: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제13장 C51 프로그래밍 381

13.4 DotMatrix 및 Keypad 제어

본 절에서는 8x8 DotMatrix 모듈, 4x4 Keypad 모듈을 제어하기 위한 동적 제어

방법에 대해 설명하고, 각 모듈을 활용한 C51 예제 프로그램을 실습하고, 관련

응용 프로그램을 구현한다.

13.4.1 정적 제어 및 동적 제어

입출력 모듈을 제어하는 방법은 정적 제어 방법과 동적 제어 방법으로 나누어

볼 수 있다.

정적 제어(static control) 방법은 지금까지 입출력 모듈들을 제어한 방법이기도

하다. 즉, 버튼 모듈, LED 모듈 등에서 각 버튼, LED 당 하나씩 MCU의 입출력

핀을 할당하고, 각 입출력 핀에 1비트의 데이터를 출력 혹은 입력함으로써 디바

이스를 제어하는 방법이다. 이러한 제어 방법은 디바이스의 제어가 단순하다는

장점은 있으나, 키보드나 LED 전광판과 같이 제어해야 할 소자가 다수인 경우

해당 소자 개수만큼의 입출력 핀이 요구되는데, 이는 현실적으로 MCU가 충족시

키기 곤란하다 것이다.

반면, 동적 제어(dynamic control) 방법은 다수의 기본 디바이스로 구성된 입출

력 장치를 보다 적은 입출력 핀으로도 제어할 수 있는 방법이다. 동적 제어 방법

은 입출력 디바이스를 구성하고 있는 기본 소자 모두를 동시에 제어하는 것이

아니라 특정 시점에서 소자의 일부만을 제어하되, 짧은 시간차를 두어 또 다른

일부의 소자를 제어하는 방식으로 일정 시간 후 모든 소자를 제어하는 방법이다.

예로 출력 장치의 경우 인간 시각 체계의 잔상 효과를 이용하는 방법이기도 하

다. 이러한 동적 제어 방법은 해당 디바이스를 제어하는데 요구되는 입출력 핀의

수를 줄일 수 있으므로 한정된 입출력 핀만을 제공하는 MCU상에서 장점이 될

수 있으나, 소프트웨어적인 제어에 신경을 써야 한다.

13.4.2 DotMatrix 모듈

DotMatrix 모듈은 [그림 13.7]과 같이 LED가 2차원 평면으로 배열된 모듈이다.

Page 392: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

382 MCS-51 마이크로컴퓨터

이 DotMatrix 모듈을 온전히 제어하기 위해서는 8비트 포트 2개가 필요하다.

KUT51 실습 보드와 같이 포트 P1만이 가용할 경우는 C1~C4 열과 R1~R4 행의

LED로 구성된 4x4 DotMatrix로 취급할 수 있겠다.

그림 13.7 DotMatrix 모듈의 구성

DotMatrix 모듈의 동적 제어

DotMatrix 모듈을 제어하기 위해서는 열 Cn중 활성화 하고자하는 하나의 열에

대해서만 Low 신호를 인가하고, Rn에 표시할 패턴 데이터를 출력하는 식으로

제어한다. 실질적으로 한 시점에서 특정 열에 대한 LED 패턴만 출력하지만, 이

와 같은 과정으로 열을 바꾸어 가며 빠르게 패턴 데이터를 출력하면, 전체 LED

에 원하는 패턴을 출력하는 효과를 얻을 수 있다. 이를 DotMatrix의 동적 제어

라 한다.

다음의 코드는 이러한 동적 제어 과정을 프로그램 코드로 표현한 것으로, 각 열

에 Low 신호를 인가해 가면서 행에 FFH 패턴 데이터를 출력한다. 단, 8x8

DotMatrix 모듈을 제어하기 위한 8비트의 COLS라는 포트가 추가로 제공된다고

가정한 상황이다. 처리 결과는 DotMatrix 모듈 내의 모든 LED를 ON하는 결과

Page 393: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제13장 C51 프로그래밍 383

를 얻게 된다.

unsigned char colData = 0x01;unsighed char i;COLS = colData;i = 0;while(1) {

delay(10); // short delayif(++i == 8)

i = 0;COLS = ~(colData << i); // low signal to a colP1 = 0xFF; // all bits ON

}

13.4.3 Keypad 모듈

Keypad 모듈은 [그림 13.8]에 보이듯이 여러 개의 버튼 스위치가 2차원으로 배열

된 버튼 스위치 모듈로 생각할 수 있다.

그림 13.8 Keypad 모듈의 회로도

Page 394: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

384 MCS-51 마이크로컴퓨터

Keypad 모듈의 키 눌림 감지를 설명하기 위해 [그림 13.9]에서 보듯이 sw10의

버튼 스위치가 눌렸다고 가정한다. 이 sw10이 있는 열에 즉, 포트의 하위 니블을

통해 Low 신호를 인가하였을 때, 포트의 상위 니블을 통해 판독한 값에는 Low

신호를 갖는 비트가 존재한다. 이 때 하위 니블에 인가한 신호와 상위 니블을 통

해 판독한 신호를 조합하면, 해당 키에 대한 코드 값을 결정할 수 있다. 만일 이

러한 과정에서 어떠한 버튼도 눌리지 않으면, 판독한 값에는 Low 신호가 있을

수 없다.

그림 13.9 Keypad 모듈의 키 감지 원리

표 13.2 Keypad 모듈의 각 키의 코드값

키 상위니블 하위니블 코드값 키 상위니블 하위니블 코드값SW0 ~0x10 ~0x08 0x18 SW8 ~0x40 ~0x08 0x48SW1 ~0x10 ~0x04 0x14 SW9 ~0x40 ~0x04 0x44SW2 ~0x10 ~0x02 0x12 SW10 ~0x40 ~0x02 0x42SW3 ~0x10 ~0x01 0x11 SW11 ~0x40 ~0x01 0x41SW4 ~0x20 ~0x08 0x28 SW12 ~0x80 ~0x08 0x88SW5 ~0x20 ~0x04 0x24 SW13 ~0x80 ~0x04 0x84SW6 ~0x20 ~0x02 0x22 SW14 ~0x80 ~0x02 0x82SW7 ~0x20 ~0x01 0x21 SW15 ~0x80 ~0x01 0x81

Page 395: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제13장 C51 프로그래밍 385

[표 13.2]는 이러한 조합에 의해 결정된 각 키에 대한 코드 값을 정리한 것이다.

여기서, 각 키의 코드 값은 하위 니블에 인가된 신호에 비트 반전하고, 상위 니

블을 통해 판독된 신호를 비트 반전하여 논리합의 형태로 결정한다.

Keypad 모듈의 키 눌림을 인지하는 과정을 소스 코드로 표현하면 다음과 같다.

이를 키 스캔(key scan) 루틴이라고 하며, 다수의 키가 존재하는 디바이스에서

동적 제어를 하는 방법이다.

out = 0x01;for(i=0; i<4; i++) {

P1 = ~out; // 특정 열에 Low 신호 인가in = (~P1) & 0xF0; // 상위 니블 판독if(in) {

in |= out; // 코드 생성break;

}out <<= 1; // 다음 열

}

13.4.5 예제 프로그램

4x4 DotMatrix 제어

다음 프로그램은 포트 P1을 통해 4x4 DotMatrix를 동적 제어하는 프로그램으로,

실행 결과는 모듈의 대각선 상의 LED들을 점등하여 표시한다.

실습을 위해서는 4x4 DotMatrix를 제어하는 경우이므로 우선 [그림 13.10]과 같

이 회로를 구성한다. DotMatrix 모듈의 연결은 P1의 상위 니블에 C5,...,C8을 연

결하고, 하위 니블에 R1,...,R4를 연결한다. 아래 소스에서 지연 시간을 증가하면

서 결과를 관찰해 보도록 하자.

Page 396: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

386 MCS-51 마이크로컴퓨터

그림 13.10 4x4 DotMattrix 회로 구성

//===========================// DOTnKEY_01.C// 4x4 DotMatrix module, dynamic control// P1_H : C5..C8, P1_L : R1..R4//===========================#include <reg51.h>void delay(unsigned int t);void msec_delay(unsigned int ms);unsigned char pattern[] = {0x01, 0x02, 0x04, 0x08};void main(void) {

unsigned char i;unsigned char colData = 0x10;i = 0;while(1) {

msec_delay(5); // short delayif(++i == 4)

i = 0;P1 = (~(colData << i) & 0xF0 ) | pattern[i];

}}

Page 397: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제13장 C51 프로그래밍 387

Keypad 모듈 제어

다음 프로그램은 Keypad 모듈로부터 눌린 키의 코드 값을 외부 데이터 메모리

0x8600 번지부터 연속적으로 저장하는 프로그램이다. 단, 키 눌림 16회만 저장하

기로 한다. 결과를 확인하기 위해서는 프로그램 실행 종료 후, 메모리를 덤프하

여 관찰한다. 실습을 위해선 Keypad 모듈을 활용하여 [그림 13.8]과 같이 회로를

구성한다.

//===========================// DOTnKEY_02.C// 4x4 Keypad module, dynamic control// P1_H : IN0..IN3, P1_L : OUT0..OUT3//===========================#include <reg51.h>#include <stdio.h>#define KEYPAD P1#define SW0 0x18#define SW1 0x14#define SW2 0x12#define SW3 0x11#define SW4 0x28#define SW5 0x24#define SW6 0x22#define SW7 0x21#define SW8 0x48#define SW9 0x44#define SW10 0x42#define SW11 0x41#define SW12 0x88#define SW13 0x84#define SW14 0x82#define SW15 0x81#define NO_KEY 0x00unsigned char keyScan(void); unsigned char keyInput(void);unsigned char p_in = NO_KEY; // 유효한 이전 눌린 키unsigned char xdata * mem = 0x8600; // 눌린 키 값 저장 위치

Page 398: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

388 MCS-51 마이크로컴퓨터

void main(void) {unsigned char key;unsigned char cnt;cnt = 0;while(cnt<16) {

key = keyInput(); if(key!=NO_KEY) { printf("%x\n", key);

*(mem++) = key;cnt++;

}}

}unsigned char keyScan(void) {

unsigned char out, i, in;out = 0x01;for(i=0; i<4; i++) {

KEYPAD = ~out;in = (~KEYPAD) & 0xF0;if(in) {

in |= out; // 코드생성break;

}out <<= 1;

}return in;

}unsigned char keyInput(void) {

unsigned char in, in1;in = keyScan();while(1) {

in1 = keyScan();if(in == in1)

break;in = in1;

Page 399: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제13장 C51 프로그래밍 389

}if(!(in & 0xF0)) { // 어떤 키도 눌리지 않았다면

p_in = NO_KEY;return NO_KEY;

}if(p_in == in) // 이전키와 같다면, 눌리지 않은 것으로 간주

return NO_KEY;p_in = in;return in;

}

13.4.5 실습과제

[실습1] DotMatrix 모듈

DotMatrix에 표시될 여러 개의 문자 혹은 도형의 패턴을 설계하고, 이를 연속적

으로, 그리고 반복적하여 표시하는 프로그램을 구현한다.

[실습2] Keypad 제어용 소프트웨어 모듈

Keypad 모듈을 제어하기 위한 변수 및 함수를 헤더 파일 및 소스 파일로 분할

하여 모듈화 하고, 이를 활용하여 예제의 프로그램을 재 구현한다. 단, Keypad I

제어용 소프트웨어 모듈 파일 중 헤더 파일의 이름은 keypad.h로, C 소스파일은

keypad.c로 한다.

[실습3] Keypad 모듈

Keypad 모듈을 [그림 13.11]과 같이 16진 숫자 키패드라 간주되도록 각 키에 숫

자를 정의하고, Keypad 모듈에서 눌린 숫자를 메모리의 특정 위치에 저장하는

프로그램을 작성한다. 단, 앞의 [실습2]를 통해 구성한 Keypad 모듈의 소프트웨

어 모듈을 활용한다. 기타 제반 사항은 각자 정의한다.

Page 400: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

390 MCS-51 마이크로컴퓨터

그림 13.11 16진수 키패드로 키 정의

[실습4] Keypad 모듈

외부 데이터 메모리 0x8500 번지부터 Keypad 모듈로부터 눌린 키에 대응하는

문자의 코드 값을 연속적으로 저장하는 프로그램을 구현한다. 단, 각 키의 정의

는 휴대폰 키패드를 모사하고, 나머지의 4개 키들에는 각 키가 눌리면 입력 모드

가 전환되도록 한다. 입력 모드에 따른 문자 셋은 [그림 13.12]를 참조한다. 결과

를 확인하기 위해서는 프로그램 실행 종료 후 메모리를 덤프하여 관찰한다.

그림 13.12 입력 모드에 따른 문자 셋

Page 401: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제13장 C51 프로그래밍 391

13.5 CLCD 제어

본 절에서는 CLCD를 제어하는 C51 프로그래밍에 관련된 예제 프로그램을 살펴

보고, 이를 활용한 응용 프로그램을 작성한다.

13.5.1 CLCD 제어 함수

busy flag 비트 검사

CLCD 명령 혹은 데이터를 기록하기에 앞서 비지 플래그 비트를 검사하거나, 시

간지연을 두는 방식을 취해야 한다. 이들 함수는 인터페이스 모드에 상관없이 적

용될 수 있는 함수들이다.

// busy flag checkvoid checkBF(void) {

while(LCD_INST_RD & 0x80) ; // wait until BF==0}checkBF() 함수를 비지 플래그 검사없이 시간 지연 루틴을 이용하여 재 작성하

면, 각 명령의 실행에 요구하는 충분한 시간 지연을 줌으로써 다음과 같이 구성

할 수 있다. 명령 중 가장 긴 시간을 요구하는 것이 1.54msec 이므로, 이보다 큰

2msec라는 충분한 시간 지연을 둠으로써 비지 플래그 체크를 대신할 수 있다.

// delay instead of busy flag checkvoid delayBF(void) {

msec_delay(2); // 2msec delay}

8비트 인터페이스용 소프트웨어 모듈

8비트 인터페이스로 CLCD를 제어하기 위해 사용하는 명령 및 데이터들은 바이

트 단위로 CLCD에 전달되어야 한다. 아래에서 8비트 모드로 제어하는데 필요한

초기화 및 관련 함수들을 소프트웨어 모듈 형태로 제시한다.

//======================================// file : clcd8.h

Page 402: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

392 MCS-51 마이크로컴퓨터

// LCD 8bit interface//======================================#ifndef __CLCD8_H__#define __CLCD8_H__#define LCD_I_WR (*(unsigned char xdata *)0xF800)#define LCD_D_WR (*(unsigned char xdata *)0xF801)#define LCD_I_RD (*(unsigned char xdata *)0xF802)#define LCD_D_RD (*(unsigned char xdata *)0xF803)void initLCD_8(void); void writeCommand_8(unsigned char cmd);void putChar_8(unsigned char ch); void putStr_8(unsigned char *str); void checkBF(void); void delayBF(void);#endif

//======================================// file : clcd8.c// LCD 8bit interface//======================================#include "clcd8.h"#include "delay.h"// LCD init.void initLCD_8(void) {

delay(400);writeCommand_8(0x38); // Function Set, 8bit interface modewriteCommand_8(0x38);writeCommand_8(0x38);writeCommand_8(0x08); // Display on, cursor off, blink offwriteCommand_8(0x0E); // Display on cursor on, blink off writeCommand_8(0x06); // cursor increment, no shift

}// LCD command writevoid writeCommand_8(unsigned char cmd) {

checkBF(); // check Busy Flag

Page 403: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제13장 C51 프로그래밍 393

LCD_I_WR=cmd;}// LCD data write(write a char to LCD) void putChar_8(unsigned char ch) {

checkBF();LCD_D_WR = ch;

}// write a string to LCDvoid putStr_8(unsigned char *str) {

unsigned char i;i = 0;do {

putChar_8(str[i]);} while(str[++i] != 0); // check end of string

}// busy flag checkvoid checkBF(void) {

while(LCD_I_RD & 0x80) ; // wait until BF==0}// delay instead of busy flag checkvoid delayBF(void) {

msec_delay(2);}

4비트 인터페이스용 소프트웨어 모듈

4비트 인터페이스로 CLCD를 제어하기 위해 사용하는 8비트 명령 및 데이터들은

4비트 단위로 나뉘어 상위 니블이 먼저 전달된 후, 하위 니블이 전달되어야 한

다. 다음에서 4비트 인터페이스로 CLCD를 제어하는데 필요한 초기화 및 관련

함수들을 소프트웨어 모듈 형태로 제시한다.

//======================================// file : clcd4.h// LCD 4bit interface

Page 404: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

394 MCS-51 마이크로컴퓨터

//======================================#ifndef __CLCD8_H__#define __CLCD8_H__#define LCD_I_WR (*(unsigned char xdata *)0xF800)#define LCD_D_WR (*(unsigned char xdata *)0xF801)#define LCD_I_RD (*(unsigned char xdata *)0xF802)#define LCD_D_RD (*(unsigned char xdata *)0xF803)void initLCD_4(void); void writeCommand_4(unsigned char cmd);void putChar_4(unsigned char ch); void putStr_4(unsigned char *str); void checkBF(void); void delayBF(void);#endif

//======================================// file : clcd4.c// LCD 4bit interface//======================================#include "clcd4.h"#include "delay.h"// LCD init.void initLCD_4(void) {

delay(1500);writeCommand_4(0x20);delay(500);writeCommand_4(0x20);delay(100);writeCommand_4(0x22);writeCommand_4(0x28); // Function Set, 4bit interface modewriteCommand_4(0x28);writeCommand_4(0x28);writeCommand_4(0x08); // Display on, cursor off, blink offwriteCommand_4(0x0E); // Display on cursor on, blink off writeCommand_4(0x06); // cursor increment, no shift

}

Page 405: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제13장 C51 프로그래밍 395

// LCD command writevoid writeCommand_4(unsigned char cmd) {

unsigned char tmp;checkBF(); // check Busy Flagtmp = cmd & 0xF0; // get higher nibbleLCD_I_WR = tmp;checkBF(); // check Busy Flagtmp = cmd & 0x0F; // get lower nibbletmp <<= 4; // shift to higher nibbleLCD_I_WR = tmp;

}// LCD data write(write a char to LCD) void putChar_4(unsigned char ch) {

unsigned char tmp;checkBF();tmp = ch & 0xF0; // get higher nibbleLCD_D_WR = tmp;checkBF();tmp = ch & 0x0F; // get lower nibbletmp <<= 4; // shift to higher nibbleLCD_D_WR = tmp;

}// write a string to LCDvoid putStr_4(unsigned char *str) {

unsigned char i;i = 0;do {

putChar_4(str[i]);} while(str[++i] != 0); // check end of string

}// busy flag checkvoid checkBF(void) {

while(LCD_I_RD & 0x80) ; // wait until BF==0}

Page 406: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

396 MCS-51 마이크로컴퓨터

// delay instead of busy flag checkvoid delayBF(void) {

msec_delay(2);}

위의 초기화 함수 initLCD_4()에서 writeCommand_4(0x28)로 인자로 0x28을 전

달하여 호출하면, 상위 니블 0x20이 출력된 후, 하위 니블 0x08이 비트 단위 좌

측 쉬프트 4회를 하여 0x80으로 된 후, 인터페이스의 상위 니블 라인으로 CLCD

에 전달된다.

사용자 문자 패턴 등록 및 표시

사용자 문자 패턴을 등록하기 위해서는 CG RAM의 주소를 설정하는 명령을 통

해 등록할 CG RAM의 주소를 설정한다. 00_0000B를 주소로 설정하는 경우 명령

은 0100_0000B 즉, 0x40이다. 이 CLCD 명령을 writeCommand() 함수를 호출하

여 인자로 넘겨준다. 그런 후, 데이터 쓰기 명령인 putChar() 함수를 통하여, 패

턴을 연속하여 등록한다. 등록할 때마다 CG RAM의 주소는 1씩 자동 증가하므

로, 주소에 신경 쓸 필요 없다.

사용자 문자 패턴의 등록은 CG RAM의 문자 주소 00H부터 07H까지 8개 주소

공간만이 가능함을 상기한다. 이는 CLCD에 표시할 사용자 문자 패턴의 주소 또

한 00H부터 07H까지 8개 주소 공간만이 가능함을 의미한다. 만일 문자 주소

00H를 주고 데이터 쓰기를 행하면, CG RAM의 00_0000B부터 00_0111B까지의

패턴 데이터들이 한 문자로서 CLCD에 표시된다.

13.5.2 예제 프로그램

8비트 인터페이스 제어

다음의 소스 코드는 CLCD에 두 줄의 문자열을 출력하는 프로그램이다. 제어를

위해 CLCD의 주소를 접근하기 위해 포인터를 사용하고, 8비트 제어 모드, 비지

플래그를 검사하여 동작되도록 작성한 프로그램이다.

//======================================// CLCD_01.C// 8bit interface, BF check

Page 407: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제13장 C51 프로그래밍 397

// software module : clcd8.h, clcd8.c//======================================#include "clcd8.h"void main(void) {

initLCD_8(); // initialize LCDwriteCommand_8(0x01); // 1st lineputStr_8("KUT 8051 Board");writeCommand_8(0xC0); // 2nd lineputStr_8("LCD Test OK!");while(1) ; // loop

}

4비트 인터페이스 제어

다음의 소스 코드는 CLCD에 두 줄의 문자열을 출력하는 프로그램이다. 제어를

위해 CLCD의 주소를 접근하기 위해 포인터를 사용하고, 4비트 제어 모드, 비지

플래그를 검사하여 동작되도록 작성한 프로그램이다.

//======================================// CLCD_02.C// 4bit interface, BF check// software module : clcd4.h, clcd4.c//======================================#include "clcd4.h"void main(void) {

initLCD_4(); // initialize LCDwriteCommand_4(0x01); // 1st lineputStr_4("KUT 8051 Board");writeCommand_4(0xC0); // 2nd lineputStr_4("LCD Test OK!");while(1) ; // loop

}

Page 408: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

398 MCS-51 마이크로컴퓨터

CG RAM/CG ROM의 문자 표시

다음의 프로그램은 CG RAM과 CG ROM내의 문자 패턴을 1sec마다 하나씩 표

시하는 프로그램이다. 1sec 마다 다음 주소의 내용이 표시되도록 한다. 이들 문

자 패턴이 저장된 곳의 첫 주소는 0x00번지부터 시작하므로, 이 주소부터 문자

패턴을 출력하면서 주소 값을 1씩 증가하도록 구현한다.

//======================================// CLCD_03.C// display char. patterns in CG RAM/ROM// software module : clcd8.h, clcd8.c//======================================#include "clcd8.h"#include "delay.h"static unsigned char lcdTitle[] = "CG RAM/ROM Pats ";void main(void) { unsigned char ch;

unsigned char cnt;initLCD_8(); // initialize LCDwriteCommand_8(0x01); // 1st lineputStr_8(lcdTitle); // put titlewriteCommand_8(0xC0); // 2nd lineputStr_8("....... ");cnt = 0;while(1) { writeCommand_8(0xCA); // 2nd line, 10Col

ch = (unsigned char)cnt; putChar_8(ch);

delay(50000); // 0.5 sec

delay(50000); // 0.5 sec cnt++; }}

Page 409: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제13장 C51 프로그래밍 399

사용자패턴 등록 및 출력

다음의 프로그램은 CLCD에 사용자 패턴을 등록하고 이를 출력하는 프로그램이

다. 사용자 패턴으로 한글 '마이크로프로세서'라는 문자열을 출력할 수 있도록 8

개의 문자 패턴을 정의하여 등록하고, 이를 CLCD의 두 번째 라인에 출력한다.

아래 소스에서 'clcd8.h' 헤더 파일은 앞에서 살펴본 8비트 인터페이스 모드 예제

중 main() 함수를 제외한 모든 내용을 포함하고 있다.

//======================================// CLCD_04.C// 8bit interface, user pattern// software module : clcd8.h, clcd8.c//======================================#include "clcd8.h"void regUserPattern(void);void putUserPattern(void);static unsigned char lcdTitle[] = "KOREATECH DICE";unsigned char userPattern[64] = { // 5x8 font

0x1E, 0x12, 0x1E, 0x00, 0x04, 0x07, 0x04, 0x04, //마0x09, 0x15, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, //이0x1F, 0x01, 0x07, 0x01, 0x00, 0x1F, 0x00, 0x00, //크0x1F, 0x01, 0x1F, 0x10, 0x1F, 0x00, 0x04, 0x1F, //로0x1F, 0x0A, 0x0A, 0x1F, 0x00, 0x1F, 0x00, 0x00, //프0x1F, 0x01, 0x1F, 0x10, 0x1F, 0x00, 0x04, 0x1F, //로0x04, 0x0A, 0x11, 0x00, 0x05, 0x1D, 0x05, 0x05, //세0x04, 0x0A, 0x11, 0x00, 0x01, 0x1F, 0x01, 0x01 //서

};void main(void) {

initLCD_8(); // initialize LCDregUserPattern(); // register user patternswriteCommand_8(0x01); // 1st lineputStr_8(lcdTitle); // put titlewriteCommand_8(0xC0); // 2nd lineputUserPattern(); // put user patternswhile(1) ; // loop

Page 410: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

400 MCS-51 마이크로컴퓨터

}void regUserPattern(void) {

unsigned char cmd;unsigned char i;cmd = 0x40; // 0100_0000, CG_RAM addresswriteCommand_8(cmd);for(i=0; i<64; i++)

putChar_8(userPattern[i]);}void putUserPattern(void) {

unsigned char addr;for(addr=0; addr<8; addr++)

putChar_8(addr); // addr is pattern address}

13.5.3 실습과제

[실습1] CLCD 주소 접근 방법

제시된 예제 프로그램은 CLCD를 제어하기 위한 주소를 접근하는데 있어 포인터

가 사용되었다. 이를 매크로를 이용하여 접근하도록 재작성하고 결과를 살펴본

다. 또한 _at_ 키워드를 이용한 방법으로 재작성하여 결과를 살펴본다. 8비트 모

드 제어 부분에서의 예제 'CLCD_01.C'를 활용한다.

[실습2] 사용자 문자 패턴

'CLCD_04.C' 프로그램은 CLCD에 보일 문자 패턴을 정의하여 CG RAM에 기록

하고, 이 정의된 문자를 CLCD에 출력하는 프로그램이다. 단 CG RAM에 등록할

때, 예제 프로그램과 같이 각 문자 패턴을 순차적으로 등록하지 말고, 임의 순서

로 등록한다. 예를 들면 예제와 같은 “마이크로프로세서"문자열의 패턴에 대해

문자 주소 05H번지에 문자 패턴 '마'를 등록하고, 그 다음에 01H번지에 문자 패

Page 411: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제13장 C51 프로그래밍 401

턴 '이'를 등록하는 방식으로 등록한다. 그런 후, 출력할 때는 “마이크로프로세서

"로 보이도록 한다.

[실습3] 사용자 문자 패턴

KUT51 실습 보드의 모니터 프로그램으로는 내부 데이터 메모리의 내용을 직접

확인할 방법이 없어, 우회적으로 내부 데이터 메모리의 내용을 외부 데이터 메모

리에 블록 전송하여 확인 하는 방식으로 내부 메모리 내용을 확인하였다. CLCD

에 내부 메모리의 해당 주소에 어떠한 값이 들어 있는지를 표시하는 프로그램을

작성한다.

[실습4] 휴대전화 문자패턴 입력

[그림 13.13]과 같이 휴대폰 키패드 배열과 흡사하게 Keypad 모듈의 각 키를 정

의하고, 해당 키를 누르면 대응 문자가 CLCD에 표시되도록 프로그램을 작성한

다. 포트 P1에 Keypad 모듈을 연결한다. 또한 여러 문자를 입력할 수 있도록 프

로그램을 재작성하고, 나머지의 키에 기타의 기능을 각자 정의하여 추가 구현한

다. 예를 들면 최근 입력 문자 한자를 삭제(back), 입력된 모든 문자열 삭제

(clear), 입력모드설정 기능(imod) 등의 기능들을 생각할 수 있다.

그림 13.13 키패드 모듈의 기능 정의

Page 412: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

402 MCS-51 마이크로컴퓨터

13.6 외부 인터럽트

본 절에서는 외부 인터럽트를 취급하는 C51 프로그래밍에 관련된 예제 프로그램

을 살펴보고, 이를 활용한 응용 프로그램을 작성한다.

13.6.1 인터럽트 취급

MCS-51 MCU에서 인터럽트를 취급하는 C51 프로그램을 작성할 때는 앞에서

소개하였듯이, 스타트업 코드 파일을 추가해 주어야 하며, 내용 일부를 수정해야

함을 상기하자. 또한 인터럽트 서비스 루틴을 작성하는 것은 일반 함수를 작성하

는 것과는 다르다는 것을 상기하자.

외부 인터럽트 서비스 루틴을 작성할 경우에, 스타트업 코드 파일에서 외부 인터

럽트와 관련된 부분을 수정한다. 다음의 코드는 외부 인터럽트 INT0에 대한 인

터럽트 서비스 루틴을 정의할 경우에 한해 주석 해제한 부분을 보인다.

⋮EXTRN CODE (INT0_ISR)⋮CSEG AT 8000H ; start address of user program

?C_STARTUP: LJMP STARTUP1CSEG AT 8003HLJMP INT0_ISR⋮

13.6.2 예제 프로그램

외부 인터럽트 : 인터럽트 구동 방식

다음의 소스 코드는 Normal 상태에서는 LED 하나씩 상위 비트 쪽으로 회전하면

서 점등하기를 반복한다. 그러다 외부 인터럽트 INT0가 요청되면 모든 LED를 1

회 점멸한다. P1의 하위 니블에 LED 모듈을 연결한다. 인터럽트 구동 방식

Page 413: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제13장 C51 프로그래밍 403

(interrupt driven method)에 의해 구현한 것이다. 인터럽트 요청되어 점멸 후

normal 상태로 복귀할 때, 인터럽트가 요청되지 않았다면 진행해야 할 패턴이 제

대로 출력되는지 관찰한다.

//======================================// INT0_01.C// interrupt driven method// normal : pattern shift, INT0 : blink// P1_L : LED module//======================================#include <reg51.h>#include "delay.h"// external INT0 ISRvoid INT0_ISR(void) interrupt 0 {

unsigned char blink = 0x00;P1 = blink;delay(50000);P1 = ~blink;delay(50000);

}void main(void) {

unsigned char pat;IT0 = 1; // edge triggerEX0 = 1; // INT0 enableEA = 1; // global enable

pat = 0xFE;while(1) {

P1 = pat ;delay(50000);pat = (pat << 1) | 1;if(!(pat & 0x10))

pat = 0xFE;}

}

Page 414: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

404 MCS-51 마이크로컴퓨터

외부 인터럽트 : 폴링 방식

다음 프로그램은 위의 인터럽트 구동 방식의 프로그램과 동일 기능의 프로그램

으로, 폴링 방식에 의해 구현한 것이다.

//======================================// INT0_02.C// polling method// normal : pattern shift, INT0 : blink// P1_L : LED module//======================================#include <reg51.h>#include "delay.h"void main(void) {

unsigned char blink = 0x00;unsigned char pat;IT0 = 1; // edge trigger

IE0 = 0; // flag clear

pat = 0xFE;while(1) {

P1 = pat ;delay(50000);pat = (pat << 1) | 1;if(!(pat & 0x10))

pat = 0xFE; if(IE0) { // interrupt service code

P1 = blink; delay(50000); P1 = ~blink; delay(50000);

IE0 = 0; // flag clear }

} }

Page 415: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제13장 C51 프로그래밍 405

13.6.3 실습과제

[실습1] LED 상태 횟수만큼 점멸

포트 P1의 하위 니블에 LED 모듈을 연결하고, Normal 상태에서는 최하위의

LED부터 하나씩 차례로 ON하다가 외부 인터럽트 INT0가 발생하면 그때의

LED 상태 값의 횟수만큼 모든 LED를 점멸하는 프로그램을 작성한다. 인터럽트

구동 방식에 의해 구현한다. 또한 동일한 동작을 폴링 방식에 의해 재 구현한다.

[실습2] FND 모듈을 이용한 자모음 패턴 출력

포트 P1에 FND 모듈을 연결하고, Normal 상태에서는 본인 이름의 자모음 패턴

을 반복하여 출력하다가, 외부 인터럽트 INT0가 발생하면 이성 친구 이름의 자

모음 패턴을 1회 출력하는 프로그램을 작성한다. 단, 인터럽트 구동 방식에 의해

구현한다. 또한 동일한 동작을 수행하도록 폴링 방식에 의해 재 구현한다.

[실습3] 숫자 맞추기

Keypad 모듈과 CLCD를 활용하여 다음과 같은 동작을 하는 숫자 맞추기 프로그

램을 작성한다. Normal 1 상태에서는 0부터 16까지의 숫자를 계수하기를 반복한

다. INT0 요청이 들어오면 현재의 계수 값을 보관한다. 이는 게임자가 맞추어야

숫자이다. 이제 Normal 2 상태에 진입하고, 이 상태에서는 16진 Keypad 모듈로

부터 키 입력을 받아, 맞출 수와 비교 후 CLCD에 크다, 작다를 표시하고 재입력

받는다. 일치하는 경우 CLCD에 같다고 표시하고 Normal 1 상태로 진입한다.

Page 416: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

406 MCS-51 마이크로컴퓨터

13.7 타이머/카운터 인터럽트

본 절에서는 타이머/카운터 인터럽트를 취급하는 C51 프로그래밍에 관련된 예제

프로그램을 살펴보고, 이를 활용한 응용 프로그램을 작성한다.

13.7.1 타이머/카운터

타이머/카운터 인터럽트 서비스 루틴을 작성할 경우에, 스타트업 코드 파일에서

타이머/카운터 인터럽트와 관련된 부분을 수정한다. 다음의 코드는 타이머/카운

터 인터럽트 T/C0에 대한 인터럽트 서비스 루틴을 정의할 경우에 한해 주석 해

제한 부분을 보인다.

⋮EXTRN CODE (TC0_ISR)⋮CSEG AT 8000H ; start address of user program

?C_STARTUP: LJMP STARTUP1CSEG AT 800BHLJMP TC0_ISR⋮

13.7.2 예제 프로그램

타이머 모드

다음의 소스 코드는 인터럽트 방식에 의해 구현된 타이머 모드의 프로그램이다.

타이머 인터럽트 T/C0가 요청될 때, LED의 점등을 좌로 1비트 이동하는 인터럽

트 서비스 루틴이 실행된다.

//======================================// TCNT_01.C// T/C0, Timer, mode 1, interrupt driven

Page 417: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제13장 C51 프로그래밍 407

// P1_L : LED module//======================================#include <reg51.h>unsigned char pat;void TC0_ISR(void) interrupt 1 {

TR0 = 0; // T/C0 stoppat = (pat << 1) | 0x01; // move left 1 bitif((pat & 0x10) == 0)

pat = 0xFE;P1 = pat; // output the pat to P1TH0 = 0; // timer constantTL0 = 0;TR0 = 1; // T/C0 run

} void main(void) {

TMOD = 0x01; // T/C0, timer, mode 1TH0 = 0; // timer constantTL0 = 0;PT0 = 0; // T/C0 priorityET0 = 1; // enable T/C0 interruptEA = 1; // enable all interruptpat = 0xFE; // initial patP1 = pat;TR0 = 1; // T/C0 runwhile(1) ; // loop

}

Page 418: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

408 MCS-51 마이크로컴퓨터

카운터 모드

다음의 소스 코드는 카운터 모드의 인터럽트를 제어하는 프로그램으로, 폴링 방

식으로 구현한 것이다. LED 모듈을 P1의 하위 니블에 연결한다. 외부에서 T0핀

으로 입력되는 하나의 사건이 발생되면 인터럽트가 요청되며, 요청될 때마다

LED를 좌로 이동하여 점등한다.

//======================================// TCNT_02.C// T/C0, Counter, mode 0, polling // P1_L : LED module//======================================#include <reg51.h>void main(void) {

unsigned char pat;TMOD = 0x06; // T/C0, counter mode, mode 0TH0 = 255; // timer constantTL0 = 255;

pat = 0xFE; // initial patternwhile(1) {

P1 = pat; // outputTR0 = 1; // T/C0 runTF0 = 0; // overflow clearwhile(!TF0) ; // wait until overflow, polling// following is interrupt service codeTR0 = 0; // overflow clearpat = (pat << 1) | 0x01; // shift left and OR 01if((pat & 0x10) == 0)

pat = 0xFE; // initial pattern}

}

Page 419: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제13장 C51 프로그래밍 409

13.7.3 실습과제

[실습1] 게이트 모드

앞의 첫 번째 예제 프로그램은 오버플로가 빈번히 발생하여 LED의 점등 패턴

이동이 빠르다. 이 예제 프로그램에서 10배 느리게 패턴 이동이 발생하도록 재

구현한다. 또한 게이트 모드도 허용할 수 있도록 한다. 즉, 실습 보드의 INT0 버

튼 스위치를 이용하여 타이머/카운터의 업 카운팅을 정지/개시할 수 있도록 구현

한다.

[실습2] 타이머 모드 응용

FND 모듈을 사용하여 Normal 상태에서는 각 세그먼트를 하나씩 차례로 ON하

기를 반복하다가, 타이머/카운터 T/C0가 발생하면 본인 이름의 자모음 패턴을 1

회 출력하는 프로그램을 작성한다. 포트 P1에는 FND 모듈을 연결한다. 단, 인터

럽트 방식에 의해 구현한다. 추가로 동작 모드를 달리하여 모드 0, 모드 2, 모드

3에 대해 동일한 기능을 하도록 재 구현한다.

[실습3] 카운터 모드 응용

T0 핀으로부터의 신호를 자동차 이동이라고 가정하여, 자동차의 교통량을 계측

하는 프로그램을 작성한다. 단, 10대의 차량이 이동하였을 때마다 인터럽트가 요

청되도록 구현하며, 기타 제반 필요한 사항은 각자 정의한다.

[실습4] DC 모터의 PWM 제어

PWM 제어에 의해 DC 모터의 속도를 조절하는 프로그램을 작성한다. 듀티비를

증가/감소하기 위해 버튼 스위치 모듈을 사용한다. 단, 단위 시간을 위해 타이머/

카운터를 사용하며, 제반 필요한 사항은 각자 정의하여 구현한다. 포트 P1의 하

위 니블에는 버튼 스위치 모듈을, 상위 니블의 한 핀에는 DC 모터의 입력 단자

를 연결한다.

Page 420: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

410 MCS-51 마이크로컴퓨터

13.8 시리얼 인터럽트

본 절에서는 시리얼 인터럽트를 취급하는 C51 프로그래밍에 관련된 예제 프로그

램을 살펴보고, 이를 활용한 응용 프로그램을 작성한다.

13.8.1 시리얼 통신

시리얼 인터럽트 서비스 루틴을 작성할 경우에, 스타트업 코드 파일에서 시리얼

인터럽트와 관련된 부분을 수정한다. 다음의 코드는 시리얼 인터럽트에 대한 인

터럽트 서비스 루틴을 정의할 경우에 한해 주석 해제한 부분을 보인다.

⋮EXTRN CODE (SERIAL_ISR)⋮CSEG AT 8000H ; start address of user program

?C_STARTUP: LJMP STARTUP1CSEG AT 8023HLJMP SERIAL_ISR⋮

시리얼 통신관련 소프트웨어 모듈

시리얼 통신에서 송신 및 수신을 위한 주요 함수를 정의하여 소프트웨어 모듈화

하면 다음과 같다. 폴링 방식의 initSerial() 함수에 대응하는 initISerial() 함수와

같이 'I'를 포함한 함수는 인터럽트 구동 방식의 함수를 나타낸다.

//======================================// serial.h//======================================#ifndef __SERIAL_H__#define __SERIAL_H__#define CR 0x0D // carriage return, '\r'

Page 421: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제13장 C51 프로그래밍 411

#define LF 0x0A // line feed, '\n'// for polling methodvoid initSerial(void);void txRTN(unsigned char txbuf);unsigned char rxRTN(void);void txStr(unsigned char *str);// for interrupt driven methodvoid initISerial(void);void txIRTN(unsigned char txbuf);unsigned char rxIRTN(void);#endif

//======================================// serial.c//======================================#include <reg51.h>#include "serial.h"// serial initialize, 19200bps void initSerial(void) {

TMOD = 0x20; // T/C1, mode 2TH1 = 0xFD; // 9600bpsPCON = 0x80; // x 2 = 19200bpsTR1 = 1; // T/C1 runSCON = 0x52; // Mode=1, REN=1, TI=1, RI=0

}// transmit a charactervoid txRTN(unsigned char txbuf) {

while(!TI) ; // wait until TI == 1TI = 0; // clear TISBUF = txbuf; // write transmitting data

}// receive a characterunsigned char rxRTN(void) {

unsigned char rxbuf;

Page 422: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

412 MCS-51 마이크로컴퓨터

while(!RI) ; // wait until RI == 1RI = 0; // clear RIrxbuf = SBUF; // read received datareturn rxbuf;

}// transmit a stringvoid txStr(unsigned char *str) {

while(*str)txRTN(*str++);

}// serial initialize, 19200bps void initISerial(void) {

TMOD = 0x20; // T/C1, mode 2TH1 = 0xFD; // 9600bpsPCON = 0x80; // x 2 = 19200bpsTR1 = 1; // T/C1 runSCON = 0x52; // Mode=1, REN=1, TI=1, RI=0PS = 1; // enhance serial priority ES = 1; // enable serial interruptEA = 1; // enable all interrupt

}// transmit a charactervoid txIRTN(unsigned char txbuf) {

TI = 0; // clear TISBUF = txbuf; // write transmitting data

}// receive a characterunsigned char rxIRTN(void) {

unsigned char rxbuf;RI = 0; // clear RIrxbuf = SBUF; // read received datareturn rxbuf;

}

Page 423: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제13장 C51 프로그래밍 413

통신 프로그램 속성 설정

실습하는 과정에서 시리얼 통신을 위해 사용하는 하이퍼터미널 통신 프로그램의

'속성'-'설정'-'ASCII설정'의 ASCII 보내기와 받기 난에서 각 체크 항목을 적절

히 설정할 필요가 있다. 관련 화면은 [그림 13.14]와 같다.

그림 13.14 통신 프로그램의 속성 설정

13.8.2 실습 보드간 송수신 회로

2개의 KUT51 실습 보드를 활용하여 송수신하는 프로그램을 구동하기 위해서는

[그림 13.15]와 같이 송수신 케이블을 연결하여야 한다.

그림 13.15 보드간 송수신을 위한 통신선 연결

Page 424: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

414 MCS-51 마이크로컴퓨터

KUT51 실습 보드의 시리얼 RS232 포트의 형식은 female형이므로, 시리얼 통신

케이블의 양종단의 RS232 포트의 형식은 male형이어야 한다. 9핀 시리얼 포트의

경우 2, 3, 5핀만 연결하면 되며, 2번 핀은 TxD, 3번 핀은 RxD, 5번 핀은 Gnd이

다. 한쪽 종단의 TxD 신호는 다른 종단의 RxD 핀에 인가되고, RxD 핀은 다른

종단의 TxD와 연결되어야 함을 유의한다. RS232의 9핀 컨넥터의 핀 레이아웃

및 기능은 [그림 13.16]을 참조한다.

핀 약어 기 능 핀 약어 기 능1 DCD Data Carrier Detect 6 DSR Data Set Ready2 RXD Received Data 7 RTS Request To Send3 TXD Transmitted Data 8 CTS Clear To Send4 DTR Data Terminal Ready 9 RD Ring Detect5 GND Logic Ground

그림 13.16 9핀 시리얼 포트(RS-574) 핀 기능

13.8.3 시리얼통신 구현 방식

문자 전송 후 충분한 시간 지연 후 다음 문자를 전송하는 방식, 인터럽트를 활용

하는 폴링 방식 및 인터럽트 구동 방식이 있다. 실습 보드에서 컴퓨터의 하이퍼

터미널 창에 영문자 'A'부터 'Z'까지 시리얼 전송하는 프로그램을 통하여 시리

얼 송수신이 이루어 질 수 있는 방법의 사례를 들어본다.

일정시간의 지연 후 문자 전송

송수신 인터럽트 관련 플래그 비트와 상관없이 일정 시간마다 강제적으로 문자

를 송신하는 방식을 생각해 볼 수 있다. 다음은 문자 전송 후 충분한 시간 지연

을 두고 다음 문자를 전송하는 방식으로 구현된 프로그램이다. 프로그램의 실행

결과는 영자 알파벳 대문자 한 세트를 출력하고 줄을 바꾸는 방식으로 반복 하

는 프로그램이다.

Page 425: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제13장 C51 프로그래밍 415

//======================================// SERIAL_01.C// transmit ALPHABET to PC// using delay//======================================#include <reg51.h>#include "serial.h"#include "delay.h"void main(void) {

unsigned char i;initSerial();SBUF = CR; // line homedelay(100); // delaySBUF = LF; // next linedelay(100);SBUF = CR; // line homedelay(100);do {

for(i=0; i<26; i++) { // 'A'~'Z'SBUF = 'A' + i;delay(10000); // delay

}SBUF = LF; // next linedelay(100);SBUF = CR; // line homedelay(100);

} while(1);}

폴링에 의한 통신

시리얼 인터럽트와 관련된 인터럽트 플래그 비트 RI, TI를 검사하여 송수신을 수

행하는 방식을 생각해 볼 수 있으며, 이들 플래그 비트를 프로그램 코드에서 조

건 검사하므로 폴링 방식이다. 문자를 전송한 후 전송이 완료되었으면 곧바로 다

음 문자를 전송하므로, 시간 지연 없이 가능한 빠르게 문자를 전송할 수 있다.

Page 426: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

416 MCS-51 마이크로컴퓨터

//======================================// SERIAL_02.C// transmit ALPHABET to PC// using polling method//======================================#include <reg51.h>#include "serial.h"void main(void) {

unsigned char i;initSerial();txRTN(CR); // line hometxRTN(LF); // next linetxRTN(CR); // line homewhile(1) {

for(i=0; i<26; i++) // 'a'~'z'txRTN('a' + i);

txRTN(LF); // next linetxRTN(CR); // line home

}}

인터럽트에 의한 통신

시리얼 인터럽트와 관련된 TI, RI 플래그 비트의 설정에 따라 시스템에 의해 자

동으로 시리얼 인터럽트 서비스 루틴을 수행하여 송수신하는 방법을 생각할 수

있다. 다음은 인터럽트 구동 방식에 의한 문자 셋을 전송하는 프로그램이다. 여

기서 normal 상태에서 10msec마다 문자 하나씩 생성하여 전송하고 있다.

//======================================// SERIAL_03.C// transmit ALPHABET to PC// using interrupt driven method///======================================#include <reg51.h>#include "serial.h"#include "delay.h"

Page 427: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제13장 C51 프로그래밍 417

unsigned char txbuf;unsigned char flagTx;void SERIAL_ISR(void) interrupt 4 {

if(TI) {if(flagTx==1) {

TI = 0; SBUF = txbuf;

flagTx = 0;}

}}void main(void) {

unsigned char i;flagTx = 0;initISerial();

txbuf = CR; // line homeflagTx = 1;txbuf = LF; // next lineflagTx = 1;while(1) {

for(i=0; i<26; i++) { // 'A'~'Z'txbuf = 'A' + i;flagTx = 1;msec_delay(10); // delay

}

txbuf = LF; // next lineflagTx = 1;

} }

13.8.4 예제 프로그램

시리얼 통신은 모니터 프로그램과 하이퍼터미널간의 메시지 송수신과 같이 실습

Page 428: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

418 MCS-51 마이크로컴퓨터

보드와 컴퓨터간의 통신과 두 개의 KUT51 실습 보드를 활용한 실습 보드간 통

신으로 크게 구분하여 살펴본다.

문자 반송 : 인터럽트 구동 방식

다음의 소스 코드는 수신한 문자를 반송하는 프로그램으로 인터럽트 방식에 의

해 구현한 것이다. 입력한 문자가 하이퍼터미널 창에 보이는 것은 입력한 문자가

실습 보드로 전송되었다가 프로그램에 의해 반송된 때문이다. 또한 normal 상태

에서는 LED에 점등 패턴을 바꾸어 가며 반복 표시한다.

//======================================// SERIAL_04.C// receive a char. from PC and retransmit it to PC// using interrupt driven method // P1_L : LED module//======================================#include <reg51.h>#include "serial.h"#include "delay.h"unsigned char buf;unsigned char flagRx;void SERIAL_ISR(void) interrupt 4 {

if(RI) {buf = rxIRTN();flagRx = 1;

}if(TI) {

if(flagRx == 1) {txIRTN(buf);flagRx = 0;

}}

}void main(void) {

unsigned char pat;flagRx = 0;initISerial();

Page 429: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제13장 C51 프로그래밍 419

pat = 0x03;while(1) { // normal P1 = pat;

delay(1000);pat = ~pat;

}}

문자 반송 : 폴링 방식

다음의 소스 코드는 실습 보드의 프로그램이 컴퓨터로부터 수신한 문자를 반송

하는 프로그램으로 폴링 방식에 의해 구현한 것이다. 특히 엔터키가 입력되면,

개행 문자 및 캐리지리턴 문자를 반송하도록 하여 줄 바꿈을 행하고 있다. 또한

반송한 문자의 패턴을 LED로 통해 일부 확인할 수 있으므로, 숫자 문자를 전송

하면서 LED 모듈을 확인한다.

//======================================// SERIAL_05.C// receive a char. from PC and retransmit it to PC// include carriage return char handling// using polling method, P1_L : LED module //======================================#include <reg51.h>#include "serial.h"void main(void) {

unsigned char rxbuf;initSerial();txStr("input any char...... \r\n");while(1) {

rxbuf = rxRTN();txRTN(rxbuf); // retransmit to PCif(rxbuf==CR) {

txRTN(LF); // next linetxRTN(CR); // line home

}

Page 430: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

420 MCS-51 마이크로컴퓨터

P1 = ~rxbuf; // out the char to P1}

}

실습 보드간 시리얼 통신

KUT51 실습 보드 2개를 이용하여, 보드간 송수신을 수행하는 프로그램을 작성

한다. 송신측 보드에서는 1씩 증가된 값을 CLCD에 표시하면서 전송하고, 수신측

보드에서는 수신한 수치 값을 ASCII 코드로 취급하여 대응 문자를 CLCD에 표

시한다. 보드간 시리얼 통신을 위해서 지금까지 사용하였던 M/F형의 시리얼통신

케이블 대신 M/M형의 시리얼통신 케이블을 필요로 한다. 실습을 위해서는 송신

측 보드와 수신측 보드의 프로그램이 실행중인 상태에서 M/M형 시리얼통신 케

이블을 연결한다.

다음 프로그램은 송신측 보드를 위한 프로그램이며, 송신측 보드에서는 0부터 1

씩 증가하며 전송하기를 반복하면서 전송된 데이터를 CLCD에 표시한다.

//======================================// SERIAL_06_Tx.C// for sending board//======================================#include <reg51.h>#include <stdio.h>#include "serial.h"#include "clcd8.h"#include "delay.h"

int main(void) {char msg[16] ;unsigned char tx;

initLCD_8();initSerial();

tx = 0;while(1) {

txRTN(tx);sprintf(msg, "SendingNO.: %3d", (unsigned)tx);

Page 431: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제13장 C51 프로그래밍 421

writeCommand_8(0x02);putStr_8(msg);

tx++;msec_delay(500);

}}

다음 프로그램은 수신측 보드를 위한 프로그램으로, 데이터 수신을 기다리다 수

신이 되면 이를 CLCD에 ACII 코드 값과 그에 대응하는 문자를 표시한다. 또한

수신한 문자가 대문자인지 소문자인지 숫자인지 기타의 문자인지를 구분하여 표

시한다.

//======================================// SERIAL_06_Rx.C// for receiving board//======================================#include <reg51.h>#include <stdio.h>#include "serial.h"#include "clcd8.h"#include "delay.h"int main(void) {

char msg[16];unsigned char rx;initLCD_8();initSerial();writeCommand_8(0x02);putStr_8("Waiting.......");while(1) {

rx = rxRTN();txRTN(rx); // retransmitsprintf(msg, "RxData : %3d %c", (unsigned)rx, rx);writeCommand_8(0x02);

Page 432: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

422 MCS-51 마이크로컴퓨터

putStr_8(msg);writeCommand_8(0x40); // line 2putStr_8("Type : ");

if(rx >= 'A' && rx <= 'Z') // 대문자

putStr_8("ALPHABET");else if(rx >= 'a' && rx <= 'z') // 소문자

putStr_8("alphabet");else if(rx >= '0' && rx <= '9') // 숫자

putStr_8("Number ");else // 기타

putStr_8("other...");}

}

13.8.5 실습과제

[실습1] 문자열 반송

하나의 문자열을 수신한 후, 그 문자열을 컴퓨터의 하이퍼터미널 창으로 반송하

는 프로그램을 인터럽트 구동 방식에 의해 구현한다. 또한 추가적으로 폴링 방식

에 의해 재 구현한다.

[실습2] 원격 디바이스 제어

실습 보드의 P1에 제어를 위한 모듈을 연결하고 원격에서 명령을 전송하여 해당

모듈을 제어하는 프로그램을 작성한다. 단, 제어할 입출력 모듈 및 제어 명령 등

필요한 사항은 각자 정의한다. 예를 들면, 실습 보드에 LED 모듈을 연결한 경우,

송신측에서 일반 메시지를 보내는 경우 수신하여 CLCD에 표시하다가, 특정 명

령이 입력되면, 가령 '!'는 명령의 시작임을 알린다면, LED를 통해 수신된 제어

패턴을 출력하도록 할 수 있다.

Page 433: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

제13장 C51 프로그래밍 423

[실습3] 보드간 시리얼 통신

두 실습 보드 간에 시리얼 통신을 통하여 영자 및 숫자로 구성된 단문 메시지를

주고받을 수 있는 프로그램을 작성한다. 송수신 메시지는 CLCD에 표시한다. 포

트 P1에는 Keypad 모듈을 연결한다. Keypad 모듈을 활용하여 문자 셋을 달리하

는 입력 모드 설정, 문자 삭제 등의 기능을 수행했던 13.5절의 [실습4] 과제 내용

을 활용한다.

Page 434: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

424 MCS-51 마이크로컴퓨터

Page 435: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

부록 1. KUT51 회로도 425

부록 1. KUT51 회로도

Page 436: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

426 MCS-51 마이크로컴퓨터

부록 2. KUT51 부품 목록

순번 부 품 명 규 격 수량 비 고1 PCB microcom-51 1 자체개발2 IC P80C31BH1 1 MCU3 IC 62256 1 RAM4 IC 27C256 1 ROM5 IC 74HC573, 대치불가 16 IC 74LS139, 대치불가 17 IC 74HC14, 대치불가 18 IC 74HC08, 대치불가 19 IC MAX232 110 IC socket 40pin 111 IC socket 28pin 212 IC socket 20pin 113 IC socket 16pin 214 IC socket 14pin 215 소켓헤더 14pin, H10, 암수, CLCD용 116 저항 330 117 저항 10K 318 가변저항 GF06-10K 1 LCD광조절19 세라믹콘덴서 0.1 , 104 1020 세라믹콘덴서 30pF 221 전해콘덴서 1 , 25V 422 전해콘덴서 22 , 25V 123 전해콘덴서 100 , 25V 124 X-tal HSL11.0592MHz, ATS형 125 LED 빨강 126 Push Button 5x5mm 327 Support 암수쌍, H10 428 Connector RS232C, 9P, 암, 기판고정용 1 통신포트29 Connector 3024-8P 'ㄱ'형, 수, 기판고정용 2 P1용30 전원잭 기판고정용 131 CLCD LC1621-YH6-RC 132 시리얼케이블 DB9M/F, 1.8m 133 전원어댑터 110/220V입력, 5V출력, 500mA 1

Page 437: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

부록 3. 모니터프로그램 427

부록 3. 모니터 프로그램 소스

File : KUT51LCD.ASM

; Ver 1.1 : Hyper Terminal and LCD supported(line delay=20 ms, 19200 bps)

$mod51

; PORT DEFINITIONLCD_COMMAND_WR EQU 0F800HLCD_DATA_WR EQU 0F801HLCD_COMMAND_RD EQU 0F802HLCD_DATA_RD EQU 0F803H

RAM equ 8000h ; RAM start addressSTACK equ 40h ; STACK areaESC equ 1Bh ; escape codecr equ 0dh ; carriage return codelf equ 0ah ; line feed code

; CPU Reset org 0

ajmp INIT

;Interrupt Service Routinesorg 3 ; 0003 external INT0ljmp RAM+3

org 000bh ; 000B timer 0 ljmp RAM+0bh

org 0013h ; 0013 external INT1ljmp RAM+13h

org 001bh ; 001b timer 1ljmp RAM+1bh

org 0023h ; 0023 serial RI and TIljmp RAM+23h

; MAIN STARTS HEREINIT: mov a,#STACK ; set stack pointer

mov sp,a

; Power-on Sign, LED 4,7 On, 5,6 Off mov P1,#0f6h

clr a

Page 438: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

428 MCS-51 마이크로컴퓨터

mov psw,a ; set register bank zero

;initialize serial & LCD portCALL SERIAL_INITCALL LCD_INIT

MENU: LCALL XSTRINGdb cr, lf, lf, lfdb '****************************************', cr, lfdb '* KUT51 Mini-Monitor Program Ver. 1.1 *', CR, LFdb '****************************************', cr, lfdb 'Ver.1.0 - 16x2 Char. LCD supported', CR, LFdb 'Ver.1.1 - Hyper terminal supported', cr, lfdb ' (20ms line delay, 19200bps)', cr,lf,lf,lf

db 'ENTER THE LETTER FOR YOUR SELECTION:',lf,cr,lf,crdb 'U - "Upload Hex File to RAM"',lf,crdb 'G - "GO to Specified Address"',lf,crdb 'D - "Dump External ROM & RAM"',lf,crdb 'W - "Write External RAM with a Byte"',lf,cr db 'H - "Display HELP Menu, Start Again"', lf, cr

db lf,lf,lf,lf ;advance to 24th linedb esc

getsel: lcall xstring db cr,lf,'KUT51>' ;prompt

db ESC

MOV A, #01H ; CLEAR DISPLAY, HOME CURSOR CALL LCD_COMMAND_WRITE

MOV A, #16 ; REQUIRE 1.53MS(SPEC. SHEET) CALL DELAY100US

MOV DPTR, #MSG1 ; DISPLAY 1ST LINE CALL LCD_PRINT

MOV A, #0C0H ; CURSOR TO SECOND LINE HOME CALL LCD_COMMAND_WRITE

MOV DPTR, #MSG2 ; DISPLAY 2ND LINE CALL LCD_PRINT

LCALL CHR_INanl a,#5fh ; uppercase to lowercase

Check_Dump:CJNE A, #'D', Check_Write ; IF NOT D, THEN CHECK LAJMP RUN_DUMP ; D, RUN DUMP MEMORY

Check_Write: CJNE A, #'W', Check_Go ; IF NOT L, THEN CHECK JAJMP RUN_WRITE ; W, RUN WRITE BYTE

Check_Go:

Page 439: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

부록 3. 모니터프로그램 429

CJNE A, #'G', Check_Upload ; IF NOT J, THEN CHECK P AJMP RUN_GO ; J, RUN JUMP TO ADDRESSCheck_UPload:

CJNE A,#'U',Help_MENU ; IF NOT P, THEN CHECK IAJMP RUN_UPLOAD ; U, RUN UPLOAD PROGRAM

Help_MENU: cjne a, #'H',other_key

ACALL WAIT ; default - wait, then show menuLJMP MENU

other_key:LCALL XSTRING

db lf,cr,'### Incorrect Key Input("H" for HELP) ###'db ESCljmp getsel

;Display external data memory (hex and ASCII)RUN_DUMP:

LCALL XSTRING ; ASK FOR START ADDRESS db lf,cr,'ENTER 2-BYTE START ADDRESS:',lf,cr

db ESCACALL READHEX ; PUT START ADDR IN DPTRMOV DPH,AACALL READHEXANL A,#0F0h ; START ON 16-BYTE BOUNDARYMOV DPL,A ; HAVE START ADDRESS IN DPTR

acall lfcr

;SET UP ROW COUNTERmov r1,#10h ; Fixed to 00-ffhACALL LFCR ; GO TO NEXT LINE TO START

LOUTLOOP:MOV R0,#16 ; SET UP BYTE COUNTERMOV A,DPH ; AT START OF LINE OUTPUT ADDRACALL WRBYTEMOV A,DPLACALL WRBYTEMOV A,#' ' ; AND SPACE TO MAKE IT TIDYACALL CHR_OUTpush dplpush dph ; save line start address on stack

BOUTLOOP:MOVX A,@DPTR ; OUTPUT ROW ONE BYTE AT A TIMEACALL WRBYTEMOV A,#' 'ACALL CHR_OUTINC DPTRDJNZ R0,BOUTLOOPpop dphpop dpl ; restore line start address

Page 440: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

430 MCS-51 마이크로컴퓨터

acall dasciiACALL LFCRDJNZ R1,LOUTLOOPacall lfcrLJMP getsel ; return to command mode

;dascii: mov r0,#16 ; initalize loop count

mov a,#' 'acall chr_out ; put out couple of spacesacall chr_out

dasci1: movx a,@dptr ; get the byteanl a,#07fh ; mask parity bitclr csubb a,#' ' ; subtract ascii spacejnc dasci2 ; jump if displayablemov a,#('.'-' ') ; load "." minus space if not displayable

dasci2: add a,#' ' ; make it ascii againacall chr_outinc dptr ; bump data pointerdjnz r0,dasci1 ; and loop 'till doneret ; return and do next line

RUN_WRITE:ACALL XSTRING

db lf,cr,'ENTER THE 2-BYTE STARTING ADDRESS YOU WISH TO CHANGE:' db lf,cr,'(NOTE : Writing tO ROM will NOT cause an ERROR)',lf,cr

db ESC ACALL READHEX ; FIRST GET THE TWO ADDRESS BYTES MOV DPH,A

ACALL READHEXMOV DPL,APUSH DPH ; SAVE THE ADDRESSPUSH DPLMOV A,#' ' ; SPACE BETWEEN ADDRESS AND DATAACALL CHR_OUTMOVX A,@DPTR ; SHOW THE CURRENT DATAACALL WRBYTEACALL XSTRING

db lf,cr,'ENTER THE BYTE TO BE WRITTEN(IN HEX):',lf,crdb ESCACALL READHEX ; GET THE NEW VALUEPOP DPLPOP DPHMOVX @DPTR,A ; MOVE THE NEW VALUE TO MEMORY

lcall xstringdb crdb ESC

;*******LJMP getsel ; return to command mode

;;------------------------------------------------------------------------

Page 441: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

부록 3. 모니터프로그램 431

;Go to address RUN_GO:

ACALL XSTRING db lf,cr,'ENTER THE 2-BYTE JUMP DESTINATION ADDRESS:',lf,cr

db ESCACALL READHEX ; FIRST GET THE JUMP ADDRESSMOV DPH,AACALL READHEXMOV DPL,AACALL LFCRACALL LFCR

clr aJMP @A+DPTR ; JUMP TO THE ADDRESS

;Load hex file into memoryRUN_UPLOAD:

ACALL LFCR;ACALL LFCR

U_RUN1:ACALL CHR_IN ; GET RID OF : AT START OF LINECJNE A,#':', U_RUN1ACALL READHEXJZ ALLREAD ; LAST RECORD HAS 01 IN RECORD TYPEMOV R5,A ; LOAD BYTE COUNT FOR LINE INTO R5ACALL READHEX ; READ HIGH BYTE OF START ADDRESSMOV DPH,AACALL READHEX ; READ LOW BYTE OF START ADDRESSMOV DPL,AACALL READHEX ; READ RECORD TYPE 00=DATA, 01=END

READLOOP:ACALL READHEXMOVX @DPTR,AINC DPTR ; MOVE DPTR TO NEXT BYTE ADDRESSDJNZ R5,READLOOP ; DECR BYTE COUNTER, JNZACALL READHEX ; GET RID OF CHECKSUM, NO CHECKING

AJMP RUN_UPLOAD ; GET NEXT LINEALLREAD:

ACALL READHEX ; READ ADDRESSACALL READHEX ; READ ADDRESSACALL READHEX ; READ RECORD TYPEACALL READHEX ; READ LAST CHECKSUMACALL CHR_IN ; CR=HyperTerm. last char=0dh

LJMP getsel ; DONE, GO BACK TO MENU

LFCR: MOV A,#lfACALL CHR_OUTMOV A,#crACALL CHR_OUTRET

Page 442: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

432 MCS-51 마이크로컴퓨터

;; WAIT PAUSES FOR A FRACTION OF A SECOND. FREQUENCY UNKNOWN;WAIT: MOV A,#-1WAIT1: MOV B,#-1

DJNZ B,$DEC AJNZ WAIT1RET

;; THE TEXT STRING MUST END WITH AN ESC CHARACTER;XSTRING:

POP DPH ; LOAD DPTR WITH FIRST CHARPOP DPL

XSTR_1: CLR AMOVC A,@A+DPTR ; FETCH FIRST CHAR IN STRING

XSTR_2: JNB TI,$ ; WAIT UNTIL TRANSMITTER READYCLR TI ; MARK AS NOT READYMOV SBUF,AINC DPTRCLR AMOVC A,@A+DPTR ; GET NEXT CHARACTERCJNE A,#ESC,XSTR_2 ; LOOP UNTIL ESCAPE READMOV A,#1JMP @A+DPTR ; RETURN TO CODE AFTER ESCAPE

; ; READS THE SERIAL PORT AND ECHO BACKCHR_IN: JNB RI,$

CLR RIMOV A,SBUFANL A,#7FhACALL CHR_OUTRET

;; SENDS A CHARACTER(ASCII) IN A OUT THE SERIAL PORTCHR_OUT:

JNB TI,$CLR TIMOV SBUF,ARET

; ASCII CHARACTER IN A --> HEX ; LOWER NIBBLE = HEX, UPPER NIBBLE = 0ASC2HEX:

CLR CYSUBB A,#'0'MOV B,ASUBB A,#10 ; subtract 10 decimalJB CY,A2LT10MOV A,BSUBB A,#7

Page 443: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

부록 3. 모니터프로그램 433

MOV B,AA2LT10: MOV A,B

RET

; CONVERTS THE LOWER NIBBLE IN A TO AN ASCII CHARACTER RETURNED IN AHEX2ASC:

ANL A,#0FhCLR CYMOV B,ASUBB A,#10MOV A,BJB CY,H2LT10ADD A,#7

H2LT10: ADD A,#'0'RET

;; READS TWO ASCII CHARACTERS FROM THE SERIAL PORT AND ; CONVERTS THEM INTO A BYTE RETURNED IN A. USES; REGISTER 2 IN THE FIRST BANKREADHEX:

ACALL CHR_INACALL ASC2HEXSWAP A ; HIGH ORDER NIBBLE IS FIRST ONEMOV R2,A ; SAVE THE HIGH ORDER NIBBLEACALL CHR_INACALL ASC2HEXORL A,R2 ; PUT NIBBLES TOGETHER IN ARET

; WRITES BYTE IN A TO THE SERIAL PORT AS TWO ASCII ; CHARACTERS. USES REGISTER 2 IN THE FIRST BANK.WRBYTE: MOV R2,A

SWAP AACALL HEX2ASCACALL CHR_OUTMOV A,R2ACALL HEX2ASCACALL CHR_OUTRET

; SERIAL INITSERIAL_INIT:

MOV SCON,#52hMOV TMOD,#20hmov pcon, #80h ; SMOD = 1 for 19200bps (0 for 9600)MOV TH1,#0FDh ; #0FDH=9600/19200 BAUDSETB TR1 ; START TIMER FOR SERIAL PORT

; WAIT UNTIL LCD READY BIT SETLCD_READY:

PUSH ACC MOV DPTR, #LCD_COMMAND_RD

Page 444: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

434 MCS-51 마이크로컴퓨터

LCD_READY0: MOVX A,@DPTRJB ACC.7, LCD_READY0 ; LOOP IF BUSY FLAG = 1

POP ACC RET

; SEND DATA TO LCD; INPUT : A = OUTPUT CHARACTERLCD_DATA_WRITE: PUSH DPL PUSH DPH

CALL LCD_READY

MOV DPTR,#LCD_DATA_WR MOVX @DPTR,A

CALL DELAY40US

POP DPH POP DPL

RET

; SEND COMMAND TO LCD; INPUT : A = OUTPUT COMMANDLCD_COMMAND_WRITE: PUSH DPL PUSH DPH

CALL LCD_READY

MOV DPTR, #LCD_COMMAND_WR MOVX @DPTR, A

CALL DELAY40US ; REQUIRE 39US DELAY(SPEC. SHEET)

POP DPH POP DPL

RET

; LCD CURSOR POSITION; INPUT: A = LINE NUMBER - 0 ~ 1; B = DIGIT NUMBER = DISPLAY DATA RAM(DDRAM) - 0 ~ 15LCD_CURSOR: CJNE A, #0, LCD_CURSOR1 ; 2ND LINE MOV A, B ; 1ST LINE ADD A, #80H CALL LCD_COMMAND_WRITE RETLCD_CURSOR1: CJNE A, #1, LCD_CURSOR_ERR MOV A, B

Page 445: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

부록 3. 모니터프로그램 435

ADD A, #0C0H CALL LCD_COMMAND_WRITE RETLCD_CURSOR_ERR: RET

;INITIALIZE THE LCDLCD_INIT: MOV A, #150 ; PAUSE FOR 15MS CALL DELAY100US

MOV A, #38H CALL LCD_COMMAND_WRITE ; SET 8-BIT, 2-LINE, 5X8 FONT

MOV A, #08H CALL LCD_COMMAND_WRITE ; DISPLAY ON, CURSOR OFF, BLINK OFF

MOV A, #0EH CALL LCD_COMMAND_WRITE ; DISPLAY ON, CURSOR ON, BLINK OFF

MOV A, #06H CALL LCD_COMMAND_WRITE ; CURSOR INC.(MOVES RIGHT), NO SHIFT

RET

; SEND A STRING TO LCD; INPUT: DPTR = STRING ADDRESS LCD_PRINT: MOV A, #0 ; MOVC INDEX = 0

MOVC A, @A+DPTR ; READ CHAR.

JZ LCD_PRINT01 ; STRING END '00'

CALL LCD_DATA_WRITE

INC DPTR SJMP LCD_PRINT ; REPEAT LOOPLCD_PRINT01:

RET

; 40 MICROSECOND DELAY; 11.0592MHZ = 1 MACHINE CYCLE = 1.085 US; 2(CALL) + 35 = 37 (40.145 US)DELAY40US: PUSH 1 ; (2) SAVE REGISTER R1 MOV R1, #13 ; (1) 20 DJNZ INSTR = 40US

DJNZ R1, $ ; (2 X 14) = 28 POP 1 ; (2) RESTORE REGISTER R1

RET ; (2)

; ACC*100US DELAY

Page 446: MCS-51 마이크로컴퓨터 - KOREATECHmicrocom.koreatech.ac.kr/course backup/IFC180/TEXTBOOK... · 2017. 9. 1. · 2 MCS-51 마이크로컴퓨터 x7 ,- - ªz|H¹ 모델 ROMRAM속도I/O핀T/CUARTInterrupt

436 MCS-51 마이크로컴퓨터

; INPUT: ACC = ? (100 US APPROX.); 2(CALL) + 100 = 102 (110 US)DELAY100US:

PUSH 1 ; (1) SAVE REGISTER R1

DELAY100US01: MOV R1, #46 ; (1) 46 X 2 DJNZ INS. X 1.085 = 99.82 us

DJNZ R1, $ ; (2 X 46) = 92DJNZ ACC, DELAY100US01 ; (2)

POP 1 ; (2)RET ; (2)

MSG1: DB ' KUT51-LCD ',00HMSG2: DB ' !!! READY !!! ',00H;

END