Vous êtes sur la page 1sur 0

Daniel Campos Laboratrio de Arquitetura de Computadores 2001

Reviso 04 _______________________________________________________________ Pgina 1



LABORATRIO DE ARQUITETURA DE
COMPUTADORES





- Objetivos da Disciplina:

Este curso tem por objetivo dar noes bsicas de programao usando a linguagem
C. Sero desenvolvidos vrios programas utilizando os recursos aprendidos no
decorrer do curso, que serviro como base para o desenvolvimento de projetos usando
as interfaces paralela e serial do microcomputador.

Esta disciplina ser tambm um complemento da teoria aprendida no curso de
Arquitetura e Sistemas de Computadores, proporcionando prticas de laboratrio de
acordo com o andamento da teoria.




- Ementa do curso de Arquitetura e Sistemas:

Princpios bsicos dos computadores digitais;
Arquitetura do microprocessador;
Instrues do microprocessador;
Modalidades de endereamento em microprocessadores;
Execuo da instruo e microssequncias;
Memria do microcomputador;
Transferncias de I/O paralelas;
Transferncias de I/O em srie;
Princpios bsicos de fundamento e sistemas operacionais.




- Ementa do curso de Laboratrio de Arquitetura:

Componentes de hardware do PC-AT (8088,486 e Pentium);
Observao dos sinais no barramento local e de expanso do PC-XT usando
osciloscpio e analisador lgico;
Temporizaes e acessos memria DRAM;
Principais interrupes;
Noes bsicas de programao utilizando a linguagem "C";
Projeto utilizando interface serial e paralela.

Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 2

- Programa:


I INTRODUO A LINGUAGEM C
1.0 Histrico.
2.0 Algoritmos.
3.0 Introduo ao Ambiente de Desenvolvimento de Programas.



II NOES BSICAS DE PROGRAMAO
1.0 Estrutura Bsica de um Programa em C.
2.0 Formataes Bsicas em C.
3.0 Constantes e Variveis.
4.0 Expresses e Operadores.
5.0 Laos.
6.0 Comandos de Deciso.
7.0 Matrizes e Strings.
8.0 Funes.
9.0 Estruturas e Unies.
10.0 Ponteiros.
11.0 Leitura e Escrita em Disco.



III PROJETOS UTILIZANDO A INTERFACE PARALELA
1.0 Introduo.
2.0 Pinagem.
3.0 Registradores.
4.0 Propriedades de Hardware.
5.0 Padres Existentes.
6.0 Porta Paralela para Impressora.
7.0 Programando a Porta Paralela.
8.0 Projetos Utilizando a Interface Paralela.



IV PROJETOS UTILIZANDO A INTERFACE SERIAL
1.0 Introduo.
2.0 Modos de Transmisso Serial.
3.0 Padres de Interface Serial.
4.0 Comunicao Serial no PC.
5.0 Pinos e Sinais da Porta Serial.
6.0 Registradores
7.0 O Hardware da Porta Serial.
8.0 Padres Existentes.
9.0 Programando a Porta Serial.
10.0 Conectando Hardware a Porta Serial.

Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 3

- Critrio de Avaliao:

Dois projetos de pesos iguais, mais um projeto servindo como prova substitutiva por
semestre. Os projetos sero programas utilizando os recursos aprendidos durante o curso
e a nota ser composta da seguinte maneira: (Projeto x 0,5) + (Apresentao x 0,5).

Os programas sero entregues em grupos de no mximo 5 pessoas. Ser sorteado um
aluno de cada turma, que far a apresentao do projeto. Os demais grupos tero a nota
do Projeto valendo de 0 a 10. A nota do semestre ser a mdia dos dois projetos.



- Bibliografia Bsica:

VIVIANE, Vitorine
Treinamento em Linguagem C: Curso Completo
Rio de janeiro
Editora McGrow Hill

JAMSA, Kris
Microsoft C: Dicas, Segredos e Truques
So Paulo
Editora Makron Books, 1992 701 p.

ZELENOVSKY, Ricardo; MENDONCA, Alexandre
PC e Perifricos: Um Guia Completo de Programao
Rio de Janeiro
Editora Cincia Moderna, 1996 493 p.



- Bibliografia Complementar:

NORTON, Peter
Desvendando o PC
Rio de Janeiro
Editora Campus, 1997 735 p.

ZELENOVSKY, Ricardo; MENDONCA, Alexandre
PC: Um Guia Prtico de Hardware e Interfaceamento
Rio de Janeiro
Editora Intercincia, 1996 350 p.

TANENBAUM, Andrew S
Organizao Estruturada de Computadores
Traduo de Hlio Marques Sobrinho, Luiz Fernando Costa, 3 edio
Rio de Janeiro
Editora Prentice Hall, 1992 460 p.
Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 4

I INTRODUO A LINGUAGEM C

1.0 Histrico:

A primeira verso de C foi criada por Dennis Ritchie em 1972 nos laboratrios Bell
para ser includo como um dos softwares a serem distribudos juntamente com o sistema
operacional Unix do computador PDP-11, na equipe certificada por Ken Thompson.

Do ponto de vista tcnico, o surgimento do C iniciou com a linguagem ALGOL 60,
definida em 1960. ALGOL era uma linguagem de alto nvel, que permitia ao
programador trabalhar "longe da mquina", sem se preocupar com os aspectos de como
cada comando ou dado era armazenado ou processado. Foi criado para substituir o
FORTRAN. ALGOL no teve sucesso, talvez por tentar ser de muito alto nvel em uma
poca em que a maioria dos sistemas operacional exigia do usurio um grande
conhecimento de hardware.

Em 1967 surgiu CPL (Combined Programming Language) nas universidades de
Londres e Cambridge com o objetivo, segundo a equipe do projeto, de "trazer ALGOL
terra", ou "manter contato com a realidade de um computador real". Da mesma forma
do ALGOL, CPL no foi bem aceita, em especial pelos projetistas de sistemas
operacionais que a consideravam difcil de implementar.

Ainda em 1967, em Cambridge, Martin Richards criou o BCPL (Basic CPL), uma
simplificao do CPL, tentando manter apenas as "boas coisas do CPL".

Em 1970, Ken Thompson, chefe da equipe que projetou o UNIX para o PDP-11 do Bell
Labs, implementou um compilador para uma verso mais reduzida do CPL. Batizou a
linguagem de B.

Tanto BCPL quanto B mostravam-se muito limitadas, prestando-se apenas para certas
classes de problemas. Isto se fez sentir especialmente na primeira verso do PDP-11,
lanado no mercado em 1971. Um dos fatores que levou isto foi a inteno do grupo
responsvel pelo UNIX de reescrev-lo todo em uma linguagem de alto nvel, e para
isto B era considerado lenta.

Estes problemas levaram a que o projetista Dennis Ritchie, do Bell Labs, fosse
encarregado de projetar uma nova linguagem, sucessora do B, que viria ento, a ser
chamada de C.

A linguagem C buscou manter o "contato com o computador real" e ainda assim dar ao
programador novas condies para o desenvolvimento de programas em reas diversas,
como comercial, cientfica e de engenharia.

Por mais alguns anos (aproximadamente 6) a sintaxe (formato) tida como padro da
linguagem C foi a fornecida com o UNIX verso 5.0 do Bell Labs. A principal
documentao deste padro encontra-se na publicao "The C Programming Language",
de Brian Kernighan e Dennis Ritchie (K&R), tida como a "bblia da linguagem C".


Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 5

O mais interessante desta verso de C era que os programas-fonte criados para rodar em
um tipo de computador podiam ser transportados e recompilados em outros sem grandes
problemas. A esta caracterstica d-se o nome de portabilidade. Com ela, uma empresa
que desenvolve um programa pode faz-lo rodar em diferentes computadores sem ter
um elevado custo a cada vez que isto for feito.

Em 1985, a ANSI (American National Standards Institute) estabeleceu um padro
oficial de C o chamado "C ANSI".


1.1 Resumo Cronolgico:

Ano Acontecimentos
1960 ALGOL 60.
1967 BCPL: Martin Richards.
1970 B: Ken Thompson PDP-7.
1972 C: Dennis Ritchie PDP-11.
1974 Pcc: Steve Johnson primeiro compilador C comercial.
1978 Kernighan e Ritchie (K&R) escrevem um livro padronizando a linguagem C.
1983 X3J11: criado um comit para padronizao da linguagem C.
1985

Surge o padro ANSI C.
Bjarne Stroutrup trabalha no aperfeioamento da linguagem C e cria o C++,
que uma linguagem modular orientada a objetos.
1989 Surge o ISO/IEC 9899, idntico ao padro ANSI.


1.2 Principais Caractersticas:

Linguagem de programao mais usada em software de sistemas (sistemas
operacionais, interpretadores, editores, programas montadores, compiladores e
gerenciadores de banco de dados);

Linguagem de mdio nvel, segundo Herbert Schild;

Considerada uma linguagem estruturada;

Simplicidade, versatilidade e flexibilidade;

Alta portabilidade;

Permite manipulao de bits, bytes e endereos;

Quantidade de palavras chaves: 32 (padro K&R) o BASIC para PC contm
159 palavras;

Adequao a hardware e Sistemas Operacionais (maior eficincia);

Padronizao e disponibilidade;
Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 6

1.3 Deficincias e Restries:

Pouca verificao semntica:
- Verificao de tipos;
- Converso de dados.

Pouco controle de memria:
- Verificao de arrays;
- Controle de apontadores;
- Acessos ilegais.

Suporte ilimitado modularizao:
- Compilao separada;

Conjunto restrito de primitivas:
- Simplicidade extremada;
- Diferenas entre bibliotecas.


1.4 Compilao na Linguagem C:

No processo de compilao de um programa em C, o programador vai transformar os
vrios arquivos fonte do sistema e dele prprio em um nico programa executvel. A
figura 1.1 mostra um exemplo de compilao composto por 3 etapas:


Figura 1.1 Etapas de compilao de um programa em C.

Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 7

Na primeira etapa, os arquivos fonte produzidos pelo programador (arquivos.c ou .cpp)
juntamente com os arquivos de incluso do sistema e do programador (arquivos.h) so
compilados e transformados em linguagem Assembly;

Na segunda etapa, um programa montador vai transformar os vrios arquivos Assembly
em arquivos em linguagem de mquina (cdigo objeto);

Finalmente, um programa ligador (LINK) transforma os arquivos objeto, juntamente
com as bibliotecas em um programa executvel.


1.5 Mapeamento de Memria:

Um programa C no modo executvel cria e utiliza quatro regies distintas na memria
com funes especficas:

A primeira regio armazena o cdigo do programa (as instrues);
Na segunda regio so armazenadas as variveis globais do programa;
As demais regies so a pilha (stack) e o heap (amontoar).

A pilha ou stack utilizada para vrias funes enquanto um programa executado. Ela
armazena endereos de chamadas de funo, argumentos de funo, e variveis locais.
Ela tambm salva o estado corrente da CPU. O heap uma regio disponvel de
memria onde o programa pode ser utilizado para realizar funes relacionadas com
alocao dinmica de memria, como por exemplo listas ligadas a algoritmos que
percorrem estruturas em rvore.

A figura 1.2 mostra um exemplo de mapeamento de memria para um programa em C.
Embora o layout fsico preciso de cada uma das regies de memria varie com o tipo de
CPU e verses do C, este exemplo mostra de forma conceitual como um programa
implementado em C aparece na memria.


Figura 1.2 Mapeamento de memria de um programa em C.

Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 8

2.0 Algoritmos:

Um trabalho de programao pode se tomar muito mais fcil se for dividido em partes
menos complexas. Um problema a ser solucionado pelo computador pode ser separado
em duas fases:

1) Fase da resoluo do problema
2) Fase de implementao do problema

A primeira fase se refere elaborao de um algoritmo para solucionar o problema. S
ento, aps a elaborao do algoritmo que devemos passar para a fase de
implementao do algoritmo em alguma linguagem de programao.

Os computadores apenas executam o que passamos para ele e no o que desejamos que
eles faam. Assim, as instrues a serem executadas no devem ser ambguas. Muito
cuidado deve ser tomado para garantir que o computador siga pelo nico caminho
correto, e como resultado, as respostas corretas. Escrevendo um algoritmo antes de
elaborarmos o programa, podemos obter uma formulao mais correta do problema,
evitando assim, possveis erros.

Dessa forma, o algoritmo pode ser definido como uma seqncia ordenada, sem
ambigidade, de instrues que levam soluo de um dado problema. A figura 2.1
mostra as fases de implementao de um problema pelo computador.


Figura 2.1 Fases de implementao de um problema.


A utilizao do algoritmo bastante comum. Como exemplo, podemos citar: as
indicaes para se chegar a uma determinada rua, constituem um algoritmo para
encontrar esta rua; uma receita para se fazer um bolo ou um esquema para se montar um
brinquedo constituem exemplos de algoritmos, pois todos possuem uma seqncia de
aes a serem cumpridas para atingir o objetivo.


Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 9

O algoritmo destina-se a resolver um determinado problema, estabelecendo um
conjunto de regras a serem seguidas, com o objetivo de alcanar o resultado final e
como conseqncia solucionar o problema. Como exemplo, seja a seqncia de
nmeros: 1, 5, 9, 13, 17, .... Para determinamos o prximo elemento desta srie,
devemos determinar a regra de formao desta seqncia. Para tal, observamos que o
prximo nmero a soma do anterior com 4. Portanto, este somatrio constitui a regra
de formao de qualquer nmero desta srie.

Para ilustrar, vamos elaborar um algoritmo bastante usado em nosso cotidiano: trocar
uma lmpada queimada. Este algoritmo pode ser expresso em dois passos:

1) retirar a lmpada queimada
2) colocar a nova lmpada

Podemos observar que cada passo do algoritmo para trocar uma lmpada, possuem
diversos detalhes. Como exemplo, o primeiro passo para retirar a lmpada queimada
pode ser expandido para os seguintes passos:

pegar a escada
posicionar a escada embaixo da lmpada a ser trocada
subir na escada at que a alcanar a lmpada queimada
retirar a lmpada queimada

O passo "colocar a nova lmpada" pode ser divido nas seguintes tarefas:

pegar uma lmpada nova
colocar a nova lmpada no soquete
descer da escada
guardar a escada

Observamos que o algoritmo para trocar uma lmpada queimada passou de 2 para oito
passos, aps o detalhamento de cada passo do primeiro algoritmo. Analisando o
segundo algoritmo, vemos que ele constitui de uma seqncia de instrues mais
detalhadas para a execuo da tarefa. Portanto, conclui-se que o algoritmo deve ser
formado por um conjunto de passos simples e bem definidos de forma que possa ser
entendido diretamente pelo agente que ir execut-lo. Suponhamos que o agente seja
um computador. Como o computador no tem conhecimento prvio, o conjunto de
passos de um algoritmo devem estar bem detalhados de forma que o computador possa
reconhece-los, execut-los e produzir os resultados esperados.


2.1 Obstculos na Elaborao de um Algoritmo:

Complexidade do problema
Legibilidade: constitui na capacidade de compreenso do algoritmo. Quanto
mais legvel for um algoritmo, menor ser a sua complexidade.
Portabilidade: devemos projetar um algoritmo em uma linguagem (em uma
notao) de forma que possa ser entendido e convertido diretamente para
qualquer linguagem de programao.
Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 10

Mtodo cartesiano: consiste em dividir o problema em partes menores e tratar
cada parte individualmente, tornando-o mais simples e mais especfico. Se cada
parte no estiver bem compreendida, esta deve novamente ser dividida. Este
procedimento de diviso das partes do problema deve continuar at que cada
parte possa ser facilmente compreendida e elaborada.
Planejamento Reverso: partindo do produto final, vamos separ-lo at obtermos
os componentes bsicos que o constitui. No nosso caso, a partir das informaes
de sada, determinamos os componentes de entrada e suas transformaes.


2.2 Propriedades de um Algoritmo:

Os passos (ou seja, as instrues) de um algoritmo devem ser simples e no
devem produzir ambigidades.
A ordem de execuo dos passos devem ser obedecidas e deve estar bem
definida.
Todo algoritmo deve ter uma seqncia finita de passos.

Os mtodos para a elaborao de um algoritmo, iniciam-se com uma soluo genrica
do problema e em seguida, passamos para um nvel de detalhamento do algoritmo.

O algoritmo deve ser escrito de forma que possa ser compreendido pelo agente que ir
executa-lo. Portanto, para que o computador possa executar um determinado algoritmo,
necessrio que este esteja limitado a um conjunto de instrues que possam ser
compreendidas pelo computador.


2.3 Mtodos para a Construo de Algoritmos:

Ler atentamente o enunciado do problema.
A partir do enunciado, obter os dados de entrada, ou seja, quais so os dados a
serem fornecidos.
Obter as informaes de sada a partir do enunciado do problema, ou seja, os
resultados finais ou o objetivo do algoritmo.
Determinar quais so as funes a serem desenvolvidas para transformar os
dados de entrada nas respostas desejadas. Nesta etapa, elaboramos um layout do
algoritmo, pois a partir dos requisitos especificados, determinamos a seqncia
de aes. Aqui podemos utilizar o mtodo cartesiano ou o planejamento reverso.
Construir o algoritmo definitivo.
Testar o algoritmo. Consiste em executar os passos do algoritmo, verificando os
resultados e detectando possveis erros. Aqui, rastreamos o algoritmo analisando
cada instruo deste.


2.4 Fluxograma:

Consiste em uma descrio grfica do algoritmo. Um fluxograma mostra a lgica do
algoritmo, enfatizando os passos individuais e suas interconexes. O fluxograma possui
5 smbolos para representar as instrues bsicas. A figura 2.2 ilustra estes smbolos:
Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 11


Figura 2.2 Simbologia bsica de um fluxograma.

O fluxograma composto por um conjunto desses smbolos interligados por linhas,
mostrando a ordem de execuo das operaes. A figura 2.3 mostra um exemplo de
fluxograma.


Figura 2.3 Fluxograma.
Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 12

O fluxograma no permite especificar claramente muitos dos comandos bsicos que
uma linguagem de programao implementa, mas tem como vantagem, uma melhor
visualizao da lgica do programa, pelo fato de ser uma ferramenta grfica.


2.5 Linguagem Algortmica:

Consiste em uma forma de descrio do algoritmo bastante similar s linguagens de
programao. A passagem do algoritmo expresso neste tipo de descrio para uma
linguagem de programao quase direta. A seguir mostrado um algoritmo na forma
de linguagem algortmica.

Incio

[ Declarao de variveis ]

[ Comandos ]

Fim


A seguir mostrado um exemplo de algoritmo na forma de linguagem algortmica.


Incio

N1, N2, M: real [ declarao das variveis ]

Leia (N1, N2) [ l os dados que so atribudos s variveis N1 a N2 ]

M = (N1 + N2)/2 [ avalia a expresso e atribui o resultado varivel M ]

Escreva("Mdia: ", M) [ exibe o resultado, imprimindo a constante "Mdia: " e
o valor da varivel M ]

Fim


Observao:

Os comandos obedecem a seqncia estabelecida e so executados na ordem em que
foram colocados.







Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 13

3.0 Introduo ao Ambiente de Desenvolvimento de Programas:

O compilador que usaremos durante o curso, o Borland C++ 3.1 para DOS. Embora
seja um compilador para C++, ele pode ser usado com programas em feitos C bsico,
sem nenhum problema. Esta uma caracterstica do compilador da Borland, mesmo
havendo aprimoramentos na linguagem ele mantm as verses anteriores incorporadas.
A figura 3.1 mostra o ambiente de desenvolvimento do Borland C.


Figura 3.1 Ambiente de Desenvolvimento de Programas

Na parte superior da tela esto os menus de comandos, que podem ser acessados
pressionando a tecla F10. Na parte inferior esto as informaes das teclas de atalhos, o
qual concentram as operaes mais efetuadas (Ajuda, Salvar, Abrir, Compilar, Criar
arquivo Executvel e Menu) nas teclas de funo. A seguir ser feita uma breve
descrio dos menus.

3.1 File:

New: inicia um novo arquivo fonte (arquivo.cpp).
Open: abre um arquivo fonte existente.
Save: salva o arquivo fonte em uso.
Save as: salva o arquivo fonte possibilitando a mudana
de nome e diretrio.
Save all: o Borland possibilita que mais de um arquivo
fonte esteja aberto ao mesmo tempo. Esta opo salva
todos os arquivos abertos.
Change dir: muda o diretrio em uso pelo Borland.
Print: imprime o arquivo fonte.
DOS Shell: abre a linha de comando em DOS.
Quit: sai do ambiente de programao.

Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 14

3.2 Edit:

Undo: desfaz as alteraes feitas no
arquivo fonte.
Redo: refaz as alteraes desfeitas.
Cut: recorta um texto selecionado.
Copy: copia um texto selecionado.
Paste: cola um texto copiado.
Clear: elimina um texto selecionado.
Copy Example: copia um programa
exemplo do help, possibilitando sua
compilao e utilizao.
Show clipboard: insere o contedo do
clipboard no ambiente de programao.


3.3 Search:

Find: procura caracteres ou palavras em
um arquivo fonte.
Replace: procura caracteres ou palavras
com possibilidade de substituir os mesmos
por outros.
Search again: efetua novamente a ltima
procura realizada com o comando Find.
Go to line number: vai para uma
determinada linha informada pelo
programador.
Previous error, Next error: se forem encontrados erros no arquivo fonte, possvel
navegar pelo erros e fazer as alteraes necessrias. Previous error volta um a um os
erros encontrados e Next error avana para os prximos erros.
Locate function: localiza uma funo no arquivo fonte. Funciona somente durante o
processo de depurao do programa.


3.4 Run:

Run: compila o arquivo fonte e executa o
programa.
Program reset: para o processo de depurao
e execuo do programa e libera a memria
reservada para estas operaes.
Go to cursor: executa o programa at a
posio onde se encontra o cursor.

Trace into: executa o programa passo a passo, parando a cada novo comando.
Step over: parecido com trace into, step over executa linha a linha uma funo.


Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 15

Arguments: alguns programas podem precisar de argumentos na linha de comando,
como por exemplo o comando format (format C:). Format o comando e C: o
argumento. Esta opo abre uma janela onde estes argumentos podem ser usados.


3.5 Compile:

