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
Download

Linguagem_C_vol62013_1