티스토리 뷰
상위 데이터 메모리 (80h-FFh) 사용하기
8051(AT89S51) 은 내부 데이터 메모리가 00h-7Fh 까지 있습니다. 80h-FFh 까지는 SFR(특수기능 레지스터) 영역으로 되어 있습니다. 8052(AT89S52) 는 내부 데이터 메모리가 00h-7Fh 와 80h-FFh 가 있고 SFR 영역이 80h-FFh 까지 있습니다. (80h-FFh 까지는 중복이 되어 있습니다.) 그러면 이 중복된 영역을 어떻게 구분할 수 있을까요? 주소지정방식(Addressing Mode) 이라는 것이 있습니다. 쉽게 말하면 데이터의 위치를 알리는 방식입니다. 명령어 상에서 데이터는 크게 세 군데에 있습니다. 1. 직접 수치 (데이터가 직접 명령어에 포함됨 - 데이터 앞에 #을 붙여 표시함) 2. 레지스터 (ACC, R0-R7 등 레지스터가 데이터를 갖고 있음) 3. 메모리 (내부, 외부 데이터 메모리와 코드 메모리에 데이터가 있음) 이중에서 데이터가 메모리에 있을 경우만 살펴 보겠습니다. 데이터가 들어 있는 메모리 번지가 직접 명령어에 표시되는 방식을 직접 번지지정 방식이라 하고, 데이터가 들어 있는 메모리 번지를 포인터(@R0, @R1, @DPTR) 를 사용하여 표시하는 방식을 간접 번지지정 방식이라고 합니다. 위에서 80h-FFh 는 SFR 영역이기도 하고 상위 데이터 메모리 영역이기도 한데, 이를 구별해 주는 방식으로 사용합니다. 다음에 예를 들어 보겠습니다. ㄱ) mov a,80h ; 직접 번지지정 방식 (명령어에 번지가 직접 나타남) ㄴ) mov r0,#80h mov a,@r0 ; 간접 번지지정 방식 (명령어에 포인터를 사용하여 번지를 표시함) 위에서 ㄱ) 의 경우는 직집 번지지정 방식으로 SFR 의 80h(PORT 0) 을 나타내고, ㄴ) 의 경우는 간접 번지지정 방식으로 상위 데이터 메모리 80h 번지를 표현합니다. 아래 프로그램은 상위 데이터 메모리(80h-FFh)에 데이터를 입력하고(00h-7Fh) 그 데이터를 PORT 1 에 연결되어 있는 LED 로 출력하는 프로그램입니다. 프로그램의 진행상황을 관찰하기 위하여 Debug->Animated Mode 를 사용하겠습니다. #include #define IDATA ((char *)0x10000) void delay(long int dly) { while(dly--); } void disp(char ch) { P1 = ch; delay(1); } void main() { char r0,dta,i; r0 = 0x80; dta = 0x00; for (i=0; i<0x80; i++) { IDATA[r0] = dta; disp(~IDATA[r0]); r0++; dta++; } } 프로젝트를 만들고(c03.prj) 위 프로그램을 작성합니다.(c03.c) [F9] 을 쳐서 컴파일(Make all)합니다. Start 버튼을 클릭해서 디버그 모드로 들어가고, 데이터 창과 포트 1 창을 엽니다. Debug->Animated Mode 을 클릭하고 Debug-Run 을 클릭합니다. 내부 데이터 메모리(80h-FFh) 에 00h-7Fh 까지 데이터가 들어가고 각각의 데이터가 포트 1 으로 출력되는 것을 볼 수 있습니다. 실행 속도를 조절하려면 툴바의 오른쪽에 있는 Speed 의 버튼을 이동하면 됩니다. (왼쪽은 느리게, 오른쪽은 빠르게 입니다.) 실행을 잠시 멈추려면 Speed 왼쪽에 있는 STOP 버튼을 누르면 정지하고, 다시 누르면 (GO) 계속해서 진행합니다. 이번에는 시물레이션으로 살펴본 동작을 베타 키트를 이용하여 실행해 보겠습니다. 우선 delay(1); 을 delay(10000); 으로 변경합니다.(동작 속도를 맞추기 위하여) [F9] 을 눌러 컴파일을 하고 EngineISP 를 실행해서 c03.hex 파일을 라이트 합니다. 라이트가 끝나면 바로 실행됩니다.
'C언어' 카테고리의 다른 글
DJNZ 명령으로 루프(LOOP) 만들기 (0) | 2021.08.01 |
---|---|
SFR (특수기능 레지스터) 영역 살펴보기 (0) | 2021.07.31 |
레지스터 뱅크 알아보기[2] (0) | 2021.07.29 |
레지스터 뱅크 알아보기[1] (0) | 2021.07.29 |
내부 데이터 메모리 살펴보기 (0) | 2021.07.28 |