Compile: faz a compilao do programa
buscando possveis erros de sintaxe.
Make: gera um arquivo executvel a partir do
arquivo compilado e montado.
Link: faz a ligao do cdigo e as bibliotecas.
Build all: executa a compilao e gerao de
executvel para todos os arquivos fonte abertos.
Information: abre uma caixa de informaes
estatsticas sobre o programa.
Remove messages: remove todas as mensagens da janela de mensagens.


3.6 Debug:

Inspect: abre uma janela onde
podem ser observados os valores dos
dados.
Evaluate / modify: possibilita
avaliar uma varivel ou expresso, e
alterar seus valores.
Call stacks: abre uma caixa de
dilogo que permite avaliar as
seqncias de comandos que seu programa est executando.
Watches: abre o menu de watches, que so pontos de parada e observao de
comandos executados pelo programa.
Toggle breakpoint: insere ou remove uma parada incondicional na execuo de um
programa, exatamente onde se encontra o cursor.
Breakpoints: abre uma janela de dilogo onde possvel especificar condies para a
parada na execuo do programa.


3.7 Project:

Open project: abre ou cria um novo projeto.
Close project: fecha um projeto.
Add item: adiciona um arquivo ao projeto.
Delete item: deleta um arquivo do projeto.
Local options: abre a caixa de dilogo de opes do
projeto.
Include files: abre uma caixa de dilogo que permite
visualizar todos os arquivos que fazem parte do projeto.
Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 16

3.8 Options:

Applications: altera as configuraes iniciais do
programa.
Compiler: altera as configuraes do compilador.
Transfer: adiciona ou remove programas do menu
de sistema ( - ).
Make: configura o gerenciador de projetos.
Linker: altera as configuraes do ligador.
Librarian: altera as configuraes das bibliotecas
existentes.
Debugger: altera as configuraes do depurador.
Directories: altera os diretrios padres dos
arquivos usados pelo Borland C++.
Enviroment: altera as configuraes do ambiente
de desenvolvimento.
Save: salva todas as alteraes feitas dentro do menu Options.


3.9 Window:

Size / Move: altera o tamanho ou a posio
da janela de um arquivo fonte.
Zoom: redimensiona uma janela para o
tamanho mximo.
Cascade: sobrepe todas as janelas dos
programas abertos, de forma que qualquer
uma possa ser acessada rapidamente.
Title: posiciona todas as janelas lado a lado.
Next: navega entre as janelas dos programas
abertos.
Close: fecha a janela de um programa ativo.
Close all: fecha todas as janelas abertas.
Message: abre a janela de mensagens.
Output: mostra o resultado de qualquer
programa executado em DOS.
Watch: mostra o valor de qualquer
expresso tipo Watch.

Use screen: mostra o resultado de um programa em tela cheia.
Register: mostra os valores dos registradores e flags da CPU quando um programa
executado.
Project: mostra diversas informaes sobre um projeto aberto.
Project notes: abre o arquivo de anotaes de um projeto.
List all: abre uma janela informando todas as alteraes e comando de um programa.



Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 17

3.10 Help:

Contents: abre a janela de ajuda
mostrando todos os itens, sintaxe da
linguagem e menus de funo.
Index: abre o ndice da ajuda da sintaxe
de programao.
Topic search: abre o mesmo ndice de
ajuda.
Previous topic: abre os tpicos de ajuda
anteriores at chegar a janela de Contents.
Help on help: abre a janela de ajuda que
ensina como tirar um melhor proveito da ajuda do Borland C++.
Active file: possibilita a escolha do tipo de ajuda que ser ativado quando for
solicitada ajuda.
About: abre a janela de informaes sobre o Borland C++.

































Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 18

II NOES BSICAS DE PROGRAMAO

1.0 Estrutura Bsica de um Programa em C:

Todo programa em C composto basicamente por uma ou mais funes C. A nica
funo que obrigatoriamente deve estar presente no programa chamada main( ). Essa
funo a primeira a ser chamada quando se inicia a execuo de um programa. Em um
cdigo C bem escrito, main( ) contm, o que na essncia, uma viso geral do que o
programa dever fazer. A seqncia a seguir ilustra a forma geral de um programa fonte
escrito em C:

variveis globais
main()
{
variveis locais
seqncia de comandos
}

f1()
{
variveis locais
seqncia de comandos
}

f2()
{
variveis locais
seqncia de comandos
}
.
.
.

fn()
{
variveis locais
seqncia de comandos
}

A relao a seguir mostra as 32 palavras chaves utilizadas pelo padro K&R da
linguagem C:

auto double int struct
break else long switch
case enum register typedef
char extern return union
const float short unsigned
continue for signed void
default goto sizeof volatile
do if static while

Todas as palavras devem ser utilizadas em letra minscula. Esse conjunto no pode ser
usado para indicar nome de varivel.

Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 19

A seguir ser mostrado um exemplo de programa escrito em C para clculo da mdia
aritmtica de 5 nmeros inteiros.


/*************************************************************/
/* Funcao: calculo de media aritmetica de 5 numeros inteiros */
/* Autor: Daniel Campos */
/* Data de criacao: 20/02/00 */
/* Ultima alteracao: 01/03/01 */
/* Hora: 18:00 */
/*************************************************************/

#include <stdio.h>

void main()
{
// Declaracao das variveis.
int i, soma, aux1;
float media;

soma = 0;
media = 0;

// Entrada de dados.

for(i=0; i<5; i++)
{
printf("Entre com o %d inteiro.\n",i+1);
scanf("%d",&aux1);
soma = soma + aux1;
}

// Calculo da media.
media = ((float)soma)/(float)5;
printf("Somatoria dos numeros: %d\n", soma);
printf("O valor da media aritmetica: %.2f\n", media);
}

Exemplo 1.1 Clculo da mdia de 5 nmeros.


2.0 Formataes Bsicas em C:

2.1 Funo printf( ):

A funo printf( ) uma das funes de E/S que podem ser usadas em C para escrever
na tela do computador.

No interior dos parnteses esto as informaes passadas pelo programa main( )
funo printf( ). Estas informaes so chamadas de argumentos de printf( ).

Quando o programa encontra esta linha, passa o controle para a funo printf( ), que
imprime na tela do computador o que foi solicitado. Quando for encerrada a execuo
da funo, o controle transferido novamente para o programa.

Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 20

- Sintaxe:

printf(expresso de controle, lista de argumentos);

Os exemplos a seguir empregam a funo printf( ) para escrever diversos tipos de
informaes na tela do computador.


#include <stdio.h>

void main()
{
printf("Meu primeiro programa em C.\n");
}

Exemplo 2.1 Primeiro programa usando printf( ).

Depois de executado, este programa escreve na tela a seguinte frase:

Meu primeiro programa em C.


#include <stdio.h>

void main()
{
printf("\n");
printf("Este e o numero dois: %d.\n", 2);
printf("\n");
}

Exemplo 2.2 Segundo programa usando printf( ).

Depois de executado, este programa escreve na tela a seguinte frase:

Este o nmero dois: 2.

A funo printf( ) pode ter vrios argumentos. No exemplo 2.1 colocou-se um nico
argumento: "Meu primeiro programa em C". No 2.2, colocou-se dois: "Este o
nmero: %d" que est esquerda e o valor 2 direita, separados por vrgula. A funo
printf( ) pode receber um nmero varivel de argumentos, os quais devero ser
separados por vrgula.


#include <stdio.h>

void main()
{
printf("\n");
printf("%s esta a %d milhoes de milhas \ndo sol.\n", "Venus", 67);
printf("\n");
}

Exemplo 2.3 Terceiro programa usando printf( ).
Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 21

Depois de executado, este programa escreve na tela:

Venus esta a 67 milhoes de milhas
do sol.


Como pde ser observado nos exemplos anteriores, \n representa mudana de linha.


#include <stdio.h>

void main()
{
printf("\n");
printf("A letra %c", j);
printf(" pronuncia-se %s.", "jota");
printf("\n");
}

Exemplo 2.4 Quarto programa usando printf( ).

Aparecer na tela a seguinte sada:

A letra j pronuncia-se jota.


Notar que 'j' delimitado por aspas simples ( um caractere) e "jota" por aspas duplas (
uma cadeia ou string).


2.2 - Tabelas de Cdigos Especiais:

A tabela a seguir mostra os cdigos de C para caracteres que no podem ser inseridos
diretamente do teclado. A funo printf( ) aceita todos eles.

Cdigos Especiais Significado
\a Beep
\b Backspace
\f Avano de pgina
\n Mudana de linha
\r Return (Enter)
\t Tabulao horizontal
\v Tabulao vertical
\\ Barra invertida
\ Aspas simples
\ Aspas duplas
\? Interrogao
Tabela 2.1 Caracteres no impressos.

A tabela a seguir mostra os cdigos para impresso formatada de printf( ).

Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 22

Especificador de
Formato
Tipo de Valor Exemplo
%c Caractere em formato ASCII A, b
%d ou %i Inteiro decimal 10
%e ou %E Notao cientfica 25E2
%f Ponto flutuante 3.78
%g ou %G Ponto flutuante no formato %f ou %e 3.78 ou 2.5E2
%o Inteiro octal 30
%u Inteiro decimal sem sinal 128
%s String de caracteres com terminador nulo Compilador C
%x ou %X Inteiro hexadecimal 0x220h
Tabela 2.2 Especificadores de formato.



3.0 Constantes e Variveis:

Uma constante tem um valor fixo e inaltervel. Em C temos constantes numricas,
caracteres e cadeias de caracteres.

Uma varivel em C um espao de memria reservado para armazenar um certo tipo de
dado e tendo um nome para referenciar o seu contedo. O espao de memria de uma
varivel pode ser compartilhado por diferentes valores.

Um exemplo de constante foi o mostrado do exemplo 2.2. O nmero 2 uma constante
que ser mostrada na tela atravs da funo printf( ). O exemplo a seguir mostra o uso
de uma varivel que escrever na tela o mesmo valor 2.


#include <stdio.h>

void main()
{
int num;
num = 2;

printf("\n");
printf("Este e o numero dois: %d.\n", num);
printf("\n");
}

Exemplo 3.1 Programa usando uma varivel.

Aparecer na tela a mesma sada do exemplo 2.2:

Este e o numero dois: 2.

A instruo (int num;) um exemplo de declarao de varivel e a instruo (num = 2;)
atribui o valor 2 varivel num.


Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 23

3.1 - Declarao de uma Varivel:

A declarao de uma varivel uma instruo para reservar uma quantidade de
memria apropriada para armazenar um tipo especfico de dado.

Ela consiste no nome de um tipo (int, float, char, etc.) seguido do nome da(s)
varivel(is). Exemplo:

#include <stdio.h>

main()
{
int a, b, c, d, aviao, carro;
float x, y, temperatura;
.
.
.
}
Exemplo 3.2 Declarao das variveis.

A linguagem C no trabalha com variveis no declaradas.


3.2 Tipos de Variveis:

O tipo informa a quantidade de memria, em bytes que a varivel ir ocupar. Em C
existem 6 tipos de variveis bsicas:

Tipo Bit Bytes Escala
char 8 1 -128 a 127
int 16 2 -32.768 a 32.767
enum 16 2 -32.768 a 32.767
float 32 4 3.4E-38 a 3.4E38
double 64 8 1.7E-308 a 1.7E308
void 0 0 Sem valor
Tabela 3.1 Tipos de variveis.

Com exceo de void, os tipos de dado bsicos podem estar acompanhados por
modificadores na declarao de variveis. Os modificadores de tipos oferecidos por C
so:

Tipo Bit Bytes Escala
unsigned char 8 1 0 a 255
short int 16 2 -32.768 to 32.767
unsigned int 16 2 0 a 65.535
unsigned long int 32 4 0 a 4.294.967.265
long int 32 4 -2.147.483.638 a
2.147.483.647
long double 80 10 3.4E-4932 a
1.1E4932
Tabela 3.2 Tabela dos modificadores dos tipos.
Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 24

O tipo int tem sempre o tamanho de uma palavra da mquina, ou seja para
computadores de 16 bits, ele ter 16 bits de tamanho.

No exemplo 3.3 temos um programa que utiliza variveis: caractere, ponto flutuante e
inteiro.


#include <stdio.h>

void main()
{
int evento;
char corrida;
float tempo;

evento = 5;
corrida = 'C';
tempo = 27.25;

printf("\n");
printf("O tempo vitorioso na eliminatoria %c", corrida);
printf("\nda competicao %d foi %.2fs.", evento, tempo);
printf("\n");
}

Exemplo 3.3 Uso de variveis int, char e float.

O resultado ser:

O tempo vitorioso na eliminatoria C
da competicao 5 foi 27.25 s.


Nmeros em ponto flutuante correspondem mais ou menos ao que os matemticos
chamam de nmeros reais. Eles so guardados na memria em duas partes: mantissa,
que o valor do nmero e expoente que a potncia que ir aument-lo. Por exemplo, a
representao do nmero 12345 fica:


Figura 3.1 Representao de um nmero em ponto flutuante.


3.3 Inicializando Variveis:

Em um programa, uma varivel sempre dever ser inicializada ou assumir um valor
inicial. Se isto no ocorrer, ela poder herdar um valor no desejado j colocado na
memria anteriormente.
Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 25

possvel combinar uma declarao de varivel com o operador de atribuio. Por
exemplo:


int evento = 5;
char corrida = 'c';
float tempo = 27.25;



3.4 - Nomes de Variveis:

Para a escolha de nomes de variveis, deve-se ater aos seguintes pontos:

Uma boa escolha de nomes ajuda a entender o programa e prevenir erros.
Uma varivel no pode ter o mesmo nome de uma palavra-chave de C.
Letras maisculas e minsculas so consideradas diferentes.
Para o MS-DOS somente os 8 primeiros caracteres so significativos.



4.0 Expresses e Operadores:


4.1 Funo scanf( ):

scanf( ) outra das funes de E/S implementadas em todos os compiladores C. Ela o
complemento de printf( ) e permite ler dados formatados na entrada padro (teclado).

scanf( ) possui uma sintaxe similar a de printf( ), ou seja, uma expresso de controle
seguida por uma lista de argumentos separados por vrgulas.

A principal diferena entre scanf( ) e printf( ) que na lista de argumentos devem ser
informados os endereos das variveis (no lugar do nome colocamos o endereo).

C oferece um operador para tipos bsicos chamado operador de endereo e
referenciado pelo smbolo & que retorna o endereo do operando.


- Sintaxe:

scanf(expresso de controle, lista de argumentos);


O exemplo a seguir ilustra o uso da funo de scanf( ):





Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 26


#include <stdio.h>

void main()
{
int num;

printf("\nDigite um numero inteiro: ");
scanf ("%d", &num);
printf("\nO mumero digitado foi: %d.\n", num);
}

Exemplo 4.1 Programa usando a funo scanf( ).

A sada deste programa fica:

Digite um numero inteiro: (o cursor fica parado esperando um nmero)

Supondo que o nmero 5 foi digitado, aps pressionar a tecla <Enter> aparecer na tela:

O numero digitado foi: 5.


4.2 O Operador de Endereos:

Toda varivel ocupa uma certa localizao na memria. Um inteiro ocupa
(normalmente) 2 bytes. Se declararmos a varivel n como inteira e atribuirmos a ela o
valor 2, quando n for referenciada devolver 2. Entretanto, se referenciarmos n
precedido de & (&n) ser devolvido o endereo do primeiro byte onde n est guardada.
O exemplo 4.2 imprime o valor e o endereo de n:


#include <stdio.h>

void main()
{
int num;
num = 2;

printf("\n");
printf("Valor = %d, endereco = %u.\n", num, &num);
printf("\n");
}

Exemplo 4.2 Valor do endereo da varivel n.

Um endereo de memria visto como um nmero inteiro sem sinal, por isso usamos
%u.

Sada do programa:

Valor = 2, endereo = xxxxx. (varia com o compilador)


Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 27

4.3 Cdigos de Formatao da Funo scanf( ):

A tabela a seguir mostra os cdigos de formatao utilizados:

Especificador de
Formato
Tipo de Valor Exemplo
%c Caractere em formato ASCII A, b
%d ou %i Inteiro decimal 10
%e ou %E Notao cientfica 2.5E2
%f Ponto flutuante 3.78
%g ou %G Ponto flutuante no formato %f ou %e 3.78 ou 2.5E2
%l Inteiro longo 1.285.382
%o Inteiro octal 30
%u Inteiro decimal sem sinal 128
%s String de caracteres com terminador nulo Compilador C
%x ou %X Inteiro hexadecimal 0x220h
Tabela 4.1 Especificadores de formato.

O exemplo 4.3 mostra o uso da funo scanf( ) lendo valores em ponto flutuante:


#include <stdio.h>

void main()
{
float anos, dias;

printf("\nDigite sua idade em anos: ");
scanf("%f", &anos);

dias = anos * 365;

printf("\nSua idade em dias e: %.2f.\n", dias);
}

Exemplo 4.3 Funo scanf( ) para ler valores em ponto flutuante.

A sada do programa ser:

Digite sua idade em anos: 10
Sua idade em dias e: 3650.


4.4 As Funes getche( ) e getch( ):

Em algumas situaes, a funo scanf( ) no se adapta perfeitamente, pois necessrio
pressionarmos a tecla <ENTER> depois da sua entrada para que scanf( ) termine a
leitura. A biblioteca C oferece funes que lem um caractere no instante em que
digitado, sem esperar o <ENTER>.

A funo getche( ) l o caractere do teclado e permite que seja impresso na tela. Esta
funo no aceita argumentos e devolve o caractere lido para a funo que a chamou.
Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 28
O Exemplo 4.4 chama a funo getche( ) e atribui o caractere que ela devolve varivel
ch para depois imprimi-la com printf( ):


#include <stdio.h>
#include <conio.h>

void main()
{
char ch;
printf("\nDigite algum caractere: ");
ch = getche();
printf("\nA tecla que voce pressionou foi: %c.\n", ch);
}

Exemplo 4.4 Uso da funo getche( ).

A sada do programa ser:

Digite algum caractere: d
A tecla que voce pressionou foi: d.

A funo getch( ) l o caractere no teclado e no permite que seja impresso na tela, ou
seja, o caractere digitado no aparece na tela. Como getche( ), ela no aceita
argumentos e devolve o caractere lido para a funo que a chamou.

O exemplo a seguir chama a funo getch( ) e atribui o caractere que ela devolve
varivel ch, para depois imprimir o caractere e seu sucessor na tabela ASCII:


#include <stdio.h>
#include <conio.h>

void main()
{
char ch;
printf("\nDigite algum caractere: ");
ch = getch();
printf("\nA tecla que voce pressionou foi: %c.\n", ch);
printf("A sua sucessora ASCII e: %c.\n", ch+1);
}

Exemplo 4.5 Uso da funo getch( ).

A sada do programa, supondo-se que ser pressionada a letra a, ser:

Digite algum caractere:
A tecla que voce pressionou foi: a.
A sua sucessora ASCII e: b.


4.5 - A Funo getchar( ):

Obtm o prximo caractere da entrada cada vez que chamada, s terminando a leitura
quando a tecla <ENTER> for pressionada.
Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 29

A funo getchar( ) retorna o caractere como seu valor e no aceita argumentos, ou
seja, em:


c = getchar();


a varivel c contm o prximo caractere de entrada;

Se getchar( ) estiver sendo usada para ler o contedo de um arquivo, quando encontrar a
indicao de fim de arquivo esta funo retorna 1.


4.6 Funo putchar( ):

o complemento de getchar( ) e aceita um argumento cujo valor ser impresso. Os
comando a seguir mostram como ler um caractere de entrada, atribuir seu valor
varivel c e imprimir o contedo da varivel c na sada padro (monitor):


c = getchar();
putchar(c);


O Exemplo 4.6 mostra uma utilizao das funes getchar( ) e putchar( ):


#include <stdio.h>

void main()
{
int c;

printf("\nDigite um caractere: ");

c = getchar();
putchar(c);
printf("\n");
}

Exemplo 4.6 Uso das funes getchar( ) e putchar( ).


4.7 Operadores Aritmticos:

C uma das linguagens mais ricas em operadores; possui em torno de 40. A seguir
sero descritos os principais tipos de operadores:






Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 30

4.7.1 Operador Parnteses:

Operador Descrio Exemplo Resultado
( ) Parnteses (2*6) / 6 2

O operador parnteses altera a ordem de uma expresso, de acordo com a necessidade
dos clculos.


4.7.2 Operadores de Estrutura de Acesso:

Operador Descrio Exemplo
. Selecionador de membros diretos s.m
-> Selecionador de membros indiretos ou ponteiros s->m

Estes operadores trabalham com membros diretos ou indiretos de uma estrutura. So
mais comumente usados em C++.


4.7.3 - Operadores de Incremento e Decremento:

Operador Descrio Exemplo Resultado
++ Incremento A = 5++ A = 6
-- Decremento B = 8-- B = 7

O operador de incremento (++) incrementa de 1 seu operando e o operador de
decremento (--) decrementa de 1 seu operando. Eles trabalham de dois modos: pr-
fixado ou ps-fixado.

a) Pr-fixado: O operador aparece antes do nome da varivel: ++n. Quando ++n usado
em uma instruo, n incrementada antes de seu valor ser usado.

b) Ps-fixado: O operador aparece depois do nome da varivel: n++. Quando n++
usado em uma instruo, n incrementada depois de seu valor ser usado.

Os exemplos a seguir ilustram o uso do operador de Incremento:


#include <stdio.h>

void main()
{
int n, x;

n=5;
x = n++;

printf("\nx = %d n = %d\n", x, n);
}

Exemplo 4.7 Uso do operador de incremento ps-fixado.
Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 31

A sada do programa ser:

x=5 n=6


#include <stdio.h>

void main()
{
int n, x;

n=5;
x = ++n;
printf("\nx = %d n = %d\n", x, n);
}

Exemplo 4.8 Uso do operador de incremento pr-fixado.

A sada do programa ser:

x=5 n=6

Quando um destes operadores aparece sozinho em uma instruo, no faz diferena o
uso pr ou ps-fixado: num++ equivalente a ++num (quando sozinho).


4.7.4 - Operadores Bit a Bit:

Operador Descrio Exemplo Resultado
>> Deslocamento para a direita 1111 >> 2 0011
<< Deslocamento para a esquerda 1111 << 2 1100
~ Complemento de um ~ 1111 0000
^ OR exclusivo 0000
^ 1100
1100
& AND 0101
& 1111
0101
| OR 0101
| 1100
1101

Os operadores de deslocamento direita ou esquerda, dizem ao compilador para
deslocar os bits dentro do valor pelo nmero de posies especificado. O compilador
coloca zeros nos locais vazios deixados pelo deslocamento.

