180 likes | 302 Views
AULA – Linguagem C – Campos de Bits e Unions. Disciplina: Aplicações Avançadas de Microprocessadores (AAM) Profa. Ana T. Y. Watanabe atywata@gmail.com.br.
E N D
AULA – Linguagem C – Campos de Bits e Unions Disciplina: Aplicações Avançadas de Microprocessadores (AAM) Profa. Ana T. Y. Watanabe atywata@gmail.com.br
“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; /* Data Direction for Port C Bit 0 */ byte PTCDD1 :1; /* Data Direction for Port C Bit 1 */ byte PTCDD2 :1; /* Data Direction for Port C Bit 2 */ byte PTCDD3 :1; /* Data Direction for Port C Bit 3 */ byte PTCDD4 :1; /* Data Direction for Port C Bit 4 */ byte PTCDD5 :1; /* Data Direction for Port C Bit 5 */ byte PTCDD6 :1; /* Data Direction for Port C Bit 6 */ byte :1; } Bits; struct { byte grpPTCDD :7; byte :1; } MergedBits; } PTCDDSTR;
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 _PTCDD @0x00000005; #define PTCDD _PTCDD.Byte #define PTCDD_PTCDD0 _PTCDD.Bits.PTCDD0 #define PTCDD_PTCDD1 _PTCDD.Bits.PTCDD1 #define PTCDD_PTCDD2 _PTCDD.Bits.PTCDD2 #define PTCDD_PTCDD3 _PTCDD.Bits.PTCDD3 #define PTCDD_PTCDD4 _PTCDD.Bits.PTCDD4 #define PTCDD_PTCDD5 _PTCDD.Bits.PTCDD5 #define PTCDD_PTCDD6 _PTCDD.Bits.PTCDD6 #define PTCDD_PTCDD _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; /* Input Channel Select Bit 0 */ byte ADCH1 :1; /* Input Channel Select Bit 1 */ byte ADCH2 :1; /* Input Channel Select Bit 2 */ byte ADCH3 :1; /* Input Channel Select Bit 3 */ byte ADCH4 :1; /* Input Channel Select Bit 4 */ byte ADCO :1; /* Continuous Conversion Enable - ADCO */ byte AIEN :1; /* Interrupt Enable - byte COCO :1; /* Conversion Complete Flag - The COCO flag } Bits; struct { byte grpADCH :5; byte :1; byte :1; byte :1; } MergedBits; } ADCSC1STR;
/*** ADCSC1 - Status and Control Register 1; 0x00000010 ***/ extern volatile ADCSC1STR _ADCSC1 @0x00000010; #define ADCSC1 _ADCSC1.Byte #define ADCSC1_ADCH0 _ADCSC1.Bits.ADCH0 #define ADCSC1_ADCH1 _ADCSC1.Bits.ADCH1 #define ADCSC1_ADCH2 _ADCSC1.Bits.ADCH2 #define ADCSC1_ADCH3 _ADCSC1.Bits.ADCH3 #define ADCSC1_ADCH4 _ADCSC1.Bits.ADCH4 #define ADCSC1_ADCO _ADCSC1.Bits.ADCO #define ADCSC1_AIEN _ADCSC1.Bits.AIEN #define ADCSC1_COCO _ADCSC1.Bits.COCO #define ADCSC1_ADCH _ADCSC1.MergedBits.grpADCH
Exercício de Aplicação Montar uma struct do LCD no projeto do LCD