Solution
#include <stdio.h>
#include <stdlib.h>
#define BITSET(reg, pos) (reg | (1 << (pos)))
#define BITCLEAR(reg, pos) (reg & (~(1 << (pos))))
#define BITTEST(reg, pos) (reg & (1 << (pos)))
int main(int argc, char* argv[])
{
unsigned char reg = 0;
int i = 0;
char buffer [9];
printf("Test bit setting\n");
for(i = 0; i < sizeof(unsigned char) * 8; ++i){
itoa (reg, buffer, 2);
printf("Before setting bit at pos %d, register status: 0b%08s\n",i, buffer);
reg = BITSET(reg, i);
itoa (reg, buffer, 2);
printf("After setting bit at pos %d, register status : 0b%08s\n",i, buffer);
}
unsigned char reg1 = 0x5A;
itoa (reg1, buffer, 2);
printf("\nTest bit testing 0b%08s\n",buffer);
for(i = 0; i < sizeof(unsigned char) * 8; ++i){
int status = BITTEST(reg1, i);
if(status){
printf("Bit at pos %d of register is set\n", i);
}
else{
printf("Bit at pos %d of register is NOT set\n", i);
}
}
printf("\nTest bit clearing\n");
for(i = 0; i < sizeof(unsigned char) * 8; ++i){
itoa (reg, buffer, 2);
printf("Before clearing bit at pos %d, register status: 0b%08s\n",i, buffer);
reg = BITCLEAR(reg, i);
itoa (reg, buffer, 2);
printf("After clearing bit at pos %d, register status : 0b%08s\n",i, buffer);
}
return 0;
}
Output
Test bit setting
Before setting bit at pos 0, register status: 0b00000000
After setting bit at pos 0, register status : 0b00000001
Before setting bit at pos 1, register status: 0b00000001
After setting bit at pos 1, register status : 0b00000011
Before setting bit at pos 2, register status: 0b00000011
After setting bit at pos 2, register status : 0b00000111
Before setting bit at pos 3, register status: 0b00000111
After setting bit at pos 3, register status : 0b00001111
Before setting bit at pos 4, register status: 0b00001111
After setting bit at pos 4, register status : 0b00011111
Before setting bit at pos 5, register status: 0b00011111
After setting bit at pos 5, register status : 0b00111111
Before setting bit at pos 6, register status: 0b00111111
After setting bit at pos 6, register status : 0b01111111
Before setting bit at pos 7, register status: 0b01111111
After setting bit at pos 7, register status : 0b11111111
Test bit testing 0b01011010
Bit at pos 0 of register is NOT set
Bit at pos 1 of register is set
Bit at pos 2 of register is NOT set
Bit at pos 3 of register is set
Bit at pos 4 of register is set
Bit at pos 5 of register is NOT set
Bit at pos 6 of register is set
Bit at pos 7 of register is NOT set
Test bit clearing
Before clearing bit at pos 0, register status: 0b11111111
After clearing bit at pos 0, register status : 0b11111110
Before clearing bit at pos 1, register status: 0b11111110
After clearing bit at pos 1, register status : 0b11111100
Before clearing bit at pos 2, register status: 0b11111100
After clearing bit at pos 2, register status : 0b11111000
Before clearing bit at pos 3, register status: 0b11111000
After clearing bit at pos 3, register status : 0b11110000
Before clearing bit at pos 4, register status: 0b11110000
After clearing bit at pos 4, register status : 0b11100000
Before clearing bit at pos 5, register status: 0b11100000
After clearing bit at pos 5, register status : 0b11000000
Before clearing bit at pos 6, register status: 0b11000000
After clearing bit at pos 6, register status : 0b10000000
Before clearing bit at pos 7, register status: 0b10000000
After clearing bit at pos 7, register status : 0b00000000
Press any key to continue . . .
Problem
In embedded programming, most common tasks are setting and clearing bits in a register and check whether a bit is 0 or 1 in a given register.
The purpose of CPU writing data to registers:
Configure peripherals
Command peripherals
Transfer data to a peripheral
The purpose of CPU reading data from registers
Get the status of peripherals
Read data from peripherals
How to implement bit setting, bit reading and bit clearing?