Keil Logo

C51: Configurable SFR Bit Accesses

Information in this article applies to:

  • C51 All Versions


I want to have one file for manipulating C SFR variables that are declared in other modules. I also want to make a library out of it, and include it when I link, so it will use the right SFRs. How can I do this?


This is a little tricky (since SFRs cannot be accessed indirectly), but it can be done.

Let's say that you want to have a library of routines that access STUFF attached to the port pins of the 8051. For example, you have a push button on P1.1 and an LED on P2.3. However, you realize that the next project you do will have a button on a different port and an LED on still a different port.

Make the library generic so you can use it over and over once it is debugged. Obviously, you need to have a way to "assign" the SFR addresses outside of the library. There are several reasons to do this. One is so that you can have a generic library of routines that you use that always work that you provide as a courtesy to clients. You give them the library but NOT the source code.

Here's how to proceed. First, write your C files using external bits and external data unsigned chars to access the SFRs. For example:

//----------------------- C PROGRAM -------------------------
extern bit LED_PORT;
extern bit SWITCH_PORT;
extern data unsigned char LCD_DATA_PORT;

LED_PORT = 0;        /* turn off the led */

a = SWITCH_PORT;     /* read the switch */

LCD_DATA_PORT = 'A'; /* print A on the LCD */

Now, you need an ASSEMBLY file (not a C file because the _at_ keyword doesn't allow the SFR address ranges) to declare the bits and bytes. For example:

;---------------------- A51 PROGRAM ------------------------
LED_PORT        bit     091h    ; Port 1.1
public  LED_PORT

SWITCH_PORT     bit     0A2h    ; Port 2.2

LCD_DATA_PORT   data    0B0h    ; Port 3


Now, all you need to do is to change the addresses in the A51 program to match your hardware, link it in with the library, and then you have external SFR definitions.


Last Reviewed: Thursday, February 25, 2021

Did this article provide the answer you needed?
Not Sure
  Arm logo
Important information

This site uses cookies to store information on your computer. By continuing to use our site, you consent to our cookies.

Change Settings

Privacy Policy Update

Arm’s Privacy Policy has been updated. By continuing to use our site, you consent to Arm’s Privacy Policy. Please review our Privacy Policy to learn more about our collection, use and transfers
of your data.