O operador complemento de um inverte cada bit, de modo que um 1 passe a ser 0 e um
0 passe a ser 1.

Os operadores: OR exclusivo, AND e OR trabalham sempre com dois valores e
comparam os bits correspondentes em cada posio dos dois valores.

A operao com o operador OR exclusivo resulta 1 para cada posio onde os bits
forem diferentes e 0 onde os bits forem iguais.
Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 32

A operao com o operador AND resulta em 1 apenas se nas duas posies os valores
forem 1, ou seja, ele faz uma multiplicao entre os bits.

A operao com o operador OR resulta em 1 se em umas das posies houver um 1, ou
seja, ele faz uma soma entre os bits.


4.7.5 - Operadores de Aritmtica Bsica:

Operador Descrio Exemplo Resultado
* Multiplicao 2 * 2 4
/ Diviso 4 / 2 2
+ Adio 2 + 5 7
- Subtrao 7 - 5 2

Representam as operaes aritmticas bsicas de multiplicao, diviso, soma e
subtrao. O exemplo a seguir utiliza vrios operadores aritmticos e converte
temperatura Fahrenheit em seu correspondente em graus Celsius:


#include <stdio.h>

void main()
{
int ftemp, ctemp;

printf("\nDigite a temperatura em graus Fahrenheit: ");
scanf("%d", &ftemp);

ctemp = (ftemp - 32) * 5/9;
printf("\nA temperatura em graus Celsius e: %d\n", ctemp);
}

Exemplo 4.9 Uso dos operadores de aritmtica bsica.


4.7.6 Operadores de Atribuio:

Operador Descrio Exemplo Resultado
= Atribuio a i = 5 O valor de i 5
+= Adio-igual i +=2 i = i + 2
-= Subtrao-igual d -= 3 d = d 3
*= Multiplicao-igual x *= y + 1 x = x * (y + 1)
/= Diviso-igual t /= 2.5 t = t / 2.5
%= Mdulo-igual p %= 5 p = p % 5

O sinal de igual no tem a mesma interpretao dada em matemtica. Ele representa a
atribuio da expresso direita ao nome da varivel esquerda. Por exemplo:


num = 2000;

Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 33

atribui o valor 2000 varivel num. A ao executada da direita para a esquerda neste
operador. A expresso 2000 = num no tem sentido em C, pois no podemos atribuir
um valor a uma constante. C aceita vrias atribuies numa mesma instruo:


laranjas = cenouras = abacates = 80;


Os demais operadores so usados com um nome de varivel sua esquerda e uma
expresso sua direita. As expresses com estes operadores so mais compactas e
normalmente produzem um cdigo de mquina mais eficiente.

O operador mdulo ( % ) aceita somente operandos inteiros e retorna o resto da diviso
do inteiro sua esquerda pelo inteiro sua direita (p = 3 % 2 o resultado ser 1).


4.7.7 Operador Unrio:

Operador Descrio Exemplo Resultado
- Unrio i = -5 O valor de i -5

O operador unrio usado somente para indicar troca do sinal algbrico do valor.


4.7.8 Operadores Relacionais:

Operador Descrio Exemplo Resultado
> Maior que a > b a maior que b
< Menor que a < b a menor que b
>= Maior ou igual a a >= b a maior ou igual a b
<= Menor ou igual a a <= c a menor ou igual a b
== Igual a == b a igual a b
!= Diferente a != b a diferente de b

Os operadores relacionais so usados para fazer comparaes, principalmente em
comandos de deciso e laos.

Uma ateno especial deve ser tomada com relao ao operador relacional de igualdade,
pois se ao invs de utilizar o duplo igual ( == ) for utilizado o igual ( = ), a expresso
direita do operador no ser comparada da esquerda, mas sim atribuda mesma.


4.7.9 Operadores Lgicos:

Operador Descrio Exemplo Resultado
&& AND lgico a && b a e b
|| OR lgico a || b a ou b
! NOT lgico !b Tudo, exceto b

Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 34
Os operadores lgicos permitem que seja feita uma lgica entre variveis,
principalmente quando so exigidas decises mais complexas. Por exemplo, supondo-se
que a varivel teste seja igual a 10 e esta varivel deva ser comparada ao intervalo de 0
a 20, o cdigo seria:


if(teste >= 0 && teste <= 20)


Este exemplo utiliza um comando de deciso ainda no estudado, mas basicamente est
comparando se teste maior ou igual a 0 E menor ou igual a 20.


4.7.10 Precedncia dos Operadores:

Os operadores aritmticos tm maior precedncia que os relacionais (sero avaliados
antes). Para ilustrar a precedncia dos operadores, a tabela a seguir mostra os diversos
tipos ordenados de maior para menor procedncia, comeando de cima para baixo:

Precedncia Operadores
1 ( ) [ ] . > ::
2 ++ -- + - * & ! ~ sizeof new delete
3 .* >*
4 * / %
5 + -
6 >> <<
7 < <= > >=
8 == !=
9 &
10 ^
11 |
12 &&
13 ||
14 ? :
15 = += -= *= /= %= &= ^= |= <<= >>=
16 ,

Os programas a seguir mostram exemplos de precedncia:


#include <stdio.h>

void main()
{
printf("\nA resposta e: %d.\n", 4+1 < 4);
}

Exemplo 4.10 Precedncia dos operadores.
A sada ser:

A resposta e: 0.

Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 35


#include <stdio.h>

void main()
{
printf("\nA resposta e: %d.\n", 1 < 2 + 4);
}

Exemplo 4.11 Precedncia dos operadores.

A sada ser:

A resposta e: 1.

possvel incluir expresses envolvendo operadores aritmticos (e outros operadores)
diretamente em funes como printf( ):


#include <stdio.h>

void main()
{
int ftemp;

printf("\nDigite temperatura em graus Fahrenheit: ");
scanf("%d", &ftemp);
printf("\nA temperatura em graus Celsius e: %d.\n", (ftemp-32)*5/9);
}

Exemplo 4.12 Uso de operadores no printf( ).



5.0 Laos:


5.1 Lao for:

O lao for engloba 3 expresses em uma nica. utilizado para repetir uma instruo
ou um bloco de instrues, inicializar uma ou mais variveis, testar uma varivel de
controle e incrementar uma ou mais variveis com cada alterao.


- Sintaxe:

for(inicializao; teste; incremento) instruo;


O exemplo a seguir utiliza o comando for para mostrar na tela os nmeros de 0 a 9:




Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 36


#include <stdio.h>
#include <conio.h>

void main()
{
clrscr();
int conta;

for(conta=0; conta<10; conta++)
printf("conta = %d.\n", conta);
}

Exemplo 5.1 Uso do comando for.

A sada do programa ser:

conta = 0.
conta = 1.
conta = 2.
conta = 3.
conta = 4.
conta = 5.
conta = 6.
conta = 7.
conta = 8.
conta = 9.


No lao for a inicializao executada uma nica vez antes do lao ser iniciado
(conta=0). O teste uma instruo de condio que controla o lao. Se a expresso for
verdadeira o corpo do lao executado, seno o programa continua a execuo da
instruo imediatamente posterior ao lao. O incremento define a maneira como a
varivel de controle vai ser alterada. Esta instruo sempre executada imediatamente
aps a execuo do corpo do lao.

O prximo exemplo utiliza o comando for com o operador de decremento.


#include <stdio.h>
#include <conio.h>

void main()
{
clrscr();
int conta;
for(conta=9; conta>=0; conta--)
printf("conta = %d.\n", conta);
}

Exemplo 5.2 - Uso do comando for com decremento.

A sada do programa ser:

Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 37

conta = 9.
conta = 8.
conta = 7.
conta = 6.
conta = 5.
conta = 4.
conta = 3.
conta = 2.
conta = 1.
conta = 0.

O exemplo 5.3 usa o for variando de 3 em 3 para escrever na tela os nmero de 0 a 9.


#include <stdio.h>
#include <conio.h>
void main()
{
clrscr();
int conta;

for(conta=0; conta<10; conta+=3)
printf("conta = %d.\n", conta);
}

Exemplo 5.3 - Uso do for com incremento 3.

A sada do programa ser:

conta = 0.
conta = 3.
conta = 6.
conta = 9.

Qualquer uma das expresses de um lao for podem conter vrias instrues separadas
por vrgula, como mostra o exemplo a seguir:


#include <stdio.h>
#include <conio.h>

void main()
{
clrscr();
int x, y;

for(x=0, y=0; x+y<100; x=x+1, y=y+1)
printf("%d.\n", x+y);
}

Exemplo 5.4 - Imprime os nmeros de 0 a 98 com incremento de 2.

Duas ou mais instrues podem ser colocadas no corpo do lao for se estiverem entre
chaves:
Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 38


#include <stdio.h>
#include <conio.h>

void main()
{
clrscr();
int conta, total;

for(conta=0, total=0; conta<10; conta++)
{
total = total + conta; // ou total +=conta;
printf("conta = %d, total = %d.\n", conta, total);
}
}

Exemplo 5.5 - Imprime os nmeros de 0 a 9 e totais.

A sada do programa ser:

conta = 0, total = 0.
conta = 1, total = 1.
conta = 2, total = 3.
conta = 3, total = 6.
conta = 4, total = 10.
conta = 5, total = 15.
conta = 6, total = 21.
conta = 7, total = 28.
conta = 8, total = 36.
conta = 9, total = 45.

A chave s utilizada quando o corpo do for tiver mais de uma instruo.


5.2 Lao while:

O comando while examina uma condio especfica. Enquanto a condio for
verdadeira, o comando que o segue ser executado repetidamente. Quando a condio
for falsa, a execuo passa para o primeiro comando que segue a repetio while.

while semelhante ao for: utiliza os mesmos elementos, mas eles esto distribudos de
maneira diferente no programa.

- Sintaxe:

while (expresso teste) instruo;


Reescrevendo o exemplo 5.5 usando o comando while, o cdigo fica:



Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 39


#include <stdio.h>
#include <conio.h>

void main()
{
clrscr();
int conta = 0;
int total = 0;

while(conta<10)
{
total = total + conta; /* ou total +=conta; */
printf("conta = %d, total = %d.\n", conta++, total);
}
}

Exemplo 5.6 - Imprime os nmeros de 0 a 9 e totais usando while.

A sada do programa ser:

conta = 0, total = 0.
conta = 1, total = 1.
conta = 2, total = 3.
conta = 3, total = 6.
conta = 4, total = 10.
conta = 5, total = 15.
conta = 6, total = 21.
conta = 7, total = 28.
conta = 8, total = 36.
conta = 9, total = 45.

Quando o nmero de interaes no conhecido mais apropriado usar while. O
comando while mais apropriado em situaes em que o lao pode ser terminado
inesperadamente por condies desenvolvidas dentro do lao, como mostra o exemplo
5.7:


#include <stdio.h>
#include <conio.h>

void main()
{
clrscr();
int cont = 0;

printf("Digite uma frase: ");

while (getche() != 13)
cont++;

printf("\nO numero de caracteres e: %d", cont);
}

Exemplo 5.7 - Conta o nmero de caracteres de uma frase.

Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 40

Assim como no comando for possvel aninhar laos, ou seja, colocar um while dentro
de outro while. O exemplo a seguir mostra este tipo de organizao:


#include <stdio.h>
#include <conio.h>

void main()
{
clrscr();
int num1, num2;
long resposta;

while(1) // Loop infinito s sai com <CTRL> + <BREAK>
{
printf("Digite um nmero inteiro: ");
scanf("%d", &num1);

num2 = num1;
resposta = 1;

while(num1>1)
resposta = resposta * num1--;

printf("O fatorial do numero %d e: %ld\n", num2, resposta);
}
}

Exemplo 5.8 Calcula nmero fatorial.

O lao while mais externo (primeiro while) um lao infinito. Para sair, devem ser
pressionadas as teclas <CTRL> + <BREAK>.


5.3 - Lao do-while:

Ao contrrio dos comandos while e for, que testam a condio e executam os comandos
se esta for verdadeira, o comando do-while primeiro executa um conjunto de comandos
e depois testa a condio. Se a condio for verdadeira, o comando novamente
executado e se repete at que a condio no seja mais verdadeira. Como conseqncia,
o do-while executado pelo menos uma vez.


- Sintaxe:

do
{
instruo;
}
while (expresso de teste);




Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 41

6.0 Comandos de Deciso:

6.1 Comando if:

O comando if examina uma condio especfica. Se a condio for verdadeira, o
programa executa o comando ou o bloco de comandos seguinte. Se a condio for falsa,
o comando que segue a condio no ser executado.

- Sintaxe:

if (expresso de teste)
{
instruo;
}

O exemplo a seguir ilustra o uso do comando if:


#include <stdio.h>
#include <conio.h>
void main()
{
clrscr();
char ch;

ch = getche();
if(ch == 'p')
printf("\nVoce precionou a tecla p");
}

Exemplo 6.1 Uso do comando if.

A instruo ser executada se a expresso de teste for verdadeira. Ele executado uma
nica vez. No prximo exemplo, sero colocadas vrias instrues no corpo do
comando if.


#include <stdio.h>
#include <conio.h>

void main()
{
clrscr();

if(getche() == 'p')
{
printf("\nVoce precionou a tecla p");
printf("\nPressione qualquer tecla para terminar.");
getche();
}
}

Exemplo 6.2 - Uso do comando if com vrias instrues.

Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 42
Dependo da complexidade do programa, um comando if pode estar dentro de outro
comando if. Exemplo:

#include <stdio.h>
#include <conio.h>

void main()
{
clrscr();
char ch;

printf("Digite uma letra de 'a' a 'z': ");
ch = getche();

if(ch >= 'a')
{
if(ch <= 'z')
printf("\nVoce digitou certo!!");
}
}
Exemplo 6.3 Uso de comandos if aninhados.

6.2 Comando if-else:

O comando else associado ao if e executa uma instruo (ou bloco de instrues) se a
expresso de teste do if for falsa.

- Sintaxe:

if (expresso de teste)
{
instruo 1;
}
else
{
instruo 2;
}

O exemplo a seguir ilustra o uso do comando if-else:

#include <stdio.h>
#include <conio.h>

void main()
{
clrscr();
char ch;

ch = getche();

if(ch =='p')
printf("\nVoce pressionou a tecla p");
else
printf("\nVoce nao pressionou a tecla p");
}
Exemplo 6.4 Uso do comando if-else.
Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 43

O prximo exemplo utiliza o for e if-else:


#include <stdio.h>
#include <conio.h>

void main()
{
clrscr();
int x,y;

for(y=1; y<9; y++) // Passo de descida.
{
for(x=1; x<9; x++) // Passo de largura.
{
if((x+y)%2 == 0) // numero par?
printf("\xDB\xDB"); // Imprime quadrado cheio.
else
printf(" "); // Imprime quadrado branco.
}
printf("\n"); // Linha nova.
}
}

Exemplo 6.5 Desenho de um tabuleiro de xadrez.


6.3 Comando switch:

O comando switch avalia uma expresso e tenta localizar uma coincidncia dentro da
lista de valores. Se for encontrada uma coincidncia, switch executa os comandos
associados a ele. Se no for encontrada nenhuma coincidncia, a execuo continua no
primeiro comando seguinte ao switch.


- Sintaxe:

switch(expresso constante)
{
case constante l:
instrues 1;
break;
case constante 2:
instrues 2;
break;
}

A expresso entre parnteses deve ser um valor inteiro ou caractere e o corpo do switch
deve estar envolto por chaves. Pode haver uma ou mais instrues seguindo cada case.
Estas instrues no podem estar entre chaves. O comando break causa uma sada
imediata do switch. Se no existir um break seguindo as instrues de um caso, o
programa segue executando todas as instrues dos casos abaixo.

Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 44

O exemplo a seguir usa o comando switch para tomar vrias decises em funo de uma
nica expresso:


#include <stdio.h>
#include <conio.h>

void main()
{
clrscr();
int D, M, A, i;

long int F = 0;

do
{
do
{
printf("\n\nDigite a data na forma dd/mm/aaaa: ");
scanf("%d/%d/%d", &D, &M, &A);
}
while(A < 1600 || M < 1 || M > 12 || D < 1 || D > 31);

F = A + D + 3 * (M - 1) - 1;

if(M<3)
{
A--;
i = 0;
}
else
i = .4 * M + 2.3;

F = F + A / 4 - i;
i = A / 100 + 1;
i = i * 0.75;
F = F - i;
F = F % 7;

switch(F)
{
case 0: printf("\nDomingo"); break;
case 1: printf("\nSegunda-feira"); break;
case 2: printf("\nTerca-feira"); break;
case 3: printf("\nQuarta-feira"); break;
case 4: printf("\nQuinta-feira"); break;
case 5: printf("\nSexta-feira"); break;
case 6: printf("\nSabado"); break;
}
printf(\n\nPressione ENTER para continuar ou ESC para sair: );
}
while(getch() != 27);
}

Exemplo 6.6 - Calcula o dia da semana usando o comando switch.

O prximo exemplo usa o comando switch para identificar o tipo de operao
matemtica usada.
Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 45


#include <stdio.h>
#include <conio.h>

void main()
{
float x1, x2, result=0;
char sinal;

do
{
printf("Operacao: ");
scanf("%f%c%f", &x1, &sinal, &x2);

switch(sinal)
{
case '+': result = x1 + x2; break;
case '-': result = x1 - x2; break;
case '*': result = x1 * x2; break;
case '/': result = x1 / x2; break;
default : printf("\nOperacao invalida\n"); continue;
}

printf("Resposta = %.4f\n", result);
printf("\n");
}
while(1); // Loop infinito - s sai com <Ctrl> + <Break>
}

Exemplo 6.7 Uso do comando switch.

O rtulo default no comando switch permite que sejam especificados um ou mais
comandos que sero executados caso nenhuma das condies satisfaa a expresso
constante.



7.0 Matrizes e Strings:

7.1 Matriz:

Uma matriz agrupa uma serie de variveis do mesmo tipo referenciadas por um nico
nome, onde cada varivel diferenciada atravs de um nmero chamado subscrito ou
ndice. Colchetes so usados para conter o ndice da matriz.


- Sintaxe:

tipo_da_varivel nome[num_elementos];

Se a matriz tiver apenas um ndice, pode ser chamada de vetor.

O exemplo a seguir ilustra o uso da matriz para calcular a mdia da nota de 5 alunos.

Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 46


#include <stdio.h>
#include <conio.h>

void main()
{
clrscr();
int notas[5];
int i, soma;

for(i=0; i<5; i++)
{
printf("\nDigite a nota do aluno %d: ", i+1);
scanf("%d", &notas[i]);
}
soma = 0;
for(i=0; i<5; i++)
soma = soma + notas[i];

printf("\n\nMedia das Notas: %d", soma/5);
}

Exemplo 7.1 Clculo da mdia da nota de 5 alunos.

Os elementos da matriz so guardados em uma seqncia contnua de memria, isto ,
um seguido do outro. O primeiro elemento da matriz est na posio zero. Logo,
notas[2] , na verdade, o terceiro elemento da matriz.

Os elementos da matriz podero ser de outros tipos alm de inteiros, como no exemplo
7.2 a seguir, onde utilizado o tipo float, considerando assim a parte fracionria das
notas dos alunos:


#include <stdio.h>
#include <conio.h>

void main()
{
clrscr();
float notas[5];
float soma;
int i;

for(i=0; i<5; i++)
{
printf("\nDigite a nota do aluno %d: ", i+1);
scanf("%f", &notas[i]);
}

soma = 0;
for(i=0; i<5; i++)
soma = soma + notas[i];

printf("\n\nMedia das Notas: %.2f", soma/5);
}

Exemplo 7.2 Clculo da mdia da nota de 5 alunos usando float.

Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 47

Quando no conhecemos o total de elementos da matriz (no exemplo a quantidade total
de alunos da classe), podemos criar um mecanismo que pode ser modificado facilmente
e que estabelece um limite superior para a quantidade de elementos. Este procedimento
feito atravs de um comando de pr-processamento chamado define:


#include <stdio.h>
#include <conio.h>
#define LIM 40

void main()
{
clrscr();

float notas[LIM];
float soma = 0.0;
int i=0;

printf(\n\nDigite 0 para sair.\n\n);

do
{
printf("\nDigite a nota do aluno %d: ", i+1);
scanf("%f", &notas[i]);

if(notas[i] > 0)
soma = soma + notas[i];
}
while(notas[i++] > 0);

printf("\n\nMedia das Notas: %.2f", soma/(i-1));
}

Exemplo 7.3 Clculo da mdia da nota de 5 alunos.


Ateno:

C no avisa quando o limite de dimensionamento de uma matriz foi excedido. Portando
o procedimento acima deve ser utilizado com cuidado para que i no seja superior a 39.
O ideal modificar o lao do-while:

O prximo exemplo, faz uma modificao do no lao do-while, para evitar que o limite
de dimensionamento da matriz seja excedido:










Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 48


#include <stdio.h>
#include <conio.h>
#define LIM 40

void main()
{
clrscr();
float notas[LIM];
float soma = 0.0;
int i = 0;

printf(\n\nDigite 0 para sair.\n\n);

do
{
if(i >= LIM)
{
printf("Buffer lotado!!!\n");
i++;
break; // Sai do lao do-while.
}

printf("\nDigite a nota do aluno %d: ", i+1);
scanf("%f", &notas[i]);

if(notas[i] > 0)
soma = soma + notas[i];
}
while(notas[i++] > 0);

printf("\n\nMedia das Notas: %.2f", soma/(i-1));
}

Exemplo 7.4 Clculo da mdia da nota de 5 alunos.

Em C podemos declarar uma matriz e tambm atribuir valores a ela:


#define LIM 5
int tab[LIM] = {50,25,10,5,1};

void main()
{
.
.
.
}

Exemplo 7.5 Declarao e atribuio de valores para uma matriz.

A lista de valores colocada entre chaves e os valores so separados por vrgulas. Os
valores devem ser atribudos em seqncia.

A linguagem C permite a criao de matrizes de mais de uma dimenso. Com dois pares
de colchetes podemos declarar, por exemplo uma matriz de duas dimenses, como
mostra o exemplo 7.6:
Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 49


#include <stdio.h>
#include <conio.h>

#define A 5
#define L 10

