I am facing this error when try to compile a C program using the SDCC compiler:

The part of programme that is causing error.

define cmdport P3
define dataport P2
define q 100

(following  3 line are causing error.)
sbit at  cmdport^0  rs ;  //register select pin
sbit at  cmdport^1  rw ;  // read write pin
sbit at  cmdport^6  e ;  //enable pin
  • \$\begingroup\$ take the time to format your code, it is not easily readable right now. \$\endgroup\$
    – Kortuk
    Mar 13, 2011 at 11:54
  • 5
    \$\begingroup\$ That isn't valid C code. I'm not surprised that you get errors. \$\endgroup\$ Mar 13, 2011 at 14:37
  • \$\begingroup\$ I have write a small part of code and if you are talking about # before define then i did it and if bout sbit declaration then in sdcc we define <br>sbit rs = cmdport^0; as<br>sbit at cmdport^0 rs ; \$\endgroup\$
    – Zain
    Mar 13, 2011 at 15:58
  • \$\begingroup\$ @Leon Heller: while this technically isn't ANSI C code, the original poster clearly stated he is using SDCC. The __sbit __at language extension is clearly documented in the SDCC manual. \$\endgroup\$
    – davidcary
    Mar 14, 2011 at 15:17
  • \$\begingroup\$ would you mind if I edit your original question so that it's valid C? You have a good question here about sbit with SDCC, but it's being overshadowed by confusion around the code \$\endgroup\$ Mar 15, 2011 at 1:28

2 Answers 2


Your code is not valid C. It should look like this:

#include <reg51.h>
#define cmdport P3
#define dataport P2
#define q 100

To create sbit definitions for the individual bits in P3 (address 0xB0), you want:

__sbit __at (0xB0) rs; // P3.0
__sbit __at (0xB1) rw; // P3.1
__sbit __at (0xB6) e;  // P3.6

Though, if you look in sdcc/includes/mcs51/8051.h you'll find that there are already generic definitions for P3_0 and so on, allowing you to write:

#define rs P3_0
#define rw P3_1
#define e  P3_6

I'd also recommend that you pick more descriptive names for your bit definitions than rs, rw and e as these may clash with variable names.

  • \$\begingroup\$ i was including like you but i could not add # in question.I also tried __ before sbit and at as they were warned by sdcc as depriciated.i just copy your code nd now my code is working fine.but still i can,t figure out the cause f problem.please let me to know. \$\endgroup\$
    – Zain
    Mar 14, 2011 at 16:46
  • \$\begingroup\$ @Zain Try the SDCC mailing list. That's a much better forum for detailed back and forth discussion \$\endgroup\$ Mar 14, 2011 at 17:27

My guess is that this is an assembly file - you need to run it through an assembler rather than the C compiler.

Many C compilers (especially gcc based ones) will recognise a file with a particular suffix (.s for example) and do the right thing for you - other compilers wont - if you're using a make file that was written for gcc with a different compiler you might find that it makes this mistake


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.