Jaime Perez Jaime Perez - 3 years ago 330
C Question

C - Increment 18 bits in C 8051

I have been programming the 8051 for about two months now and am somewhat of a newbie to the C language. I am currently working with flash memory in order to read, write, erase, and analyze it. I am working on the write phase at the moment and one of the tasks that I need to do is specify an address location and fill that location with data then increment to the next location and fill it with complementary data. So on and so forth until I reach the end.

My dilemma is I have 18 address bits to play with and currently have three bytes allocated for those 18 bits. Is there anyway that I could combine those 18 bits into an

int
or
unsigned int
and increment like that? Or is my only option to increment the first byte, then when that byte rolls over to
0x00
increment the next byte and when that one rolls over, increment the next?

I currently have:

void inc_address(void)
{
P6=address_byte1;
P7=address_byte2;
P2=address_byte3;
P5=data_byte;

while(1)
{
P6++;
if(P6==0x00){P7++;}
else if(P7==0x00){P2++;}
else if(P2 < 0x94){break;} //hex 9 is for values dealing with flash chip
P5=~data_byte;
}
{

Answer Source

Is there anyway that I could combine those 18 bits into an int or unsigned int and increment like that?

Sure. Supposing that int and unsigned int are at least 18 bits wide on your system, you can do this:

unsigned int next_address = (hi_byte << 16) + (mid_byte << 8) + low_byte + 1;
hi_byte = next_address >> 16;
mid_byte = (next_address >> 8) & 0xff;
low_byte = next_address & 0xff;

The << and >> are bitwise shift operators, and the binary & is the bitwise "and" operator.

It would be a bit safer and more portable to not make assumptions about the sizes of your types, however. To avoid that, include stdint.h, and use type uint_least32_t instead of unsigned int:

uint_least32_t next_address = ((uint_least32_t) hi_byte << 16)
        + ((uint_least32_t) mid_byte << 8)
        + (uint_least32_t) low_byte
        + 1;

// ...
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download