void main()
{
clrscr();
char matriz[A][L];
int x, y;

for(y=0; y<A; y++)
{
for(x=0; x<L; x++)
matriz[y][x]= '.';
}

printf("\nDigite coordenadas na forma x, y (4,2).\n");
printf("\nDigite um numero negativo para sair.\n ");

while(x>=0)
{
for(y=0; y<A; y++)
{
for(x=0; x<L; x++)
printf("%c", matriz[y][x]);
printf("\n");
}

printf("Coordenadas: ");
scanf("%d,%d", &x, &y);
matriz[y][x] = '\xB1';
}
}

Exemplo 7.6 Imprime coordenadas na tela.



7.2 Strings:

Uma string , na verdade, uma matriz unitria de caracteres definida como sendo do tipo
char. Ela segue os mesmos padres utilizados pelas matrizes e vetores numricos.

Tanto o tamanho da string como seus elementos especficos, so identificados pelo
nome da string seguido pelo nmero (ndice) entre colchetes. Contudo, como o primeiro
caractere reside no elemento 0, o nmero do ltimo elemento sempre o tamanho da
string menos 1.

O ltimo elemento de uma string de caracteres o caractere nulo \0. Ele deve ser
sempre considerado na hora de especificar o tamanho da string.



Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 50

- Sintaxe:

char nome[num_elementos];

Uma string definida como char nome[20] pode conter, no mximo 20 caracteres (0 a
19), considerando a posio 20 como o caractere nulo \0. A string no precisa ser
utilizada por completo, ou seja, estarem preenchidas as 20 posies. Ela pode conter de
0 a 20 caracteres, mas no pode exceder este valor.

O exemplo a seguir cria uma string de caracteres chamada alfabeto, com capacidade
para armazenar 27 caracteres (26 letras mais o caractere nulo \0).


#include <stdio.h>
#include <conio.h>

void main()
{
char alfabeto[26]; // 26 letras mais o caractere nulo.
char letra;
int index;

clrscr();

for(letra = A, index=0; letra <= Z; letra++, index++)
alfabeto[index] = letra;

alfabeto[index] = \0;

printf(%s, alfabeto);
}

Exemplo 7.7 Utilizao de uma string para armazenar o alfabeto.

A varivel index reflete a posio de cada letra dentro da string. O programa inicializa
index com 0, que a primeira posio armazenada na string alfabeto[0]. Cada interao
da repetio incrementa as variveis letra e index. Como resultado, o programa
armazena as letras como mostrado na figura a seguir:

alfabeto[0] ---- A
alfabeto[1] ---- B
alfabeto[2] ---- C
.
.
.

alfabeto[24] ---- Y
alfabeto[25] ---- Z
alfabeto[26] ---- \0 Caractere nulo.
Figura 7.1 Armazenamento da string.

Neste exemplo a funo printf( ) examina um caractere por vez at encontrar o \0.
Como printf( ) exibe a string inteira, ao contrrio de exibir um caractere especfico,
pode-se utilizar a string alfabeto sem os colchetes.
Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 51

A string alfabeto comporta 27 caracteres. Caso sejam utilizadas apenas 10 posies, a
posio 11 deve conter o caractere nulo. Se o comando de escrita na tela no encontrar o
caractere nulo, ele continuar escrevendo os caracteres da string at que todas as
posies sejam escritas. Isto significa que qualquer coisa que esteja nas posies 11 at
27 ser apresentada junto com os 10 caracteres iniciais, alterando o significado da
seqncia de caracteres da string.

O exemplo a seguir permite que o usurio insira uma string no programa.


#include <stdio.h>
#include <conio.h>

void main()
{
char string[128];
int index=0;

clrscr();
printf("\nDigite uma string de caracteres e pressione ENTER.\n\n> ");

while((string[index] = getchar()) != '\n')
index++;

string[index] = '\0';
printf("\n%s\n\n(A string contem %d caracteres)", string, index);
getch();
}

Exemplo 7.8 Insere uma string no programa.

Os caracteres so lidos um a um pelo lao while utilizando a funo getchar( ). A ser
pressionada a tecla ENTER, o lao terminado e o programa escreve na tela a string e o
nmero de caracteres digitados.

Assim como nas matrizes e vetores, podemos declarar uma string e tambm atribuir
valores a ela:


char string[128] = {Isto uma string};

Exemplo 7.9 Declarao e atribuio de valores para uma string.



7.2.1 Funes gets( ) e puts( ):

A funo gets( ) obtm uma string de caracteres do usurio. Internamente, gets( ) usa
getchar( ) para obter os caracteres at localizar um ENTER. Portanto, como getchar( ),
gets( ) deixa o usurio editar a linha de texto usando a tecla BACKSPACE. Uma vez
pressionado ENTER, gets( ) recupera apenas os caracteres que aparecem na tela. Se o
usurio ultrapassar o espao reservado para a string, gets( ) sobrepe os valores na
memria, podendo at travar o computador.

Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 52

A funo puts( ) exibe uma string de caracteres com o caractere de mudana de linha.
Quando puts( ) encontra um caractere nulo, que finaliza a string, a funo faz a
mudana de linha automaticamente, dispensando a utilizao do \n.


- Sintaxe da funo gets( ):

gets(string);


- Sintaxe da funo puts( ):

puts(string);

O exemplo a seguir utiliza as funes gets( ) e puts( ) para ler uma string e novamente
apresent-la na tela.


#include <stdio.h>
#include <conio.h>

void main()
{
char string[128];

puts(Digite uma string e pressione Enter:);
gets(string);
puts(\nA string digitada foi:);
puts(string);
}

Exemplo 7.10 Uso das funes gets( ) e puts( ).

A funo puts( ) tambm pode escrever na tela textos simples e utilizar o caractere de
mudana de linha, mas no aceita especificadores de formato (%d, %c, etc.) e
argumentos.

Estas funes simplificam bastante o uso de strings, substituindo as funes scanf( ) e
printf( ).



7.2.2 Rotinas de Manipulao de String:

A manipulao de strings a principal atividade de muitos programas em C. Alguns
exemplos de manipulao: comparar duas strings, localizar um caractere em uma string,
adicionar o contedo de uma string em outra, etc. Para isto, C disponibiliza uma
biblioteca chamada string.h, que contm diversas funes de manipulao de strings,
conforme mostra a tabela a seguir:



Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 53


Funo Descrio
strcat Anexa uma string outra.
strchr Pesquisa uma string pela primeira ocorrncia de uma letra.
strcmp Compara duas strings.
strcmpi Compara duas strings, ignorando diferenas entre maisculas e
minsculas.
strcpy Copia o contedo de uma string em outra.
strcspn Devolve a primeira letra de uma string que est na segunda string.
strdup Aloca memria e copia uma string.
strerror Devolve uma mensagem de erro associada ultima chamada rotina
da biblioteca run-time que produziu o erro.
stricmp Compara duas strings, ignorando diferenas entre maisculas e
minsculas.
strlen Retorna o nmero de caracteres da string.
strlwr Converte uma string para minscula.
strncat Anexa n caracteres em uma string.
strncmp Compara os primeiros n caracteres de uma string.
strncpy Copia os primeiros n caracteres de uma string em outra.
strnicmp Compara os primeiros n caracteres de duas strings, ignorando
diferenas entre maisculas e minsculas.
strnset Inicializa os primeiros n caracteres da string com um caractere
especfico.
strpbrk Localiza o primeiro caractere da primeira string que tambm est na
segunda.
strrchr Localiza a ltima ocorrncia de uma letra na string.
strrev Reverte a ordem das letras em uma string.
strset Define todos os caracteres de uma string com uma letra especfica.
strspn Retorna o primeiro caractere da primeira string que no est no
conjunto de caracteres da segunda string.
strstr Retorna um ponteiro com a localizao da segunda string dentro da
primeira, ou NULL se a string no existir.
strtod Converte uma string para um valor decimal.
strtol Converte uma string para um valor long.
strtoul Converte uma string para um valor unsigned long.
strupr Converte uma string para maiscula.
Tabela 7.1 Rotinas de manipulao de strings.


O exemplo 7.11 a seguir utiliza strcpy para adicionar a frase Isto uma String string
teste e utiliza strchr para retornar a posio da letra r dentro da string.

Para que seja possvel identificar a posio da letra r dentro da string, necessrio
utilizar um ponteiro chamado ptr. O conceito de ponteiros ser visto no captulo 10.




Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 54


#include <string.h>
#include <stdio.h>

void main()
{
char teste[15];
char *ptr; // Define um ponteiro chamado ptr.
char c = 'r';

strcpy(teste, "Isto e uma String");
ptr = strchr(teste, c);

if(ptr)
printf("O caractere r esta na posicao: %d\n", ptr-teste);
else
printf("O caractere nao foi encontrado!\n");
}

Exemplo 7.11 Identificao de um caractere dentro da string.

O exemplo 7.12 a seguir, utiliza strlen para retornar o nmero de caracteres da string
teste.


#include <stdio.h>
#include <string.h>

void main()
{
char teste[20] = {"Isto e uma String"};

printf("\nA string tem %d caracteres.\n", strlen(teste));
}

Exemplo 7.12 Retorna o nmero de caracteres da string.


O exemplo 7.13 utiliza strupr para converter uma string minscula em maiscula.


#include <stdio.h>
#include <string.h>
#include <conio.h>

void main()
{
clrscr();
char teste[27] = {"abcdefghijklmnopqrstuvwxyz\0"};
char *maiusc;

maiusc = strupr(teste);
printf("\nString maiuscula: %s\n", maiusc);
}

Exemplo 7.13 Converte uma string minscula em maiscula.


Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 55

7.2.3 Rotinas de Converso de Caracteres:

Como um complemento para as rotinas de manipulao de strings, existem as rotinas de
converso de caracteres, que convertem um caractere de um formato para outro. A
tabela a seguir define as rotinas de converso de caracteres disponveis na biblioteca
ctype.h:

Funo Descrio
tolower(c) Converte c para maiscula se minscula.

toupper(c) Converte c para minscula se maiscula.

toascii(c) Limpa todos os caracteres com exceo dos 7 bits menos significativos
de c.
_tolower(c) Macro que converte c para minscula sem checar o tipo.

_touper(c) Macro que converte c para maiscula sem checar o tipo.

Tabela 7.2 Rotinas de converso de caracteres.


A linguagem C fornece ambas as implementaes, macro e funo, para as rotinas
tolower e toupper. Se a velocidade do programa for mais importante que o tamanho, use
a macro. Macros so mais rpidas que funes, mas resultam em um arquivo executvel
maior.



7.2.4 Rotinas de Converses Numricas:

Muitos programas em C precisam obter um nmero (no um cdigo ASCII) do usurio
no formato de texto. Para obter este nmero, podemos usar a funo gets( ) para ler o
nmero no formato de uma string de caracteres ASCII e depois usar as funes de
converso numrica da biblioteca stdlib.h para converter a string em um valor
numrico. A tabela a seguir apresenta trs funes de converso:

Funo Descrio
atoi Converte um valor ASCII para o formato int.

atol Converte um valor ASCII para o formato long.

atof Converte um valor ASCII para o formato float.

Tabela 7.3 Rotinas de converses numricas.


O Exemplo a seguir utiliza as rotinas de converso para converter strings em valores
numricos:

Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 56

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

void main()
{
clrscr();
char string[128];

puts(Digite um valor inteiro);
gets(string);
printf(O valor digitado era %d\n\n, atoi(string));

puts(Digite um valor inteiro longo);
gets(string);
printf(O valor digitado era %ld\n\n, atol(string));

puts(Digite um valor em ponto flutuante);
gets(string);
printf(O valor digitado era %f\n\n, atof(string));
}

Exemplo 7.14 Converte string de caractere em valores numricos.


8.0 Funes:

As funes dividem grandes tarefas de computao em tarefas menores, permitindo s
pessoas trabalharem sobre o que outras j fizeram, ao invs de partir do zero. Exemplo:
funo printf( ).

Uma funo uma unidade de cdigo de programa autnoma projetada para cumprir
uma tarefa particular. C foi projetada com funes eficientes e fceis de usar. Programas
em C geralmente consistem em vrias pequenas funes ao invs de poucas de maior
tamanho.


8.1 Estrutura das Funes em C:

A estrutura de uma funo C bastante semelhante funo main( ). A nica diferena
que main( ) possui um nome especial.

A funo criada pelo usurio deve ser colocada antes do programa principal. Todas as
funes em C comeam com um nome seguido de um parntese (que envolve ou no
uma lista de argumentos) e, aps isto, chaves que envolvem o corpo da funo.

- Sintaxe:

declarao_do_tipo nome_da_funo(lista_de_argumentos)
{
instrues;
return( );
}
Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 57

8.2 Chamando Funes:

As funes criadas so chamadas da mesma forma como so chamadas as funes
printf( ) e getche( ), por exemplo. Visto que a chamada a uma funo constitui uma
instruo do programa, deve ser encerrada por ponto e vrgula. Entretanto, na definio
de uma funo, o ponto e vrgula no pode ser usado.


8.3 - Passando Dados para a Funo Chamada:

O mecanismo usado para transmitir informaes para uma funo chamado
argumento, os quais j foram usados nas funes printf( ) e scanf( ).

Em C todos os argumentos de funes so passados "por valor". Isso significa que
funo chamada dada uma cpia dos valores dos argumentos e ela cria outras
variveis temporrias para armazenar estes valores. A diferena principal que em C
uma funo no pode alterar o valor de uma varivel da funo que chama, ela s pode
alterar sua cpia temporria.

O argumento poder ser uma constante ou uma varivel. Se mais de um argumento
necessrio, podem ser passados uma lista de argumentos separados por vrgulas.


8.3 Variveis Locais:

As variveis que so declaradas dentro de uma funo so chamadas de variveis locais.
Elas so conhecidas somente dentro do prprio bloco e existem somente durante a
execuo do bloco onde foram declaradas. Este tipo de varivel tambm chamada de
varivel automtica, pois ela automaticamente criada quando a funo criada e
destruda ao final de sua execuo.


8.4 Usando mais de uma Funo:

Cada funo pode chamar outras funes. Uma funo chamada linha( ), criada pelo
programador, chama a funo printf( ) e a funo main( ) chama as funes linha( ) e
printf( ).

Em um programa podem ser usadas vrias funes. Em C no permitido definir uma
funo dentro da outra e todas as funes so visveis por todas as outras.


8.5 Tipos de Funes:

O tipo de uma funo determinado pelo tipo de valor que ela retoma e no pelo tipo de
seus argumentos. Uma funo do tipo inteiro quando ela retoma um inteiro. Se uma
funo for do tipo no inteira ela deve ser declarada. Se o tipo for omitido o compilador
assume por default que a funo do tipo int. Uma funo que retorna um char ou no
retorna nada pode ser considerada como inteira.
Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 58

8.5.1 - Funes do Tipo void:

O comit de padronizao da linguagem do American National Standard Institute
(ANSI), em suas propostas, batizou funes que no retornam nada com sendo do tipo:
void.


8.5.2 Funes Simples:

Funes simples so executadas e no devolvem nenhum valor ao programa principal
que a chamou. O exemplo a seguir utiliza uma funo bem simples. Ele cria uma funo
que imprime 20 caracteres slidos em uma linha:


#include <stdio.h>
#include <conio.h>

// Funcao linha().
// Desenha uma linha solida com 20 caracteres na tela.

void linha()
{
int j;

for(j=1; j<=20; j++)
printf("\xDB");

printf("\n");
}


void main()
{
clrscr();

linha();
printf("\xDB Um Programa em C \xDB\n");
linha();
}

Exemplo 8.1 - Envolve um texto por uma moldura.


8.5.3 Funes que Retornam um Valor:

uma aplicao um pouco mais complicada de funo, porque esta retorna um valor a
funo principal que a chamou. Um exemplo j utilizado: a funo getche( ), devolve o
valor do primeiro caractere pressionado no teclado. Neste caso a funo geralmente
chamada dentro de uma expresso aritmtica, por exemplo:





Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 59


minusculo()
{
.
.
}

void main()
{
.
ch = minusculo();
.
}

Exemplo 8.2 Funo que retorna um valor.


8.6 O Comando return( ):

O comando return( ) tem dois usos importantes: no primeiro, o comando pode ser usado
para devolver um valor a retornar, imediatamente, para a prxima instruo do cdigo
de chamada. No segundo, ele pode ser usado, sem os parnteses, para causar uma sada
imediata da funo na qual ele se encontra, ou seja, o return far com que a execuo
do programa volte para o cdigo de chamada assim que o computador encontrar esse
comando, o que ocorre, em geral, antes da ltima instruo da funo.

Como mostra o exemplo 8.3, o programador poder colocar mais de um comando
return( ) em suas funes.


#include <stdio.h>
#include <conio.h>

minutos() // Funo que l e converte horas em minutos.
{
int hora, min;
scanf("%d:%d", &hora, &min);
return(hora*60+min);
}

void main()
{
int mins1, mins2;
clrscr();
printf("Digite a primeira hora (hora:min): ");
mins1 = minutos();
printf("Digite a segunda hora (hora:min): ");
mins2 = minutos();
printf("A diferenca e de %d minutos.", mins2-mins1);
}

Exemplo 8.3 Clculo da diferena entre dois tempos.

Limitao do comando return( ): pode retornar somente um nico valor funo
que chama.

Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 60

9.0 Estruturas e Unies:


9.1 Estruturas:

Uma estrutura em C o nome de uma coleo de variveis relacionadas. Para criar uma
estrutura, necessrio primeiro definir uma estrutura e, ento, declarar variveis
daquele tipo.

- Sintaxe:

struct nome_da_estrutura
{
declarao_do_tipo nome_da_varivel_1;
declarao_do_tipo nome_da_varivel_2;
...
declarao_do_tipo nome_da_varivel_n;
} nome_das_variveis;

A estrutura composta por trs partes: a palavra reservada struct, que diz ao compilador
que voc est definindo uma estrutura; o nome da estrutura (opcional), que identifica a
estrutura criada e os membros da estrutura, que esto entre as chaves. A definio
associa a srie de membros ao nome da estrutura, mas no diz ao compilador para criar
a varivel.

Para que seja possvel utilizar a estrutura, necessrio declarar variveis do tipo da
estrutura criada, como mostra o exemplo a seguir:


struct registro
{
char nome[20];
int idade;
float salario;
char fone[15];
} cadastro;

Exemplo 9.1 Declarao de uma estrutura.

O nome de identificao da estrutura registro. Para que seja possvel utilizar a
estrutura registro, declarada uma varivel chamada cadastro, que acessa todos os
membros da estrutura registro.

Para acessar um membro especfico de uma estrutura, utilizado o operador ponto (.).
Por exemplo, o comando cadastro.idade = 27; atribui o valor 27 ao membro da
estrutura cadastro chamado idade. Caso seja necessrio incluir novos membros uma
estrutura, basta adiciona-los na declarao da estrutura.

possvel declarar estruturas e posteriormente declarar variveis do tipo da estrutura
criada. O exemplo a seguir ilustra o uso de estruturas.

Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 61
#include <stdio.h>

void main()
{
struct
{
int a;
int b;
} x, y;

x.a = 10;
x.b = 5;
y = x;

printf(\nO valor de x.a e: %d, x.a);
printf(\nO valor de x.b e: %d, x.b);
printf(\nO valor de y.a e: %d, y.a);
printf(\nO valor de y.b e: %d, y.b);
}
Exemplo 9.2 Uso de estrutura.

O prximo exemplo utiliza uma estrutura para receber informaes sobre carros.

#include <stdio.h>
#include <conio.h>

struct carro
{
char fabricante[15];
char modelo[15];
char chassi[10];
int ano;
long int km;
float preco;
} meucarro;

void main()
{
puts(Informe o fabricante do carro:);
gets(meucarro.fabricante);
puts(Informe o modelo do carro:);
gets(meucarro.modelo);
puts(Informe o numero de chassi:);
gets(meucarro.chassi);
puts(Informe o ano do carro:);
scanf(%d, &meucarro.ano);
puts(Informe a quilometragem atual:);
scanf(%ld, &meucarro.km);
puts(Informe o preo de compra.);
scanf(%f, &meucarro.preco);
getchar(); // Esvazia o buffer do teclado.

printf(\nUm %s %s %d com chassi #: %s\n, meucarro.fabricante,
meucarro.modelo, meucarro.ano, meucarro.chassi);
printf(atualmente tem %ld Kms e foi comprado por %.2f\n,
meucarro.km, meucarro.preco);
}

Exemplo 9.3 Cadastro de informaes sobre carros usando estrutura.

Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 62

No prximo exemplo so declaradas duas estruturas, fora do programa principal.
possvel declarar uma estrutura dentro de outra. Neste caso, os membros so acessados
de acordo com a ordem das estruturas.


#include <stdio.h>
#include <string.h>
#include <conio.h>

struct tipo_endereco
{
char rua[50];
int numero;
char bairro[20];
char cidade[30];
char sigla_estado[3];
long int CEP;
};

struct ficha_pessoal
{
char nome[50];
long int telefone;
struct tipo_endereco endereco;
};

void main()
{
// Declarao da varivel como sendo estrutura.
struct ficha_pessoal ficha;

clrscr();

strcpy (ficha.nome,"Luiz Osvaldo Silva");
ficha.telefone=4921234;
strcpy (ficha.endereco.rua,"Rua das Flores");
ficha.endereco.numero=10;
strcpy (ficha.endereco.bairro,"Cidade Velha");
strcpy (ficha.endereco.cidade,"Belo Horizonte");
strcpy (ficha.endereco.sigla_estado,"MG");
ficha.endereco.CEP=31340230;

printf(\nNome: %s, ficha.nome);
printf(\nEndereco: %s, n %d, ficha.endereco.rua,
ficha.endereco.numero);
printf(\n %s - %s - %s, ficha.endereco.bairro,
ficha.endereco.cidade, ficha.endereco.sigla_estado);
printf(\nCEP: %ld Fone: %ld, ficha.endereco.CEP,
ficha.telefone);
}

Exemplo 9.4 Cadastro de funcionrios usando estrutura.






Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 63

9.2 Unies:

Unies so casos particulares de Estruturas, que permitem armazenar valores de
diferentes tipos, mas apenas um valor pode ocupar a varivel em um determinado
momento. Cada membro de uma unio disputa uma mesma posio de memria,
fazendo com que apenas um membro por vez possa ser utilizado.


- Sintaxe:

union nome_da_unio
{
declarao_do_tipo nome_da_varivel_1;
declarao_do_tipo nome_da_varivel_2;
...
declarao_do_tipo nome_da_varivel_n;
} nome_das_variveis;


O exemplo a seguir define uma unio chamada keys que pode armazenar um valor do
tipo int, float ou char. O programa cria uma varivel unio chamada key.


