Keil C51 Hanbat National University prof Song Myoung
Keil C-51 프로그램 정리 정보통신 • 컴퓨터 공학부 송명규 Hanbat National University prof. Song Myoung Gyu 1
1. C-51 메모리 타입 정리 Hanbat National University prof. Song Myoung Gyu 2
2. 비트 Type 함수 [1] v bit_func(bit chk_flag, bit key_flag) { bit func_flag; func_flag = key_flag; if(rx_end_flag == 1) chk_flag = 1; else key_flag = 0; return func_flag; } Hanbat National University prof. Song Myoung Gyu 3
2. 비트 Type 함수 [2] v bit rx_end_flag = 0; void main(void) { unsigned char song; rx_end_flag = bit_func(rx_end_flag, 1); } Hanbat National University prof. Song Myoung Gyu 4
3. Bit 주소 (bdata 0 x 20 – 0 x 2 f) v bdata int song; v bdata char k[4] ; v bdata unsigned char smg; sbit mybit 0 = song ^ 0; sbit mybit 15 = song ^ 15; sbit ary 7 = k[0] ^ 6; sbit ary_g = k[3] ^ 2; sbit key_flag = smg ^ 4; Ex) key_flag = 1; ar 7 = 0; if(ary_g == 1) key_flag = mybit 0; Hanbat National University prof. Song Myoung Gyu 5
4. Sfr, sfr 16 v v v v v sfr 영역를 정의 할때 사용 sfr P 0 = 0 x 80; sfr P 3 = 0 xb 0; sfr TCON = 0 x 88; sfr IE = 0 xa 8; sfr TMOD = 0 x 89; Ex) IE = 0 x 83; Sfr 16 T 2 = 0 xcc; // sfr영역 16비트 레지스터 정의 Sfr 16 RCAP 2 = 0 xca; //sfr 16비트 레지스터 Hanbat National University prof. Song Myoung Gyu 6
5. Sbit [1] v 형식 1 v sfr PSW = 0 xd 0; v sfr IE = 0 xa 8; v sfr P 1 = 0 x 90; v v v v sbit OV = PSW ^ 2; sbit CY = PSW ^ 7; sbit EA = IE ^ 7; sbit EX 0 = IE ^ 0; Sbit PWM_OUT = P 1 ^ 3; //p 1. 3 bit Sbit key_in = P 1 ^ 1; //p 1. 1 Ex) PWM_OUT = (~(PWM_OUT)); if(key_in == 0) { } EA = 1; EX 0 = 0; PWM_OUT = EA; if(CY) {} Hanbat National University prof. Song Myoung Gyu 7
5. Sbit [2] v 형식 2 v Sbit OV = 0 xd 0 ^ 2; v Sbit CY = 0 xd 0 ^ 7; v Sbit EA = 0 xa 8 ^ 7; v Sbit EX 0 = 0 xa 8 ^ 0; v Sbit LED_0 = 0 x 80 ^ 0; // port 0. 0 v Sbit LED_1 = 0 xa 0 ^ 2; // port 2. 2 v Sbit MOTOR_ON = 0 x 90 ^ 7; // port 1. 7 v Sbit sound_out = 0 xb 0 ^ 5; // port 3. 5 Hanbat National University prof. Song Myoung Gyu 8
5. Sbit [3] v 형식 3 v Bdata char j, k; v Bdata int kim; v Bdata char count[3]; v Sbit key_flag = j ^ 0; v Sbit rtx_flag = kim ^ 13; v Sbit ON_OFF_FLAG = count[2] ^ 5; Hanbat National University prof. Song Myoung Gyu 9
6. Bit 변수 v bit key_flag = 0; v bit chk_flag = 1; v bit on_flag; v bit off_flag; v bit tog_bit = 1; v bit rtx_bit = 0; v bit key_in; v Ex) on_flag = 1; off_flag = 0; key_flag=rtx_flag; if(key_in == 0) {} Hanbat National University prof. Song Myoung Gyu 10
7. 메모리 지정 포인터 v Data char *k; v Idata int *h; v Xdata float *smg; v Pdata char *song; Hanbat National University prof. Song Myoung Gyu 11
8. 메모리 저장 위치 프로그램 v v v bdata char k; bdata int song; data char kim[]; data int mig; idata char p; idata int loop[2] = {0 x 0001, 0 x 0002, 34, 56}; pdata char kig; xdata float sum = 123; xdata char sd[10]; code char fnd_font[] = {0 x 30, 0 x 55, 0 x 46, 0 x 88}; const char logo[] = “Song Moung Gyu”; Ex) song = 1000; p=3; kig = 9; if(sd[1] != 0 x 40) {} Hanbat National University prof. Song Myoung Gyu 12
9. 메모리 및 외부 I/O 절대번지 엑세스 포인터 [1] v 1. 절대번지 엑세스 매크로를 사용하는 방법 - ABSACC. H 파일에 정의되어 있다 = include 하여 사용한다. - 8 비트, 16 비트 를 엑세스 할수 있다. 예) #include <ABSACC. H> unsigned char val 8; unsigned char val 16; val 8 = DBYTE[0 x 0010]; // read 0010 번지 DWORD[0 x 0020] = 0 xa 000; // write 2 byte, 0020 – 0021 번지 val 16 = XWORD[0 x 1000]; // read 2 byte, 1000 – 1001 번지 XBYTE[0 x 1100] = 0 xa 0; //write 1100 번지 Hanbat National University prof. Song Myoung Gyu 13
9. 메모리 및 외부 I/O 절대번지 엑세스 포인터 [2] v ABSACC. H v Direct access to 8051, extended 8051 and Philips 80 C 51 MX memory areas. Copyright (c) 1988 -2001 Keil Elektronik Gmb. H and Keil Software, Inc. All rights reserved. -------------------------------------*/ v v v v #define CBYTE ((unsigned char volatile code *) 0) DBYTE ((unsigned char volatile data *) 0) PBYTE ((unsigned char volatile pdata *) 0) XBYTE ((unsigned char volatile xdata *) 0) v v #define CWORD ((unsigned int volatile code *) 0) DWORD ((unsigned int volatile data *) 0) PWORD ((unsigned int volatile pdata *) 0) XWORD ((unsigned int volatile xdata *) 0) Hanbat National University prof. Song Myoung Gyu 14
9. 메모리 및 외부 I/O 절대번지 엑세스 포인터 [3] v v v v v #ifdef __CX 51__ #define FVAR(object, addr) (*((object volatile far *) (addr))) #define FARRAY(object, base) ((object volatile far *) (base)) #else #define FVAR(object, addr) (*((object volatile far *) ((addr)+0 x 10000 L))) #define FCVAR(object, addr) (*((const object far *) ((addr)+0 x 810000 L))) #define FARRAY(object, base) ((object volatile far *) ((base)+0 x 10000 L)) #define FCARRAY(object, base) ((const object volatile far *) ((base)+0 x 810000 L)) #endif Hanbat National University prof. Song Myoung Gyu 15
9. 메모리 및 외부 I/O 절대번지 엑세스 포인터 [5] v 3. 포인터를 사용하는 방법 - 외부 I/O 번지를 지정하는데 널리 사용되는 방법 = xdata 영역에 해당 예) #define PORT_A *((unsigned char xdata *) 0 x 1200) #define LED_PORT * (unsigned char xdata *) 0 x 1201) unsigned char smg; PORT_A = (PORT_A & 0 x 0 f); LED_PORT = 0 x 80; smg = LED_PORT; PORT_A = smg; #define CODE_Memory ((char *) 0 x 022048) #define XDATA_Memory ((char *) 0 x 018000) #define XDATA_PTR (*(char *) 0 x 015000) XDATA_PTR = 50; //5000 번지에 50을 저장 XDATA_Memory = smg; smg = CODE_Memory; Hanbat National University prof. Song Myoung Gyu 17
10. 8051 메모리 지도 [참고 1] Hanbat National University prof. Song Myoung Gyu 18
11. C 51 메모리 모델 세크먼트 [참고 2] Hanbat National University prof. Song Myoung Gyu 19
12. C 51 인수전달 레지스터 [참고 3] Hanbat National University prof. Song Myoung Gyu 20
13. C 51 함수 리턴값 레지스터 [참고 4] Hanbat National University prof. Song Myoung Gyu 21
- Slides: 21