Přijel jsem z weekendu a vidím - pánové, co tu řešíte za složitosti?
Pokud chci dostat data z portu do proměnné, je to snad obyčejné přiřazení
Kód: Vybrat vše
unsigned char c = PORTA; // vsechny bity
unsigned char d = PORTB & MASKA; // kde maska "propusti" bity na pozicich, kde ma sama log. 1
Pokud by se mělo výsledné slovo skládat ze skupin bitů nějak na přeskáčku, tak lze použít bitová pole. Následující prográmek složí výsledné 16 bitové slovo ze 3 skupin bitů o délkách 3, 6 a 7 bitů. Pro jednoduchost jsou jako data použity konstanty.
Kód: Vybrat vše
typedef struct
{
unsigned dolni_3 : 3; // bity 0-2
unsigned strednich_6 : 6; // bity 3-8
unsigned nejvyssich_7 : 7; // bity 9-15
}BitFields;
typedef union
{
BitFields as_bit_fields;
unsigned short int as_short_int;
}InData;
int main(int argc, char* argv[])
{
InData data;
data.as_bit_fields.nejvyssich_7 = 0xc0;
data.as_bit_fields.strednich_6 = 0x7f;
data.as_bit_fields.dolni_3 = 0x07;
unsigned short int result = data.as_short_int;
return 0;
}
Potřebné shifty a maskování zařídí překladač automaticky. Výsledek je v proměnné result = 0x81ff. Všmněte si, že i když přiřazení:
Kód: Vybrat vše
data.as_bit_fields.strednich_6 = 0x7f;
přesahuje svou konstantou 0x7f délku pole 6 bitů, je automaticky oříznuto na 6 bitů a výsledek 0x81ff je stejný jako pro přířazení:
Kód: Vybrat vše
data.as_bit_fields.strednich_6 = 0x3f;