#include <stdio.h>
#include <conio.h>

void main()
{
union keys
{
int ikey;
float fkey;
char ckey;
} key;

clrscr();

key.ikey = 7;
printf(Valor atual da uniao = %d\n, key.ikey);

key.fey = 88.2;
printf(Valor atual da uniao = %f\n, key.fkey);

key.ckey = A;
printf(Valor atual da uniao = %c\n, key.ckey);
}

Exemplo 9.5 Programa que utiliza uma unio para escrever valores.

Como uma unio pode armazenar apenas um valor por vez, o compilador no aloca
espao de armazenamento para cada entrada. Contudo ele prov espao para o maior
elemento da unio.


Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 64

O prximo exemplo ilustra a quantidade de memria alocada para uma estrutura e para
uma unio. Para isso utilizado o operador sizeof, que retorna o tamanho em bytes da
expresso entre parnteses.


#include <stdio.h>
#include <conio.h>

void main()
{
struct s_entry
{
int ivalue; // Ocupa 2 bytes.
float fvalue; // Ocupa 4 bytes.
char cvalue; // Ocupa 1 byte.
}

union u_entry
{
int ivalue;
float fvalue; // Ocupa 4 bytes (maior membro).
char cvalue;
}

clrscr();

printf(\nTamanho da estrutura = %d bytes\n, sizeof(struct s_entry));
printf(\nTamanho da uniao = %d bytes\n, sizeof(union u_entry));
}

Exemplo 9.6 Alocao de memria para estruturas e unies.


Os membros da estrutura requerem 7 bytes da memria. O compilador, contudo, alinha
os membros em endereos mltiplos do tamanho de uma palavra (por definio), o que
resulta em 8 bytes.

Como pode ser observado, apesar de unies e estruturas serem semelhantes no formato,
comportam-se de maneira diferente. Unies ocupam menos espao na memria.



10.0 Ponteiros:

O formatador de tipo, int, especifica variveis do tipo inteiro, o float do tipo ponto
flutuante, o char do tipo caractere, etc. Um ponteiro uma varivel que contm um
endereo de memria, ou seja, o endereo de uma outra varivel na memria.

Se uma varivel contiver o endereo de uma outra varivel, pode-se dizer que uma
aponta para a outra, conforme ilustra a figura a seguir.




Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 65


Figura 10.1 Um ponteiro aponta para o endereo de memria de uma varivel.


- Sintaxe:

tipo_do_ponteiro *nome_da_varivel;

A declarao de um ponteiro deve especificar o nome da varivel ponteiro precedida
por um asterisco, e o tipo de valor que contm.

o asterisco (*) que faz o compilador saber que aquela varivel no vai guardar um
valor mas sim um endereo para aquele tipo especificado.

O exemplo a seguir declara uma varivel do tipo int e um ponteiro para um valor tipo
int. Ele atribui o endereo da varivel cont ao ponteiro ptr e, ento, exibe o valor e o
endereo de cont, seguido pelo valor do ponteiro.


#include <stdio.h>

void main()
{
int cont = 1;
int *ptr;

ptr = &cont;

printf(\nValor de cont = %d\tEndereco de cont = %X\n, cont, &cont);
printf(\nValor de ptr = %04X, ptr);
}

Exemplo 10.1 Utilizao de um ponteiro.

O operador de endereo (&) retorna a localizao de cont na memria. No programa, o
comando ptr = &cont; atribui varivel ponteiro ptr o endereo da varivel cont.

Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 66

Usando o operador de indireo (*), o comando seguinte exibe o valor de cont, isto , o
valor contido na localizao de memria para a qual ptr est apontando.

A expresso *ptr, refere-se ao valor da localizao de memria contido na varivel
ponteiro. Em contrapartida, ptr refere-se ao endereo da varivel. Considerando o
exemplo 10.1, tem-se:

*ptr 1 (valor da localizao de memria contido na varivel ponteiro)
ptr 0DF6 (endereo da varivel contido na varivel ponteiro)


A seguir so mostrados outros exemplos utilizando ponteiros.


#include <stdio.h>

void main()
{
int num, valor;
int *p;

num = 55;
p = &num; // Pega o endereo de num.
valor = *p; // Valor igualado a num de uma maneira indireta.

printf("\n\n%d\n", valor);
printf("Endereco para onde o ponteiro aponta: %p\n", p);
printf("Valor da variavel apontada: %d\n", *p);
}

Exemplo 10.2 Iguala variveis usando um ponteiro.



#include <stdio.h>

void main()
{
int num,*p;
num = 55;

p = &num; // Pega o endereo de num.
printf("\nValor inicial: %d\n", num);

*p = 100; // Muda o valor de num de uma maneira indireta.
printf("\nValor final: %d\n", num);
}

Exemplo 10.3 Altera o valor de uma varivel usando um ponteiro.

No exemplo 10.2, o cdigo %p usado na funo printf( ) indica funo que ela deve
exibir um endereo.



Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 67

10.1 Aritmtica com Ponteiros:

Podemos fazer algumas operaes aritmticas com ponteiros. A primeira, e mais
simples, igualar dois ponteiros. Se temos dois ponteiros p1 e p2 podemos igual-los
fazendo:


p1 = p2;


Repare que estamos fazendo com que p1 aponte para o mesmo lugar que p2. Se
quisermos que a varivel apontada por p1 tenha o mesmo contedo da varivel apontada
por p2 devemos fazer:


*p1 = *p2;


possvel tambm usar os operadores de incremento e decremento. Quando
incrementamos um ponteiro ele passa a apontar para o prximo valor do mesmo tipo
para o qual o ponteiro aponta. Isto , se temos um ponteiro para um inteiro e o
incrementamos ele passa a apontar para o prximo inteiro.

Esta mais uma razo pela qual o compilador precisa saber o tipo de um ponteiro: se
voc incrementa um ponteiro int* ele anda 2 bytes na memria e se voc incrementa um
ponteiro double* ele anda 8 bytes na memria. O decremento funciona de maneira
semelhante. Supondo que p um ponteiro, as operaes so escritas como:


p++; // Incremento.
p--; // Decremento.


Estas operaes so realizadas com os endereos e no com o contedo das variveis
para as quais eles apontam. Por exemplo, para incrementar o contedo da varivel
apontada pelo ponteiro p, faz-se:


(*p)++;


Outras operaes aritmticas teis so a soma e subtrao de inteiros com ponteiros.
Para incrementar um ponteiro de 15, basta fazer:


p = p + 15;






Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 68

Para usar o contedo do ponteiro 15 posies adiante:


*(p + 15);


A subtrao funciona da mesma maneira. Tambm podemos saber se dois ponteiros so
iguais ou diferentes atravs dos operadores relacionais (== e !=). No caso de operaes
do tipo >, <, >= e <= estamos comparando qual ponteiro aponta para uma posio mais
alta na memria. Ento uma comparao entre ponteiros pode revelar qual dos dois est
"mais adiante" na memria. A comparao entre dois ponteiros se escreve como a
comparao entre outras duas variveis quaisquer:


p1 > p2;


H entretanto operaes que no se pode efetuar com um ponteiro, como por exemplo, a
diviso ou multiplicao e adio ou subtrao de ponteiros do tipo float ou double.



11.0 Leitura e Escrita em Disco:

Um arquivo uma coleo de bytes armazenados permanentemente em algum
dispositivo de memria secundria, como disquete, winchester, cd-rom, etc.

Todo arquivo contm um nico nome, atravs do qual o referenciamos. Consiste em um
conjunto de componentes arranjados em forma de sequncia, onde cada elemento s
pode ser acessado aps a leitura sucessiva de todos os elementos anteriores, a partir do
primeiro. Uma sequncia um arranjo (vetor) de elementos de forma que eles
mantenham entre si uma relao de posio. Todo arquivo tem uma marca especial para
indicar o seu fim. (Fim de Arquivo - EOF).

Para acessar um arquivo, o programa deve usar um ponteiro de arquivo, o qual
conceitualmente similar a um indicador de posio. Quando voc l ou escreve no
arquivo, este ponteiro contm a trilha da posio atual do arquivo. Deve ser usado um
ponteiro para cada arquivo.

Para declarar um ponteiro de arquivo, necessrio incluir a biblioteca stdio.h e criar
uma varivel do tipo FILE.


- Sintaxe:

FILE *ponteiro_de_arquivo;

ponteiro_de_arquivo o nome do ponteiro que passar a ser um ponteiro de arquivo,
que ser usado para acessar um arquivo.

Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 69

Para abrir ou criar um arquivo, necessrio usar a funo fopen( ). Esta funo, alm de
abrir ou criar um arquivo, retorna um ponteiro de arquivo. Se no puder criar ou abrir o
arquivo como especificado, fopen( ) retorna o ponteiro NULL (nulo).


- Sintaxe:

ponteiro_de_arquivo = fopen(nome_do_arquivo, modo);

ponteiro_de_arquivo uma varivel do tipo FILE, criada como foi descrito
anteriormente (FILE *ponteiro_de_arquivo), a qual o comando fopen( ) atribui um
ponteiro para o arquivo aberto. O argumento nome_do_arquivo especifica o nome de
um arquivo a ser aberto ou criado, e pode conter um drive de disco especificado, assim
como um nome completo de arquivo, que varia de acordo com o sistema operacional
utilizado. O segundo argumento, modo, especifica como o programa precisa acessar o
arquivo.

A tabela a seguir especifica os modos que podem ser usados para abrir ou criar um
arquivo:

Modo Significado
"r" Abre um arquivo para leitura. Se o arquivo no existir, fopen( ) retorna o
ponteiro NULL.
"w" Cria um arquivo para escrita. Se o arquivo j existe, ser sobrescrito, se
no existir, fopen( ) o criar.
"a" Acrescenta dados no fim do arquivo ("append"). Se o arquivo no existir
fopen( ) o criar.
"rb" Abre um arquivo binrio para leitura.
"wb" Cria um arquivo binrio para escrita.
"ab" Acrescenta dados binrios no fim do arquivo.
"r+" Abre um arquivo para leitura e escrita.
"w+" Cria um arquivo para leitura e escrita.
"a+" Acrescenta dados ou cria uma arquivo para leitura e escrita.
"r+b" Abre um arquivo binrio para leitura e escrita.
"w+b" Cria um arquivo binrio para leitura e escrita.
"a+b" Acrescenta dados ou cria um arquivo binrio para leitura e escrita.
"rt" Abre um arquivo texto para leitura.
"wt" Cria um arquivo texto para escrita.
"at" Acrescenta dados no fim do arquivo texto.
"r+t" Abre um arquivo texto para leitura e escrita.
"w+t" Cria um arquivo texto para leitura e escrita.
"a+t" Acrescenta dados ou cria uma arquivo texto para leitura e escrita.
Tabela 11.1 Modos de operaes com arquivos.


O programa a seguir cria um arquivo simples chamado TESTE.TXT e grava uma frase
no mesmo:


Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 70


#include <stdio.h>
#include <conio.h>

void main()
{
clrscr();

FILE *fp;

if((fp = fopen(TESTE.TXT, W)) == NULL)
printf(\nErro na criacao do arquivo TESTE.TXT\n);
else
{
printf(Arquivo criado com sucesso);
fclose( );
}
}

Exemplo 11.1 Criao de arquivo.

Como pode ser observado, a chamada a fopen( ) especifica o nome do arquivo e o modo
de acesso de gravao. Devido aos parnteses, o comando if primeiramente atribui o
ponteiro de arquivo devolvido por fopen( ) varivel fp e, ento compara o valor de fp
com NULL. Se no for possvel abrir o arquivo como especificado, fopen( ) retorna
NULL.

Os arquivos que forem utilizados dentro do programa, devem ser fechados antes de
terminar o programa, ou quando seu uso j no for mais necessrio. Para isso utilizado
o comando fclose( ). Quando um arquivo fechado, o sistema operacional atualiza a
entrada de diretrio para aquele arquivo.


11.1 Macros putc( ), getc( ), feof( ):

C disponibiliza estas macros como um complemento para a manipulao de arquivos. A
macro putc( ) escreve um caractere no arquivo.


- Sintaxe:

putc(caractere, ponteiro_de_arquivo);


A macro getc( ) retorna um caractere lido do arquivo.


- Sintaxe:

char varivel = getc(ponteiro_de_arquivo);



Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 71

EOF ("End Of File") indica o fim de um arquivo. s vezes, necessrio verificar se um
arquivo chegou ao fim. A macro feof( ) retorna um valor diferente de zero se o arquivo
chegou ao EOF, caso contrrio retorna zero.


- Sintaxe:

feof(ponteiro_de_arquivo);

A seguir ser apresentado um programa onde vrias operaes com arquivos so
realizadas. Primeiro o arquivo aberto para a escrita, e escreve-se algo nele. Em
seguida, o arquivo fechado e novamente aberto para a leitura.


#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>

void main()
{
FILE *p;
char c, str[30], frase[80] = "Este e um arquivo chamado: ";
int i;

clrscr();

// L um nome para o arquivo a ser aberto.
printf("\n\nEntre com um nome para o arquivo: ");
gets(str);

if((p = fopen(str,"w")) == NULL)
{
printf("\nErro! Impossivel criar o arquivo: %s!\n", str);
exit(1);
}

// Se no houve erro, escreve no arquivo e fecha.
strcat(frase, str); // Adiciona a string str no final da string frase.

for(i=0; frase[i]; i++)
putc(frase[i], p);
fclose(p);

// Abre novamente para a leitura e fecha.
p = fopen(str,"r");
while(!feof(p))
{
c = getc(p);
printf("%c", c);
}
fclose(p);
}

Exemplo 11.2 Gravao e leitura em arquivo utilizando macros.


Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 72

11.2 - Comandos de Acesso a Arquivos:

11.2.1 ferror( ):

A funo ferror( ) se torna muito til quando se quer verificar se cada acesso a um
arquivo teve sucesso. Cada vez que uma funo de arquivo executada, a prpria
funo registra em uma varivel especial se houve sucesso na operao ou no. Com
ferror( ) podemos ter acesso ao contedo desta varivel: ela retorna um valor diferente
de zero se houve algum erro na ltima funo de acesso ao arquivo. Sintaxe:

int ferror(ponteiro_de_arquivo);


11.2.2 rewind( ):

A funo rewind( ) retorna a posio corrente do arquivo para o incio. Sintaxe:

void rewind(ponteiro_de_arquivo);


11.2.3 getw( ):

A funo getw( ) l um inteiro de um arquivo. Sintaxe:

int getw(ponteiro_de_arquivo);


11.2.4 putw( ):

A funo putw( ) escreve um inteiro em um arquivo. Sintaxe:

int putw(int varivel, ponteiro_de_arquivo);


11.2.5 fgets( ):

A funo fgets( ) l uma string de um arquivo. A string lida deve ter seu tamanho
determinado pelo programador. Sintaxe:

char *fgets (char *string, int tamanho, ponteiro_de_arquivo );


11.2.6 fputs( ):

A funo fputs( ) escreve uma string em um arquivo. Sintaxe:

char *fputs (char *string, ponteiro_de_arquivo);


Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 73
11.2.7 fread( ):

A funo fread( ) l blocos de dados em um arquivo. Sintaxe:

unsigned fread(void *buffer, int numero_de_bytes, int cont, ponteiro_de_arquivo);

O buffer a regio de memria na qual sero armazenados os dados lidos. O
nmero_de_bytes o tamanho da unidade a ser lida. O contador cont indica quantas
unidades devem ser lidas. Isto significa que o nmero total de bytes lidos :

Nmero_de_bytes * cont

A funo retorna o nmero de unidades efetivamente lidas. Este nmero pode ser menor
que o valor requisitado quando o fim do arquivo for encontrado.


11.2.8 fwrite( ):

A funo fwrite( ) escreve blocos de dados em um arquivo e funciona da mesma
maneira que fread( ). Sintaxe:

unsigned fwrite(void *buffer, int numero_de_bytes, int cont, ponteiro_de_arquivo );


11.2.9 fseek( ):

Para se fazer procuras e acessos randmicos usa-se a funo fseek( ). Esta move o
cursor no arquivo de um valor especificado, a partir de um ponto especificado. Sintaxe:

int fseek(ponteiro_de_arquivo, long nmero_de_bytes, parmetro_de_origem);

O parmetro_de_origem determina a partir de onde que os bytes de movimentao
sero contados. Os valores possveis so definidos por macros no arquivo cabealho e
so mostrados na tabela a seguir:

Nome Valor Significado
SEEK_SET 0 Deslocamento dede o incio do arquivo.
SEEK_CUR 1 Deslocamento a partir da posio atual no arquivo.
SEEK_END 2 Deslocamento a partir do final do arquivo.
Tabela 11.2 Parmetros da funo fseek( ).

Tendo-se definido a partir de onde ir se contar, nmero_de_bytes determina quantos
bytes de deslocamento ser dado na posio atual.


11.2.10 remove( ):

A funo remove( ) apaga um arquivo especificado. Sintaxe:

int remove (char *nome_do_arquivo);
Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 74
O exemplo 11.2 poderia ser reescrito usando-se, fgets( ) e fputs( ) ou fread( ) e fwrite( ).
A seguir ser apresentado uma segunda verso que usa as funes fgets( ) e fputs( ),
alm de acrescentar algumas inovaes.


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main()
{
FILE *p;
char str[30], frase[80] = "Este e um arquivo chamado: ", resposta[80];
int i;

// L um nome para o arquivo a ser aberto.
printf("\n\nEntre com um nome para o arquivo: ");
gets(str);

if((p = fopen(str, "w")) == NULL)
{
printf("Erro! Impossivel criar o arquivo: %s!\n", str);
exit(1);
}

// Se no houve erro, escreve no arquivo e fecha.
fputs(frase, p);
fputs(str, p);

// E se o seu disco estiver muito cheio.
if (ferror(p))
printf("\nErro! Impossvel gravar o arquivo!\n");
fclose(p);

strcat(frase, str);

// Abre novamente para a leitura e fecha.
p = fopen(str, "r");
fgets(resposta, strlen(frase)+1, p);
printf("\n\n%s\n", resposta);
fclose(p);
remove(str);
}

Exemplo 11.3 Gravao e leitura em arquivo.


11.3 Funes fprintf( ) e fscanf( ):

O fluxo padro em arquivos, permite ao programador ler e escrever em arquivos da
maneira padro com a qual o programador j lia e escrevia na tela.


11.3.1 fprintf( ):

A funo fprintf( ) funciona como a funo printf( ). A diferena que a sada de
fprintf( ) um arquivo e no a tela do computador.

Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 75

- Sintaxe:

fprintf (ponteiro_do_arquivo, char *string);

A nica diferena entre fprintf( ) e o printf( ) a especificao do arquivo destino
atravs do ponteiro de arquivo.


11.3.2 fscanf( ):

A funo fscanf( ) funciona como a funo scanf( ). A diferena que fscanf( ) l de
um arquivo e no da tela do computador.

- Sintaxe:

fscanf (ponteiro_do_arquivo, char *string);

A nica diferena entre fscanf( ) e o scanf( ) a especificao do arquivo destino
atravs do ponteiro de arquivo. O prximo exemplo utiliza fprintf( ) e fscanf( ) para
manipular um arquivo.


#include <stdio.h>
#include <stdlib.h>

void main()
{
FILE *p;
char str[80],c;

// L um nome para o arquivo a ser aberto.
printf("\n\nEntre com um nome para o arquivo: ");
gets(str);

if((p = fopen(str,"w")) == NULL)
{
printf("Erro! Impossivel abrir o arquivo: %s!\n", str);
exit(1);
}

// Se no houver erro, escreve no arquivo e fecha.
fprintf(p,"Este e um arquivo chamado: %s\n", str);
fclose(p);

// Abre novamente para a leitura e fecha.
p = fopen(str,"r");
while(!feof(p))
{
fscanf(p, "%c", &c);
printf("%c", c);
}
fclose(p);
}
Exemplo 11.4 Gravao e leitura em arquivo.

Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 76

III PROJETOS UTILIZANDO A INTERFACE PARALELA


1.0 Introduo:

A porta paralela a interface mais usada hoje em projetos que envolvam o computador.
Ela chamada de paralela porque os dados passam do computador para a impressora ao
longo de condutores paralelos, ou seja, todos os oito bits de dados viajam juntos.

A vantagem das conexes paralelas que com oito vias para transportar dados
simultaneamente, as informaes podem fluir rapidamente do computador para a
impressora ou qualquer outro dispositivo.

Embora na maioria das vezes a porta paralela seja usada para conexo com a
impressora, ela tambm pode ser usada para aceitar dados de dispositivos externos,
viabilizando sua utilizao para diferentes tipos de aplicaes, como por exemplo,
controle de motores de passo, interligao entre computadores, aquisio de dados, etc.

Um dos principais motivos para a utilizao irrestrita desta porta so as limitaes de
distncia das linhas paralelas. Como as linhas de dados so paralelas, h mais chance de
interferncia, acarretando erros de dados medida que o comprimento do cabo aumenta.
A comunicao paralela boa para distncias de no mximo 3,7 m (12 ps). Para linhas
mais longas deve ser utilizada a porta serial.

A porta paralela disponibiliza de modo simultneo 8 bits de sada, 5 bits de entrada e 4
bits bidirecionais. Basicamente ela composta por 8 linhas de dados, 5 linhas de status
e 4 linhas de controle. Ela encontrada normalmente no painel traseiro do PC em
conectores fmea tipo D de 25 pinos (DB-25).

Antes de 1994, no existiam padronizaes de como a Porta Paralela deveria ser
conectada aos dispositivos como por exemplo impressoras, scanner, CD-ROM, drives,
etc. Alguns utilizavam os chips TTL enquanto outros o CMOS. O padro IEEE 1284-
1994 definiu ento cinco modos de operao para esta porta:


Compatvel: o mais conhecido, podendo somente enviar dados (computador
dispositivo externo) na velocidade tpica de 50 Bps;

Nibble: permite a recepo de 4 bits;

Byte: trabalha com a recepo de 8 bits;

EPP (Enhanced Parallel Port) e ECP (Extended Capabilities Mode): utilizam
hardwares adicionais para gerar e gerenciar operaes tipo handshaking.




Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 77

2.0 Pinagem:

Abaixo est a disposio dos pinos no conector DB-25:



Figura 2.1 DB-25 fmea.


A direo das informaes para o padro SPP est descrita abaixo:


Figura 2.2 Direo dos Dados.



3.0 Registradores:

