Crossware

Table of Contents        Previous topic       Next topic       

C COMPILER->Accessing the 8051 Internal Registers->Predefined 8051 Internal Registers Variables

All of the special function registers of the 8051 and its variants can be accessed from within C  using the _sfr, _sfrword and _sfrbit variable types.

Variables for the 8051 and 8052 sfr's have been predefined in header files sfr.h and reg.h.

SFR definitions are provided in two forms:

- lower case with a leading underscore
- upper case without a leading underscore

The first form uses a leading underscore to be compatible with that ANSI standard (which requires a leading underscore for vendor defined variables) and uses lower case because upper case symbols are traditionally associated with C macros.

The second form is provide compatible with other 8051 C compilers.

Include header file sfr.h to use the first form or include header file reg.h to use the second form.

The contents of sfr.h is listed below.  Declarations for the additional register of other 8051 variants can also be added to this file.

#ifndef _SFR_H
#define _SFR_H

/**** 8051 8 bit SFR's *****/

_sfr _acc = 0XE0;        /* accumulator */
_sfr _b = 0XF0;        /* accumulator B */
_sfr _dph = 0X83;        /* data pointer high byte */
_sfr _dpl = 0X82;        /* data pointer low byte */
_sfr _ie = 0XA8;        /* interrupt enable */
_sfr _ip = 0XB8;        /* interrupt priority */
_sfr _p0 = 0X80;        /* port 0 */
_sfr _p1 = 0X90;        /* port 1 */
_sfr _p2 = 0XA0;        /* port 2 */
_sfr _p3 = 0XB0;        /* port 3 */
_sfr _psw = 0XD0;        /* program status word */
_sfr _sbuf = 0X99;        /* serial port buffer */
_sfr _scon = 0X98;        /* serial port controller */
_sfr _sp = 0X81;        /* stack pointer */
_sfr _tcon = 0X88;        /* timer control */
_sfr _th0 = 0X8C;        /* timer 0 high byte */
_sfr _th1 = 0X8D;        /* timer 1 high byte */
_sfr _tl0 = 0X8A;        /* timer 0 low byte */
_sfr _tl1 = 0X8B;        /* timer 1 low byte */
_sfr _tmod = 0X89;        /* timer mode */
_sfr _pcon = 0X87;        /* power control register */

/**** 8051 16 bit SFR's *****/

_sfrword _dptr = 0X82;    /* data pointer low byte */


/**** 8051 SFR bits *****/

_sfrbit _cy = _psw^7;        /* carry flag */
_sfrbit _ac = _psw^6;        /* auxiliary carry flag */
_sfrbit _f0 = _psw^5;        /* flag 0 */
_sfrbit _rs1 = _psw^4;        /* register bank select 1 */
_sfrbit _rs0 = _psw^3;        /* register bank select 0 */
_sfrbit _ov = _psw^2;        /* overflow flag */
_sfrbit _p = _psw^0;        /* parity flag */

_sfrbit _tf1 = _tcon^7;        /* timer 1 overflow flag */
_sfrbit _tr1 = _tcon^6;        /* timer 1 run control bit */
_sfrbit _tf0 = _tcon^5;        /* timer 0 overflow flag */
_sfrbit _tr0 = _tcon^4;        /* timer 0 run control bit */
_sfrbit _ie1 = _tcon^3;        /* interrupt 1 edge flag */
_sfrbit _it1 = _tcon^2;        /* interrupt 1 type control bit */
_sfrbit _ie0 = _tcon^1;        /* interrupt 0 edge flag */
_sfrbit _it0 = _tcon^0;        /* interrupt 0 type control bit */

_sfrbit _sm0 = _scon^7;        /* serial mode control bit 0 */
_sfrbit _sm1 = _scon^6;        /* serial mode control bit 1 */
_sfrbit _sm2 = _scon^5;        /* serial mode control bit 2 */
_sfrbit _ren = _scon^4;        /* receive enable */
_sfrbit _tb8 = _scon^3;        /* transmit bit 8 */
_sfrbit _rb8 = _scon^2;        /* receive bit 8 */
_sfrbit _ti = _scon^1;        /* transmit interrupt flag */
_sfrbit _ri = _scon^0;        /* receive interrupt flag */

_sfrbit _ea = _ie^7;        /* enable all interrupts */
_sfrbit _es = _ie^4;        /* enable serial port interrupt */
_sfrbit _et1 = _ie^3;        /* enable timer 1 interrupt */
_sfrbit _ex1 = _ie^2;        /* enable external interrupt 1 */
_sfrbit _et0 = _ie^1;        /* enable timer 0 interrupt */
_sfrbit _ex0 = _ie^0;        /* enable external interrupt 0 */

_sfrbit _rd = _p3^7;        /* read data for external memory */
_sfrbit _wr = _p3^6;        /* write data for external memory */
_sfrbit _t1 = _p3^5;        /* timer/counter 1 external flag */
_sfrbit _t0 = _p3^4;        /* timer/counter 0 external flag */
_sfrbit _int1 = _p3^3;        /* interrupt 1 input pin */
_sfrbit _int0 = _p3^2;        /* interrupt 0 input pin */
_sfrbit _txd = _p3^1;        /* serial port transmit pin */
_sfrbit _rxd = _p3^0;        /* serial port receive pin */

_sfrbit _ps = _ip^4;        /* priority of serial port interrupt */
_sfrbit _pt1 = _ip^3;        /* priority of timer 1 interrupt */
_sfrbit _px1 = _ip^2;        /* priority of external interrupt 1 */
_sfrbit _pt0 = _ip^1;        /* priority of timer 0 interrupt */
_sfrbit _px0 = _ip^0;        /* priority of external interrupt 0 */


/***** 8052 8 bit SFR's *****/

_sfr _t2con = 0XC8;        /* timer/counter 2 control register */
_sfr _th2 = 0XCD;        /* timer 2 high byte */
_sfr _tl2 = 0XCC;        /* timer 2 low byte */
_sfr _rldh = 0XCB;        /* timer 2 auto reload high byte */
_sfr _rldl = 0XCA;        /* timer 2 auto reload low byte */

/**** 8052 SFR bits *****/

_sfrbit _tf2 = _t2con^7;        /* timer 2 overflow flag */
_sfrbit _exf2 = _t2con^6;        /* timer 2 external flag */
_sfrbit _rclk = _t2con^5;        /* receive clock flag */
_sfrbit _tclk = _t2con^4;        /* transmit clock flag */
_sfrbit _exen2 = _t2con^3;    /* timer 2 external enable flag */
_sfrbit _tr2 = _t2con^2;        /* timer 2 run control bit */
_sfrbit _c_t2 = _t2con^1;        /* timer/counter select bit */
_sfrbit _cp_rl2 = _t2con^0;    /* capture/reload flag */
_sfrbit _et2 = _ie^5;        /* enable timer 2 interrupt */

#endif    /* _SFR_H */