티스토리 뷰

C언어

SFR (특수기능 레지스터) 영역 살펴보기

시작이반입니다 2021. 7. 31. 04:00

SFR (특수기능 레지스터) 영역 살펴보기

SFR 영역에는 8051 에서 사용하는 특별한 기능의 레지스터 들이 있습니다. 이 영역의 레지스터들은 앞으로 계속해서 하나 씩 공부해 나갈 것입니다. 8051 을 잘 사용한다는 것은 결국 SFR 영역에 있는 레지스터의 기능을 잘 알고 활용한다는 것입니다. C 언어에서는 헤더 파일에 SFR 영역에 있는 레지스터를 정의 해 두었기 때문에 변수 선언 없이 그대로 사용할 수 있습니다. reg52.h 의 헤더 파일은 C:\RIDE\INC\51 폴더에 있습니다. 편집기로 파일을 열어 보면 SFR 영역에 있는 레지스터들이 선언되어 있는 것을 볼 수 있습니다. (모든 레지스터가 대문자로 선언되어 있습니다.) 아래 프로그램은 SFR 영역에 있는 B 레지스터에 값을(0x5B) 증가 시키면서 데이터 메모리 30h 번지부터 입력한 뒤 LED 에 출력하는 프로그램입니다. B 레지스터는 범용적으로 사용할 수 있는 레지스터 입니다. #include #define IDATA ((char *)0x10000) void delay(long int dly) { while(dly--); } void disp(char ch) { P1 = ch; delay(1); // -- 1 } void main() { char i,r0; B = 0x5b; r0 = 0x30; for (i=0; i<0x10; i++) { IDATA[r0] = B; disp(~IDATA[r0]); r0++; B++; } } 위 프로그램에서 B 는 변수 선언이 되어 있지 않지만 에러도 안 나오고 실행이 됩니다. 그것은 B 가 SFR 레지스터이고 헤더 파일 (reg52.h) 에 선언이 되어 있기 때문입니다. 시물레이션 모드에서 데이터 창과 메인 레지스터 창, 그리고 포트 1 창을 열고 Debug->Animated Mode 를 클릭하고, Debug->Run 을 실행하면 명령이 실행되는 것을 볼 수 있습니다. B 를 ACC 로 바꿔서 실행해 보세요. 데이터 메모리에 생각지 않은 값이 들어갑니다. 그것은 disp() 함수를 실행하면서 컴파일러가 ACC 레지스터를 사용하기 때문입니다. RIDE51 에서 SFR 영역은 Main registers 창에 나옵니다. 위 프로그램을 베타 키트에서 실행하려면 -- 1 부분을 delay(10000); 으로 수정해서 하세요. 테스트가 끝났으면 Debug->reset 을 클릭하고 초기화합니다. View->Code(disassembly) 를 클릭합니다. C 언어가 역어셈블 되어서 나옵니다. [F8] 을 클릭하면 한 명령씩 실행되는 것을 볼 수 있습니다. (너무 어렵지요) 실행하는 것만 몇 단계 해 보세요. C 언어가 어셈으로 어떻게 바뀌는 가를 볼 수 잇습니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함