No PC, o usurio tem disponvel (em termos lgicos), 3 portas paralelas denominadas
LPT1, LPT2 e LPT3, mas fisicamente s existe uma conexo externa atravs do
conector DB-25 fmea.

Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 78

Os pinos da porta paralela so acessados atravs dos registradores de Dados, Status e
Controle. Para cada registrador associado pela BIOS, um endereo, conforme
mostrado abaixo:

Porta Paralela Dados Status Controle
LPT1 378h 379h 37Ah
LPT2 278h 279h 27Ah
LPT3 3BCh 3BDh 3BEh
Tabela 3.1 Endereo dos Registradores.

O endereo 3BCh era utilizado em uma placa antiga padro IBM, o qual oferecia um
adaptador monocromtico e uma porta paralela. Esta placa era chamada de
Monochrome Display and Printer Adapter (MD&PA). Ainda hoje alguns
computadores fabricados pela IBM utilizam este endereo como base para a LPT1.

Quando a BIOS est inicializando o sistema, ela associa as LPTs aos endereos base de
I/O. Existe uma lista ordenada na seguinte ordem: 3BCh 378h 278h. Na maioria
dos PCs, a LPT1 associada ao endereo base 378h. Posteriormente ser apresentado
um programa em C para verificar a existncia e o endereo base da porta paralela no
PC.


3.1 Registrador de Dados:

O Registrador de Dados est associado ao endereo base (378h), sendo utilizado como
sada de 8 bits, a qual poder ser efetuada uma escrita usando uma instruo OUT ou
uma leitura usando uma instruo IN. Os bits deste registrador esto associados aos
seguintes pinos do conector:

Bits 7 6 5 4 3 2 1 0
Pinos 9 8 7 6 5 4 3 2
Tabela 3.2 Pinos associados ao Registrador de Dados.

Esses pinos so capazes de drenar de 2,6 a 24mA. Escrever 1 em um bit resulta em um
nvel TTL alto na sada. Deve-se ressaltar que no padro SPP esse registrador no pode
funcionar como entrada de dados, j que o dado lido a sada de um latch 74LS373.


3.2 Registrador de Status:

O Registrado de Status est associado ao endereo base + 1 (379h), sendo utilizado
como uma entrada de 5 bits. Uma leitura no endereo 379h, com uma instruo IN,
reflete o estado imediato desses pinos. Os bits deste registrador esto associados aos
seguintes pinos do conector:

Bits 7 6 5 4 3 2 1 0
Pinos 11 (L) 10 12 13 15 - - -
Tabela 3.3 Pinos associados ao Registrador de Status.
(L) Indica que a entrada invertida.
Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 79

O pino 10 (bit 6) pode ser usado para provocar a interrupo IRQ7 (INTFh no DOS).
Ela acontecer quando, neste pino, houver uma transio de nvel baixo ( ) para nvel
alto ( ), condicionado ao bit 4 do Registrador de Controle (37Ah), que deve estar em
nvel alto (nvel lgico 1).


3.3 Registrador de Controle:

O Registrador de Controle geralmente associado ao endereo base + 2 (37Ah), sendo
considerado uma porta bidirecional de 4 bits. Como colocado anteriormente, o bit 4
usado para controlar a habilitao da IRQ 7. Quando este bit colocado em nvel alto a
interrupo poder ocorrer. Estas sadas so a coletor aberto, o que lhes permite
trabalhar tanto como entrada quanto sada. Elas esto conectadas a Vcc por resistores de
4,7 K e podem receber at 7mA e ainda manter um bom nvel baixo de TTL (menor que
0,8 V). Esta porta, quando trabalha como sada apresenta um retardo nas transies de
nvel baixo para nvel alto, pois toda carga feita atravs do pull up de 4,7 K. Sempre
que possvel, mais conveniente usar essa porta como entrada. A tabela a seguir mostra
a relao entre os bits da porta e os pinos do conector:

Bits 7 6 5 4 3 2 1 0
Pinos - - - IRQ7 17 (L) 16 14 (L) 1 (L)
Tabela 3.4 Pinos associados ao Registrador de Controle.
(L) Indica que a entrada invertida.


3.4 Quadro Resumo:

Registrador BIT Direo Pinos Nome
7 OUT 09 D7
6 OUT 08 D6
5 OUT 07 D5
4 OUT 06 D4
3 OUT 05 D3
2 OUT 04 D2
1 OUT 03 D1
3
7
8
h
0 OUT 02 D0
7 IN 11 (L) Busy
6 IN 10 Acknowledge
5 IN 12 Paper End
4 IN 13 Select Out
3
7
9
h
3 IN 15 Error
4 - IRQ 7 -
3 IN / OUT 17 (L) Select In
2 IN / OUT 16 Init
1 IN / OUT 14 (L) Auto Feed
3
7
A
h
0 IN / OUT 01 (L) Strobe
Tabela 3.5 Quadro Resumo dos Registradores.
(L) Indica que a entrada invertida.

Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 80

4.0 Propriedades de Hardware:

O padro IEEE 1284 especifica 3 tipos de conectores utilizveis em portas paralelas:

Tipo A: conector de 25 pinos tipo Delta, localizado nos computadores;
Tipo B: conector Centronics de 36 pinos localizados nas impressoras;
Tipo C: semelhante ao Centronics, porm de menor tamanho.

Na maioria dos PCs a interface paralela acessada atravs de um conector tipo D de 25
pinos. A tabela a seguir mostra quais so os sinais associados a cada pino, dos dois tipos
de conectores mais usados:

DB-25 Centronics Sinal
1 1 Strobe (L)
2 2 D0
3 3 D1
4 4 D2
5 5 D3
6 6 D4
7 7 D5
8 8 D6
9 9 D7
10 10 Acknowledge
11 11 Busy
12 12 Paper End
13 13 Select Out
14 14 Auto Feed (L)
15 32 Error (L)
16 31 Init
17 36 Select In (L)
18-25 19-30 GND
Tabela 4.1 Associao de pinos DB-25 e Centronics.
(L) Indica que a entrada invertida.



5.0 Padres Existentes:

Existem atualmente 3 padres de porta existentes:

Porta Paralela Padro Standard Parallel Port ou SPP;
Porta padro PS/2;
Porta Paralela Estendida Enhaced Parallel Port ou EPP.

A seguir veremos algumas caractersticas desses padres.



Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 81

5.1 Porta Paralela Padro SPP:

o padro mais antigo do mercado, sendo desenvolvido para comunicao entre PC e
impressora da Centronics. Por isso tambm conhecido como porta Centronics.

Inicialmente o conector utilizado era de 36 pinos, mas a IBM imps o conector Delta de
25 pinos, o qual atualmente utilizado. o protocolo usado na comunicao PC
Impressora, sendo unidirecional.


5.2 Padro PS/2:

Este padro foi desenvolvido pela IBM para tornar a porta paralela um dispositivo de
comunicao bidirecional. Foi utilizada nos PC ATs, sendo porm oficializada somente
com o PS/2. A IBM no alterou a definio de sinais e pinagens, sendo portanto
compatvel com a porta padro. A transferncia de dados feita utilizando o DMA
(Direct Memory Access). Consequentemente, aumentou a velocidade de transferncia
de dados.


5.3 Porta Paralela Estendida EPP:

Este padro foi originalmente desenvolvido por uma associao das seguintes empresas:
Zenith, Xircom e Intel, sendo apresentado em maro de 1992. Ele foi utilizado pela
primeira vez nos 386 SL da Zenith. um padro compatvel com o da porta padro.

Dois bits do registrador de controle definem o modo de operao da porta EPP como
porta padro ou como porta estendida:

BIT 7 BIT 6
1 0 1 0
Modo estendido Porta padro Bidirecional Unidirecional
Tabela 5.1 Modos de operao da porta EPP.

A EPP utiliza o mesmo conector de 25 pinos, porm a quantidade de registradores de
I/O associados maior: 8. Quando est trabalhando no modo estendido, somente 8
linhas de dados e 5 sinais de controle so efetivamente utilizados.

Para suportar altas velocidades, foi necessrio especificar um cabo especial, com as
seguintes caractersticas:

Comprimento mximo de 2 metros;
Velocidade suportada: 2 a 8 Mbps;
Empacotamento com capa dupla dividido em duas regies. Na primeira, denominada
central, so colocados as vias de transmisso de dados e na segunda, denominada
perifrica, so colocadas as vias de controle.

A HP e a Microsoft trabalham desde 1992 numa verso mais evoluda da EPP
denominada Extended Capabilities Port (ECP).
Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 82

A primeira verso foi publicada em novembro de 1992. Ela trabalha com um protocolo
mais sofisticado com os seguintes atributos: negociao de velocidade, verificao de
taxa de erro e modo comprimido de transmisso.



6.0 Porta Paralela para Impressora:

A figura 3 apresenta os sinais trocados entre um PC e uma impressora utilizando a
porta paralela padro.


Figura 6.1 Comunicao entre o PC e a Impressora.


6.1 Descrio dos Sinais:

A seguir faremos uma descrio dos sinais trocados entre esses dispositivos.

D0-D7: so os 8 bits de dados em cdigo ASCII.
Strobe: pulso, em nvel baixo, que informa impressora que h dado vlido no
barramento de dados. Sua largura deve ser maior que 0,5 s.
Acknowledge: pulso em nvel baixo que indica que a impressora que j recebeu o
dado e est pronta para receber o prximo. Tem uma durao tpica de 11 s.
Busy: indica que a impressora est ocupada e no pode receber dados.
Paper End: indica que a impressora est sem papel.


Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 83

Select: indica ao computador que a impressora est selecionada, ou seja, est pronta
para receber os dados. Se no estiver em nvel alto a porta paralela no transmite
dados.
Auto-Feed: muda de linha aps cada impresso.
Error: indica que houve erro na impressora.
Init: inicializa a impressora. Ela vai para o estado em que estaria aps sua
energizao. Seu buffer de impresso apagado. O pulso de inicializao deve ter
uma durao maior que 50 s.
Select In: est normalmente em nvel baixo. uma maneira do computador controlar
se a impressora est pronta para aceitar dados.


6.2 Protocolo Utilizado:

A transferncia de dados computador impressora segue um protocolo tipo handshake
assncrono de 3 linhas de controle (Strobe, Acknowledge e Busy) e 8 linhas de dados
(D0 a D7). Descrevemos a seguir os passos seguidos na execuo do protocolo:

A linha Busy quando ativada indica que a impressora est ocupada. Se Busy = 0 a
impressora estar pronta e o computador coloca o dado no barramento.

Quando este sinal estabiliza, o computador envia um pulso de Strobe (h dado
disponvel) para impressora.

A impressora l o dado e envia a confirmao via Acknowledge.

O computador s pode alterar o dado se receber um Acknowledge .

Se, aps o recebimento de um Acknowledge, a linha Busy estiver em nvel zero o
computador envia o prximo dado e repete o ciclo.


7.0 Programando a Porta Paralela:

Como mencionado anteriormente no Item 3.0, a BIOS associa cada porta LPT a um
endereo na ordem 3BCh 378h 278h. Uma vez associados estes endereos, a
BIOS os guarda sempre em uma posio especfica da memria, conforme mostra a
tabela abaixo:

Endereo da Memria Porta
0000:0408 Endereo base da porta LPT1
0000:040A Endereo base da porta LPT2
0000:040C Endereo base da porta LPT3
Tabela 7.1 Endereo da porta paralela na BIOS.

Desta forma, o programa a seguir mostrar como verificar estas posies de memria,
retornando o endereo base das portas LPTs. Se o programa retornar um 0, significa
que no existe nenhum endereo associado a LPT.
Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 84


#include <stdio.h>
#include <conio.h>

void main()
{
unsigned int far *ptend; // Ponteiro p/ localizar endereo da Porta.
unsigned int base; // Endereo da porta.
int i;

ptend = (unsigned int far *)0x00000408; // Coloca no ponteiro ptend o
// contedo da posio de
clrscr(); // memria 0000:0408

for(i=0; i<3; i++)
{
base = *ptend;
if(base==0)
printf(Nao existe nenhum endereco associado a LPT%d\n, i+1);
else
printf(O endereco associado a porta LPT%d e %Xh\n, i+1, base);
*ptend++;
}
}

Exemplo 7.1 Endereo base da porta paralela.


7.1 - Funes inportb( ) e outportb( ):

As funes inportb( ) e outportb( ) fazem a leitura e escrita respectivamente de um byte
em qualquer porta de hardware do PC. Elas pertencem a biblioteca dos.h e sua sintaxe
a mostrada abaixo:

- Sintaxe da funo inportb( ):

inportb(unsigned porta);


- Sintaxe da funo outportb( ):

outportb(unsigned porta, unsigned valor);


A tabela a seguir descreve as principais funes de acesso portas em C:

Funo Descrio
inport (unsigned porta) L uma palavra de uma porta de hardware
inportb (unsigned porta) L um byte de uma porta de hardware
outport (unsigned porta, unsigned valor) Escreve uma palavra em uma porta de
hardware
outport (unsigned porta, unsigned valor) Escreve um byte em uma porta de hardware
Tabela 7.2 Funes de acesso portas em C.

Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 85

O prximo exemplo determina o endereo base do registrador de dados, l o seu
contedo e depois escreve nele 255 (11111111 em binrio). Aps a escrita o programa
faz uma nova leitura no registrador para confirmar se os dados foram escritos
corretamente e apresenta os resultados na tela.


#include <process.h>
#include <stdio.h>
#include <conio.h>
#include <dos.h>

void main()
{
unsigned int far *ptend;
unsigned int base, novo, velho;

ptend = (unsigned int far *)0x00000408;
clrscr();
base = *ptend;

if(base==0)
{
printf(\n\nNao existe nenhum endereco associado a LPT1\n\n);
exit(1); // Termina o programa e retorna para o prompt do DOS.
}

printf(\nO endereco base do registrador de dados => %Xh\n, base);
velho = inportb(base);
outportb(base, 255);
novo = inportb(base);
printf(\nO valor inicial do registrador era => %Xh\t%dd, velho, velho);
printf(\nO valor escrito no registrador foi => %Xh\t%dd\n, novo, novo);
}
Exemplo 7.2 Escrita e leitura na porta paralela.



8.0 - Projetos Utilizando a Interface Paralela:


8.1 Leds Monitores:

Este projeto bem simples e pode ser implementado sem problemas em qualquer PC.


8.1.1 Material Necessrio:

01 Proto-board;
08 Leds vermelhos;
08 Resistores de 220;
01 Conector DB-25 macho;
Fios para conexo e um cabo com 12 vias;


Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 86

8.1.2 Esquema de Ligao:


Figura 8.1 Esquema de ligao.


8.1.3 Programa:


//****************************************************************
//** **
//** LABORATRIO DE ARQUITETURA DE COMPUTADORES **
//** ========================================== **
//** **
//** PINAGEM UTILIZADA **
//** **
//** LED's PORTA PARALELA **
//** **
//** LED 01 ----------------------------- 02 - D0 **
//** LED 02 ----------------------------- 03 - D1 **
//** LED 03 ----------------------------- 04 - D2 **
//** LED 04 ----------------------------- 05 - D3 **
//** LED 05 ----------------------------- 06 - D4 **
//** LED 06 ----------------------------- 07 - D5 **
//** LED 07 ----------------------------- 08 - D6 **
//** LED 08 ----------------------------- 09 - D7 **
//** GND -------------------------------- 25 - GND **
//** **
//****************************************************************

#include <process.h> // exit()
#include <stdlib.h> // atoi()
#include <stdio.h> // Basica de I/O
#include <conio.h> // clrscr(), cores, getch()
#include <dos.h> // delay(), inportb(), outportb()

void main()
{
unsigned int far *ptend;
unsigned int base;
int i, tempo, num_max;
char n[4], t[6];

Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 87

ptend = (unsigned int far *)0x00000408;

textbackground(BLUE); // Define cor de fundo azul
clrscr(); // Limpa a tela e aplica o fundo azul
base = *ptend;

if(base == 0)
{
gotoxy (5,2);
textcolor(LIGHTRED+BLINK); // Texto vermelho piscante.
cprintf("Nenhuma porta LPT encontrada!!!");
getch();
textbackground(BLACK); // Estas trs linhas normalizam a cor
textcolor(LIGHTGRAY); // do fundo e do texto do DOS antes
clrscr(); // de encerrar o programa.
exit(1);
}

textcolor(YELLOW); // Texto amarelo.
gotoxy (5,5);
cprintf("Entre com o numero maximo a ser enviado (0 a 255):");
gotoxy (56,5);
gets(n);
gotoxy (5,7);
cprintf("Entre com tempo de retardo em milisegundos:");
gotoxy (50,7);
gets(t);
num_max = atoi(n); // Converte string para inteiro.
tempo = atoi(t); // Converte string para inteiro.

for (i=0; i<=num_max; i++)
{
textcolor(LIGHTGREEN); // Texto verde claro.
gotoxy(5,10);
cprintf("Enviando o n %3d para o registrador %Xh da LPT1 ", i,
base);
outportb(base, i); // Escreve o nmero na porta.
delay(tempo); // Retardo entre as escritas.
}

getch();
textbackground(BLACK);
textcolor(LIGHTGRAY);
clrscr();
}

Programa 8.1 Acende 8 leds atravs da porta paralela.

O programa utiliza a rotina de verificao dos endereos associados aos registradores da
porta paralela para pegar o endereo base do Registrador de Dados. Com este endereo,
o programa solicita um nmero mximo (entre 0 e 255) e um tempo de retardo em
milisegundos e escreve na porta os nmeros de 0 at o nmero mximo.

A escrita pode ser observada na tela e confirmada atravs dos leds conectados porta,
levando em considerao que nos leds aparecer o correspondente binrio dos nmeros
decimais escritos.


Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 88

8.2 Display LCD:

Este projeto consiste em conectar um display de cristal lquido porta paralela. O
programa l palavras ou fases do teclado e enviar para o display.


Figura 8.2 Display LCD.


8.2.1 Material Necessrio:

01 Fonte de alimentao (5 Vcc);
01 Proto-board;
01 Display LCD de 16 caracteres e uma linha;
02 Resistores de 10K;
01 Potencimetro de 10K;
01 Conector DB-25 macho;
Fios para conexo e um cabo com 12 vias;


8.2.2 Esquema de Ligao:


Figura 8.3 Esquema de ligao do display LCD porta paralela.




Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 89

8.2.3 Caractersticas do Display LCD:

Pinagem do display de cristal lquido Hitachi:

Pino Nome Funo
1 GND GND
2 Vcc Vcc
3 Vo Controle de brilho
4 RS
RS = 0 Comandos
RS = 1 Dados
5
R/ W
R/ W= 0 Escreve dados no display
R/ W= 1 L dados do display
6 E Habilita a leitura ou escrita dos dados na transio de HL
7 DB0 Barramento de dados Bit 0
8 DB1 Barramento de dados Bit 1
9 DB2 Barramento de dados Bit 2
10 DB3 Barramento de dados Bit 3
11 DB4 Barramento de dados Bit 4
12 DB5 Barramento de dados Bit 5
13 DB6 Barramento de dados Bit 6
14 DB7 Barramento de dados Bit 7
Tabela 8.1 Pinagem do display LCD Hitachi.

O display de cristal lquido possui um microcontrolador responsvel pela execuo dos
comandos e a escrita. Para que o display funcione, necessrio executar uma seqncia
de comandos de inicializao que sero enviados atravs da porta paralela. Alm de
inicializar o display, esta seqncia configura o modo como os caracteres sero escritos.

A tabela a seguir mostra um exemplo de seqncia de inicializao e escrita:

