13.C51 언어 확장 - 이상정

Download Report

Transcript 13.C51 언어 확장 - 이상정

C51 언어 확장
순천향대학교 정보기술공학부
이상정
2002-1 마이크로프로세서
메모리 영역
 8051의 메모리 영역 지정
• code: 64KB 프로그램 메모리 영역
• data: 내부 메모리 하위 128 바이트 영역으로 직접
지정
• idata: 내부 메모리 256 바이트 영역으로 간접지정
• bdata: 내부 데이터 메모리비트 단위 지정영역
(20H-2FH, SFR 8의 배수)
• xdata: 외부 데이터 메모리
• pdata: 1 페이지(256 바이트) 외부 데이터 메모리
영역, 8 비트 지정가능
순천향대학교 정보기술공학부
이상정
2
2002-1 마이크로프로세서
메모리 모델
 함수의 인수,변수 등의 사용 메모리 형 지정
• SMALL
모든 변수들이 data 형인 내부 데이터 메모리 128
바이트에 위치
• COMPACT
모든 변수들이 pdata 형인 1페이지의 외부 데이터
메모리에 위치
• LARGE
xdata 형인 외부 데이터 메모리 64KB에 위치
순천향대학교 정보기술공학부
이상정
3
2002-1 마이크로프로세서
메모리 형 사용 예
예
• char code text[]=“STRING”;
•
•
•
•
char data var1;
float idata x,y,z;
char bdata flag;
unsigned int xdata array[100];
순천향대학교 정보기술공학부
이상정
4
2002-1 마이크로프로세서
정수 자료형
 int 형은 2바이트
• long 4 바이트, short는 2바이트
 unsigned char 가 주로 사용
 int 형1234H 저장 시 Big Endian 식 저장
• 낮은 번지12H 저장
• 높은 번지 34H 저장
순천향대학교 정보기술공학부
이상정
5
2002-1 마이크로프로세서
자료형의 추가
 표준 ANSI 에 8051에 적용되는 특수 자료형
추가
• bit, sbit sfr, sfr16
 비트 자료형
• bdata 영역의 변수 선언시 사용
• bit형, sbit 형
• bit형은 비트단위 변수 지정
• sbit형은 바이트나 비트 단위 액세스 변수로 ^ 기호
로 특정 비트 표시
순천향대학교 정보기술공학부
이상정
6
2002-1 마이크로프로세서
비트 자료형 예
예
static bit time_flag = 0;
int bdata var1;
char bdata vector[5];
sbit mybit0 = var1 ^ 0;
sbit mybit15 = var1 ^ 15;
sbit vector15 = vector[1] ^ 7;
/* bit 0 of var1 */
/* bit 15 of var1 */
/* bit 7 of vector[1] */
vector[0] = ‘a’;
/* byte addressing */
var1 = -10;
/* word addressing */
mybit15 = 0;/* clear bit 15 of var1 */
vector15 = 1;
/* set bit 7 of vector[1] */
순천향대학교 정보기술공학부
이상정
7
2002-1 마이크로프로세서
SFR의 액세스
 SFR을 액세스하기 위해 sfr, sfr16, sbit 데이
터형을 사용
• sfr16은 타이머 2와 같이 16비트 길이의 SFR 선언
시 사용
예
sfr P0 = 0x80;
sfr16 RACP2 = 0xCA;
sbit EA = 0xAF;
sfr PSW = 0xD0;
sbit CY = PSW ^ 7;
sbit OV = 0xD0 ^ 2;
순천향대학교 정보기술공학부
이상정
/*
/*
/*
/*
/*
/*
port 0, address 80H */
Timer 2 Capture CAH, CBH */
bit 7 of IE */
PSW, address D0H */
carry flag */
overflow flag */
8
2002-1 마이크로프로세서
절대번지 변수
 특정 절대번지에 변수를 위치시키려면 다음 형
식으로 선언
메모리형 자료형 변수이름 _at_ 주소
예
idata int var1 _at_ 0x50;
xdata int start _at_ 0x9000;
xdata char text[256] _at_ 0xB000;
순천향대학교 정보기술공학부
이상정
9
2002-1 마이크로프로세서
포인터 사용
 일반 포인터(generic pointer)와 메모리 지정 포
인터(memory-specific pointer)로 구분
 일반 포인터
• 일반 C에서 사용되는 포인터로 3바이트로 표현
=> 첫번째 바이트는 메모리형 구분, 나머지 2바이트는
주소
• 메모리 어느 영역의 변수를 액세스할 수 있으나 처리속
도 느림
• 예
chat *sptr;
• 일반 포인터가 저장될 메모리 영역을 지정할 수 있다
char * xdata sptr;
순천향대학교 정보기술공학부
이상정
10
2002-1 마이크로프로세서
포인터 사용
 메모리 지정 포인터
