AULA – Linguagem C – Campos de Bits e Unions Disciplina: Aplicações Avançadas de Microprocessadores (AAM) Profa. Ana T. Y. Watanabe [email protected] “E sabemos que todas as coisas concorrem para o bem daqueles que amam a Deus, daqueles que são chamados segundo o seu propósito.” Romanos 8:28 Objetivos da Aula: • Typedefs • Campos de Bits • Unions • Extern • Exemplos • Exercício Typedef C permite que sejam definidos explicitamente novos tipos de dados usando a palavra reservada typedef. typedef não cria realmente uma nova classe de dados, mas sim define um novo nome para uma tipo já existente. Typedef O uso do typedef torna os programas em C mais legíveis e mais portáteis, pois bastará alterar a definição do typedef quando trocar de ambiente. Ex.: typedef unsigned char byte; Campos de Bits São os operadores bit a bit: Como C foi projetada para substituir a Linguagem Assembly na maioria das tarefas de programação, ela acessa os bits individuais de uma variável, ou registrador do microcontrolador. Campos de Bits A declaração de um campo de bit é feita da mesma forma que a declaração de um campo qualquer de estrutura, com a diferença de que após o nome do campo, o programador deve inserir um sinal “:” e em seguida o número de bits utilizado pelo campo. Campos de Bits Exemplo: struct dispositivo { unsigned ativo : 1; unsigned pronto : 1; unsignet erro : 1; unsigned : 2; unsigned ultimo_erro : 3; } Uniões São um tipo especial de dado no qual as variáveis declaradas residem num mesmo endereço da memória. O compilador aloca memória para a variável cujo tipo ocupe o maior espaço na memória e sem seguida, as demais variáveis pertencentes à união são alocados no mesmo espaço. /*** PTCDD - Port C Data Direction Register; 0x00000005 ***/ typedef union { byte Byte; struct { byte PTCDD0 :1; byte PTCDD1 :1; byte PTCDD2 :1; byte PTCDD3 :1; byte PTCDD4 :1; byte PTCDD5 :1; byte PTCDD6 :1; byte :1; } Bits; struct { byte grpPTCDD :7; byte :1; } MergedBits; } PTCDDSTR; /* Data Direction for Port C Bit 0 */ /* Data Direction for Port C Bit 1 */ /* Data Direction for Port C Bit 2 */ /* Data Direction for Port C Bit 3 */ /* Data Direction for Port C Bit 4 */ /* Data Direction for Port C Bit 5 */ /* Data Direction for Port C Bit 6 */ Extern - classe de armazenamento As classes de armazenamento são utilizados para definir o escopo e tempo de vida das variáveis dentro do programa. auto extern static register Extern - classe de armazenamento A classe de armazenamento extern permite definir variáveis globais que serão visíveis em mais de um arquivo do programa. Assim, os programas podem ser divididos em vários arquivos, os quais podem ser compilados separadamente. Extern - classe de armazenamento 1º. ARQUIVO int soma = 0; / global int main() { escreve(); return 0; } 2º. ARQUIVO extern int soma; // extern void escreve(); printf(“Soma = %d ”,soma); Extern - classe de armazenamento Ao colocar a palavra extern antes da declaracão da variável soma, não estamos declarando uma nova variável, mas apenas informando ao compilador que ela existe em outro local de armazenamento previamente definido. Por esse motivo, ela NÃO pode ser inicializada. /*** PTCDD - Port C Data Direction Register; 0x00000005 ***/ extern volatile PTCDDSTR #define PTCDD #define PTCDD_PTCDD0 #define PTCDD_PTCDD1 #define PTCDD_PTCDD2 #define PTCDD_PTCDD3 #define PTCDD_PTCDD4 #define PTCDD_PTCDD5 #define PTCDD_PTCDD6 #define PTCDD_PTCDD _PTCDD @0x00000005; _PTCDD.Byte _PTCDD.Bits.PTCDD0 _PTCDD.Bits.PTCDD1 _PTCDD.Bits.PTCDD2 _PTCDD.Bits.PTCDD3 _PTCDD.Bits.PTCDD4 _PTCDD.Bits.PTCDD5 _PTCDD.Bits.PTCDD6 _PTCDD.MergedBits.grpPTCDD Volatile => O modificador volatile diz ao compilador para não otimizar qualquer coisa relacionada àquela variável. /*** ADCSC1 - Status and Control Register 1; 0x00000010 ***/ typedef union { byte Byte; struct { byte ADCH0 :1; byte ADCH1 :1; byte ADCH2 :1; byte ADCH3 :1; byte ADCH4 :1; byte ADCO :1; byte AIEN :1; byte COCO :1; } Bits; struct { byte grpADCH :5; byte :1; byte :1; byte :1; } MergedBits; } ADCSC1STR; /* Input Channel Select Bit 0 */ /* Input Channel Select Bit 1 */ /* Input Channel Select Bit 2 */ /* Input Channel Select Bit 3 */ /* Input Channel Select Bit 4 */ /* Continuous Conversion Enable - ADCO */ /* Interrupt Enable /* Conversion Complete Flag - The COCO flag /*** ADCSC1 - Status and Control Register 1; 0x00000010 ***/ extern volatile ADCSC1STR #define ADCSC1 #define ADCSC1_ADCH0 #define ADCSC1_ADCH1 #define ADCSC1_ADCH2 #define ADCSC1_ADCH3 #define ADCSC1_ADCH4 #define ADCSC1_ADCO #define ADCSC1_AIEN #define ADCSC1_COCO #define ADCSC1_ADCH _ADCSC1 @0x00000010; _ADCSC1.Byte _ADCSC1.Bits.ADCH0 _ADCSC1.Bits.ADCH1 _ADCSC1.Bits.ADCH2 _ADCSC1.Bits.ADCH3 _ADCSC1.Bits.ADCH4 _ADCSC1.Bits.ADCO _ADCSC1.Bits.AIEN _ADCSC1.Bits.COCO _ADCSC1.MergedBits.grpADCH Exercício de Aplicação Montar uma struct do LCD no projeto do LCD