Instrues
Seq.
RS R/*W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
Operao
1 0 0 0 0 1 1 1 0 0 0 Operao em uma linha.
2 0 0 0 0 0 0 1 1 1 0 Ativa o display e o cursor.
3 0 0 0 0 0 0 0 1 1 0
Incrementa o display e
desloca o cursor direita.
4 1 0 0 1 0 0 1 0 0 0 Escreve a letra H
5 1 0 0 1 0 0 1 0 0 1 Escreve a letra I
Tabela 8.2 Seqncia de inicializao e escrita do display.

As letras a serem enviadas so codificadas em valores binrios de 8 bits, que so
compatveis com os valores binrios da tabela ASCII do PC, conforme mostra o
exemplo a seguir

Letra Valor ASCII Bits
A 65 0 1 0 0 0 0 0 0 1
B 66 0 1 0 0 0 0 0 1 0
C 67 0 1 0 0 0 0 0 1 1

Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 90

8.2.4 Programa:


//****************************************************************
//** **
//** LABORATRIO DE ARQUITETURA DE COMPUTADORES **
//** ========================================== **
//** **
//** PINAGEM UTILIZADA **
//** **
//** DISPLAY PORTA PARALELA **
//** **
//** 01 - 0V - Fonte --------------------------------------- **
//** 02 - Vcc - Fonte(5Vcc) -------------------------------- **
//** 03 - Intensidade (0V-max) ----------------------------- **
//** 04 - RS (0-Comando / 1-Dados) ----- 17 - SELEC IN (L) **
//** 05 - RW (0-Read / 1-Write) -------- 25 - GND - 0V Fonte **
//** 06 - Enable (L,H->L) -------------- 16 - INIT **
//** 07 - DB0 -------------------------- 02 - D0 **
//** 08 - DB1 -------------------------- 03 - D1 **
//** 09 - DB2 -------------------------- 04 - D2 **
//** 10 - DB3 -------------------------- 05 - D3 **
//** 11 - DB4 -------------------------- 06 - D4 **
//** 12 - DB5 -------------------------- 07 - D5 **
//** 13 - DB6 -------------------------- 08 - D6 **
//** 14 - DB7 -------------------------- 09 - D7 **
//** **
//****************************************************************

#include <process.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <dos.h>

// Subrotina de execuo e atraso de comandos.
void exec(unsigned int base)
{
outportb(base+2, 15); // 0 0 0 0 1 1 1 1 => RS=0, E=1
outportb(base+2, 11); // 0 0 0 0 1 0 1 1 => RS=0, E=0
delay(2);
}

// Subrotina de execuo e atraso de dados.
void exed(unsigned int base)
{
outportb(base+2, 7); // 0 0 0 0 0 1 1 1 => RS=1, E=1
outportb(base+2, 3); // 0 0 0 0 0 0 1 1 => RS=1, E=0
delay(2);
}

void main()
{
// Declarao das variveis.
unsigned int far *ptend;
unsigned int base;
int lcd, i, dados, tam, done;
char frase[17], aux[16];

Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 91

// Define o fundo azul.
textbackground(BLUE);
clrscr();

// Rotina para verificar os endereos dos registradores da porta
// paralela.
ptend = (unsigned int far *)0x00000408;
base = *ptend;
if(base == 0)
{
gotoxy (5,2);
textcolor(LIGHTRED+BLINK); // Texto vermelho piscante.
cprintf("Nenhuma porta LPT encontrada!!!");
getch();
textbackground(BLACK); // Estas trs linhas normalizam a cor
textcolor(LIGHTGRAY); // do fundo e do texto do DOS antes
clrscr(); // de encerrar o programa.
exit(1);
}

// Reseta os dados da porta paralela.
outportb(base, 0); // 0 0 0 0 0 0 0 0 => D0-D7=0
outportb(base+2, 11); // 0 0 0 0 1 0 1 1 => RS=0, E=0

textcolor(WHITE);
gotoxy (5,5);
cprintf("1 - Display 16 caracteres x 1 linha");
gotoxy (5,6);
cprintf("2 - Display 16 caracteres x 2 linhas");
gotoxy (5,8);
cprintf("Escolha o display:");
gotoxy (24,8);
cscanf ("%d", &lcd);

// Inicializao do display.
// Linha 01 => RS=0, (1 Linha DB=48, 2 Linhas DB=52)
if(lcd==1)
outportb(base, 48);
else
outportb(base, 52);
exec(base); // Chama a subrotina de execuo de comandos.

// Linha 02 => RS=0, DB=14
outportb(base, 14); // Ativa o display e o cursor.
exec(base);

// Linha 03 => RS=0, DB=06
outportb(base, 6); // Incrementa o display e desloca o cursor.
exec(base);

textcolor(LIGHTRED);
gotoxy (11,13);
cprintf("Digite uma frase (maximo 16 caractres) ou ENTER para sair");







Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 92

do
{
// Insere 17 caracteres brancos na string da frase.
for(i=0; i<=16; i++)
frase[i] = 254;

textcolor(WHITE);
gotoxy(24,15);
cprintf(">>>>> [ ] <<<<<");
textcolor(LIGHTGREEN);
gotoxy(31,15);
cprintf(" ");
gotoxy(31,15);
gets(frase);
tam = strlen(frase); // Retorna o tamanho da string.

// Muda para comando e limpa o display.
outportb(base+2, 11);
outportb(base, 1);
exec(base);

if(tam != 0)
{
// Muda para dados.
outportb(base+2, 3); // 0 0 0 0 0 0 1 1 => RS=1, E=0

// Elimina o caractere nulo "/0" do final da string.
frase[tam]=254;

for(i=0; i<=15; i++)
{
sprintf(aux, "%d", frase[i]);
dados = atoi(aux);
outportb(base, dados);
exed(base);
}
done = 0;
}
else
done = 1;
}
while(done!=1);

// Normaliza as cores da tela do DOS.
textbackground(BLACK);
textcolor(LIGHTGRAY);
clrscr();
}

Programa 8.2 Escreve no display LCD usando a porta paralela.








Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 93

IX PORTA SERIAL


1.0 Introduo:

A principal diferena entre as portas paralela e serial que na ltima os dados so
enviados em uma nica linha em um fluxo serial (bit a bit). Os PC's atuais so
configurados para receber at 4 portas seriais denominadas COM1, COM2, COM3 e
COM4. Geralmente eles so equipados com 2 portas fsicas. Anteriormente, o hardware
de tais portas era colocado na placas IDE (2 portas seriais e uma paralela). Atualmente
este hardware instalado na placa de sistema.

O padro mais utilizado de porta serial o RS-232C, permitindo a utilizao de dois
tipos de conectores: 9 e 25 pinos. O PC vem equipado com a COM1 e COM2, as quais
so ligadas, respectivamente, aos conectores Delta de 9 pinos e de 25 pinos ou dois
conectores Delta de 9 pinos. O conector de 9 (DB-9) pinos muito utilizado para
instalao do mouse. As portas seriais so largamente utilizadas para controlar
dispositivos perifricos em geral e na comunicao ponto a ponto entre PC's.

Existem dois modos de transmisso serial: assncrono e sncrono. Nas portas seriais dos
PC's o modo de transmisso utilizado o assncrono.



2.0 Modos de Transmisso Serial:

O termo assncrono utilizado para justificar a aleatoriedade em que os dados so
transmitidos neste modo. Ao contrrio do modo assncrono, no modo sncrono no
existe interrupo dos dados transmitidos. Vale ressaltar que para os dois modos
necessrio haver um sincronismo de bit (mesma taxa mdia e mesma fase) entre o
transmissor e o receptor.


2.1 - Modo de Transmisso Assncrono:

Este modo , na prtica, caraterizado como transmisso de caracteres, tipo start/stop. A
transmisso feita caractere a caractere. Para cada caractere adicionado um elemento
de sinalizao que marca o incio (start) e o final do caractere (stop).

Este modo aceita pequenas variaes em relao frequncia nominal. O sincronismo
de fase obtido utilizando-se um oscilador local operando numa frequncia n vezes
superior frequncia do oscilador do transmissor. Quanto maior o valor de n, maior a
preciso. Por exemplo, para n = 4 a preciso de 25% e para n = 32 a preciso de 3%.

Por conveno o bit menos significativo enviado primeiro. Os elementos bsicos de
uma transmisso assncrona so:


Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 94

Start Bit durao de 1 bit;
Stop Bit pode assumir os seguintes valores: 1, 1.5 e 2 bits;
Taxa de transmisso varia de sistema para sistema;
Tamanho do caractere varia de 5 a 8 bits;
Paridade par, mpar, marca (sempre 1), espao (sempre 0) e nula (no envia o bit).


2.2 - Modo de Transmisso Sncrono:

Para se transmitir um caractere no modo assncrono so necessrios vrios bits de
controle, denominados overhead. Tal acrscimo de bits pode resultar, no pior caso, em
um overhead de at 50%. Para melhorar esse rendimento foi desenvolvido o modo
sncrono.

Equipamentos mais elaborados permitem que a transmisso seja feita sem as marcaes
de caractere. Periodicamente transmitido um conjunto especial de bits para sincronizar
o equipamento receptor com o transmissor. No receptor existe um mecanismo
sofisticado de recuperao de relgio, a qual feita a partir da sequncia especial de bits
que se repete periodicamente.



3.0 Padres de Interface Serial:

3.1 Interface RS-232C:

o padro mais antigo e popular utilizado na comunicao de dados. Ele contempla as
caractersticas eltricas, mecnicas e funcionais da interface. As caractersticas bsicas
deste padro so mostradas a seguir:


Figura 3.1 Driver/receiver para TTL/RS-232C.

Comunicao bidirecional;
Taxa mxima de transmisso: 20 Kbps;
Distncia mxima entre equipamentos: 15,24 m;
A transmisso feita em +/- 12V (-12V nvel lgico 1 e +12V nvel lgico 0).
Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 95
3.2 Interface RS-423:

considerada uma evoluo da RS-232C. Utilizada por usurios que demandam taxas
de transmisso mais elevadas. Algumas caractersticas:


Figura 3.2 Driver/receiver para TTL/RS-423.

Comunicao bidirecional;
Taxa mxima de transmisso: 100 Kbps;
Distncia mxima entre equipamentos: 12,19 m;
A transmisso feita em +/- 6V (+6V nvel lgico 1 e 6V nvel lgico 0).


3.3 Interface RS-422:

considerada uma evoluo da RS-423. Algumas caractersticas:


Figura 3.3 Driver/receiver para TTL/RS-422.
Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 96

Comunicao bidirecional;
Taxa mxima de transmisso: 10 Mbps;
Distncia mxima entre equipamentos: 304,8 m.
A transmisso feita em +/- 6V (+6V nvel lgico 1 e 6V nvel lgico 0).



4.0 Comunicao Serial no PC:

Como colocado anteriormente, no PC esto configuradas 4 portas seriais, as quais
permitem a programao dos seguintes parmetros:

Stop bit: 1, 1 e 2;
Bit de paridade: par, mpar, nula, marca e espao;
Tamanho do caractere: 5, 6, 7 ou 8 bits;
Taxa de transmisso: 110 a 115.200 bps.

Essa programao pode ser feita atravs do comando mode no DOS, pelo painel de
controle do Windows, ou via programao.

O corao da interface serial recebe o nome de UART (Universal Asynchronous
Receiver/Transmiter). As funes da UART so realizadas pelo dispositivo programvel
denominado 8250 (ou compatvel), o qual trabalha com vrios modos de operao.

O controle do fluxo de transmisso e recepo tambm feito pelo 8250. Ele
responsvel pela insero do start/stop bit e do bit de paridade. Os dados so
transmitidos pelo 8250, em seqncia, do bit menos significativo para o mais
significativo, conforme mostrado na figura a seguir:


Figura 4.1 Seqncia de bits em uma transmisso serial.

Uma sada inativa fica transmitido marca (-12V). Isto serve tambm para descobrir
quem sada e que entrada. Com um multmetro, medem-se as tenses nos pinos: os
que estiverem em +12V so sadas, os demais so entradas, exceto o terra e os pinos
desconectados. O outro nvel permitido, +12V, recebe o nome de espao. A tabela a
seguir apresenta a interpretao dos sinais de marca e espao.
Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 97
TTL RS-232C
Sinal
Tenso Lgico Tenso Controle
Espao 0V 0 +12V ON
Marca 5V 1 -12V OFF
Tabela 4.1 Interpretao dos sinais marca e espao.

Durante uma transmisso de dados, a marca (-12V) usada para caracterizar o estado
binrio 1, e o espao (+12V) usado para caracterizar o estado binrio 0. Para os
circuitos de controle da interface, uma funo estar em ON (ativada) quando sua tenso
for +12V, e estar em OFF (desativada), quando sua tenso for 12V.


5.0 - Pinos e Sinais da Porta Serial:

Os sinais da RS-232C geralmente esto disponveis nos conectores tipo Delta macho de
9 e 25 pinos, localizados no painel traseiro do computador. A tabela a seguir mostra a
relao entre os pinos e sinais em cada conector:

DB-9 DB-25 Sinal Nome Direo
01 08 CD Carrier Detect

02 03 RD Received Data

03 02 TD Transmit Data

04 20 DTR Data Terminal Ready

05 07 SG Signal Ground -
06 06 DSR Data Set Ready

07 04 RTS Request to Send

08 05 CTS Clear to Send

09 22 RI Ring Indicator

Tabela 5.1 Pinagem e direo da porta serial.

Antes de iniciarmos a descrio dos sinais apresentados na tabela acima, faz-se
necessrio definir os dois principais elementos envolvidos em uma transmisso serial: o
DCE e o DTE.


5.1 Definio do DCE e do DTE:

O Data Terminal Equipment (DTE) ou Equipamento Terminal de Dados o
dispositivo de comunicao localizado em um dos extremos da comunicao. Neste
caso assumem o papel de DTE os seguintes equipamentos: o PC, impressora serial
(algumas possuem uma chave para o usurio escolher entre DTE ou DCE), plotters, etc..

O Data Communication Equipment (DCE) ou Equipamento Comunicador de Dados
o dispositivo de comunicao que no est colocado no extremo da comunicao. Um
bom exemplo de um DCE o tradicional modem utilizado para conectar os PC's aos
provedores de Internet.

Existem basicamente dois tipos de comunicao entre dispositivos seriais utilizando a
interface RS-232C: DCE-DTE (ligao modem - PC, por exemplo) e DTE-DTE
(ligao PC - PC ou PC - impressora, por exemplo).
Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 98
5.2 Sinais de Entrada:

Os sinais de entrada so gerados por outro dispositivo serial, como por exemplo um
modem ou um outro computador. Eles so recebidos pelo PC e depois de passarem por
um conversor de nvel RS-232C/TLL (de +/- 12 V para 0/5 V), so entregues ao 8250.
Apresentamos a seguir estes sinais:

Sinal
Descrio
RD So os dados seriais enviados do perifrico ao computador. Ele encaminhado ao
pino 10 do 8250.
CTS O perifrico informa que est pronto para receber dados do PC.
DSR Quando positivo informa que o perifrico est ligado.
CD O perifrico indica que detectou uma portadora na linha.
RI Serve para o perifrico indicar o recebimento do tom de discar da linha
telefnica.
Tabela 5.2 Sinais de entrada.

5.3 Sinais de Sada:

So aqueles sinais gerados pelo PC e enviados ao perifrico. Eles so gerados no 8250 e
depois de passarem por um conversor TTL/RS-232C, so entregues aos pinos do
conector serial.

Sinal
Descrio
TD So os dados seriais enviados ao perifrico, a partir pino 11 do 8250.
RTS Informa ao perifrico que o PC est pronto para transmitir dados.
DTR Informa ao perifrico que est ligado e pronto para se comunicar.
Tabela 5.3 Sinais de sada.


5.4 Definio dos Sinais Considerando a Comunicao DCE-DTE:

Faremos agora uma descrio dos mesmos sinais descritos nos itens 5.2 e 5.3,
considerando que ocorre uma comunicao entre um DCE (modem por exemplo) e um
DTE (PC). A figura 5.1 ilustra uma ligao entre dois PCs via modem. O que na
verdade teremos so duas ligaes tipo DCE-DTE. A pingem descrita refere-se ao
conector DB-25.


Figura 5.1 Comunicao DCE DTE.
Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 99

O sinal no pino 20 chamado DTR (Data Terminal Ready). Ele uma voltagem
positiva enviada do DTE para o DCE para indicar que o DTE est ligado e pronto para
comear a comunicao. O sinal complementar aparece no pino 6. Ele chamado DSR
(Data Set Ready). Ele uma voltagem positiva que indica que o DCE est ligado e
pronto para iniciar os trabalhos de comunicao. Numa comunicao serial normal,
ambos sinais devero estar presentes antes que algum procedimento de comunicao
ocorra. O DTE envia o DTR para o DCE e o DCE envia o DSR para o DTE.

O "handshaking" entre o DTE e o DCE feito pelos sinais CTS e RTS. O DCE coloca
uma voltagem positiva no pino 5, que chamado CTS (Clear To Send), para indicar que
est tudo bem, ou seja, ele est pronto para receber dados do PC. Do outro lado da
conexo, o DTE coloca uma voltagem positiva no pino 4, denominado RTS (Request
To Send), para indicar ao DCE que ele tambm est apto para receber dados. Uma regra
importante para se lembrar que s haver troca de dados se ambos sinais estiverem
com voltagem positiva.

O DCE envia um sinal, denominado CD (Carrier Detect), que pode afetar o fluxo de
dados. Uma voltagem positiva neste condutor indica que o DCE (modem) tem um sinal
de portadora vinda de outro modem, no outro lado da conexo. Se nenhuma portadora
for detectada, ento o sinal serial pode ser apenas rudo. Em alguns casos, quando CD
for negativo, o DTE ir rejeitar o sinal recebido.

O sinal do pino 22 chamado RI (Ring Indicator) e usado pelo DCE (modem) para
sinalizar ao DTE que foi detectada uma chamada telefnica para o modem. Em muitas
ligaes seriais este sinal considerado opcional e sua ausncia no vai inviabilizar a
comunicao serial.

Uma comunicao serial pode ser considerada um protocolo muito particular. Antes que
qualquer coisa ocorra, os hardwares nas duas extremidades devero estar ligados e
prontos para trabalhar. Neste caso o DTE (PC) envia o DTR e o DCE (modem) envia o
DSR. Se um telefone chama, ele "acorda" o modem e este envia o RI para o
computador, o qual pode enviar uma mensagem para a tela. Enquanto o modem negocia
a conexo com o outro modem, o DCE envia o CD para o DTE.

A ligao DTE-DCE feita por um cabo ligado pino a pino, sem cruzamentos. Este tipo
de cabo denominado cabo transparente. Por conveno o DTE usa o pino 2 para
transmisso e o pino 3 para recepo. O DCE usa o pino 3 para transmisso e o pino 2
para recepo.

O sinal GND (pino 7) deve sempre existir em uma transmisso serial. Ele prov o
caminho de retorno para os sinais de dados e controle. Ele no tem relao com o pino
1, que o terra de carcaa.


5.5 Comunicao DTE-DTE:

A figura 5.2 mostra como deve ser a ligao entre dois DTEs (dois computadores, por
exemplo), onde ressaltada a tica de cada um deles. A conexo simples: basta cruzar
DTR e DRS (20 x 6), RTS e CTS (4 x 5) e TD e RD (2 x 3). A conexo de terra direta.
Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 100


Figura 5.2 Comunicao DTE DTE.



6.0 Registradores:

Todo o controle da Porta Serial feito pela UART. Esto previstas 4 portas seriais para
o PC. Cada porta ocupa 8 endereos de I/O, com possibilidade de interrupo. O
endereamento das portas o mostrado na tabela a seguir:

Porta Endereos Endereo Base Interrupo
COM1 3F8-3FFh 3F8h IRQ4
COM2 2F8-2FFh 2F8h IRQ3
COM3 3E8-3EFh 3E8h IRQ4
COM4 3E8-2EFh 2E8h IRQ3
Tabela 6.1 Endereamento das portas seriais.


As portas COM1 e COM3 compartilham a IRQ4 e as portas COM2 e COM4
compartilham a IRQ3. Apenas uma das portas ligadas ao mesmo IRQ pode gerar pedido
de interrupo, sob pena de haver um conflito no barramento de controle do PC.
Algumas portas mais modernas so mais flexveis quanto a IRQ utilizada.

A cada porta serial est associado um dispositivo 8250 (ou compatvel), que possui 11
registradores, os quais so acessados por instrues tipo IN e OUT da linguagem
Assembly. Esses 11 registradores so acessados pelos 8 endereos de I/O, havendo
portanto um compartilhamento de endereos controlado pelo bit DLAB.

A tabela a seguir apresenta a relao dos registradores do 8250, com suas finalidades e
endereos:





Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 101

Reg. Funo DLAB Endereo Acesso
TXD Buffer de transmisso 0 Base Escrita
RXD Buffer de recepo 0 Base Leitura
BAL Divisor menos significativo 1 Base Bidirecional
BAH Divisor mais significativo 1 Base + 1 Bidirecional
IER Habilita interrupes 0 Base + 1 Bidirecional
IIR Identificador de interrupes - Base + 2 Leitura
LCR Inicializa operao da UART - Base + 3 Bidirecional
MCR Controlador de modem (OUT2) - Base + 4 Bidirecional
LSR Status da operao - Base + 5 Leitura
MSR Status do modem - Base + 6 Leitura
SCR Registrador para deteco da porta - Base + 7 Bidirecional
Tabela 6.2 Descrio dos registradores do 8250.


O DLAB (Divisor Latch Access Bit) controla os registradores acessados atravs dos
endereos Base e Base + 1, conforme mostrado na tabela acima. Isto se deve ao fato de
termos 11 registradores, mas somente 8 endereos de I/O. A seguir sero descritos cada
um destes registradores:


6.1 Registrador TXD:

O TXD (Transmit Data Buffer) armazena o caractere a ser transmitido serialmente. A
transmisso iniciada imediatamente aps a escrita neste registrador. Ento,
necessrio ler o bit TXDE (bit 5 do LSR) para verificar se o buffer de transmisso est
vazio. O chamado erro break detecte acontecer quando se comear uma transmisso
sem terminar a anterior. O acesso a este registrador apenas para a escrita, no endereo
Base, e est condicionado ao bit DLAB (bit 7 do LCR) = 0.


6.2 Registrador RXD:

O RXD (Receive Data Buffer) armazena o ltimo caractere recebido serialmente.
necessrio ler o bit RXDA (bit 0 do LSR) para verificar se h um novo caractere
disponvel (ou se o caractere no RXD j foi lido anteriormente). O chamado erro
"overrun error" acontece quando um caractere esteve disponvel, mas no foi lido pela
CPU por causa da chegada de um outro caractere. O acesso a este registrador apenas
para a leitura, no endereo Base, e est condicionado ao bit DLAB (bit 7 do LCR) = 0.


6.3 Registradores BAH e BAL:

O BAH (Divisor High Byte) e o BAL (Divisor Low Byte), em conjunto, determinam a
taxa de transmisso (Baud Rate). A taxa de transmisso dada por:


Taxa (baud) = 115.200 / Baud

Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 102

Assim, alguns valores comerciais so facilmente relacionados, como ilustra a tabela a
seguir. O acesso a estes registradores, BAL no endereo Base e BAH no endereo Base
+ 1, est condicionado ao bit DLAB (bit 7 do LCR) = 1.

Taxa BAH BAL
115.200 bauds 0 1
57.600 bauds 0 2
38.400 bauds 0 3
28.800 bauds 0 4
14.400 bauds 0 8
9.600 bauds 0 12
7.200 bauds 0 16
4.800 bauds 0 24
3.600 bauds 0 32
2.400 bauds 0 48
1.800 bauds 0 64
1.200 bauds 0 96
600 bauds 0 192
300 bauds 1 128
Tabela 6.3 Valores de BAH e BAL para taxas comerciais.



6.4 Registrador IER:

O IER (Interrupt Enable Register) mascara as 4 (quatro) possveis origens de pedidos de
interrupo a serem gerados pelo 8250. Pode-se dizer que o IER est para o 8250 assim
como a OCW1 est para o 8259. Cada bit setado (1) para habilitar e ressetado (0) para
desabilitar uma determinada origem do pedido de interrupo. O acesso ao IER, no
endereo Base + 1, est condicionado ao bit DLAB (bit 7 do LCR) = 0.


Bit
Sinal Descrio
0
RX Data Interrupt
Enable (RXDA)
Gera pedido quando algum caractere estiver disponvel
para leitura em RXD, evitando que o programa leia,
constantemente, o j referido bit RXDA.
1
TX Data Interrupt
Enable (TXDA)
Gera pedido quando a ltima transmisso de caractere
for encerrada, evitando que o programa leia,
constantemente, o j referido bit TXDA.
2
RX Error Interrupt
Enable (RXIE)
Gera pedido quando algum erro de transmisso for
detectado, evitando que o programa leia,
constantemente, os bits de erro do LSR.
3 Modem Interrupt Enable
Gera pedido quando um dos 4 (quatro) bits menos
significativos do MSR setado.
Tabela 6.4 Descrio dos bits do Registrador IER.



Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 103
6.5 Registrador IIR:

O IIR (Interrupt Identification Register) um registrador que identifica o estado da
interrupo. Ele informa CPU qual a origem do pedido que foi atendido. acessvel
diretamente no endereo Base + 2.

Bit Configurao Descrio
0
Interrupt Pending
(IPN)
Ativado em nvel baixo, este bit informa se foi feito algum
pedido de interrupo CPU que ainda no foi atendido. Ele
setado quando uma das condies descritas no IER atendida
e ressetado quando o bit que gerou a interrupo ressetado
(RXDA, TXDA, bits de erro, bits do MSR), ou quando o IIR
lido. Um novo pedido de mais alta prioridade tem preferncia
a outro mais antigo de menor prioridade.
1 e 2
Bit 1 = 1
Bit 2 = 1
O pedido de interrupo foi gerado por uma condio de erro
de transmisso. Tem a maior prioridade. Encerra-se o pedido
executando-se uma leitura no LCR.
1 e 2
Bit 1 = 1
Bit 2 = 0
O pedido de interrupo foi gerado pelo bit RXDA.
Encerra-se o pedido executando-se uma leitura no RXD.
1 e 2
Bit 1 = 0
Bit 2 = 1
O pedido de interrupo foi gerado pelo bit TXDA. Encerra-se
o pedido executando-se uma leitura no IIR ou escrita no TXD.
1 e 2
Bit 1 = 0
Bit 2 = 0
O pedido de interrupo foi gerado por um dos quatro bits
menos significativos do MSR. Tem a menor prioridade.
Encerra-se o pedido executando-se uma leitura no MSR.
Tabela 6.5 Descrio dos bits do Registrador IIR.

6.6 Registrador LCR:

0 LCR (Line Control Register) o registrador que define os parmetros de operao do
8250, como UART. acessvel diretamente no endereo Base + 3.

Bit Configurao Descrio
0 e 1
0 e 0 5 bits
0 e 1 6 bits
1 e 0 7 bits
1 e 1 8 bits
Definem o tamanho, em bits, do caractere
a ser transmitido / recebido.
2
0 1 stop bit
1 2 stop bits, para caracteres de 6,
7 ou 8 bits, ou 1 , para caracteres
de 5 bits.
Nmero de stop bits
4 e 5
0 e 0 paridade mpar
0 e 1 paridade par
1 e 0 paridade alta
1 e 1 paridade baixa
Definem a paridade
6
1 Seta
0 Resseta
Fora a nvel baixo o pino TXD at que
este bit seja ressetado.
7 DLAB (Divisor Latch Access Bit).
Seleciona que registradores devem ser
acessados nos endereos Base e Base + 1.
Tabela 6.6 Descrio dos bits do registrador LCR.
Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 104

6.7 Registrador MCR:

O MCR (Modem Control Register) o registrador que controla o nvel lgico (atravs
do seu complemento) dos pinos de sada da operao com o modem. acessvel
diretamente no endereo Base + 4.

Bit Sinal Descrio
0 DTR Data Terminal Ready.
1 RTS Request To Send.
2 OUT1 Este bit, quando setado, controla a sada OUT1 do 8250.
3 OUT2
Este bit, quando setado, controla a sada OUT2 do 8250 e
permite que seu pedido de interrupo seja diretamente
conectado IRQ correspondente do barramento de controle
do PC.
4 LC Loopack Control - Modo de loop local.
Tabela 6.7 Descrio dos bits do registrador MCR.


6.8 Registrador LSR:

O LSR (Line Status Register) o registrador de status da operao do 8250. acessvel
diretamente no endereo Base + 5. Seus bits, descritos a seguir, representam um
segundo estgio de identificao de interrupo (o primeiro o IIR), fornecendo
disponibilidades de caracteres e possveis erros de transmisso / recepo.

Bit Sinal Descrio
0 RXDA
Informa se h caractere disponvel em RXD. Este bit setado
por hardware e ressetado quando uma leitura ao RXD
realizada.
1
OE
(Overrun Error)
Indica que um caractere foi perdido pela chegada de outro,
pois a CPU no o leu a tempo. Setado por hardware e
ressetado na leitura do LSR.
2
PE
(Parity Error)
Indica que um caractere foi recebido com um erro de
paridade. Setado por hardware e ressetado na leitura do LSR.
3
FE
(Framing Error)
Indica que um caractere foi recebido com erro de quadro,
estando relacionado a diferentes taxas de transmisso. Setado
por hardware e ressetado na leitura do LSR.
4
BKD
(Break Detected)
Indica que a transmisso de um caractere foi interrompida.
Setado por hardware e ressetado na leitura do LSR.
5 TXDE
Informa que o buffer para transmisso est vazio. Setado por
hardware e ressetado na escrita do TXD.
6 TXST
Quando setado (por hardware), informa que no h caractere
sendo transmitido. Ressetado na escrita de TXD.
7 TIME OUT Acusa erro de decurso de tempo.
Tabela 6.8 Descrio dos bits do registrador LCR.




Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 105

6.9 Registrador MSR:

O MSR (Modem Status Register) o registrador que l o nvel lgico dos pinos de
entrada da operao com o modem. acessvel diretamente no endereo Base + 6.
Quando um dos bits 3, 2, 1 e 0 setado, h um pedido de interrupo.


Bit Descrio
0 Setado quando o pino CTS muda de nvel lgico. Ressetado na leitura do MSR.
1 Setado quando o pino DSR muda de nvel lgico. Ressetado na leitura do MSR.
2 Setado quando o pino RI muda de nvel lgico alto para nvel lgico baixo.
Ressetado na leitura do MSR.
3 Setado quando o pino CD muda de nvel lgico. Ressetado na leitura do MSR.
4 Complemento de CTS.
5 Complemento de DSR.
6 Complemento de RI.
7 Complemento de CD.
Tabela 6.9 Descrio dos bits do registrador MSR.


6.10 Registrador SCR:

O SCR (Scratchpad Register) um registrador, acessvel no endereo Base + 7, que no
influencia na operao do 8250. Mas bastante utilizado para verificar se existe porta
serial conectada ao PC. Para isso, escreve-se um dado nos possveis endereos deste
registrador: se o valor lido for igual ao valor escrito, h um forte indcio da presena da
Porta Serial.



7.0 O Hardware da Porta Serial:

O circuito principal da porta serial a Universal Asynchronous Receiver and Transmiter
(UART). Ele um chip especial responsvel por transformar um barramento paralelo
em um trem de bits seriais. Trabalha de modo bidirecional e com barramento de 8 bits.
A UART est relacionada com as funes da porta serial e com uma famlia de
circuitos.

Existem 3 tipos bsicos de circuitos utilizados nos PCs que realizam as funes da
UART:

8250: o mais antigo, usado principalmente nos PCs XT;
16450: melhor performance, lanado em 1984;
16550: lanado em 1987, muito utilizado atualmente.

A figura a seguir mostra a pinagem destas UARTs:



Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 106


Figura 7.1 UART 16550 e 8250.


O 16550 compatvel com o 8250 e 16450. A nica diferena so os pinos 24 e 29. No
8250 o pino 24 a sada do Chip Select o qual funciona apenas como indicador se o
chip foi ativado ou no, e o pino 29 no utilizado.

No 16550 foram introduzidos dois novos pinos no encapsulamento. Eles so o Transmit
Ready e Received Ready o qual pode ser implementado o acesso direto a memria
(Direct Memory Access - DMA). Estes pinos tem dois diferentes modos de operao:
Modo 0 suporta uma transferncia simples com DMA enquanto o Modo 1 suporta
mltiplas transferncias com DMA.

Atualmente a UART mais utilizada a 16550. A tabela a seguir descreve os pinos deste
Circuito Integrado.

Pinos Nome Descrio
1 a 8 D0 a D7 Data Bus
9 RCLK
Receiver Clock Input. A frequncia desta entrada deve ser igual a
taxa recepo multiplicada por 16.
10 RD Receive Data
11 TD Transmit Data
12 CS0 (H) Chip Select 0
13 CS1 (H) Chip Select 1
14 CS2 (L) Chip Select 2
15
BAUDOUT
(L)
Baud Output. Sada para Gerador Programvel de Taxa de
transmisso. Frequncia = (taxa * 16)
16 XIN
Entrada externa de Cristal. Usado pelo oscilador de taxa de
transmisso.
17 XOUT Sada externa de cristal
18 WR (L) Write Line

Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 107

Pinos Nome Descrio
19 WR Write Line
20 VSS Conectado ao GND
21 RD Read Line
22 RD (L) Read Line
23 DDIS
Driver Disable. Este pino vem para nvel baixo quando a CPU
est lendo a UART. Pode ser conectado ao barramento de
transmisso no caso de um barramento de alta capacidade.
24 TXRDY (L) Transmit Ready
25 ADS (L)
Address Strobe. Usado se o sinal no estiver estvel durante o
ciclo leitura ou escrita.
26 A2 Address Bit 2
27 A1 Address Bit 1
28 A0 Address Bit 0
29 RXRDY (L) Receive Ready
30 INTR Interrupt Output
31 OUT2 (L) User Output 2
32 RTS (L) Rquest to Send
33 DTR (L) Data Terminal Ready
34 OUT1 (L) User Output 1
35 MR Master Reset
36 DSR (L) Data Set Ready
37 DSR (L) Data Set Ready
38 DCD (L) Data Carrier Detect
39 RI (L) Ring Indicator
40 VDD + 5 Volts
Tabela 7.1 Descrio dos pinos da UART 16550.


7.1 O Circuito 8250:

O 8250 foi largamente utilizado nos PCs XT e em modems de baixa velocidade. Suas
principais funes:

Converso paralelo/serial dos dados;
Controle da taxa de transmisso;
Controle do fluxo de informao (tamanho da palavra de dados, paridade e stop bit);
Gerenciamento da comunicao.

A tecnologia aplicada ao circuito considerada antiga, com baixa velocidade de
TX/RX. Ele possui apenas um buffer interno de um byte, o que pode acarretar
problemas de sobrescrita denominado overrum error. Isso ocorre quando o byte
recebido no lido pelo processador antes da chegada de um novo byte. Em
contrapartida um chip barato sendo por isso muito utilizado.

A programao do 8250 feita pela BIOS, porm os usurios tem acesso aos seus
registradores via instrues tipo IN e OUT do Assembly.

Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 108

7.2 O Circuito 16450:

O circuito 16450 uma evoluo do 8250, possuindo um desempenho melhor, apesar
de continuar com somente um byte de buffer. Quando aplicado comunicao em altas
taxas ou software multitarefa ainda ocorre o overrun error.


7.3 O Circuito 16550 A:

Neste chip foi resolvido o problema de overrrun error em aplicao multitarefa com a
utilizao de um buffer de 16 bytes. Ele compatvel com o 16450.


7.4 O ChipSet:

Atualmente a funo da UART realizada em um chipset denominado ASICs
(Aplication Specific Integrated Circuit). Nele esto implementados 2 circuitos 16650 e
uma porta paralela.



8.0 Padres Existentes:

8.1 Porta Serial Avanada (Enhanced Serial Port):

Para comunicao em altas taxas, o 16550 continuava sendo inadequado. Em funo
disso, em 1990 a Hayes Microcomputer Products criou a porta serial avanada. Possui
um buffer de 1024 bytes, sendo controlada por um microcontrolador 8031. Ela
programada para trabalhar no modo padro e no modo avanado. necessrio um
software para ativ-la.


8.2 O Padro P1394:

A performance das portas seriais continuavam baixas para as novas aplicaes do PC. A
melhor maneira de aumentar o desempenho foi a redefinio do padro de porta serial.
O IEEE tem trabalhado no P1394 para ser a porta serial do futuro. O objetivo oferecer
uma conexo de baixo custo e alto desempenho entre o computador e os perifricos, que
venha substituir as conexes atualmente utilizadas (serial, paralela e vdeo). Segue
algumas caractersticas desse padro:

A taxa de transmisso inicial prevista para o padro de 100 Mbps, podendo evoluir
para 200 e 400 Mbps.

Utilizar um conector plstico de 6 vias.

Os perifricos podero estabelecer uma comunicao direta, sem a interveno do
PC. Neste caso o P1394 funcionar como uma pequena rede.

Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 109

Trabalha no tradicional modelo de camadas de redes de computadores. Esto
previstas 4 camadas: gerenciamento (nvel 4), transao (nvel 3), enlace (nvel 2) e
camada fsica (nvel 1).



9.0 Programando a Porta Serial:

Assim como as portas LPT, os endereos base das portas COM podem ser lidos
diretamente da rea de dados da BIOS. A tabela a seguir mostra quais so os endereos
da rea de dados da BIOS. Cada endereo ocupa 2 bytes:

Endereo da Memria Porta
0000:0400 Endereo base da porta COM1
0000:0402 Endereo base da porta COM2
0000:0404 Endereo base da porta COM3
0000:0406 Endereo base da porta COM4
Tabela 9.1 Endereo da porta serial na BIOS.

Desta forma, o programa a seguir mostrar como verificar estas posies de memria,
retornando o endereo base das portas COM. Se o programa retornar um 0, significa
que no existe nenhum endereo associado a COM:



#include <stdio.h> // Biblioteca bsica de I/O.
#include <conio.h> // Biblioteca para crlscr() e getch().

void main()
{
unsigned int far *ptend; // Ponteiro p/ localizar endereo da Porta.
unsigned int base; // Endereo da porta.
int i;

ptend = (unsigned int far *)0x00000400; // Coloca no ponteiro ptend o
// contedo da posio de
// memria 0000:0400
clrscr();

for(i=0; i<4; i++)
{
base = *ptend;
if(base == 0)
printf(Nao existe nenhum endereco associado a COM%d\n, i+1);
else
printf(O endereco associado a porta COM%d e %Xh\n, i+1, base);
*ptend++;
}
getch();
}

Exemplo 9.1 Endereo base da porta serial.


Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 110

A leitura ou escrita na porta serial feita pelas funes inportb e outportb, descritas
anteriormente.

O prximo programa na verdade uma biblioteca de funes para o interfacemanto do
programador com a porta serial, utilizando os recursos mais usuais do 8250 para o
padro RS-232C:


/*********************************************************/
/** ARQUITETURA E SISTEMAS DE COMPUTADORES **/
/** **/
/** BIBLIOTECA RS-232C **/
/** **/
/*********************************************************/

