Hier eine etwas andere Herangehensweise:
Wenn es schon unterschiedliche Zustandsgrößen in einem unsigned char gibt, könnte man ihnen auch Namen geben.
Etwa so:
#include <stdio.h>
#define BLINKEN 1
#define NICHT_BLINKEN 0
struct StatusFeld{
unsigned char power :4; /* 4bit fuer die Power */
unsigned char modus :4; /* und 4 fuer den Modus */
};
int anschalten(unsigned char*,int,int);
/* Wertebereich fuer lampe 1, 2, 3, 4 ( 0 bis 3 wäre schoener)*/
/* Wertebereich fuer modus 0, 1 */
int anschalten(unsigned char* pAlleLampen,int lampe,int mod){
struct StatusFeld *pbitfeld = (struct StatusFeld*) pAlleLampen;
if(lampe <1 || lampe > 4)
return 1;
if(mod !=1 && mod)
return 2;
pbitfeld->power |= 1<<(lampe- 1);
pbitfeld->modus = (mod == 0) ? pbitfeld->modus & (~(1<<(lampe- 1))) :
pbitfeld->modus | (1<<(lampe-1));
return 0;
}
int main( void ) {
unsigned char alleMeineLampen = 0; /* jaaa mach sie an! */
anschalten(&alleMeineLampen, 2, 1);
printf("%i\n",(int)alleMeineLampen);/* Ausgabe 34 => 0010 | 0010 */
anschalten(&alleMeineLampen, 3, 1);
printf("%i\n",(int)alleMeineLampen);/* Ausgabe 102 => 0110 | 0110 */
anschalten(&alleMeineLampen, 2, 0);
printf("%i\n",(int)alleMeineLampen);/* Ausgabe 70 => 0100 | 0110 */
return 0;
}