	union _word
	{
		uint16_t	word;
		uint8_t		byte[2];
	} wrd;

	wrd.byte[0] = data;
	wrd.byte[1] = reg;
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=67601

   typedef union { 
       volatile unsigned char flinps; 
       struct { 
          unsigned char b0 : 1; 
          unsigned char b1 : 1; 
          unsigned char menubtileft : 1; 
          unsigned char menubtimiddle : 1; 
          unsigned char menubtiright : 1; 
          unsigned char b5 : 1; 
          unsigned char b6 : 1; 
          unsigned char b7 : 1; 
       }; 
    } flinps_union_t; 
     
    typedef union { 
       volatile unsigned char buttons; 
       struct { 
          unsigned char b0 : 1; 
          unsigned char b1 : 1; 
          unsigned char menubtbleft : 1; 
          unsigned char menubtbmiddle : 1; 
          unsigned char menubtbright : 1; 
          unsigned char b5 : 1; 
          unsigned char b6 : 1; 
          unsigned char b7 : 1; 
       }; 
    } buttons_union_t; 

 typdef struct { 
    flinps_union_t flinps; 
    buttons_union_t buttons; 
    unsigned char buttprsd;        
    unsigned char fdsmsm;        
    unsigned char tmpinps; 
 } mydata_struct_t; 

 mydata_struct_t mydata; 

 int main(void) { 
     mydata.flinps.menubtileft = 1; 
     mydata.buttons.menubtbright = 0; 
     mydata.buttprsd = 11; 
     mydata.fdsmsm = 22; 
     mydata.tmpinps = 33; 
 }
-------------------------------------------------------------------------------

Как брать отдельные байты от слова?

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=printview&t=20709&start=0

A UNION is the most elegant solution and designed to perform just this task. 

Code:

 union u_type            //Setup a Union 
 { 
   unsigned int IntVar; 
   unsigned char Bytes[2]; 
 } 
  temp;                    //Assign a var name to the Union 


 void main(void) 
 { 
  temp.IntVar=65535;          //Assign a value to the Int var of the Union 
  HighByte=temp.Bytes[1];  //Get the High Byte (255) 
  LowByte=temp.Bytes[0];   //Get the Low Byte (255) 
 }

----------

into a series of char (8-bit) pointers. Example: 
Code:

 unsigned char low_byte; 
 unsigned char high_byte; 
 unsigned int the_value; 
 ... 
 the_value = 1234; 
 low_byte = * ((unsigned char *)&the_value); 
 high_byte = * ((unsigned char *)((&the_value)+1)); 


 or a char-sized pointer could be used the same way. [I'd probably use the pointer method for repetitive uses within an app and/or many-byte variables.] 

Code:

 unsigned char low_byte; 
 unsigned char high_byte; 
 unsigned int the_value; 
 unsigned char *the_ptr; 
 ... 
 the_value = 1234; 
 the_ptr = * ((unsigned char *)&the_value); 
 low_byte = *the_ptr; 
 the_ptr++; 
 high_byte = *the_ptr;

----------

the bset way: 

 it only compile in ONe line asm code ! 

Code:

 #define LowB(x) (*((unsigned char*)  &(##x)+1)) 
 #define HighB(x) (*((unsigned char*) &(##x)+0)) 



 for ex for low byte use LowB(x)

только тут наверное младший байт без смещение (лежит первым), а старший 
байт -- +1. И тогда это совпадёт с предыдущим примером.

----------
typedef union {
  uint16_t u16;           // element specifier for accessing whole u16
  int16_t  i16;           // element specifier for accessing whole i16
  struct {
    #ifdef LITTLE_ENDIAN  // Byte-order is little endian
    uint8_t u8L;          // element specifier for accessing low u8
    uint8_t u8H;          // element specifier for accessing high u8
    #else                 // Byte-order is big endian
    uint8_t u8H;          // element specifier for accessing low u8
    uint8_t u8L;          // element specifier for accessing high u8
    #endif
  } s16;                  // element spec. for acc. struct with low or high u8
} nt16_t;

nt16_t a;
a.u16 = 0x0123;
a.s16.u8H == 0x01;

typedef union {
  uint32_t u32;           // element specifier for accessing whole u32
  int32_t i32;            // element specifier for accessing whole i32
 struct {
    #ifdef LITTLE_ENDIAN  // Byte-order is little endian
    uint16_t u16L;        // element specifier for accessing low u16
    uint16_t u16H;        // element specifier for accessing high u16
    #else                 // Byte-order is big endian
    uint16_t u16H;        // element specifier for accessing low u16
    uint16_t u16L;        // element specifier for accessing high u16
    #endif
  } s32;                  // element spec. for acc. struct with low or high u16
} nt32_t;