#include <dos.h>

// Endereos base das portas:
#define COM1 0x3F8
#define COM2 0x2F8
#define COM3 0x3E8
#define COM4 0x2E8

// Condies de gerao de interrupo:
#define MODEMSET 0x08
#define ERRORSET 0x04
#define TXSET 0x02
#define RXSET 0x01

// Origens do pedido de interrupo:
#define INTPEND 0x01
#define ERRORINT 0x06
#define RXINT 0x04
#define TXINT 0x02
#define MODEMINT 0x00

// Constantes de erro e status:
#define TIMEOUT 0x80
#define TXST 0x40
#define TXDE 0x20
#define BREAKDETECT 0x10
#define FRAME 0x08
#define PARIDADE 0x04
#define OVERRUN 0x02
#define RXDA 0x01

// Rotina para limpar o buffer da recepcao, pedido de
// interrupcao e bit de erro:
void limpa_registradores(int porta)
{
inportb(porta);
inportb(porta+2);
inportb(porta+5);
inportb(porta+6);
}



Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 111

// Rotina para ler o status da porta serial.
// Valores retonaveis: TIMEOUT
// TXST
// TSDE
// BREAKDETECT
// FRAME
// PARIDADE
// OVERRUN
// RXDA
unsigned char le_status(int porta)
{
return(inportb(porta+5));
}


// Rotina para ler um caractere pela porta serial:
unsigned char le_caractere(int porta)
{
while(!(le_status(porta)&RXDA));
return (inportb(porta));
}


// Rotina para inicializar a porta serial:
void inicializa(int porta, unsigned char nbits,
unsigned char nstop, unsigned char paridade,
unsigned int divisor)
{
unsigned char palavra;
unsigned char resultado;

// Programacao da UART:
// nbits numero de bits por caractere (5 a 8)
// paridade 0 -> sem paridade
// 1 -> paridade impar
// 3 -> paridade par
// divisor gera a taxa de transmissao
// 12 9600 bauds
// 24 4800 bauds
// 48 2400 bauds
// 96 1200 bauds
// 192 600 bauds
// 384 300 bauds

if((nbits > 8) || (nbits < 5))
nbits = 8;
palavra = nbits - 5;

if(nstop == 2)
palavra = palavra | 4;

paridade = paridade & 3;
paridade = paridade << 3;
palavra = palavra + paridade;
palavra = palavra | 128; // Para acesso aos divisores.
outportb(porta+3, palavra);
resultado = (unsigned char)(divisor & 255);
outportb(porta, resultado);


Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 112


resultado = (unsigned char)(divisor / 256);
outportb(porta+1, resultado);
outportb(porta+4, 0x03);
palavra = palavra & 127; // Desconectada da IRQ.
outportb(porta+3, palavra); // Nao acessa os divis.
limpa_registradores(porta);
}


// Rotina para enviar um caractere pela porta serial:
void envia_caractere(char c, int porta)
{
while(!(le_status(porta)&TXDE));
outportb(porta, c);
}


// Rotina para conectar o pedido de interrupcao do
// 8250 a IRQ relativa a porta:
void habilita_int_porta(int porta)
{
outportb(porta+4, inportb(porta+4) | 0x08);
}


// Rotina para desconectar o pedido de interrupcao do
// 8250 a IRQ relativa a porta:
void desabilita_int_porta(int porta)
{
outportb(porta+4, inportb(porta+4) & 0xF7);
}


// Rotina para mascarar origens possiveis do pedido
// de interrupcao do 8250.
// Valores retonaveis: MODEMSET
// ERRORSET
// TXSET
// RXSET
void seta_mascara_int(int porta, unsigned char mascara)
{
outportb(porta+1, mascara);
}


// Rotina para ler a mascarar de origens possiveis do pedido
// de interrupcao do 8250.
// Valores retonaveis: MODEMSET
// ERRORSET
// TXSET
// RXSET
unsigned char le_mascara_int(int porta)
{
return(inportb(porta+1) & 0x0F);
}



Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 113


// Rotina para verificar o fato que gerou o pedido de
// interrupcao.
// Valores retonaveis: INTPED
// ERRORINT
// RXINTR
// TXINTR
unsigned char le_origem_int(int porta)
{
return (inportb(porta+2) & 0x07);
}


// Rotina que retorna 1 se existir a porta serial, e 0
// caso contrario:
unsigned char checa_porta(int porta)
{
unsigned char flag;
flag=0;
if((porta == COM1) ||
(porta == COM2) ||
(porta == COM3) ||
(porta == COM4))
{
flag = 1;

outportb(porta+7, 0x00);
if(!(inportb(porta+7) == 0x00))
flag = 0;
outportb(porta+7, 0xFF);
if(!(inportb(porta+7) == 0xFF))
flag = 0;
outportb(porta+7, 0xA2);
if(!(inportb(porta+7) == 0xA2))
flag = 0;
}
return (flag);
}

Exemplo 9.2 - Biblioteca de funes RS-232C.



10.0 Conectando Hardware a Porta Serial:

Este exemplo mostra como conectar um display LCD de 2 linha por 16 caracteres
porta serial, no qual tudo que for digitado na tela ser enviado para o display. A linha
RTS usada para demonstrar o uso do handshaking para RS-232C.

A conexo de display na porta paralela pode ser feita com poucos componentes, visto
que a mesma j trabalha com sinais TTL. J na serial, e necessrio um hardware um
pouco mais complexo, devido a necessidade de compatibilizar os nveis de tenso e
converter os dados seriais em paralelo.

A figura a seguir mostra o esquema eletrnico do hardware usado para conexo do
display Porta Serial:
Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 114


Figura 10.1 Esquema eletrnico de conexo do display LCD porta serial.

A converso dos nveis de sinal da porta serial, que para o padro RS-232C variam de
12V a +12V, feito pelo CI MAX-232. Ele converte estes nveis de tenso para o
padro TTL (0 a 5V), usados pelo display LCD.

A UART CDP6402C quem faz a recepo e converso dos sinais entre o display e a
porta. O CI 74HC4060 gera o clock para este CI, que neste exemplo trabalha com 9600
bps.

Toda inicializao da porta serial e do prprio display so feitas via software de
controle, que o mostrado a seguir:


#include <dos.h>
#include <stdio.h>
#include <conio.h>

#define PORT1 0x3E8 // Endereo da porta

// COM1 0x3F8
// COM2 0x2F8
// COM3 0x3E8
// COM4 0x2E8

void main(void)
{
int c;
int count;


Eletricazine www.eletricazine.hpg.ig.com.br
Daniel Campos Laboratrio de Arquitetura de Computadores 2001
Reviso 04 _______________________________________________________________ Pgina 115

char init[] = { 0x0F, 0x01, 0x38 }; // 0x0F - Init Display
// 0x01 - Clear Display
// 0x38 - Dual Line / 8 Bits

outportb(PORT1 + 1 , 0x0); // Turn off interrupts - Port1
outportb(PORT1 + 3 , 0x80); // SET DLAB ON
outportb(PORT1 + 0 , 0x0C); // Set Baud rate - Divisor Latch Low Byte
// 0x06 = 19,200 BPS
// 0x0C = 9,600 BPS */
// 0x18 = 4,800 BPS */
// 0x30 = 2,400 BPS */
outportb(PORT1 + 1 , 0x00); // Set Baud rate - Divisor Latch High
Byte
outportb(PORT1 + 3 , 0x03); // 8 Bits, No Parity, 1 Stop Bit
outportb(PORT1 + 2 , 0xC7); // FIFO Control Register
outportb(PORT1 + 4 , 0x0B); // Turn on DTR, RTS, and OUT2
outportb(PORT1 + 4 , (inportb(PORT1 + 4) | 0x01)); //Reg. Select
(DTR)
// 0 = Instruction Register

for (count = 0; count < 3; count++)
{
outportb(PORT1, init[count]); // Send Init Data Bytes
delay(20); // Larger Delay for INIT
}

outportb(PORT1 + 4 , (inportb(PORT1 + 4) & 0xFE)); //Reg. Select
(DTR)
// 1 = Data Register

printf("\nExemplo de programa LCD serial. Pressione ESC para
sair\n");

do {
if (kbhit()){
c = getch();
outportb(PORT1, c);
printf("%c",c);
}

} while (c !=27);
}

Programa 10.1 Escreve no display LCD usando a porta serial.


Eletricazine www.eletricazine.hpg.ig.com.br

Vous aimerez peut-être aussi