This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

using jb of a unsigned char in c

hello,
I would like to do a bit test of a unsigned char variable. It's like a jb in assembler.

here is my code in c.


unsigned char displ;
unsigned char display3 = 0xA8;
unsigned char i;
sbit display_data = P1^0;

displ = display3;
for (i=0; i<7; i++) {
        if (displ^0 == 1){
        display_data = 0;
        }
        else {
        display_data = 1;
        }
        displ>>=1;
}


I don't have any warning or error, but the result of test is wrong.
is it possible to do in c?

tkx.

Parents
  • This slightly modified example does what you want:

    C51 COMPILER V8.08a, COMPILATION OF MODULE DISPL
    OBJECT MODULE PLACED IN displ.OBJ
    COMPILER INVOKED BY: c51.exe displ.c CODE
    
    line level    source
       1          unsigned char    displ;
       2          unsigned char display3 = 0xA8;
       3          unsigned char       i;
       4          sfr            P1 = 0x90;
       5          sbit display_data = P1^0;
       6
       7          void test (void)  {
       8   1        displ = display3;
       9   1        for (i = 0 ; i < 7; ++i )  {
      10   2          if (displ & 0x01)  { // (displ^0 == 1){
      11   3            display_data = 0;
      12   3          }
      13   2          else {
      14   3            display_data = 1;
      15   3          }
      16   2          displ >>= 1;
      17   2        }
      18   1      }
    
                 ; FUNCTION test (BEGIN)
                                               ; SOURCE LINE # 7
                                               ; SOURCE LINE # 8
    0000 850000      R     MOV     displ,display3
                                               ; SOURCE LINE # 9
    0003 E4                CLR     A
    0004 F500        R     MOV     i,A
    0006         ?C0001:
                                               ; SOURCE LINE # 10
    0006 E500        R     MOV     A,displ
    0008 30E004            JNB     ACC.0,?C0004
                                               ; SOURCE LINE # 11
    000B C290              CLR     display_data
                                               ; SOURCE LINE # 12
    000D 8002              SJMP    ?C0005
    000F         ?C0004:
                                               ; SOURCE LINE # 13
                                               ; SOURCE LINE # 14
    000F D290              SETB    display_data
                                               ; SOURCE LINE # 15
    0011         ?C0005:
                                               ; SOURCE LINE # 16
    0011 E500        R     MOV     A,displ
    0013 C3                CLR     C
    0014 13                RRC     A
    0015 F500        R     MOV     displ,A
                                               ; SOURCE LINE # 17
    0017 0500        R     INC     i
    0019 E500        R     MOV     A,i
    001B B407E8            CJNE    A,#07H,?C0001
                                               ; SOURCE LINE # 18
    001E         ?C0006:
    001E 22                RET
                 ; FUNCTION test (END)
    

Reply
  • This slightly modified example does what you want:

    C51 COMPILER V8.08a, COMPILATION OF MODULE DISPL
    OBJECT MODULE PLACED IN displ.OBJ
    COMPILER INVOKED BY: c51.exe displ.c CODE
    
    line level    source
       1          unsigned char    displ;
       2          unsigned char display3 = 0xA8;
       3          unsigned char       i;
       4          sfr            P1 = 0x90;
       5          sbit display_data = P1^0;
       6
       7          void test (void)  {
       8   1        displ = display3;
       9   1        for (i = 0 ; i < 7; ++i )  {
      10   2          if (displ & 0x01)  { // (displ^0 == 1){
      11   3            display_data = 0;
      12   3          }
      13   2          else {
      14   3            display_data = 1;
      15   3          }
      16   2          displ >>= 1;
      17   2        }
      18   1      }
    
                 ; FUNCTION test (BEGIN)
                                               ; SOURCE LINE # 7
                                               ; SOURCE LINE # 8
    0000 850000      R     MOV     displ,display3
                                               ; SOURCE LINE # 9
    0003 E4                CLR     A
    0004 F500        R     MOV     i,A
    0006         ?C0001:
                                               ; SOURCE LINE # 10
    0006 E500        R     MOV     A,displ
    0008 30E004            JNB     ACC.0,?C0004
                                               ; SOURCE LINE # 11
    000B C290              CLR     display_data
                                               ; SOURCE LINE # 12
    000D 8002              SJMP    ?C0005
    000F         ?C0004:
                                               ; SOURCE LINE # 13
                                               ; SOURCE LINE # 14
    000F D290              SETB    display_data
                                               ; SOURCE LINE # 15
    0011         ?C0005:
                                               ; SOURCE LINE # 16
    0011 E500        R     MOV     A,displ
    0013 C3                CLR     C
    0014 13                RRC     A
    0015 F500        R     MOV     displ,A
                                               ; SOURCE LINE # 17
    0017 0500        R     INC     i
    0019 E500        R     MOV     A,i
    001B B407E8            CJNE    A,#07H,?C0001
                                               ; SOURCE LINE # 18
    001E         ?C0006:
    001E 22                RET
                 ; FUNCTION test (END)
    

Children