• 메모리형과 함께 지정하여 항상 지정된 메모리 영역
참조
• idata, data,bdata, pdata 포인터는 1바이트로 표현
• code, xdata 포인터는 2바이트로 표현
• 예
char code *sptr;
int idata *numptr;
• 포인터가 저장될 영역 지정 예
char code * xdata sptr;
int idata * data numptr;
순천향대학교 정보기술공학부
이상정
11
2002-1 마이크로프로세서
함수 선언
 C51에서 함수 선언 시 다음 기능 추가
• 인터럽트 서비스 루틴 함수의 지정
• 사용될 레지스터 뱅크의 지정
• 메모리 모델의 선택
• 재진입(reentrancy)의 지정
[return_type] function_name(arg_list) {small|compact|large}
[reentrant][interrupt n][using n]
순천향대학교 정보기술공학부
이상정
12
2002-1 마이크로프로세서
함수의 인수
 표준 C 함수에서 인수 및 지역변수는 스택에
저장
 8051은 스택은 내부 데이터 메모리만을 사용
하여 용량에 제약
• 따라서 인수의 전달은 레지스터를 사용하여 전달
• 리턴 값도 레지스터 사용하여 전달
순천향대학교 정보기술공학부
이상정
13
2002-1 마이크로프로세서
인터럽트 서비스 루틴 함수
 인터럽트 서비스 루틴 함수
• interrupt n 으로 벡터번호 지정
• 인수나 리턴값은 지정할 수 없음
예
unsigned int cnt, sec;
void timer0(void) interrupt 1 using 2 {
if (++cnt == 4000) {
sec++;
cnt = 0;
}
}
순천향대학교 정보기술공학부
이상정
14
2002-1 마이크로프로세서
인터럽트 이중벡터링
 C51에서는 인터럽트 벡터를 생성하는 위치를
오프셋 값으로 지정하여 임의의 메모리 번지에
인터럽트 벡터 생성
#progrma invector(오프셋)
예
#progrma invector(0xFF00)
void TIMER0(void) interrupt 1 {
……….
……….
}
순천향대학교 정보기술공학부
이상정
15
2002-1 마이크로프로세서
Include 파일
 REG52.H 파일
• SFR 정의
 OK8051.H
• OK-8051 키트의 I/O 주소 정의
 OK8051FN.H
• 자주 사용하는 I/O 루틴 정의
• Delay(), Beep(), Key_input()
• LCD_check_busy(), LCD_command(),
LCD_data(), LCD_string()
순천향대학교 정보기술공학부
이상정
16
2002-1 마이크로프로세서
LED, LCD 프로그램 예
 p.633 C02_1.C 프로그램 예
• LED 좌우 3 비트 시프트, LCD 표시 프로그램
#include <REG52.H>
#define PPI_PORTA
*((unsigned char xdata *)0x1200)
#define PPI_PORTB
*((unsigned char xdata *)0x1201)
#define PPI_PORTC
*((unsigned char xdata *)0x1202)
#define PPI_CW
*((unsigned char xdata *)0x1203)
#define LCD_WR_INST *((unsigned char xdata *)0x1300)
#define LCD_RD_STATUS *((unsigned char xdata *)0x1301)
#define LCD_WR_DATA *((unsigned char xdata *)0x1302)
#define LCD_RD_RAM *((unsigned char xdata *)0x1303)
순천향대학교 정보기술공학부
이상정
17
2002-1 마이크로프로세서
LED, LCD 프로그램 예
void Delay(unsigned int ms)
{ unsigned int i, j;
/* time delay for ms[ms] */
for(i = 1; i <= ms; i++)
for(j = 1; j <= 125; j++);
}
void LCD_check_busy(void)
{ unsigned int i;
for(i = 0; i < 2000; i++)
{ if((LCD_RD_STATUS & 0x80) == 0)
return;
}
}
순천향대학교 정보기술공학부
이상정
/* check LCD busy flag */
18
2002-1 마이크로프로세서
LED, LCD 프로그램 예
void LCD_command(char command) /* write a command on LCD */
{ LCD_check_busy();
LCD_WR_INST = command;
}
void LCD_data(char character)
/* display a character on LCD */
{ LCD_check_busy();
LCD_WR_DATA = character;
}
void LCD_string(char command, char *string) /* display a string on
LCD */
{ LCD_command(command);
while(*string != '\0')
{ LCD_data(*string);
string++;
}
}
순천향대학교 정보기술공학부
이상정
19
2002-1 마이크로프로세서
LED, LCD 프로그램 예
main()
{ unsigned int i;
LCD_string(0x80," LED SHIFT
LCD_string(0xC0,"
");
PPI_PORTA = 0x01;
Delay(300);
for(i = 1; i <= 3; i++)
{ PPI_PORTA = PPI_PORTA <<
Delay(300);
}
for(i = 1; i <= 3; i++)
{ PPI_PORTA = PPI_PORTA >>
Delay(300);
}
");
/* display title */
/* initial output of LED data */
/* shift left by 3 times */
1;
/* shift right by 3 times */
1;
}
순천향대학교 정보기술공학부
이상정
20