Вы находитесь на странице: 1из 172

UNIVERSIDADE FEDERAL DO RIO DE JANEIRO

ESCOLA POLITCNICA
DEPARTAMENTO DE ELETRNICA E DE COMPUTAO

DESENVOLVIMENTO DE SOFTWARE E HARDWARE
EMBUTIDO PARA UM SISTEMA DE ESTACIONAMENTO


Autor: ___________________________________________________________________
Mauricio Lopes de Oliveira

Orientador:_______________________________________________________________
Prof. Manuel Lois Anido, Phd. NCE/UFRJ

Co-orientador:____________________________________________________________
Prof. Jos Paulo Brafman, Msc. EP/UFRJ

Avaliador:_______________________________________________________________
Prof. Carlos Jos Ribas DAvila, Msc. EP/UFRJ




DEL
09/2006
ii
DEDICATRIA


Ao meu av Alcides e minha av Luzia,
que no esto ao meu lado
para compartilhar os momentos marcantes em minha vida,
como este.

iii
AGRADECIMENTOS

minha amada esposa Fabiana,
que me acolheu nas minhas angstias.
Aos meus pais por acreditarem em mim,
quando nem mesmo eu acreditava.
Ao Prof. Manuel Lois,
por sua orientao e compreenso.
Aos amigos Daniel, Raphael e Vincius
Por suas participaes

E principalmente a Deus,
por sempre me dar muito alm do que eu almejava.
iv
RESUMO
Este trabalho final de graduao descreve a concepo, o projeto e a implementao de um
sistema embutido baseado na linha de microcontroladores PIC, cujo hardware testado atravs da
implementao de uma aplicao de um sistema de controle de estacionamento de automveis.
Este trabalho faz uma descrio das diversas tecnologias estudadas para alcanar os objetivos
propostos e descreve o projeto e a implementao do hardware e do software empregados. Ele tambm
descreve a metodologia usada e todo o processo de desenvolvimento desde a concepo e projeto at a
implementao do sistema proposto.
O hardware desenvolvido razoavelmente potente e genrico, considerando-se um sistema
embutido com microcontrolador PIC, e pode ser usado em diversas aplicaes, no se limitando
aplicao apresentada, a qual foi desenvolvida pelo autor em conjunto com alunos do curso de Cincia
da Computao da UFRJ . O sistema possibilita o controle de um estacionamento, lidando com clientes
avulsos (ou rotativos) e mensalistas e permite registrar placas, marcas, tabelas de preos e clientes
mensalistas, alm de calcular o tempo de permanncia e o valor a ser pago pelo usurio.


v
SUMRIO
Dedicatria.............................................................................................................................................. ii
Agradecimentos...................................................................................................................................... iii
Resumo................................................................................................................................................... iv
Sumrio................................................................................................................................................... v
ndice de figuras.................................................................................................................................... vii
ndice de tabelas..................................................................................................................................... ix
1 Introduo............................................................................................................................................ 1
1.1 Importncia do tema................................................................................................................ 1
1.2 Objetivos do Projeto................................................................................................................ 2
1.3 Organizao do trabalho final ................................................................................................. 2
2 Reviso Bibliogrfica........................................................................................................................... 3
2.1 Introduo................................................................................................................................ 3
2.2 Bibliografia revisada............................................................................................................... 3
2.2.1 Microcontroladores analisados.................................................................................... 3
2.2.2 Artigos e produtos revisados........................................................................................ 5
2.3 Concluses da Reviso Bibliogrfica............................................................................. 6
3 Reviso das tecnologias utilizadas no projeto...................................................................................... 7
3.1 Introduo................................................................................................................................ 7
3.2 Caractersticas gerais da famlia de microcontroladores PIC utilizada................................. 10
3.2.1 Microcontroladores utilizados no projeto.................................................................. 13
3.4 Componentes externos utilizados no projeto......................................................................... 16
3.4.1 EEPROM 24C32........................................................................................................ 16
3.4.2 RAM 62256............................................................................................................... 17
3.4.3 MAX 232................................................................................................................... 18
3.4.4 PCF 8583................................................................................................................... 19
3.4.4 LCD............................................................................................................................ 20
vi
3.3 Protocolos utilizados no projeto............................................................................................ 21
3.3.1 Protocolo I2C............................................................................................................. 21
3.3.2 Protocolo de comunicao para teclado PS/2............................................................ 22
3.4 Softwares e programadores de microcontroladores utilizados no projeto............................. 23
3.4.1 Softwares utilizados................................................................................................... 23
3.4.2 Programador utilizado................................................................................................ 25
3.5 UML ...................................................................................................................................... 25
4 Concepo e projeto do sistema......................................................................................................... 26
4.1 Introduo.............................................................................................................................. 26
4.2 Funes e requisitos de um sistema de estacionamento........................................................ 26
4.3 Requisitos de hardware do sistema de estacionamento......................................................... 30
4.4 Requisitos bsicos de um S.E. para uso geral........................................................................ 31
5 Implementao e resultados............................................................................................................... 41
5.1 Introduo.............................................................................................................................. 41
5.2 Implementao do software................................................................................................... 41
5.3 Implementao do hardware.................................................................................................. 46
5.4 Resultados............................................................................................................................. 51
6 Concluses......................................................................................................................................... 54
6.1 Resumo do trabalho............................................................................................................... 54
6.2 Principais dificuldades........................................................................................................... 55
6.3 Concluses............................................................................................................................. 56
6.4 Trabalhos futuros................................................................................................................... 57
Bibliografia utilizada............................................................................................................................. 58
Referncias............................................................................................................................................ 59
Apndice A Listagem do cdigo desenvolvido.................................................................................. 62
Apndice B Manual de uso das Bibliotecas usadas no Hardware.................................................... 135
Apndice C Glossrio do Sistema de Estacionamento..................................................................... 144
Apndice D Anlise de requisitos do Sistema de Estacionamento.................................................. 148
vii

NDICE DE FIGURAS

Figura 1 - Nveis de abstrao do processo de desenvolvimento de sistemas embutidos........... 10
Figura 2 Um esquema simplificado do microcontrolador 16F64............................................ 11
Figura 3 Pinagem do 18F452 e do 18F4620............................................................................ 15
Figura 4 - Pinagem da EEPROM 24C32.................................................................................... 17
Figura 5 Identificao da EEPROM........................................................................................ 17
Figura 6 Pinagem do 62256..................................................................................................... 18
Figura 7 Diagrama do CI MAX232......................................................................................... 19
Figura 8 Esquema de utilizao do PCF 8583......................................................................... 19
Figura 9 Comunicao I2C...................................................................................................... 22
Figura 10 Comunicao do teclado com o computador........................................................... 23
Figura 11 Comunicao do computador com o teclado........................................................... 23
Figura 12 Ligao do PIC com o LCD.................................................................................... 32
Figura 13 Diagrama de tempo do ciclo de escrita do LCD...................................................... 33
Figura 14 Ligao do PIC com o teclado PS/2........................................................................ 33
Figura 15 Ligao do PIC com o 24C32 e o PCF8583............................................................ 34
Figura 16 Diagrama de tempo dos dispositivos I2C................................................................ 34
Figura 17 Comunicao serial no MAX232............................................................................ 35
Figura 18 Ligao do PIC com o MAX232............................................................................. 35
Figura 19 Ligao do PIC com a memria externa 62256....................................................... 36
Figura 20 Diagrama de tempos de leitura na memria 62256................................................. 36
Figura 21 Diagrama de tempos de escrita na memria 62256................................................. 37
Figura 22 Ligao do PIC com a interface paralela................................................................. 38
Figura 23 Diagrama de tempos da interface paralela............................................................... 39
Figura 24 Diagrama esquemtico do hardware projetado........................................................ 40
viii
Figura 25 Sistema final implementado.................................................................................... 46
Figura 26 Viso de frente do sistema....................................................................................... 47
Figura 27 Viso lateral direita do sistema................................................................................ 48
Figura 28 Viso frontal do sistema.......................................................................................... 49
Figura 29 Viso lateral esquerda do sistema............................................................................ 50
Figura 30 Disposio dos componentes na placa do sistema................................................... 51
Figura 31 Tabela de marcas cadastradas.................................................................................. 51
Figura 32 Tabela de preos para automveis de classe 1......................................................... 52
Figura 33 Ticket de entrada..................................................................................................... 52
Figura 34 Listagem do ptio.................................................................................................... 52
Figura 35 Ticket de sada........................................................................................................ 53

ix
NDICE DE TABELAS
Tabela 1 Caractersticas do 18F452 e 18F4620....................................................................... 14
Tabela 2 Pinagem padro do LCD........................................................................................... 20
Tabela 3 Valores tpicos do diagrama de tempo do LCD medidos em nanosegundos............ 32
Tabela 4 Valores dos tempos dos diagramas da memria 62256............................................ 37


1 INTRODUO
A computao est cada vez mais presente, e cada vez mais importante no nosso cotidiano.
Associada as outras tecnologias, a computao oferece uma enorme gama de produtos e servios que
servem para melhorar a qualidade de vida das pessoas. H inmeros exemplos de produtos com
servios sofisticados que s com o auxlio de computao possvel prover, como por exemplo:
eletrodomsticos e automveis inteligentes, equipamentos mdicos de ltima gerao, etc.
Neste cenrio, tem se tornado cada vez mais importante, embutir placas eletrnicas com
microcontroladores dentro dos equipamentos, a fim de dar-lhes maior capacidade para prover novas
funes, para substituir partes mecnicas ou economizar energia, entre outras coisas.
A aplicao de microcontroladores e de outros circuitos integrados dentro de equipamentos
tornou-se muito importante, tanto do ponto de vista econmico quanto estratgico, fazendo com que
muitas universidades e empresas criassem cursos, departamentos, ou reas denominadas Sistemas
Embutidos ou Sistemas Embarcados, para estruturar melhor as pesquisas e o desenvolvimento destes
tipos de sistemas.
1.1 IMPORTNCIA DO TEMA
Atualmente muito comum haver pelo menos um computador pessoal nas residncias. Da
mesma maneira, h diversos sistemas que ficam embutidos dentro de aparelhos facilmente
encontrados nos lares: Celulares, lavadoras, automveis, microondas, TVs, DVDs, etc.
Estatsticas atuais indicam que os microprocessadores usados em PCs representam apenas 3%
do total de microprocessadores e microcontroladores fabricados no mundo [27]. Em termos de valor
de produto, os computadores e os notebooks juntos representam apenas 30% do valor do somatrio de
todos os outros produtos que usam microprocessadores e microcontroladores em sistemas embutidos,
tais como mquina de lavar, microondas, automveis e avies [27].
Portanto, os Sistemas Embutidos so uma realidade no contexto da nova economia, que consiste
na combinao do processo da globalizao e da alta tecnologia, na qual os resultados-chave e os
ativos produtivos so fundamentalmente intelectuais informao e conhecimento e no fsicos.
Embora na nova economia se tenha dado muita ateno ao desenvolvimento de software e
telecomunicaes, a nova economia, que faz uso intensivo de informao, engloba tambm o
desenvolvimento de sistemas embutidos.
A evoluo tecnolgica dos softwares de desenvolvimento e das tcnicas de fabricao de CIs
tem ocasionado uma reduo nos custos de produo dos Sistemas Embutidos. Dessa forma, observa-
se uma diminuio dos preos de venda de produtos baseados em Sistemas Embutidos. Ou seja, novas
2
tecnologias proporcionam preos mais baratos e fazem com que Sistemas Eletrnicos Embutidos
sejam cada vez mais utilizados dentro de produtos aos quais eles so agregados.
A facilidade de desenvolvimento e o baixo custo tm proporcionado um maior interesse por
parte das indstrias e das universidades por Sistemas Embutidos, que alm de um custo cada vez mais
baixo, apresentam uma crescente flexibilidade, capaz de permitir sua utilizao em uma grande gama
de aplicaes.
1.2 OBJETIVOS DO PROJETO
O projeto descrito neste trabalho aborda a concepo, o projeto e a implementao do hardware
de um sistema embutido com caractersticas suficientemente genricas para poder ser utilizado em
gama razovel de aplicaes. Para testar o hardware proposto, desenvolveu-se uma aplicao que
consiste num sistema para o controle de estacionamentos pequenos.
O hardware no est limitado a esta aplicao e pode ser utilizado como plataforma de
desenvolvimento de outras aplicaes.
1.3 ORGANIZAO DO TRABALHO FINAL
Neste item, so mencionados os captulos descritos neste trabalho e seu contedo.
O captulo 1 aborda a importncia do tema, os objetivos propostos e o roteiro deste trabalho.
O captulo 2 faz uma reviso bibliogrfica, analisa as principais aplicaes encontradas que
possuem alguma relao com o trabalho aqui apresentado, discute algumas famlias de
microcontroladores e justifica a escolha do microcontrolador utilizado.
O captulo 3 discute as tecnologias relevantes utilizadas no desenvolvimento do sistema
apresentado.
O captulo 4 apresenta a concepo e o projeto do sistema desenvolvido, mostrando as
caractersticas e necessidades de um sistema de estacionamento, apresentando e justificando as
escolhas feitas.
O captulo 5 descreve a implementao do hardware e do software, apresentando fotos do
sistema e uma breve descrio das funes contidas nas bibliotecas desenvolvidas.
Por fim, o captulo 6 apresenta as concluses deste trabalho e prope alguns temas para
evoluo deste projeto.


2 REVISO BIBLIOGRFICA
2.1 INTRODUO
Devido amplitude do tema Sistemas Embutidos, no qual este trabalho se insere, esta reviso
bibliogrfica analisa algumas pesquisas e produtos que possuem alguma relao com o trabalho aqui
apresentado.
2.2 BIBLIOGRAFIA REVISADA
2.2.1 MICROCONTROLADORES ANALISADOS
Para que os Sistemas Embutidos tenham um custo baixo e tamanho reduzido, necessrio fazer
uso de poucos componentes no circuito. Por este motivo, geralmente d-se preferncia ao uso de
microcontroladores no projeto de Sistemas Embutidos (ou sistemas embarcados), pois eles integram,
numa nica pastilha, um microprocessador e vrios outros dispositivos como, conversores analgico-
digitais (AD), memrias, temporizadores, interface de comunicao serial, etc. Deste modo, permitem
reduo de custos e de tamanho fsico, alm de conferir versatilidade ao hardware. Existem vrias
famlias de microcontroladores com recursos bastante variados e, por isso h diferentes escolhas
possveis de microcontroladores, que passaremos a analisar a seguir.
Os microcontroladores 8051 [7] foram lanados pela INTEL, no incio da dcada de 80, e so
usados em vrias aplicaes. A famlia de microcontroladores 8051, conhecida por famlia MCS-51,
produzida por diversos fabricantes, tais como Intel, Philips e Siemens. Estes fabricantes tm
adicionado perifricos para o 8051, como: interfaces I2C [8], conversores analgico digitais (A/D),
modulao por largura de pulso (PWM), etc. As principais caractersticas normalmente encontradas
so: 4 portas de 8 bits, um ciclo de instruo igual a 12 ciclos de clock, 2 temporizadores/contadores
de 16 bits, 1 interface UART, entre outros. O 8051 geralmente possui poucas portas de entrada e sada
(E/S), principalmente se for usada memria externa para expanso da memria interna de dados ou de
programa, o que compromete 2 portas do 8051. Alm disso, como cada ciclo de instruo ocupa 12
ciclos de clock, o 8051 necessita de um clock elevado para um ciclo de instruo considervel, o que
gera um consumo de energia mais elevado do que em outros microcontroladores. Uma outra
desvantagem da famlia MCS-51, em relao a outros microcontroladores como o PIC, por exemplo,
a pouca densidade de cdigo.
Os microcontroladores ARM [9] fazem parte de uma famlia de microcontroladores RISC de
normalmente 32 bits, que foi desenvolvida para ter o melhor desempenho possvel dentro das
seguintes limitaes: ser simples, ocupar pouca rea e ter baixo consumo de energia. Apesar de
possuir um conjunto de instrues muito simples se comparado com processadores CISC, o ARM tem
instrues mais complexas do que aquelas que um processador RISC normalmente oferece. O baixo
4
consumo de energia em relao a processadores CISC, como, por exemplo, o Pentium, alcanado
atravs de trs fatores: simplicidade do circuito, pipeline curto e um projeto que privilegia o mnimo
consumo de energia sempre que o processador no estiver em operao. Devido s suas caractersticas
de ocupar pouca rea e de apresentar um baixo consumo de energia (e ao mesmo tempo apresentar um
bom desempenho), o processador ARM muito utilizado em aplicaes complexas que necessitem de
um baixo consumo de energia, como PDAs, video games (Nintendo Game Boy Advance), etc. Apesar
de ser um microcontrolador/microprocessador rpido e com baixo consumo de energia, as ferramentas
de desenvolvimento e os prprios chips custam mais caro do que o PIC ou o 8051, o que dificulta o
desenvolvimento baseado na linha ARM. Alm disso, microcontroladores ARM no so facilmente
encontrados com encapsulamento DIP, o que dificulta a montagem de prottipos.
A linha de microcontroladores M68HC11 [10] uma famlia de microcontroladores de 8 bits
fabricados originalmente pela Motorola e agora, produzidos pela FreeScale Semiconductor. Os
microcontroladores M68HC11 geralmente possuem 5 ports e podem operar com memria externa de
programa ou dados. Porm, quando for usada memria externa, os ports B e C so usados para
barramento de endereo e de dados respectivamente. Os microcontroladores M68HC11 possuem
geralmente: EEPROM, temporizadores, conversor A/D, clock interno de 2 MHz, gerador PWM,
interface RS-232 e SPI. Estes microcontroladores tem ferramentas de desenvolvimento
comercializadas exclusivamente pela FreeScale Semiconductor e, assim, seu uso ocasiona um alto
investimento inicial, pois no existem muitas alternativas de sistema de desenvolvimento freeware
para microcontroladores Motorola como existem por exemplo para a linha PIC. Uma outra linha de
microprocessadores recentemente criada pela FreeScale Semiconductor o COLDFIRE, que possui
arquitetura RISC com tamanho de instrues de 16, 32 ou 48 bits, resultando numa melhor densidade
de cdigo, quando comparado com microprocessadores RISC de 32 bits tradicionais. O COLDFIRE
bastante usado em aplicaes complexas, como PDAs, vdeo-games, etc. No entanto, alm de possuir
as mesmas desvantagens da linha M68HC11 citada anteriormente, o COLDFIRE no facilmente
encontrado com encapsulamento DIP como na linha PIC, por exemplo, dificultando a montagem de
prottipos.
Microcontroladores PIC [11] - Peripherical Interface Controller- uma famlia fabricada pela
Microchip Technology com extensa variedade de modelos e perifricos internos, com arquitetura
Harvard e conjunto de instrues RISC com larguras de palavra de 12, 14 ou 16 bits. Estes
microcontroladores trabalham geralmente com velocidades de at 40 MHz usando ciclo de instruo
de quatro perodos de clock, o que permite uma velocidade de no mximo 10 MIPS Como o clock
pode variar desde 32KHz at 40MHz (conforme o modelo), pode-se estabelecer a velocidade de
acordo com a necessidade, economizando energia. Os microcontroladores PIC so encontrados em
chips de 6 a 100 pinos em diversos encapsulamentos (SOT23, DIP, SOIC, TQFP, etc). Seus principais
perifricos internos (a disponibilidade varia conforme o modelo) so: conversores A/D de 8 a 12 bits,
5
temporizadores e contadores de 8 e 16 bits, comparadores analgicos, USART, controladores de
comunicao I2C, controladores PWM, watchdog timer, portas digitais com capacidade de 20mA
(fornecer ou drenar) para acionar circuitos externos e osciladores internos de 4Mhz. Existem vrios
fabricantes de ferramentas de desenvolvimento para PICs e algumas so disponibilizadas
gratuitamente na Internet (apesar de terem limitaes). Consequentemente fcil e, at certo ponto,
barato obter um programador de PIC ou um compilador. Isso tornou o PIC muito popular, facilitando a
compra destes microcontroladores.
2.2.2 ARTIGOS E PRODUTOS REVISADOS
O trabalho em [1] tem como objetivo implementar um sistema de automao residencial
acessvel distncia pela Internet com os dispositivos da casa interligados pelo protocolo CAN. O
sistema se baseia na comunicao entre um computador servidor localizado na residncia que contm
os eletrodomsticos que sero controlados e um navegador cliente com uma interface amigvel que
envia pacotes ao servidor que se encarregar de trat-los. Ao receber Estes pacotes de controle
enviados pelo cliente, o servidor se comunica atravs de uma interface RS-232 com um controlador
mestre, que realiza a codificao dos dados recebidos pelo servidor para o protocolo CAN e transmite
o comando para placas eletrnicas que fazem o acionamento do dispositivo. As placas eletrnicas e o
controlador mestre utilizam microcontroladores 68HC11 da Motorola.
O trabalho em [2] consiste em um sistema porttil direcionado a deficientes surdos-mudos que
converte texto em fala do idioma portugus do Brasil. O sistema engloba a digitao do texto, a
gerao do sinal acstico correspondente fala sintetizada, a amplificao do sinal sonoro e sua
reproduo. O projeto composto por um microcontrolador 8031, um display LCD, uma memria
flash externa e um teclado padro PS/2 alm de circuitos para amplificao e reproduo do som. A
entrada textual feita pelo teclado e visualizada no LCD e os fonemas correspondentes so
armazenados na memria flash. Este processo controlado pelo microcontrolador 8031 que identifica
o texto digitado, seleciona o fonema correspondente armazenado na memria flash externa e passa o
dado digital por um conversor D/A. Enfim, a sada do conversor D/A segue para o circuito de
amplificao e reproduo do sinal sonoro.
O trabalho descrito em [3] apresenta um estudo da viabilidade de implementao de um sistema
embarcado utilizando o microcontrolador 8051. A aplicao trata de um sistema para automao do
gerenciamento de lotao e cobrana de estacionamentos pagos. Durante o projeto foi realizado o
desenvolvimento do hardware de um prottipo funcional do sistema, envolvendo a elaborao de uma
placa controladora e a programao de um firmware em Assembly para o microcontrolador 8051, a
fim de controlar as funes dos perifricos do dispositivo. Foi desenvolvido um software na
plataforma Windows para gerenciar a cobrana e a lotao do ptio, sendo possvel existir mais de um
6
hardware para gerenciar a entrada e sada de veculos e todos conectados por um computador atravs
da interface serial RS-232.
O trabalho apresentado em [4], consiste em um sistema de armazenamento, leitura,
decodificao e reproduo de arquivos de udio no formato MP3. Este trabalho apresenta um
prottipo que armazena e reproduz arquivos de udio MP3 utilizando componentes facilmente
encontrados no mercado, sendo o decodificador MP3 o nico componente especfico e, por isso, no
encontrado facilmente. O controle central do sistema feito atravs de um microcontrolador
ST10F269 (microcontrolador ARM fabricado pela STMicroeletronics) e o arquivo MP3 pode estar
armazenado em um HD, em um carto de memria CompactFlash ou um CD-ROM. A entrada de
comandos feita usando um teclado matricial e a visualizao de mensagens feita atravs de um
LCD.
O trabalho descrito em [5] consiste de um sistema de acesso remoto de dispositivos eltricos. O
acesso remoto feito atravs da Internet por meio de um servidor que recebe pacotes enviados por
navegadores que o acessam para controlar os dispositivos. Ao receber o comando enviado pelo
navegador, um script em PHP atualiza o banco de dados e chama uma rotina java que envia o
comando pela porta serial para uma placa contendo um PIC 16F628 que executa o comando atravs de
rels biestveis que acionam o dispositivo que o usurio requisitou.
O trabalho apresentado em [6] consiste no projeto de um mdulo didtico para uso em cursos de
microcontroladores e teste de prottipos. O mdulo equipado com um microcontrolador 16F877 que
possui: EEPROM, conversor A/D, sada PWM, inteface serial USART e I2C. Alm dos recursos
existentes no PIC, o mdulo didtico conta ainda com: fontes de alimentao de 5V e 12V, teclado
de dados matricial, LCD, 4 displays de 7 segmentos, banco de 8 LEDs, 8 chaves para entrada de
dados, motor DC, EEPROM externa e 2 rels biestveis.
2.3 CONCLUSES DA REVISO BIBLIOGRFICA
Aps realizar uma busca em artigos, trabalhos e produtos com alguma relao com o projeto a
ser elaborado, no foram achados artigos com muita semelhana com o trabalho escolhido como tema.
Sob o ponto de vista de hardware, ele muito simples (como normalmente de se esperar em
um sistema embutido) e no foi necessrio analisar outros esquemas.
Um outro aspecto a ressaltar na reviso bibliogrfica que os sistemas analisados no
apresentaram detalhes suficientes para uma anlise aprofundada.


3 REVISO DAS TECNOLOGIAS UTILIZADAS NO PROJETO
3.1 INTRODUO
Os computadores esto completamente difundidos no nosso quotidiano. No causa surpresa
milhes de computadores serem construdos todo ano e serem destinados a aplicaes diversas. Ou
seja, estes computadores podem executar uma ampla variedade de aplicaes podendo rodar
aplicaes variadas como: jogos, editores de texto, planilhas eletrnicas, etc. Dentro desse grupo de
computadores encontram-se: computadores pessoais (PCs), estaes de trabalho, computadores de
grande porte e servidores. Tais sistemas podem executar uma enorme diversidade de aplicaes para
suprir as necessidades do usurio.
O que passa despercebido que milhes de sistemas computacionais so produzidos todo ano
com um propsito diferente: executar repetidamente uma funo especfica para o qual foram
projetados. Tais sistemas so embutidos (ou embarcados) dentro de sistemas maiores (geralmente
equipamentos eletromecnicos como automveis, fornos de microondas, sistemas de segurana, etc),
razo pela qual so chamados Sistemas Embutidos.
Os sistemas embutidos possuem em seu ncleo um microprocessador, geralmente um
microcontrolador, que carrega dentro de si um software dedicado para executar sua funo. Os
microcontroladores possuem uma grande variedade de recursos, alm de entradas e sadas, tais como:
conversor A/D, EEPROM, memria flash, RTC, Timers, UART, PWM e barramentos especializados
para conectar perifricos (I2C, SPI, USB, etc). Existem diversos fabricantes de microcontroladores e
h famlias de microcontroladores com capacidades diferenciadas entre si.
Embora muitos recursos dos sistemas embutidos estejam disponveis no interior dos
microcontroladores, pode haver a necessidade de uso de dispositivos externos, seja para estender estes
recursos, ou para suprir alguma necessidade no prevista pelo microcontrolador.
A seguir esto dois exemplos de sistemas embutidos:
1. Celulares possuem dentro de si sistemas embutidos que fazem a ligao entre o circuito
de comunicao e o usurio do celular.
2. Muitos eletrodomsticos esto agregando valor com o uso de sistemas embutidos para
criar uma interface mais amigvel e confivel. Por exemplo, a programao e o controle
de um forno de microondas so feitos atravs de um sistema embutido. Da mesma
forma, lavadoras automticas contm sistemas embutidos que ampliam a gama de
opes de lavagem de roupa;
Ao contrrio dos softwares projetados para computadores pessoais (PCs), o software embutido
no pode ser transferido para outro sistema embutido sem mudanas; principalmente por causa das
8
grandes diferenas de hardware, a menos que tenha sido escrito em J ava e o sistema implemente uma
mquina virtual J ava (J VM). Geralmente, o hardware de cada sistema embutido confeccionado
especificamente para a aplicao em questo, com o objetivo de manter o custo baixo. Apesar disso,
os sistemas embutidos possuem algumas caractersticas comuns.
Em geral, os sistemas embutidos possuem um processador e um software. Mas para que o
software exista, deve haver um meio para armazenar o cdigo executvel e dados temporrios gerados
em tempo de execuo. O cdigo geralmente armazenado numa memria flash, que possui uma
maior velocidade de leitura que a EEPROM. Os dados temporrios como passagem de parmetros
para funes, so armazenados na memria RAM.
Entre as principais Caractersticas de Sistemas Embutidos que os diferenciam de computadores
tradicionais, podemos citar:
Consumo de energia - Quanto maior for a freqncia de operao de um sistema, maior
ser o consumo de energia, numa relao quadrtica da freqncia. Como sistemas
embutidos so geralmente projetados para um fim especifico, a freqncia de operao
ser somente a necessria para a execuo da tarefa. Conseqentemente, num sistema
embutido no se busca trabalhar com o maior clock possvel. A quantidade de CIs do
sistema tambm afeta o consumo de energia. Portanto, devem-se utilizar somente os
CIs necessrios para a aplicao.
Baixo custo de produo - Para segmentos que trabalham com produo em massa de
sistemas embutidos, o custo de produo um fator determinante e que passa pelos
projetistas do hardware e das exigncias dos desenvolvedores do software contido no
sistema embutido. Ou seja: quanto maior o custo, maior ser o preo do produto final. O
uso de poucos componentes proporciona uma reduo das dimenses e do custo do
sistema embutido. Alm disso, deve-se considerar o custo destes componentes para se
ter um custo total que seja o menor possvel.
Custo de desenvolvimento e Time-to-Market Sistemas embutidos tm custo de
desenvolvimento menor que sistemas complexos feitos para PCs (jogos3D, sistemas
operacionais, etc), pois geralmente precisam de profissionais menos qualificados e as
ferramentas de desenvolvimento so mais baratas do que aquelas usadas nestes sistemas
complexos. Porm, este custo de desenvolvimento se torna pequeno no custo total caso
seja feita uma produo em massa do sistema embutido. O termo Time-to-market se
refere quantidade de tempo necessria para um produto transitar da concepo at o
mercado ao qual ele dirigido. Assim, quanto menor este tempo, menor ser o custo de
desenvolvimento. O uso de ferramentas computacionais de apoio a projeto colabora
drasticamente para a reduo deste tempo.
9
Quantidade produzida - A relao entre o custo de produo e o custo de
desenvolvimento afetada pelo nmero de unidades a serem produzidas e vendidas. Por
essa razo, geralmente indesejvel desenvolver componentes de hardware
customizados para um baixo volume de produo. Por outro lado, para produo em
massa, pode ser til a produo de componentes e ferramentas prprias personalizadas
para diminuir o custo de produo.
O desenvolvimento de sistemas embutidos, assim como outros sistemas, deve seguir uma
metodologia pr-estabelecida para gerar um produto com menores margens de erro e que atendam com
maior preciso seu objetivo. Uma metodologia de projeto importante por trs razes. Primeiro, ela
permite manter um registro do que deve ser realizado para garantir que todas as etapas sejam
executadas da melhor forma com menor tempo. Segundo, ela facilita a escolha de Softwares de auxlio
ao projeto, ao considerar somente uma etapa do processo. Terceiro, uma metodologia de projeto
facilita a comunicao entre os membros de uma equipe de desenvolvimento. A equipe pode
compreender mais facilmente o que deve ser feito, o que deve ser recebido de outras equipes e o que
ela deve realizar aps o cumprimento da tarefa.
A figura 1 exibe as etapas de um processo de projeto para Sistemas Embutidos. No topo, h os
requisitos do sistema, onde descrito o que o projeto deve realizar sem se especificar como. A etapa
de requisitos serve para capturar as necessidades do cliente. Aps os requisitos, h a especificao do
projeto, onde criada uma descrio mais detalhada com foco no comportamento do sistema para
compreenso da equipe de desenvolvimento. O detalhamento interno do sistema (como construir)
iniciado no desenvolvimento da arquitetura, que fornece a estrutura do sistema em termos de
componentes. Uma vez que se conhecem os componentes necessrios, pode-se projetar estes
componentes, incluindo software e algum hardware especializado que se faa necessrio. Baseado
nestes componentes realizada a integrao do sistema, onde construdo o sistema completo.
10

Figura 1 - Nveis de abstrao do processo de desenvolvimento de sistemas embutidos
3.2 CARACTERSTICAS GERAIS DA FAMLIA DE
MICROCONTROLADORES PIC UTILIZADA
Um microcontrolador um dispositivo (single chip) que incorpora todos os componentes
bsicos de um computador tradicional, em escala bastante reduzida. A principal conseqncia do
pequeno tamanho do microcontrolador a limitao de seus recursos, se comparados com os
oferecidos por computadores tradicionais. Em termos funcionais, um microcontrolador um
dispositivo programvel que controla um processo ou sistema. Os microcontroladores so projetados
para possibilitar solues de baixo custo e portanto, seu uso pode reduzir drasticamente o custo e o
tamanho fsico de um projeto.
Os microcontroladores podem conter diversos perifricos, porm possuem algumas
caractersticas comuns. A primeira caracterstica uma memria no-voltil para armazenamento do
programa, sendo mais comum o uso da memria flash. Uma outra caracterstica comum uma
memria RAM para manipular dados em tempo de execuo como vetores temporrios e parmetros.
Por fim, alm dos perifricos presentes, h portas de E/S que fazem a comunicao com o meio
externo. Na figura 4 h um esquema simplificado do microcontrolador PIC 16F64 [13] que possui
interface serial, conversor A/D, temporizador, contador e watchdog timer; para ilustrar a discusso
feita at este momento.
11


Figura 2 Um esquema simplificado do microcontrolador 16F64
O desenvolvimento do software embutido para microcontroladores realizado atravs de
computadores tradicionais que funcionam como plataformas de desenvolvimento onde, com os
recursos disponveis, possvel editar, compilar e simular este software desenvolvido.
Alm do desenvolvimento do software, a plataforma de desenvolvimento deve possibilitar a
programao do microcontrolador (ou carga do cdigo objeto no microcontrolador) atravs de um
perifrico, que chamado de programador do dispositivo, o qual se conecta ao computador onde est o
cdigo a ser gravado. Essa conexo pode ser feita de vrias formas, porm as mais comum so o uso
das interfaces seriais RS-232 ou USB. A ligao entre o cdigo a ser gravado e o programador que
contm o microcontrolador de destino feita atravs de um software que carrega o cdigo-objeto e
realiza a programao do dispositivo atravs de um protocolo estabelecido para tal. Este software
chamado de programa de gravao do microcontrolador.
A depurao do programa carregado no microcontrolador no to simples, dispondo-se apenas
de impresses de variveis no display para depurar. Existem sistemas de depurao, mas geralmente
so muito caros.
12
Microcontroladores PIC - Peripherical Interface Controller- (PICmicro) a denominao dada
famlia de microcontroladores fabricados pela Microchip Technology com extensa variedade de
modelos e perifricos internos, com arquitetura Harvard e conjunto de instrues RISC. Os
microcontroladores PIC tm famlias de 12 bits, 14 bits e 16 bits de ncleo de processamento e
trabalham com velocidades desde 32KHz at 40 MHz usando ciclo de instruo de quatro perodos de
clock, o que permite uma velocidade de no mximo 10 MIPS. Os microcontroladores PIC funcionam
com tenses de alimentao de 2 a 6V, possuem de 6 a 100 pinos em diversos encapsulamentos
(SOT23, DIP, SOIC, TQFP, etc) e memria flash que pode ir de 4Kbytes 128Kbytes.
Alguns recursos comuns em microcontroladores da linha PIC so:
Watchdog timer - O watchdog timer consiste num contador incrementado
automaticamente quando habilitado e que, quando acontece o estouro do seu contedo
(passagem do mais alto valor para o mais baixo), o microcontrolador ser resetado. Este
recurso usado para evitar que o microcontrolador trave em situaes no-previstas em
que o software embutido fica preso. Com isso, o sistema que emprega o
microcontrolador fica menos suscetvel a falhas na execuo do software.
Brown-out detect - O circuito de brown-out presente em alguns modelos de
microcontroladores utilizado para forar um reset quando a tenso de alimentao
sofre uma pequena queda. Ele extremamente recomendado em projetos onde comum
o rpido desligamento e religamento da alimentao. Nestes casos, o brown-out pode
evitar problemas de reinicializao. Para que o microcontrolador execute suas
instrues com sucesso, a tenso de alimentao deve sempre ficar acima de um valor
mnimo. Quando essa tenso cai abaixo de um nvel mnimo, o microcontrolador poder
executar algumas instrues incorretamente. O resultado uma atividade inesperada das
linhas e dados internos de controle, que pode causar perdas ou alteraes nos registros e
estado das portas do microcontrolador. Para evitar estes problemas, o microcontrolador
deve ser impedido de executar suas tarefas nos perodos de tenso de alimentao
insuficiente. A melhor maneira de garantir isso com o uso de um detector de baixa
tenso que fora o microcontrolador a ficar em estado de reset enquanto a tenso no
ficar acima do mnimo desejvel.
Conversor A/D e comparador - Uma E/S analgica pode receber sinais analgicos
(geralmente nveis de tenso) e, atravs de perifricos internos; disponibilizar essa
informao na forma digital para uso pelo microcontrolador. Essa converso analgico-
digital geralmente feita atravs da representao digital do dado ou atravs da
comparao do sinal analgico com um nvel de comparao estabelecido. Alguns
13
microcontroladores disponibilizam sadas analgicas para controle de dispositivos que
se utilizam dessa forma de sinal.
Perifricos para protocolos estabelecidos - Muitos microcontroladores possuem
perifricos que implementam protocolos padronizados. Assim, alguns
microcontroladores possuem recursos prprios para acessar dispositivos externos que
funcionam baseados em protocolos estabelecidos. Alguns dos protocolos encontrados
no hardware de microcontroladores so: I2C, Microwire, CAN, SPI, RS-232, RS-485,...
Timer/Counter - Outro perifrico muito comum em microcontroladores o contador
que registra o nmero de vezes que ocorreu uma transio positiva ou negativa em um
pino de I/O do microcontrolador, podendo gerar uma interrupo quando ocorrer um
overflow no contador ou quando atingir um nmero determinado de transies. Um
timer um contador que incrementado ou decrementado numa taxa fixa dada pelo
circuito que gera o pulso de clock do microcontrolador, podendo gerar interrupes da
mesma forma que o contador. O timer utilizado geralmente para contagem de tempo e
sincronismo. Em muitos microcontroladores o timer e o counter so perifricos que so
intercambiveis, ou seja, um contador pode funcionar com timer ou vice-versa,
bastando que o mesmo seja configurado por software.
Interrupes - Uma interrupo um evento que suspende a operao regular do
programa enquanto o evento atendido por um outro programa. A ocorrncia de
interrupes aumenta a velocidade de resposta a eventos externos e evita a
monopolizao do processador por um s processo. Os microcontroladores podem ter
diversas fontes de interrupes diferentes, que incluem: eventos externos, timer,
watchdog timer, brownout detect, etc. Quando uma interrupo solicitada, a operao
corrente suspensa, a interrupo identificada e o microcontrolador executa uma
rotina de interrupo chamada ISR (interrupt service routine).
3.2.1 MICROCONTROLADORES UTILIZADOS NO PROJETO
Desde o inicio dos anos 80, os fabricantes de microcontroladores tm lanado diversos
microcontroladores diferentes, com uma ampla variedade de recursos. A maioria destes
microcontroladores foi criada para atender demandas prprias dessas empresas por produtos que elas
comercializam ou so direcionados a segmentos especficos como telefonia celular, eletrodomsticos,
brinquedos, entre outros. Poucos projetos so dedicados a um uso mais geral.
A Microchip, que produz os microcontroladores PIC, se dedica ao projeto de
microcontroladores sem foco numa aplicao especifica. Por conta disso e da vasta documentao
14
disponvel no site da empresa (http://www.microchip.com/), vrias ferramentas de desenvolvimento
para PICs foram produzidas e disponibilizadas gratuitamente na Internet.
Microcontroladores 18F452 e 18F4620
O desenvolvimento deste projeto iniciou-se com o uso do PIC 18F452 [14], porm no decorrer
do projeto, o 18F452 apresentou pouca memria para acomodar todas as funes previstas no sistema
de estacionamento. Devido a isso, optou-se pelo uso do microcontrolador 18F4620 [15]. O 18F4620
bastante semelhante ao 18F452, sendo que, enquanto o 18F452 possui 16Kinstrues de memria de
programa, o 18F4620 possui 32Kinstrues de memria de programa. No entanto, o uso do 18F452
no foi totalmente descartado, pois o 18F452 til para outras aplicaes que podem ser usadas no
mesmo hardware, sendo este hardware genrico o suficiente para outras aplicaes. A comparao
entre estes dois PICs est representada na tabela 1 e na figura 3. Aps isso, feita uma descrio dos
principais recursos disponveis nestes PICs.
Caractersticas PIC18F452 PIC18F4620
Freqncia mxima 40 MHz 40 MHz
Memria de programa (Bytes) 32K 64k
Memria de programa (instrues) 16384 32768
Memria de dados (Bytes) 1536 3968
EEPROM interna (Bytes) 256 1024
Portas de I/O Ports A, B, C, D, E Ports A, B, C, D, E
Timers 4 4
Mdulos Capture/Compare/PWM 2 2
Comunicao serial 1 USART 1USART
Porta paralela escrava 1 PSP 1 PSP
Mdulo conversor A/D 8 canais de entrada de 10 bits 13 canais de entrada de 10 bits
Brown-out Reset programvel Sim Sim
Conjunto de instrues 75 instrues 83 instrues
Encapsulamento
DIP com 40 pinos
PLCC com 44 pinos
TQFP com 44 pinos
PDIP com 40 pinos
PLCC com 44 pinos
TQFP com 44 pinos
Tabela 1 Caractersticas do 18F452 e 18F4620
15

Figura 3 Pinagem do 18F452 e do 18F4620
Alguns detalhes dos microcontroladores 18F452 e 18F4620 so:
Configurao do oscilador - O 18F452 pode operar em oito modos diferentes de
oscilao programveis pelo usurio e o 18F4620 em dez. So estes:
o LP: Cristal operando em baixas freqncias (32 kHz e 200 kHz)
o XT: Cristal operando em mdias freqncias (1MHz e 4 MHz)
o HS: Cristal operando em altas freqncias (20 MHz e 40 Mhz)
o HS+PLL: Cristal operando junto com um PLL (phase locked-loop) interno para
multiplicar a freqncia de operao por 4 (til para eliminar interferncias
eletromagnticas encontradas quando se fizer necessrio)
o RC: Uso de um resistor e um capacitor para gerar o clock de operao
o RCIO: Uso de um resistor e um capacitor para gerar o clock de operao com
liberao do pino OSC2 do PIC para I/O digital
o EC: Clock gerado por algum circuito externo (til para sincronizar sistemas)
o ECIO: Clock gerado por algum circuito externo com liberao do pino OSC2
para I/O digital.
o INTIO1: Clock de at 8 Mhz, gerado internamente pelo PIC (Menos preciso e
disponvel apenas no 18F4620) com sada de clock em RA6 e I/O em RA7
o INTIO2: Clock de at 8 Mhz, gerado internamente pelo PIC (Menos preciso e
disponvel apenas no 18F4620) com sada de clock em RA7 e I/O em RA6
E/S - O 18F452 e o 18F4620 possuem cinco portas disponveis. O 18F452 tem trs
portas com oito bits, uma porta com seis bits e outro porta com trs bits. O 18F4620 tem
quatro portas de oito bits e uma porta de quatro bits. Alguns pinos dessas portas so
16
multiplexados com perifricos internos, como: I2C, USART, conversor A/D, etc. Em
geral, quando o perifrico est habilitado para uso atravs de registradores, o pino no
pode ser usado como I/O de uso geral.
Memria de programa flash - A memria flash, onde est o cdigo executvel, pode ser
lida, escrita e apagada durante a operao normal do 18F452 e do 18F4620. A memria
flash contida nestes microcontroladores pode ser lida byte a byte, escrita em blocos de
oito bytes e apagada em blocos de sessenta e quatro bytes. A operao de busca de
instruo pausada enquanto a memria flash estiver sendo escrita ou apagada durante
a operao normal.
EEPROM interna - A EEPROM interna dos dois PICs utilizados no projeto podem ser
lidas e escritas em operao normal e tambm escritas e lidas durante a programao do
dispositivo. Como observado na tabela 1, o 18F452 tem 256 bytes disponveis na
EEPROM interna e o 18F4620 tem 1024 bytes.
Timers/Counters - O 18F452 e o 18F4620 possuem quatro timers/counters
(temporizador/contador) que podem ser configurados com diferentes configuraes. No
modo timer, o registrador associado ao timer incrementado quando ocorrer um
determinado nmero de transies de clock que determinado pelo valor do registrador
de prescale. No modo counter, o registrador incrementado quando ocorrerem pulsos
em um pino estabelecido para este perifrico.
Mdulo MSSP - O mdulo MSSP (Master Synchronous Serial Port) um perifrico
presente no 18F452 e no 18F4620 til para comunicao serial com outros dispositivos.
O mdulo MSSP pode realizar essa comunicao utilizando o protocolo I2C ou o SPI.
Mdulo USART - O mdulo USART (Universal Synchronous Asynchronous Receiver
Transmitter) outro perifrico destinado comunicao serial presente no 18F452 e no
18F4620. O mdulo USART pode ser configurado para realizar comunicao serial,
full-duplex e assncrona, para enviar e receber dados de terminais e computadores
pessoais.
3.4 COMPONENTES EXTERNOS UTILIZADOS NO PROJETO
3.4.1 EEPROM 24C32
A EEPROM 24C32 [16] contm 32.768 bits organizados em 4096 palavras de 1 byte fornecidos
atravs do protocolo I2C. Podem ser conectados at 8 destes CIs no barramento, desde que sejam
identificados com configuraes diferentes atravs dos pinos A0, A1 e A2.
17
Na figura 4, os pinos VCC e GND fornecem a alimentao (+5V e 0V); os pinos A0, A1 e A2
fornecem uma identificao para mltiplas memrias conectadas no barramento I2C; os pinos SCL e
SDA so as linhas de clock e dados que devem ser conectado ao barramento I2C e o pino WP a
proteo de escrita (desabilita escrita na EEPROM quando em nvel 1).

Figura 4 - Pinagem da EEPROM 24C32
A figura 5 exemplifica o endereo do 24C32. O primeiro nibble (4 bits mais significativos)
fixo em 0x8 para identificar uma das EEPROM que podem estar conectadas ao barramento I2C. O
segundo nibble contm a identificao da EEPROM e a natureza da operao que ser realizada
(leitura ou escrita).

Figura 5 Identificao da EEPROM
Para escrita na EEPROM, o mestre do barramento deve enviar aps a condio de incio, o
endereo da EEPROM que ser escrita com o ltimo bit em nvel 0 para identificar a operao como
escrita. Aps o bit de reconhecimento da EEPROM, o mestre deve enviar dois bytes correspondentes
posio em que o dado ser escrito. Em seguida, enviado o dado que ser escrito. Caso o mestre
queira escrever dados consecutivos, basta enviar mais dados aps a condio de reconhecimento, os
quais sero escritos seqencialmente na EEPROM. Por fim, o mestre realiza uma condio de parada.
A leitura na EEPROM segue um procedimento parecido com a escrita. A diferena o bit de
identificao da operao que 1 para indicar uma leitura. A EEPROM envia os dados para o
mestre aps o fornecimento do endereo de leitura pelo mestre. Caso o mestre deseje ler dados
seguidos na EEPROM, basta fornecer uma condio de reconhecimento. Para encerrar a leitura, ele
no executa essa condio de reconhecimento e realiza uma condio de parada.
3.4.2 RAM 62256
O CI 62256 [17] uma memria RAM de 256KBits organizada em 32K palavras de 8 bits. De
acordo com a figura 6, alm dos pinos de alimentao (VCC e VSS), a memria possui: barramento de
endereo (A0 A13); barramento de dados (IO1 IO8); habilitao de sada (OE); habilitao de
escrita (WE) e habilitao do CI (CE).
18

Figura 6 Pinagem do 62256
3.4.3 MAX 232
O RS-232 uma interface definida pela EIA (Electrical Industries Association) e equivalente ao
CCITT-V24 para comunicao serial em que os nveis de tenso dos sinais transmitidos e recebidos
diferem do padro TTL. O nvel lgico 0 definido como uma tenso de +3V +12 V e o nvel lgico
1 definido como uma tenso entre -3V -12V para dados. Para sinais de controle, uma tenso entre
+3V e +12V representa o nvel lgico 1 e uma tenso entre 3V e 12V representa o nvel lgico
0.
Uma interface de comunicao que segue o padro RS-232 importante para um sistema
microcontrolado porque seu uso muito comum em computadores pessoais e sua utilizao nestes
sistemas possibilita uma comunicao com estes computadores. No entanto, a grande maioria dos
sistemas microcontrolados segue padres TTL, de forma que para se trabalhar com o padro RS-232
deve ser usado um circuito que faa a converso entre os padres RS-232 e TTL. Tal circuito consiste
no MAX232, o qual transforma a fonte positiva de +5V em +5V e 5V, atravs de um oscilador e de
circuitos de chaveamento e ilustrado na figura 7..
19

Figura 7 Diagrama do CI MAX232
3.4.4 PCF 8583
O PCF 8583 [18] um chip RTC (Real-time clock) que armazena e atualiza a hora e a data com
base na oscilao de um cristal de 32.768 KHz. A escolha deste RTC produzido pela Philips, Inc
deveu-se ao fato de o PCF8583 usar o protocolo I2C para receber dados referentes a hora e a data e
fornecer a hora e a data atuais. Assim, feita uma economia dos pinos usados no microcontrolador.
Um esquema prtico de utilizao do PCF8583 est na figura 8. Quando o circuito estiver
ligado, o PCF8583 alimentado pela fonte deste circuito. Porm quando o circuito desligado, a
alimentao fornecida pela bateria BT1. Este chaveamento feito pelos diodos D1 e D2. Alm dos
pinos para o cristal oscilador (OSCI e OSCO), dos pinos de alimentao (VCC e GND) e dos pinos
referentes ao barramento I2C (SDA e SCL), h o pino INT que ativo caso uma hora e uma data
programada estiver sido alcanada.
Caso a bateria no circuito da figura 8 acabe, deve se configurar a hora e a data todas as vezes
que se ligar o circuito, pois a memria RAM contida no PCF8583 apagar no desligamento do
sistema. Isso acontece at que a bateria seja trocada por uma nova.

Figura 8 Esquema de utilizao do PCF 8583
20
3.4.4 LCD
O visor LCD empregado da Hitachi e apresenta uma interface de sada muito utilizada em
sistemas microcontrolados. Visores LCD so especificados pelo nmero de linhas e colunas que eles
possuem, havendo LCDs com vrias linhas e colunas. O visor utilizado apresenta 2 linhas por 40
colunas.
Os mdulos podem ser encontrados com LED backlight (com uma iluminao de fundo) para
facilitar sua leitura. Neste caso, a alimentao deste LED faz-se normalmente pelos pinos 15 e 16. A
corrente de alimentao deste LED varia de 100 a 200mA, dependendo do modelo.
Estes mdulos utilizam um controlador prprio chamado HD44780 [19]. Este controlador
estabelece uma comunicao com o sistema microcontrolado e executa a ao requerida no LCD
propriamente dito. A tabela 2 fornece uma descrio da pinagem padro do LCD.
Pino Funo Descrio
1 Alimentao Terra ou GND
2 Alimentao VCC (+5 v)
3 V0
Tenso para ajuste de contraste atravs de um potencimetro
ligado a este pino.
4 RS Seleo: 1 - Dado, 0 - Instruo
5 R/W Seleo: 1 - Leitura, 0 - Escrita
6 E Chip select 1 - Habilita, 0 - Desabilitado
7 B0 LSB
8 B1

9 B2

10 B3

11 B4

12 B5

13 B6

14 B7 MSB
Barramento de Dados
15 A (qdo existir) Anodo p/LED backlight
16 K (qdo existir) Catodo p/LED backlight
Tabela 2 Pinagem padro do LCD
Comandos so enviados para o controlador HD44780 atravs do barramento de dados. Esta
comunicao pode ser feita byte a byte ou nible (4 bits) a nible. Caso seja usada a comunicao nible a
nible, utilizam-se somente os pinos 7 ao pino 10 do barramento, havendo uma economia de pinos de
E/S do microcontrolador.
21
3.3 PROTOCOLOS UTILIZADOS NO PROJETO
3.3.1 PROTOCOLO I2C
O I2C um protocolo sncrono de duas linhas, sendo uma linha de clock (chamada SCL) e outra
linha de dados (chamada de SDA). Graas especificao das sadas em coletor (ou dreno) aberto, o
protocolo permite a ligao de diversos componentes nas mesmas linhas, formando uma rede de
comunicao de dispositivos. A quantidade de dispositivos que podem ser conectados no barramento
limitada apenas pela capacitncia mxima admitida que de 400pF segundo a especificao. Como
todos os dispositivos conectados ao barramento esto em paralelo, cada um deles adiciona uma
capacitncia definida pelo seu circuito.
O I2C um protocolo sncrono do tipo mestre-escravo, mas tambm suporta multi-mastering,
ou seja, a presena de diversos mestres presentes no barramento, sendo que somente um pode estar
ativo por vez.
Os princpios de funcionamento do I2C so:
A informao presente na linha de dados (SDA) somente lida durante a fase alta da
linha de clock (SCL);
Somente permitido alterar o nvel da linha de dados (SDA) durante a fase baixa da
linha de clock (SCL);
Quando o barramento no est em uso, ambas as linhas permanecem desligadas e so
foradas em nvel 1 pelos resistores de pull-up.
No incio da transmisso, o dispositivo fora a linha SDA de 1 para 0, durante a fase alta da
linha SCL, indicando a todos os componentes presentes no barramento que uma transmisso ter
incio. Este processo chamado de condio de incio. O fim da transmisso (condio de parada)
consiste na transio de 0 para 1 da linha SDA durante a fase alta da linha SCL.
Aps a condio se incio, so transmitidos oito bits de dados, iniciando pelo MSB. Aps o
ltimo bit (LSB) o receptor deve gerar uma condio de reconhecimento, o que feito colocando a
linha SDA em 0 antes do nono pulso de clock da linha SCL. Caso o receptor no reconhea o dado,
mantendo a linha SDA em 1 aps o nono pulso, o transmissor deve gerar uma condio de parada e
reiniciar a transmisso.
Para a coexistncia de diversos dispositivos em um mesmo barramento, necessrio que cada
um possua uma identificao. O formato bsico de uma identificao I2C constituda por 7 bits de
endereo, utilizados para especificar o dispositivo escravo a ser acessado e, aps essa identificao
segue-se um bit identificador de leitura ou escrita.
22
Dessa forma, aps o envio da identificao do escravo pelo mestre e da condio de
reconhecimento pelo escravo, o mestre pode enviar e receber dados do escravo. Terminada a
comunicao, segue-se uma condio de parada. Este processo demonstrado na figura 9.

Figura 9 Comunicao I2C
3.3.2 PROTOCOLO DE COMUNICAO PARA TECLADO PS/2
O protocolo para comunicao com o teclado PS/2 um protocolo serial, sncrono e
bidirecional. Ou seja, o teclado pode enviar informaes para o computador e o computador pode
enviar informaes para o teclado serialmente atravs de uma linha de dados, a qual chamada de
KBD_DATA. O sincronismo feito atravs de uma linha de clock, que chamada de KBD_CLOCK.
Ambas as linhas so conectadas a resistores de pull-up.
A alimentao para o teclado provida pelo conector, de forma que alm das linhas
KBD_DATA e KBD_CLOCK, o conector tem duas linhas para alimentao (+5V e terra), que
fornecida pelo computador.
O teclado pode enviar informaes para o computador sempre que as linhas KBD_CLOCK e
KBD_DATA estiverem em nvel 1 pelos resistores de pull-up. Caso o computador coloque a linha
KBD_CLOCK em nvel 0, o teclado cria um buffer com as informaes que devem ser enviadas ao
computador at que o mesmo termine de enviar. Isso acontece porque o computador tem prioridade na
comunicao.
De acordo com a figura 10, a transmisso de informaes do teclado para o computador
realizada atravs de 11 bits transmitidos pela linha KBD_DATA e sincronizados por KBD_CLOCK
numa freqncia de 20 kHz a 30 kHz estabelecida pelo teclado. O primeiro bit transmitido pelo
teclado o bit de incio (nvel 0), seguido por 8 bits de dados ou comandos (do LSB at o MSB).
Aps os dados, segue-se um bit de paridade (paridade impar) e um bit de parada em nvel 1. Cada
bit lido pelo computador na transio de descida do clock gerado pela linha KBD_CLOCK.
23

Figura 10 Comunicao do teclado com o computador
De acordo com a figura 11, quando o computador precisa enviar comandos para o teclado, ele
coloca a linha KBD_CLOCK em nvel 0 por aproximadamente 60us. Aps isso, o computador
coloca a linha KBD_DATA em nvel 0 e libera a linha KBD_CLOCK para que o teclado gere o
clock. Aps a primeira transio de descida do clock, o computador envia os 8 bits de comando (do
LSB at o MSB) seguido pelo bit de paridade (paridade mpar). Aps o bit de paridade, o computador
libera a linha KBD_DATA e aguarda o bit de reconhecimento do comando provido pelo teclado na
prxima transio de descida.

Figura 11 Comunicao do computador com o teclado
Dentre os comandos enviados para o teclado esto: acender ou apagar LEDs de status do
teclado (NUM LOCK, CAPS LOCK e SCROLL LOCK), estabelecer taxa de repetio da digitao do
teclado, habilitar ou desabilitar o teclado e reiniciar o teclado.
Alm dos cdigos das teclas pressionadas ou soltas, o teclado pode enviar comandos para
indicar certas situaes para o computador como: reconhecimento de comandos, erro ou estouro de
buffer e pedido de reenvio de comando.
3.4 SOFTWARES E PROGRAMADORES DE MICROCONTROLADORES
UTILIZADOS NO PROJETO
3.4.1 SOFTWARES UTILIZADOS
O aumento do poder de processamento dos computadores e a criao de linguagens de alto nvel
tm proporcionado a criao de sofwares cada vez mais rpidos e sofisticados. Estes fatores
ocasionaram uma maior difuso de softwares produzidos com o intuito de auxiliar projetos.
24
Os softwares utilizados neste trabalho consistem de:
Compilador CCS [20] Este compilador foi utilizado inicialmente no
desenvolvimento do sistema e oferece algumas vantagens em relao ao compilador
HITECH PICC-18 descrito a seguir, como por exemplo, possuir algumas bibliotecas
para LCD, para EEPROM, RTC, etc. No entanto, ele no um compilador ANSI-C.
Alm disso, ele se mostrou ineficaz na gerao de algumas funes. Por exemplo, a
funo delay_ms() implementada in-line em vez de chamar uma rotina, gerando um
enorme nmero de NOPS para atrasos grandes, e gastando memria
desnecessariamente.
Compilador HITECH PICC-18 [21] Este um compilador C para
microcontroladores da linha PIC pertencentes a famlia PIC18. O HITECH PICC-18
Compiler um compilador ANSI-C que possui integrao com o MPLAB, que um
ambiente de desenvolvimento integrado (IDE) fornecido pela Microchip. Este
compilador se mostrou mais eficiente que o CCS.
Simulador ISIS Proteus [22] Para a construo do esquemtico e a simulao inicial
do sistema foi utilizada a ferramenta ISIS Proteus. Este software possui bibliotecas
com microcontroladores PIC, LCDs, EEPROMs, RTCs, etc; disponveis para projeto
e simulao, sendo possvel carregar o cdigo gerado pelo compilador no componente
do microcontrolador no ISIS Proteus e simular sua iterao com os outros
componentes. Alm disso, o ISIS Proteus permite depurar o cdigo, acompanhando
passo-a-passo como o cdigo interage com o microcontrolador e outros componentes
do projeto. O ISIS PROTEUS foi usado no incio do projeto e, posteriormente, no foi
mais possvel us-lo porque ele no simulava todos os componentes empregados.
IDE MPLAB [23] - O MPLAB um ambiente de desenvolvimento integrado para
compiladores baseados em microcontroladores PIC. O MPLAB desenvolvido pela
Microchip e possui compatibilidade com o compilador HITECH PICC 18, facilitando
sua utilizao. O MPLAB possui um editor de cdigos e permite depurar o cdigo
gerado, alm de permitir programao direta do PIC.
Programador ASIX UP [24] O software de programao ASIX UP faz a
comunicao com o programador Presto que est conectado ao microcontrolador PIC e
conecta-se ao computador atravs da interface USB. Este software permite carregar o
cdigo-objeto gerado pelo compilador e envi-lo ao programador do microcontrolador,
o qual realiza a gravao deste cdigo nele.
25
3.4.2 PROGRAMADOR UTILIZADO
Para realizar a programao dos microcontroladores utilizados no projeto foram necessrios
dispositivos que fizessem a gravao do programa a ser executado nos microcontroladores. Estes
dispositivos consistem nos programadores.
O programador utilizado no incio do projeto foi o McFlash desenvolvido pela Mosaico
Engenharia, Ltda. Este programador no abrange uma grande gama de PICs, porm programa o
18F452, que foi o primeiro PIC utilizado no projeto. No entanto, ao se optar pelo PIC 18F4620, o
McFlash teve que ser substitudo pelo programador PRESTO, que comercializado pela ASIX, Inc. O
Presto um dispositivo de gravao via USB e dentro da gama de componentes que o Presto pode
gravar, encontram-se: Microcontroladores PIC, ATMEL e AVR, alm de EEPROMs seriais (24LCxx,
93LCxx e 25Cxx). A gama de microcontroladores PIC com que este programador trabalha bem
maior que a do McFlash e abrange o 18F4620. Alm disso, este programador permite a gravao In-
Circuit, eliminando a necessidade de retirada do circuito para programao do microcontrolador.
3.5 UML
A UML a linguagem padro para especificar, visualizar, documentar e construir artefatos de
um sistema e pode ser utilizada com todos os processos ao longo do ciclo de desenvolvimento e
atravs de diferentes tecnologias de implementao [25].
A UML disponibiliza uma forma padro de modelagem de projetos de Sistemas, incluindo seus
aspectos conceituais, tais como: processos de negcios e funes do sistema, alm de itens concretos
como as classes escritas em determinada linguagem de programao, processos de banco de dados e
componentes de software reutilizveis.
Dentro da especificao UML foi utilizada no projeto a anlise de requisitos, onde se capturam
as intenes e necessidades dos usurios do sistema a ser desenvolvido. A anlise de requisitos
descreve as necessidades e desejos de um determinado sistema. O princpio bsico da anlise de
requisitos identificar e documentar o que realmente necessrio, desta forma comunicando a todos
os envolvidos no projeto, da forma mais clara possvel, de maneira no-ambgua os requisitos de modo
que os possveis riscos sejam identificados. Um exemplo de parte da descrio do sistema utilizando a
anlise de requisitos apresentado no captulo 4



4 CONCEPO E PROJETO DO SISTEMA
4.1 INTRODUO
Este captulo apresenta a concepo e o projeto do sistema como um todo (software+hardware),
iniciando pela apresentao e descrio das funes operacionais e dos requisitos de um sistema de
estacionamento. O sistema de estacionamento foi desenvolvido pela equipe do grupo de pesquisa em
Sistemas Embutidos do NCE/UFRJ , do qual tambm participaram os alunos do curso de cincia da
computao: Daniel da Cunha Schmidt, Raphael Azevedo Silva e Vinicius Santos Silva. O nosso
papel no software foi participar na elaborao do documento de especificao de requisitos em UML e
prover todas as funes bsicas de entrada e sada do sistema. Esta aplicao foi escolhida por ser
razoavelmente complexa para testar o hardware apresentado, incluindo a implementao de um
sistema de arquivos tipo FAT baseado numa implementao feita para o Zilog [26].
4.2 FUNES E REQUISITOS DE UM SISTEMA DE ESTACIONAMENTO
A etapa inicial na concepo do sistema de estacionamento consistiu em analisar as
funcionalidades que devem ser executadas por um sistema de estacionamento e, atravs dessas
funcionalidades, realizar uma anlise mais profunda delas, onde so gerados o fluxo normal e as
excees da funo, ou seja, os possveis fluxos diferentes do fluxo normal de execuo da funo
analisada. Este processo chamado de Anlise de Requisitos e foi desenvolvido atravs de reunies,
onde a equipe envolvida no projeto do estacionamento discutia e executava essa etapa inicial.
Paralelamente a este processo, surgiram termos que, para evitar ambigidade, foram definidos em um
glossrio para posterior consulta. Este glossrio encontra-se no apndice C e seu uso importante para
entendimento das funes e dos requisitos gerados. A seguir, est a lista dos requisitos analisados, os
quais foram implementados no sistema de estacionamento.
Requisitos sucintos que o sistema deve atender:
1. Operador do terminal libera a entrada de um cliente do estacionamento no ptio.
2. Operador do terminal libera a sada de um cliente do estacionamento.
3. Operador do terminal realiza abertura de caixa.
4. Operador do terminal realiza entrada de caixa.
5. Operador do terminal realiza sada de caixa.
6. Operador do terminal lista os automveis presentes no ptio.
7. Operador do terminal lista a tabela de preos.
8. Operador do terminal troca o nvel de acesso (operador/gerente/root).
27
9. Operador do terminal imprime a tabela com cdigos das marcas.
10. Gerente inclui itens na tabela de marcas.
11. Gerente remove itens na tabela de marcas.
12. Gerente edita itens na tabela de marcas.
13. Gerente inclui novos clientes mensalistas no sistema.
14. Gerente remove clientes mensalistas do sistema.
15. Gerente edita cadastro de clientes mensalistas.
16. Gerente configura a tabela de preos.
17. Gerente configura o cabealho e o rodap dos tickets de entrada, sada e recibo.
18. Gerente configura a data e a hora do Sistema.
19. Gerente inclui operadores no sistema.
20. Gerente edita o cadastro de operadores do sistema.
21. Gerente remove operadores do sistema.
Requisitos detalhados:
Para ilustrar o detalhamento existente no documento de requisitos, que se encontra no apndice
D, segue-se a descrio dos requisitos 2 e 18.
Requisito2:
Fluxo normal:
o O display exibe:
Entrada:
Placa: Cod.Marca:
o O operador digita a placa do automvel e pressiona enter;
o O operador digita o cdigo de 3 dgitos associado a marca do automvel;
o Assim que o operador digita o cdigo de 3 dgitos da marca do automvel o sistema
exibe, aps o cdigo digitado, a marca associada;
o O operador verifica que a marca do automvel est correta e pressiona enter;
o O sistema imprime o ticket de entrada;

28
Excees:
o A placa digitada pelo operador incorreta.
Ao: o campo Placa no display limpo e o sistema fica esperando o operador
digitar uma nova placa.
o O cdigo de marca digitado pelo operador incorreto, i.e., o cdigo digitado no est
cadastrado na tabela de marcas.
Ao: o sistema exibe logo frente o campo Marca a mensagem Cdigo Invlido e
fica esperando o operador digitar um novo cdigo.
o O operador verifica que o cdigo digitado no confere com a marca exibida no display
pelo sistema.
Ao: operador pressiona Backspace. O sistema limpa o campo Marca. O
operador digita um novo cdigo de marca e pressiona enter.
o O operador tenta dar entrada em um automvel que j est no ptio.
Ao: O sistema exibe a mensagem: Automvel j no estacionamento; O operador
pressiona enter ou backspace; Sistema apaga os campos Placa e Marca e espera
o operador digitar uma nova Placa e Marca.
o O operador digita um Cdigo de Mensalista no campo Placa.
Ao: O sistema exibe a mensagem: Mensalista? (S/N)
O operador digita S ou s.
Ao: O sistema associa o cdigo placa da tabela de mensalistas, d entrada e
imprime o ticket de entrada.
O operador digita N ou n.
Ao: O sistema apaga os campos Placa e Marca e espera o operador digitar uma
nova Placa e Marca.
Observaes:
o Como entrada para o campo placa o sistema aceita apenas uma seqncia de no
mnimo 2 (automveis antigos) e no mximo 3 letras seguida por 4 algarismos ou
apenas 4 algarismos (entrada pelo cdigo do mensalista).
o Como entrada para o campo Cod.Marca o sistema aceita apenas uma seqncia de 3
algarismos.
o Modelo de relatrio de Ticket de Entrada: ver Glossrio
29

Requisito 18:
O sistema permite um mximo de 5 linhas de cabealho e 3 linhas de rodap. A fonte pode
ser impressa em tamanho normal (padro da impressora, mximo de 40 caracteres).
Fluxo Normal:
o O display exibe:
Cabealho 1:
o O gerente digita o texto para o cabealho 1 e pressiona enter;
o O display exibe:
Cabealho 2:
o O gerente digita o texto para o cabealho 2 e pressiona enter;
o O display exibe:
Cabealho 3:
O gerente digita o texto para o cabealho 3 e pressiona enter;
o O display exibe:
Cabealho 4:
O gerente digita o texto para o cabealho 4 e pressiona enter;
o O display exibe:
Cabealho 5:
O gerente digita o texto para o cabealho 5 e pressiona enter;
o O display exibe:
Rodap 1:
O gerente digita o texto para o rodap 1 e pressiona enter;
o O display exibe:
Rodap 2:
O gerente digita o texto para o rodap 2 e pressiona enter;
o O display exibe:
Rodap 3:
O gerente digita o texto para o rodap 3 e pressiona enter;
Durante a digitao dos campos Cabealho1-5 e Rodap1-3, o sistema aceita apenas
seqncias alfanumricas de pelo menos 3 caracteres.
30
4.3 REQUISITOS DE HARDWARE DO SISTEMA DE ESTACIONAMENTO
Com um entendimento inicial do sistema pronto e tendo as especificaes do projeto, pode-se
iniciar a seleo dos componentes de hardware que devem ser utilizados para suprir as necessidades
do projeto e prever aplicaes mais complexas, de forma que o hardware proposto possa tambm ser
usado em outras aplicaes.
Os componentes de hardware necessrios para atender o sistema de estacionamento so:
EEPROM: Pela anlise dos requisitos, conclui-se que o hardware deve possuir um meio de
armazenamento permanente para guardar informaes sobre: operadores, gerentes, carros no ptio, etc.
Para essa finalidade, foi escolhida a EEPROM serial 24C32 que, como discutido anteriormente,
funciona sob o protocolo I2C e tem capacidade de armazenar 4Kbytes de dados. Essa memria por ser
serial, possui a vantagem de economizar pinos de E/S para uso futuro e, funcionando sob o protocolo
I2C, pode ter outros componentes conectados nos mesmos pinos de E/S.
Teclado PS/2: O teclado PS/2 utilizado para realizar entrada de dados, como por exemplo, a
placa do automvel que est entrando no ptio. Seu uso, comparado a um teclado matricial, mais
eficaz, pois todos os caracteres alfanumricos j esto no teclado PS/2 e a construo de um teclado
matricial com todos estes caracteres seria bastante dispendiosa. Alm disso, teclados compatveis com
teclados de PC tm custo muito baixo hoje em dia.
LCD: O LCD usado para exibio de mensagens direcionadas pelo PIC. Sua utilidade aplica-
se a visualizao de informaes, como a hora e a data registrada no RTC. O LCD possui um
controlador especializado chamado HD44780, que controla todas as funes a serem executadas pelo
LCD, dando um maior controle e inteligncia ao seu uso, se comparado com outros visores de baixo
custo, como por exemplo, um vetor de displays de 7 segmentos.
Interface paralela: A interface paralela serve para impresso de relatrios e dos tickets
necessrios ao sistema de estacionamento, como por exemplo, o ticket de entrada que o cliente recebe
do operador. A opo da interface paralela para impresso deve-se a facilidade de se achar impressoras
que funcionam sob este barramento.
RTC PCF8583: O RTC serve para armazenar e atualizar a hora e a data a serem utilizadas no
sistema de estacionamento. A hora e a data atual so informaes teis para clculo do tempo de
permanncia do cliente no estacionamento. O chip escolhido para essa funo o PCF8583 e suas
vantagens so as mesmas discutidas no componente 24C32 (economia de E/S).
31
4.4 REQUISITOS BSICOS DE UM S.E. PARA USO GERAL
A criao de um S.E. de uso geral deve levar em conta algumas das consideraes j feitas
sobre sistemas embutidos, como baixo consumo e tamanho reduzido e, ao mesmo tempo, ter
capacidade de memria flash, EEPROM, RAM e diferentes interfaces de E/S. Observa-se que um
sistema de uso geral normalmente possui muitas interfaces para atender diferentes aplicaes. Por
outro lado, o uso de vrias interfaces contrasta com as consideraes j feitas sobre sistemas
embutidos. Em vista disso, este projeto usa os componentes externos que se mostraram necessrios
para atender a aplicao escolhida.
Um sistema de uso geral normalmente possui entradas e sadas e meios de armazenamento
permanente. Para o sistema proposto, foram implementados os seguintes recursos:
LCD
A figura 12 ilustra a ligao eltrica feita do LCD com o PIC. O resistor R4, ligado entre VCC e
o pino RA4 um resistor de pull-up e, seu uso necessrio porque o pino fica em dreno aberto quando
configurado como I/O digital. O potencimetro serve para regulagem de contraste que feita
variando-se a tenso no pino 3 do LCD. Alm disso, so usados somente os pinos D4, D5, D6 e D7 no
barramento de dados/comando do LCD, significando que a comunicao do LCD com o PIC feita
nibble a nibble para proporcionar economia E/S no PIC.
Os sinais de controle do LCD so: RS, R/W e E. O sinal RS usado para diferenciao entre
dado ou comando transmitido (1 - Dado, 0 Instruo); o sinal R/W seleciona entre escrita ou leitura
(1 - Leitura, 0 Escrita) e o sinal E (Enable) habilita ou desabilita o LCD (1 ou 1 0 - Habilita, 0
Desabilita).
A figura 13 ilustra o diagrama de tempo do ciclo de escrita do LCD. Caso o LCD esteja
configurado para comunicao usando somente os pinos D4 D7, sero necessrios 2 ciclos de escrita
ou leitura para transmisso ou recebimento de dados e comandos. Um ciclo de leitura realizado da
mesma forma que o ciclo de escrita, mas com o sinal R/W em nvel 1 na transio do nvel 1 para
o nvel 0 do enable. Os valores dos tempos na figura 13 encontram-se na tabela 3.






32
Parmetro Smbolo Min Max
Enable Cycle Time
tc
500
-
Enable Pulse Width (High)
tw
230 -
Enable Rise/Fall Time
tr,tf -
20
Address Setup Time
tas
40
-
Address Hold Time tah 10 -
Data Setup Time
tds
80

Data Hold Time
th
10
-
Tabela 3 Valores tpicos do diagrama de tempo do LCD medidos em nanosegundos

Figura 12 Ligao do PIC com o LCD

33

Figura 13 Diagrama de tempo do ciclo de escrita do LCD
Teclado PS/2
A figura 14 ilustra a ligao eltrica feita entre o conector do teclado PS/2 com o PIC. Segundo
a especificao do protocolo, recomendvel que os pinos KBD_CLOCK e KBD_DATA possuam
resistores de pull-up por causa de alguns teclados que possuem essas linhas em coletor aberto. Alm
da linha de dado (KBD_DATA) e a linha de clock (KBD_CLOCK), o pino de conexo do teclado
possui alimentao que deve ser fornecida pelo circuito externo para funcionamento do teclado. O
diagrama de tempo da comunicao do computador com o teclado encontra-se na figura 11 e o
diagrama de tempo da comunicao do teclado com o computador est na figura 10.

Figura 14 Ligao do PIC com o teclado PS/2


34
24C32 e PCF8583
A figura 15 ilustra a ligao eltrica entre o PIC e os CIs 24C32 (EEPROM) e PCF8583 (RTC).
Estes dois CIs funcionam sob o barramento I2C, razo pela qual possuem a linha de dado e de clock
em comum (SCL e SDA). Alm disso, so necessrios resistores de pull-up nas linhas SCL e SDA,
porque os dois CIs esto em coletor aberto, segundo a especificao do protocolo I2C.
Os endereos I2C padro do 24C32 0x51 para leitura e 0x50 para escrita (O LSB identifica a
operao como sendo de leitura ou de escrita), que so os mesmos endereos I2C do PCF8583. Este
problema foi resolvido colocando-se o pino A0 do 24C32 em nvel 1 para que ele possua endereo
0x52 para leitura e 0x51 para escrita. Os pinos A0, A1 e A2 do 24C32 possuem pull-down interno, de
forma que no necessrio ligar os pinos A2 e A3 ao terra.
O diagrama de tempo dos dispositivos I2C est na figura 16. A freqncia mxima especificada
nos manuais do 24C32 e no PCF8583 para a freqncia no barramento 100 khz.

Figura 15 Ligao do PIC com o 24C32 e o PCF8583

Figura 16 Diagrama de tempo dos dispositivos I2C
35
MAX 232
A figura 17 demonstra a comunicao feita entre o PIC e um dispositivo externo usando o
conversor MAX232. Atravs da figura, verifica-se a existncia de um bit de incio (start bit), que
seguido por 8 bits (do LSB ao MSB) e, por fim, a comunicao encerra-se com o bit de parada (stop
bit).
A figura 18 ilustra a ligao eltrica do MAX232 com o PIC. O MAX232 est localizado entre
o PIC e o conector DB-9 para fazer a converso dos nveis de tenso do padro TTL para o padro RS-
232 e vice-versa.

Figura 17 Comunicao serial no MAX232

Figura 18 Ligao do PIC com o MAX232
Memria 62256
A figura 19 ilustra a ligao eltrica da memria RAM externa 62256 com o PIC. Para
enderear 32 Kbytes (que correspondem a 256Kbits) necessrio um barramento de endereo de 15
bits, conforme consta no CI 62256 na figura 6 e na figura 19. Como o barramento de dados possui 8
bits, teriam de ser usados 23 pinos do PIC para acrescentar a memria RAM externa. Este problema
contornado usando latchs 74LS373 para multiplexar o barramento de dados, os 8 bits menos
significativos do barramento de endereo e os 7 bits mais significativos do barramento de endereo.
Assim, usado o port D tanto para o barramento de dados como para o barramento de endereo. O
36
pino LE_L habilita o latch que conter os 8 bits menos significativos do barramento de endereo e o
pino LE_H habilita o latch que conter os 7 bits mais significativos do barramento de endereo.
A figura 20 ilustra o diagrama de tempo de leitura da memria 62256 e a figura 21 ilustra o
diagrama de escrita. Os tempos destes diagramas esto descriminados na tabela 4.

Figura 19 Ligao do PIC com a memria externa 62256

Figura 20 Diagrama de tempos de leitura na memria 62256
37

Figura 21 Diagrama de tempos de escrita na memria 62256
Parmetro Smbolo Min Max
Read cycle time tRC 70 -
Address access time tAA - 70
Chip select to output tCO - 70
Output enable to valid output tOE - 35
Chip select to low-Z output tLZ 10 -
Output enable to low-Z output tOLZ 5 -
Chip disable to high-Z output tHZ 0 30
Output disable to high-Z output tOHZ 0 30
Leitura
Output hold from address change tOH 5 -
Write cycle time tWC 70 -
Chip select to end of write tCW 60 -
Address set-up time tAS 0 -
Address valid to end of write tAW 60 -
Write pulse width tWP 50 -
Write recovery time tWR 0 -
Write to output high-Z tWHZ 0 25
Data to write time overlap tDW 30 -
Data hold from write time tDH 0 -
Escrita
End write to output low-Z tOW 5 -
Tabela 4 Valores dos tempos dos diagramas da memria 62256
Interface paralela
A ligao do PIC com a interface paralela est ilustrada na figura 22. A interface paralela, que
usada pra conectar uma impressora no hardware, possui um barramento de dados (D0 D7) e sinais de
controle (BUSY e strobe). Apesar de haver outros sinais de controle disponveis na interface paralela
38
Centronics, somente estes sinais de controle so usados para se ter um controle econmico da
impressora.
De acordo com o diagrama de tempos da figura 23, o PIC l o estado da linha BUSY para
verificar se a impressora est com seu buffer cheio. Caso no esteja, o PIC escreve um dado no
barramento de endereo e aplica um pulso de durao no inferior a 1uS em STROBE. Depois,
verifica novamente o estado da linha BUSY.

Figura 22 Ligao do PIC com a interface paralela


39

Figura 23 Diagrama de tempos da interface paralela
Os componentes e suas ligaes descritas acima formam o sistema aqui concebido e projetado
que est ilustrado na figura 24. Alm das ligaes dos componentes externos, o PIC possui um boto
de reset realizado pelo pino 1 do PIC (MCLR), alm da conexo de um cristal para o oscilador interno
do PIC.
40

Figura 24 Diagrama esquemtico do hardware projetado


5 IMPLEMENTAO E RESULTADOS
5.1 INTRODUO
Este captulo apresenta uma descrio da implementao do hardware do sistema, mostrando a
construo da placa lgica com tecnologia wire-wrapp, descrevendo as interconexes dos principais
mdulos e o empacotamento utilizado.
Alm da implementao do hardware, este captulo descreve a implementao do software da
aplicao escolhida, a qual foi realizada no laboratrio de Sistemas Embutidos do NCE/UFRJ e que
consiste num sistema de estacionamento.
5.2 IMPLEMENTAO DO SOFTWARE
Para dar suporte ao hardware foram desenvolvidas bibliotecas com funes definidas para
manipular os componentes eletrnicos explicados anteriormente. Desta forma, cada componente ter
uma biblioteca associada a ele que realizar a sua manipulao pelo PIC. O apndice A contm a
listagem destes arquivos com as funes pertinentes.
Para facilitar o desenvolvimento foi feito um manual de uso das bibliotecas dos componentes de
E/S cuja descrio se encontra no apndice B. A seguir ser feita uma descrio resumida das funes
de software implementadas para o sistema de estacionamento. Podem ser encontrados maiores
detalhes no manual apresentado no apndice B.
Timer 0 (DELAY_TIMER.C)
Para contagem de tempo foi usado o TIMER0 do PIC, que consiste num temporizador de 16
bits. A listagem deste arquivo est no apndice A e contm as seguintes funes.
void init_tmr0(int value): A funo init_tmr0 inicializa o timer0. A varivel Value
recebe o valor do prescale para o timer0.
void delay_tmr0(int value): Atribui 65536-value para o TMR0, inicia a contagem do
timer0 e aguarda o overflow. Ou seja, a funo realiza uma contagem definida pela
varivel value e pelo prescale.
Display de Cristal Lquido (LCD.C)
A manipulao o LCD implementada pelo arquivo lcd.c, que contm as funes que enviam
comandos para o LCD executar. A listagem deste arquivo est no apndice A e contm as seguintes
funes:
void lcd_init(void): Inicializa o LCD.
42
void lcd_cursor(lcd_cursor_type): Muda o cursor do LCD. O tipo lcd_cursor_type
composto dos seguintes valores: lcd_cursor_on, lcd_cursor_off, lcd_cursor_blink,
lcd_cursor_alternate.
void lcd_gotoxy( byte x,byte y): Posiciona o cursor na coluna x e linha y no LCD.
void lcd_erase(lcd_direction dir,byte n): Apaga n bytes na direo dir (right ou left so
os valores possveis para o tipo lcd_direction).
void lcd_erase_all(void): Apaga todo o contedo do visor do LCD.
byte lcd_getc(byte x,byte y): Obtm o caracter que se encontra na coluna x, linha y do
LCD.
void lcd_moven(lcd_direction direc,char n): Move o cursor n vezes numa direo.
void lcd_putch(unsigned char): Imprime um caracter no visor do LCD.
Teclado PS/2 (KEYBOARD.C)
O protocolo de comunicao com o teclado PS/2 implementado no arquivo keyboard.c, que
fornece as funes bsicas para entrada de dados pelo teclado. A listagem deste arquivo est no
apndice A, e contm a s seguintes funes:
unsigned char kbd_getc(): Retorna um caracter pela entrada do teclado. Sendo vlidos
nmeros, letras e teclado de funes.
void kbd_gets(char string[], unsigned char lenght): Retorna um vetor de char chamado
string com tamanho mxino length pelo teclado, exibindo os caracteres no LCD.
Memria RAM externa (62256.C)
O acesso memria RAM externa feita atravs do arquivo 62256.c. Esta biblioteca realiza as
funes para escrita e leitura na memria RAM externa. A listagem deste arquivo est no apndice A e
contm as seguintes funes:
void ram_Init(void): Incializa a RAM. Este comando deve ser usado antes de qualquer
instruo de utilizao da RAM.
void ram_Cursor(unsigned int address): Coloca addres no barramento de endereo da
RAM.
unsigned char ram_ReadByte(unsigned int address): Retorna um byte lido no endereo
address.
void ram_WriteByte(unsigned char value,unsigned int address): Grava um byte value
no endereo address.
43
void ram_SequentialWrite(char *val,unsigned int initial_address): Realiza uma escrita
sequencial do vetor de char val iniciando em initial_address.
void ram_SequentialRead(char *val,unsigned int initial_address,unsigned int size):
Realiza uma leitura sequencial colocando no vetor de char val de initial_address at
initial_address+size.

Interface I2C (I2C_MASTER.C)
O arquivo i2c_mater.c possui funes para configurar o mdulo MSSP (Master Synchronous
Serial Port) para o protocolo I2C no modo mestre e funes de leitura e escrita dos registradores do
mdulo MSSP. A listagem deste arquivo est no apndice A e contm as seguintes funes:
void i2c_init(unsigned char ssp_add): Esta funo configura o mdulo MSSP para o
protocolo I2C no modo mestre e especifica a freqncia do pino SCL pelo parmetro da
funo ssp_add.
char i2c_start(unsigned char i2c_address): Executa uma condio de incio no
barramento I2C e envia o endereo do dispositivo cujo acesso este sendo solicitado e
designado pelo parmetro address (endereo do dispositivo). Caso o dispositivo
responda, a funo retona verdadeiro, caso contrrio retona falso.
char i2c_restart(unsigned char i2c_address): Inicia a repetio da condio de incio do
barramento I2C e envia o endereo do dispositivo cujo acesso este sendo solicitado e
designado pelo parmetro address (endereo do dispositivo). Caso o dispositivo
responda, a funo retona verdadeiro, caso contrrio retona falso.
char i2c_read(unsigned char ack): Executa uma leitura do dispositivo selecionado
atravs da funo i2c_start ou i2c_restart e retorna a leitura realizada. Aps executar a
leitura executa a condio de reconhecimento dada pelo parmetro ack (1 ou 0).
char i2c_write( unsigned char i2cWriteData): Executa uma escrita no dispositivo
selecionado atravs da funo i2c_start ou i2c_restart. Aps executar a escrita a funo
retona o reconhecimento da escrita do dispositivo acessado (1-Dispositivo reconhece a
transmisso; 0-Dispositivo no reconhece a transmisso).
void i2c_stop(): Executa uma condio de parada no barramento I2C.



44
EEPROM 24C32 (24CXX.C)
As funes direcionadas EEPROM 24C32 esto no arquivo 24cxx.c. Essa biblioteca faz uso
da biblioteca i2c_master.h que contm as funes para manipulao da interface I2C do PIC. A
listagem deste arquivo est no apndice A e contm as seguintes funes:
void i2c_eepromWrite(char device,int address, char data): Escreve o caracter data no
endereo address no dispositivo device, onde device um identificador da memria no
caso de uso de mltiplas memrias do mesmo tipo.
char i2c_eepromReadCurrent(char device): Retorna um byte lido no endereo currente
no dispositivo device.
void i2c_eepromCursor(char device,int i2c_address): Posiona o cursor de endereo do
dispositivo device no endereo i2c_address.
void i2c_eepromPageWrite(char device,int address, char *data,unsigned char size_str):
Escreve um vetor de char que tenha no mximo 12 posies iniciando no endereo
address, no dispositivo device com tamanho size_str.
RTC PCF8583 (PCF8583.C):
O arquivo pcf8583.c contm o cdigo usado para manipular o RTC PCF8583. Essa biblioteca
faz uso da biblioteca i2c_master.h que contm as funes para manipulao da interface I2C do PIC.
A listagem deste cdigo est no apndice A e contm as seguintes funes:
void write8583_rtc(struct Time *t, struct Date *d, BYTE address_reg): Ajusta a hora e
a data do RTC ou o alarme do mesmo atravs das estruturas Time e Date.
void read8583_rtc(struct Time *t, struct Date *d, BYTE address_reg): L a data e a
hora do RTC ou o alarme do mesmo atravs de Date e Time.
void configure8583_control_reg(BYTE control_reg): Configura o reg. de controle do
RTC.
void configure8583_alarm_reg(BYTE alarm_reg): Configura o registrador de alarme do
RTC.
Impressora matricial (PRINTER.C):
O arquivo printer.c contm as funes para uso da impressora matricial. A listagem deste cdigo
est no apndice A e contm as seguintes funes:.
void printer(unsigned char c): Esta funo imprime um caracter pela impressora
matricial.
45
void prn_printf(const char *str): Esta funo imprime uma string pela impressora
matricial.
Sistema de Arquivos FAT para EEPROM (FILE.C, FILEINIT.C e FILECONF.H):
Os arquivos file.c, fileinit.c e fileconf.h contm as funes necessrias para implementar uma
verso compacta do sistema de arquivos FAT para a EEPROM. O uso dessa biblioteca faz com que a
EEPROM fique transparente, sendo necessrio somente criar, abrir, ler, escrever e fechar arquivos
usando as funes implementadas para o sistema de arquivos. A listagem destes cdigos est no
apndice A. e contm as seguintes funes:
char fcreate(char name[], char tag): Esta funo cria um novo arquivo na EEPROM,
tendo como parmetro o nome do arquivo a ser criado, onde o tamanho mximo de at
8 caracteres. Um campo tag indica se o arquivo ser seqencial ou ser um arquivo de
registros (0-Arquivo sequencial ; N-Arquivo de registros, onde N o tamanho de cada
registro). O arquivo de registros, ao contrrio do arquivo seqencial, possui campos de
tamanho fixo.
char ferase(char name[]) : Apaga o arquivo da EEPROM. Retorna 1 caso o arquivo
no exista e 0 em caso de sucesso.
int fexist(char name[]) : Procura pelo arquivo na tabela de arquivos da EEPROM.
Retorna 1 se o arquivo no for encontrado e, caso o arquivo exista, retorna o ndice do
arquivo na tabela.
FILE* fopen(char name[], char mode): Abre um arquivo na EEPROM. Retorna 0 caso
nenhum arquivo seja encontrado ou se no houver mais espao na tabela de arquivo. Se
o arquivo for encontrado, retorna sua entrada na tabela de arquivos aberta. O arquivo
pode ser aberto nos seguintes modos atravs do parmetro mode: FM_APPEND
Insere dados no fim do arquivo e FM_RDWR L ou escreve no incio do arquivo.
int fclose(FILE *pf): Fecha um arquivo previamente aberto e retorna 0 se a operao
for bem-sucedida ou 1 caso contrrio. O parmetro pf um ponteiro para o arquivo
aberto.
int fread(void bfr[],int size, FILE *pf): Executa uma leitura de um arquivo aberto. O
parmetro bfr uma varivel que recebe os dados lidos, size o nmero de bytes a
serem lidos e pf um ponteiro para o arquivo a ser lido.
int fwrite(char bfr[],int size,FILE *pf): Executa uma escrita em um arquivo aberto. O
parmetro bfr uma varivel que recebe os dados a serem escritos, size o nmero de
bytes a serem escritos e pf um ponteiro para o arquivo.
46
Programa principal (ESTACIONAMENTO.C e MENUS.C)
O arquivo estacionamento.c o cdigo principal executado pelo PIC. Este cdigo contem as
inicializaes dos componentes externos utilizados e aps isso faz chamada a rotina menus(), que est
no arquivo menus.c. O arquivo menus.c possui as rotinas com a estrutura dos menus exibidas no LCD
e a implementao dos requisitos j discutidos. A listagem desses arquivos encontra-se no apndice A.
5.3 IMPLEMENTAO DO HARDWARE
Para que fosse porttil, buscou-se construir o sistema numa embalagem bem pequena e leve, o
que foi conseguido com uma caixa de plstico com dimenses 12 cm x 12 cm x 7 cm, A verso final
ideal ser um teclado pequeno, como o de um notebook com um display junto s teclas de funo e a
placa eletrnica sob o teclado.
A figura 25 mostra o sistema dentro da caixa de plstico com a impressora, teclado PS/2 e o
programador Presto conectados. A ligao destes perifricos com a placa desenvolvida compe o
sistema proposto neste relatrio com todas as exigncias discutidas para atender a implementao de
um sistema de controle de estacionamento.

Figura 25 Sistema final implementado
A figura 26 mostra a viso de frente do compartimento do projeto com conectores para porta
serial, porta paralela, teclado PS/2, potencimetro para ajuste do contraste do LCD e boto de reset.
47

Figura 26 Viso de frente do sistema
A figura 27 mostra a viso lateral direita do sistema com indicaes do conector do Power LED
da placa que se liga a um cabo com LED na outra ponta localizado no painel frontal. A figura 26
tambm indica o conector do programador do PIC que se liga ao Presto na outra ponta.
48

Figura 27 Viso lateral direita do sistema

A figura 28 ilustra a viso frontal do sistema com as seguintes conexes:
Conector da porta paralela em que ligado um cabo cuja outra ponta conectada a
porta paralela localizada no painel do sistema.
Conector para LCD, onde ligado um cabo conectado a um LCD na outra ponta.
Conector da porta serial, onde ligado um cabo conectado a um conector DB-9.

49

Figura 28 Viso frontal do sistema

A figura 29 ilustra a viso lateral esquerda do sistema com as seguintes conexes:
Conector do teclado PS/2 que se liga a um cabo cuja outra ponta est localizada no
painel frontal onde conectado o teclado PS/2
Conector do potencimetro para ajuste do contraste do LCD que se liga a um cabo com
um potencimetro na outra ponta
Conector de alimentao que se liga a um cabo cuja outra ponta est localizada no
painel frontal e recebe a alimentao provida por uma fonte.
Conector do boto de reset da placa que se liga a um cabo cuja outra ponta est ligado o
boto de reset localizado no painel frontal
50

Figura 29 Viso lateral esquerda do sistema
A figura 30 ilustra a disposio dos componentes na placa eletrnica do sistema. Os
componentes mostrados na figura so:
PIC 18F4620 para controle do sistema
2 CIs 74LS244 usados para isolar a porta paralela do 18F4620, protegendo o PIC.
2 CIs 74LS373 para uso da memria RAM 62256 conforme discutido anteriormente
MAX232 para converso do nvel TTL para o RS232
RTC PCF8583 para manipulaes da data e da hora
EEPROM 24C32 para armazenamento de dados
Bateria de Ltio para preservao da hora e da data do PCF8583
Cristal oscilador para gerao do clock do 18F4620
Banco dos resistores usados no sistema
Cristal de 32,768 KHz usado pelo RTC
LM7805 usado para regulao da alimentao
Banco de capacitores usados pelo MAX232
Conectores para ligao dos perifricos
51

Figura 30 Disposio dos componentes na placa do sistema
5.4 RESULTADOS
Nesta seo so demonstradas algumas das listagens obtidas com o sistema implementado.
A figura 31 mostra uma listagem de marcas cadastradas no sistema de estacionamento. Essa
listagem possui: O cdigo da marca, a classe do automvel e a descrio deste.

Figura 31 Tabela de marcas cadastradas

52
A figura 32 mostra uma tabela de preos configurada no sistema para automveis de classe 1,
relacionando o preo de acordo com o tempo de permanncia do cliente no estacionamento.

Figura 32 Tabela de preos para automveis de classe 1
A figura 33 ilustra um ticket de entrada no estacionamento com a hora e a data de entrada, a
marca do automvel que entrou e sua placa, bem como o cabealho e o rodap previamente
configurados no sistema.

Figura 33 Ticket de entrada
A figura 34 mostra a listagem dos automveis presentes no ptio do estacionamento numa
determinada hora e data. A listagem do ptio contm a placa, o tipo do cliente (A-Avulso, M-
Mensalista), o cdigo da marca, a hora e a data de entrada no ptio.

Figura 34 Listagem do ptio
53
A figura 35 mostra o ticket de sada do estacionamento com a hora e a data de sada, tempo de
permanncia e o valor pago, alm do cabealho e do rodap previamente configurados. No caso em
questo, o cliente ficou no ptio tempo menos que o tempo de desistncia, no pagando nada.

Figura 35 Ticket de sada


6 CONCLUSES
6.1 RESUMO DO TRABALHO
Este trabalho final de graduao apresentou a concepo, projeto e implementao de um
sistema embutido com hardware suficientemente genrico para ser usado em diversas aplicaes. Para
testar o hardware foi desenvolvida uma aplicao que consiste em um sistema de controle de
estacionamento, que razoavelmente complexa para avaliar os diversos componentes do circuito. O
projeto descrito uma contribuio ao desenvolvimento de outros Sistemas Embutidos, uma vez que
foram apresentadas as diversas etapas do projeto, desde a concepo inicial at a implementao final
do sistema.
O desenvolvimento deste trabalho envolveu o estudo de diversas tecnologias, tais como:
Anlise de requisitos em UML;
Estudo de Sistemas embutidos de uma forma geral;
Microcontroladores PIC;
Programao em linguagem C e ambientes de desenvolvimento para PIC;
Protocolos de entrada e sada como I2C, teclado PS/2, protocolo LCD, protocolo RS-
232;
Gravao de PICs com vrios programadores;
Conexo de EEPROM e Real-time Clock (RTC) a microcontrolador PIC;
Construo de hardware usando Wire-wrapp.
O sistema descrito neste trabalho possibilita:
Comunicao serial com outro computador;
Impresso usando a interface paralela Centronics;
Manipulao de um LCD de 2 linhas e 40 colunas;
Manipulao de um teclado PS/2;
Ajuste e atualizao automtica da data e da hora usando o RTC PCF8583;
Manipulao de uma RAM externa de 256KBits (62256);
Manipulao de uma EEPROM externa de 32KBits (24C32).
O software descrito neste trabalho composto de 2 camadas que so as rotinas bsicas e a
aplicao. As rotinas bsicas fazem parte deste trabalho e consistem de:
55
Rotinas para o teclado;
Rotinas para impresso;
Rotinas para LCD;
Rotinas para EEPROM;
Rotinas para RTC;
Rotinas para porta serial;
Rotinas para I2C.

A aplicao desenvolvida consiste de um sistema para controle de estacionamento e permite,
entre outras coisas:
Gerenciar clientes mensalistas;
Cadastrar usurios do sistema;
Cadastrar cabealho e rodap do ticket.
Cadastrar a entrada no ptio;
Liberar a sada do ptio fornecendo ticket de sada e recibo caso seja solicitado;
Listar os automveis presentes no ptio;
Gerenciar as marcas dos automveis;
Gerenciar a tabela de preos;
Gerenciar a hora e a data do sistema;
6.2 PRINCIPAIS DIFICULDADES
Durante o andamento deste trabalho foram encontradas vrias dificuldades decorrentes da
escolhas de tecnologias que mais tarde se mostraram ineficazes para se alcanar o objetivo proposto
neste trabalho. As principais foram:
A escolha do compilador CCS, que se mostrou ineficiente para cdigos com tamanho
considervel, pois no executava uma boa otimizao e no atendia ao padro ANSI-C.
Um exemplo disto foi a rotina de delay_ms, em que o CCS expandia in-line ao invs
de usar loop. Este problema foi solucionado com a escolha do compilador HITECH-
PICC18 Compiler, aps anlise de compiladores para microcontroladores PIC.
56
Com o crescimento do cdigo, o microcontrolador 18F452 se mostrou incapaz de
armazenar o cdigo necessrio ao sistema, tendo que ser feita uma busca de
microcontroladores PIC semelhantes ao 18F452, mas com maior memria. A opo
escolhida foi o PIC 18F4620.
A escolha do 18F4620 trouxe dois problemas: O compilador e o programador. O
compilador escolhido (HITECH-PICC18) no tinha suporte para o 18F4620 por ser a
verso 8.30, sendo substituda pela verso 8.35 do compilador que dava suporte ao
18F4620. O programador McFlash tambm teve que ser trocado pelo Presto por no
dar suporte ao 18F4620.
Adicionalmente, o programador Presto solucionou um problema do programador
McFlash, pois o Presto, ao contrrio do McFlash, possibilita a gravao do PIC In-
Circuit. Assim, ele diminui o risco de quebra dos pinos do PIC e da maior eficincia ao
desenvolvimento, pois no h mais a perda de tempo ocasionada pela retirada e
colocao do PIC na placa.
Tentou-se usar um PIC com mais memrias flash e RAM que o 18F4620, que foi o
18F6420. Porm, este PIC possui um encapsulamento PLCC, que dificultava seu uso e,
alm disso, o programador no suportava este PIC.
6.3 CONCLUSES
Os principais objetivos estabelecidos no incio deste trabalho foram plenamente atingidos,
sendo o principal deles a disponibilizao de um sistema embutido de uso geral validado por uma
aplicao de controle de estacionamento.
As principais concluses do sistema que podem ser tiradas deste trabalho so:
Sistemas Embutidos simples podem ser utilizados para resolver problemas
razoavelmente complexos utilizando eletrnica barata e normalmente mais confivel
que computadores tradicionais. O fato de geralmente no possurem dispositivos com
partes mveis, como por exemplo, discos rgidos, aumenta muito a confiabilidade destes
sistemas.
O sistema projetado pode ser perfeitamente utilizado em um sistema mvel, devido ao
seu tamanho reduzido e ao seu baixo consumo de energia.
Programar Sistemas Embutidos em uma linguagem de alto nvel como C, aumenta
muito a produtividade e torna mais fcil uma migrao para outro sistema, caso seja
necessrio.
57
O custo de ferramentas de desenvolvimento, como compiladores e simuladores ainda
elevado, principalmente em se tratando das boas ferramentas.
O sistema ISIS-PROTEUS mostrou-se bastante til nas etapas iniciais do trabalho, pois
ele permitiu simular o processador PIC em conjunto com alguns perifricos. Com o
aumento da complexidade do sistema, o ISIS-PROTEUS no dispunha de plugins para
simular os novos componentes, como por exemplo, o teclado PS/2.
O projeto foi extremamente importante na minha formao, pois me permitiu trabalhar
com software de alto nvel e um hardware, ampliando substancialmente minhas chances
de empregabilidade e, ao mesmo tempo, me dando uma boa viso do que eu poderia
fazer como micro-empresrio.
6.4 TRABALHOS FUTUROS
Como desdobramento em trabalhos futuros, sugere-se que sejam adicionados alguns novos
requisitos e expandidos requisitos existentes. Um exemplo de requisito que pode ser expandido em
relao aos clientes mensalistas, que podem ter uma data limite de pagamento cadastrada no sistema e,
caso no quitassem suas dvidas at a data limite, sua entrada no estacionamento no seria permitida.
A expanso deste requisito criaria outros requisitos, como a impresso da listagem dos mensalistas
inadimplentes.
Alm disso, sugere-se a adio de novos componentes no hardware. Tais como:
1. A incluso de uma interface IRDA para comunicao sem-fio com outros sistemas;
2. A incluso de uma interface USB seria til para comunicao com outros sistemas que
possuem essa interface que esta se tornando extremamente popular;
3. Interface ZigBee 802.15.4 e protocolos;
4. Interface de rede Ethernet via conector RJ -45.
58
BIBLIOGRAFIA UTILIZADA


BOOCH, G.; RUMBAUGH, J . & JACOBSON, I. UML: Guia do usurio. Rio de J aneiro: Campus, 2000.

PALTOR, I.; LILUS, J . A case study on designing embedded systems using the UML notation. Finland: Turku
Centre for Computer Science, 1999.

CHAPMAN, M. The final word on the 8051. London: E-book gratuito, 1994.

PEREIRA, F. PIC: Programao em C. So Paulo: rica, 2003.

SOUZA, D. Desbravando o PIC. So Paulo: rica, 2000.

PREDKO, M. Programming and customizing PICmicro microcontrollers. Toronto, Canad: M. books, 1999.

ZELENOVSKY, R.; MENDONA, A. PC: um guia prtico de Hardware e Interfaceamento. Rio de J aneiro:
MZ Editora, 1999.





59
REFERNCIAS

[1] AMORY, A. PETRINI, J . Sistema integrado e multiplataforma para controle remoto de
residncias. PUC-RS. Projeto final de curso. Disponvel por WWW em., consultado em Agosto de
2006.

[2] FRIEDRICH, E. Sistema de Sntese de Voz Microcontrolado Porttil. UNICENP. Projeto
final de curso. Disponvel por WWW em http://www.
http://engcomp.unicenp.br/engcomp/UserFiles/File/ProjFinais/2004_SinteseVoz_Elcio.pdf,
consultado em Agosto de 2006.

[3] ADRIO, A. M. S. ; BOGO, R. C. ; GRACIOLLI, T. G. . Implementao de um Sistema
Embarcado para Automao de Estacionamentos Utilizando o Microcontrolador 8051. In:
Salo de Iniciao Cientfica da UFRGS, 2003, Porto Alegre. Anais do XV Salo de Iniciao
Cientfica da UFRGS. Porto Alegre : UFRGS, 2003. p. 114.

[4] LATREILLE, G. Uma implementao de Sistema Microcontrolado para Aparelho de
udio MP3.UNOESC. Projeto final de graduao. Disponvel por WWW em
http://www.geocities.com/gilvanl. Consultado em Agosto de 2006.

[5] FERREIRA, E. F.; ARNOLD, F. J . Alarme Residencial microcontrolado. CESET-
UNICAMP. Projeto de iniciao cientfica. Disponvel por WWW em
http://scholar.google.com.br/url?sa=U&q=http://www.prp.unicamp.br/pibic/congressos/xiiicongres
so/paineis/023603.pdf. Consultado em Agosto de 2006.

[7] INTEL, INC. MCS-51 Microcontrollers Classic. Disponvel por WWW em
http://www.intel.com/design/mcs51/docs_mcs51.htm. Consultado em Agosto de 2006.

[8] PHILIPS, INC. The I2C-Bus specification. . Disponvel por WWW em
http://www.semiconductors.philips.com/acrobat_download/literature/9398/39340011.pdf#search=
%22I2C%20specification%22 . Consultado em Agosto de 2006.

[9] ARM, INC. MCS-51 Microcontrollers Classic. Disponvel por WWW em
http://www.arm.com/documentation/books/1183.html . ARM Architecture reference manual.
Consultado em Agosto de 2006.
60

[10] FREESCALE SEMICONDUCTORS, INC. M68HC11 Reference manual. Disponvel por
WWW em
http://www.freescale.com/files/microcontrollers/doc/ref_manual/M68HC11RM.pdf#search=%22M
68HC11%20reference%20manual%22 .Consultado em Agosto de 2006.

[11] MICROCHIP TECHNOLOGY, INC. Getting started with PIC microcontrollers. Disponvel
por WWW em
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=2551 .Consultado
em Agosto de 2006.

[12] BOSCH, INC. Controller Area Network. Disponvel por WWW em
http://www.semiconductors.bosch.de/en/20/can/index.asp .Consultado em Agosto de 2006.

[13] MICROCHIP TECHNOLOGY, INC. PIC16F84. Disponvel por WWW em
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1335&dDocNam
e=en010229.Consultado em Agosto de 2006.

[14] MICROCHIP TECHNOLOGY, INC. PIC18F452. Disponvel por WWW em
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1335&dDocNam
e=en010296 .Consultado em Agosto de 2006.

[15] MICROCHIP TECHNOLOGY, INC. PIC18F4620. Disponvel por WWW em
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1335&dDocNam
e=en010304.Consultado em Agosto de 2006.

[16] ATMEL CORPORATION, INC. AT24C32. Disponvel por WWW em
http://www.atmel.com/dyn/products/product_card.asp?part_id=3792. Consultado em Agosto de
2006.

[17] DATASHEETARCHIVE. Datasheet do 62256 Disponvel por WWW em
http://www.datasheetarchive.com/search.php?q=62256&sType=part&ExactDS=Starts . Consultado
em Agosto de 2006.

61
[18] Philips, Inc. Datasheet do RTC PCF8583. Disponvel por WWW em
http://www.semiconductors.philips.com/pip/PCF8583_5.html . Consultado em Agosto de 2006.

[19] Spark fun Electronics, Inc. Datasheet do processadro HD44780. Disponvel por WWW em
http://www.sparkfun.com/datasheets/LCD/HD44780.pdf . Consultado em Agosto de 2006.

[20] CCS ,Inc. CCS PIC-C Compiler. Disponvel por WWW em
http://www.ccsinfo.com/product_info.php?cPath=Store&products_id=PCH_full. Consultado em
Agosto de 2006.

[21] HI-TECH Software ,Inc. HI-TECH PICC-18 Compiler. Disponvel por WWW em
http://www.htsoft.com/products/pic18ccompiler.php . Consultado em Agosto de 2006.

[22] LABCENTER Electronics, Inc. Simulador PROTEUS. Disponvel por WWW em
http://www.labcenter.co.uk/index_uk.htm . Consultado em Agosto de 2006.

[23] MICROCHIP TECHNOLOGY, Inc. MPLAB Quick start guide. Disponvel por WWW em
http://ww1.microchip.com/downloads/en/DeviceDoc/51281F.pdf . Consultado em Agosto de 2006.

[24] ASIX PIC-TOOLS, Inc. PRESTO USB Programmer. Disponvel por WWW em
http://www.pic-tools.com/prg_presto.htm . Consultado em Agosto de 2006.

[25] FURLAN, J . DAVI. Modelagem de objetos atravs da UML. So Paulo, Makron Books:
1998.

[26] ELECTRONICS ENGINEERING TIMES. Using na eZ80 Memory File System. Disponvel
por WWW em http://www.eetasia.com/ART_8800336573_499486_7ba16f96200405.HTM
. Consultado em Agosto de 2006.

[27] TURLEY, JIM. The two percent solution. Embedded.com - Thinking inside the box.
Disponvel por WWW em
http://www.eetasia.com/ART_8800336573_499486_7ba16f96200405.HTM . Consultado
em Agosto de 2006.
62
APNDICE A LISTAGEM DO CDIGO DESENVOLVIDO
DELAY_TIMER.C:

/ *
Rout i nes f or del ay usi ng Ti mer 0
Devel oped by NCE/ UFRJ

Regi st er s and f l ags used i n del ay_t i mer

T0CON: The T0CON r egi st er i s a r eadabl e and
wr i t abl e r egi st er t hat cont r ol s al l t he aspect s of Ti mer 0,
i ncl udi ng t he pr escal e sel ect i on.

bi t 7 TMR0ON: Ti mer 0 On/ Of f Cont r ol bi t
1 = Enabl es Ti mer 0
0 = St ops Ti mer 0

bi t 6 T08BI T: Ti mer 0 8- bi t / 16- bi t Cont r ol bi t
1 = Ti mer 0 i s conf i gur ed as an 8- bi t t i mer / count er
0 = Ti mer 0 i s conf i gur ed as a 16- bi t t i mer / count er

bi t 5 T0CS: Ti mer 0 Cl ock Sour ce Sel ect bi t
1 = Tr ansi t i on on T0CKI pi n
0 = I nt er nal i nst r uct i on cycl e cl ock ( CLKO)

bi t 4 T0SE: Ti mer 0 Sour ce Edge Sel ect bi t
1 = I ncr ement on hi gh- t o- l ow t r ansi t i on on T0CKI pi n
0 = I ncr ement on l ow- t o- hi gh t r ansi t i on on T0CKI pi n

bi t 3 PSA: Ti mer 0 Pr escal er Assi gnment bi t
1 = TI mer 0 pr escal er i s NOT assi gned. Ti mer 0 cl ock i nput bypasses pr escal er .
0 = Ti mer 0 pr escal er i s assi gned. Ti mer 0 cl ock i nput comes f r ompr escal er out put .

bi t 2- 0 T0PS2: T0PS0: Ti mer 0 Pr escal er Sel ect bi t s
111 = 1: 256 pr escal e val ue
110 = 1: 128 pr escal e val ue
101 = 1: 64 pr escal e val ue
100 = 1: 32 pr escal e val ue
011 = 1: 16 pr escal e val ue
010 = 1: 8 pr escal e val ue
001 = 1: 4 pr escal e val ue
000 = 1: 2 pr escal e val ue


TMR0I E: TMR0 Over f l ow I nt er r upt Enabl e bi t .
TMR0I E i s t he bi t 5 of t he I NTCON Ref i st er . The I NTCON r egi st er conf i gur es t he i nt er r upt s.
1 = Enabl es t he TMR0 over f l ow i nt er r upt
0 = Di sabl es t he TMR0 over f l ow i nt er r upt

TMR0L: Ti mer 0 Regi st er Low Byt e

TMR0I F: TMR0 Over f l ow I nt er r upt Fl ag bi t . Bi t 2 of t he I NTCON r egi st er .
1 = TMR0 r egi st er has over f l owed ( must be cl ear ed i n sof t war e)
0 = TMR0 r egi st er di d not over f l ow
*/
#i f ndef _DELAY_TI MER_H
#def i ne _DELAY_TI MER_H
#endi f
#def i ne PRE_SCALE_2 0x00
#def i ne PRE_SCALE_4 0x01
#def i ne PRE_SCALE_8 0x02
#def i ne PRE_SCALE_16 0x03
#def i ne PRE_SCALE_32 0x04
#def i ne PRE_SCALE_64 0x05
#def i ne PRE_SCALE_128 0x06
#def i ne PRE_SCALE_256 0x07
#def i ne NO_SCALE 0x08

63
voi d i ni t _t mr 0( unsi gned char ) ;

voi d del ay_t mr 0( unsi gned i nt ) ;
voi d i ni t _t mr 0( unsi gned char val ue)
{
T0CON=val ue;
TMR0I E=1;
}
voi d del ay_t mr 0( unsi gned i nt val ue)
{
unsi gned i nt t emp;
t emp=65536- val ue;
TMR0H=t emp>>8;
TMR0L=t emp&0x0F;
TMR0I F=0;
TMR0ON=1;
whi l e ( ! TMR0I F) ;
TMR0ON=0;
TMR0I F=0;
}

#def i ne del ay_t mr 0_i nl i ne( val ue) \
i nt t emp; \
t emp=65536- val ue; \
TMR0H=t emp>>8; \
TMR0L=t emp&0x0F; \
TMR0I F=0; \
TMR0ON=1; \
whi l e ( ! TMR0I F) ; \
TMR0ON=0; \
TMR0I F=0; \
#endi f

LCD.C:

#i f ndef _LCD_H
#def i ne _LCD_H

#i f ndef BI TNUM
#def i ne BI TNUM( adr , bi t ) ( ( unsi gned) ( &adr ) *8+( bi t ) )
#endi f
#i f ndef BI TTEST
# def i ne BI TTEST( var , bi t ) ( ( var & ( 1<<bi t ) ) ! = 0)
#endi f

t ypedef unsi gned char byt e;
t ypedef enum{l cd_cur sor _on, l cd_cur sor _of f , l cd_cur sor _bl i nk, l cd_cur sor _al t er nat e}
l cd_cur sor _t ype;
t ypedef enum{l ef t , r i ght } l cd_di r ect i on;
/ / 0=5x7 1=5x10 2=2l i nes
#i f ndef LCD_TYPE
#def i ne LCD_TYPE 2
#endi f
#i f def USE_NO_PORT_LCD
#i f ndef LCD_EN
#er r or LCD_EN not def i ned
#endi f
#i f ndef LCD_RS
#er r or LCD_RS not def i ned
#endi f
#i f ndef LCD_RW
#er r or LCD_RWnot def i ned
#endi f
#i f ndef LCD_D4
#er r or LCD_D4 not def i ned
#endi f
#i f ndef LCD_D5
#er r or LCD_D5 not def i ned
64
#endi f
#i f ndef LCD_D6
#er r or LCD_D6 not def i ned
#endi f
#i f ndef LCD_D7
#er r or PI N_D7 not def i ned
#endi f
#def i ne PI N_EN LAT##LCD_EN
#def i ne TRI S_EN TRI S##LCD_EN
#def i ne PI N_RS LAT##LCD_RS
#def i ne TRI S_RS TRI S##LCD_RS
#def i ne PI N_RW LAT##LCD_RW
#def i ne TRI S_RW TRI S##LCD_RW
#def i ne PI N_D4 LAT##LCD_D4
#def i ne TRI S_D4 TRI S##LCD_D4
#def i ne PI N_D5 LAT##LCD_D5
#def i ne TRI S_D5 TRI S##LCD_D5
#def i ne PI N_D6 LAT##LCD_D6
#def i ne TRI S_D6 TRI S##LCD_D6
#def i ne PI N_D7 R##LCD_D7
#def i ne TRI S_D7 TRI S##LCD_D7
#def i ne P_I NPUT 1
#def i ne P_OUTPUT 0
#el se
#def i ne LCD_READ 0xE0
#def i ne LCD_WRI TE 0x00
#i f def USE_PORTA_LCD
#def i ne PORT_LCD PORTA
#def i ne TRI S_LCD TRI SA
#endi f
#i f def USE_PORTB_LCD
#def i ne PORT_LCD PORTB
#def i ne TRI S_LCD TRI SB
#endi f
#i f def USE_PORTC_LCD
#def i ne PORT_LCD PORTC
#def i ne TRI S_LCD TRI SC
#endi f
#i f def USE_PORTD_LCD
#def i ne PORT_LCD PORTD
#def i ne TRI S_LCD TRI SD
#endi f
#i f ndef PORT_LCD
#er r or USE_PORTx_LCD not def i ned
#endi f
st at i c vol at i l e near bi t PI N_EN @( ( unsi gned) &PORT_LCD*8) +0;
st at i c vol at i l e near bi t PI N_RS @( ( unsi gned) &PORT_LCD*8) +1;
st at i c vol at i l e near bi t PI N_RW @( ( unsi gned) &PORT_LCD*8) +2;
st at i c vol at i l e near bi t PI N_D4 @( ( unsi gned) &PORT_LCD*8) +3;
st at i c vol at i l e near bi t PI N_D5 @( ( unsi gned) &PORT_LCD*8) +4;
st at i c vol at i l e near bi t PI N_D6 @( ( unsi gned) &PORT_LCD*8) +5;
st at i c vol at i l e near bi t PI N_D7 @( ( unsi gned) &PORT_LCD*8) +6;
#endi f
/ *These byt es need t o be sent t o t he LCD t o st ar t i t up*/
const char LCD_I NI T_STRI NG[ 4] ={0x20 | ( LCD_TYPE <<2) , 0xC, 1, 6};

#def i ne LCD_LI NE_TWO 0x40 / / LCD RAM addr ess f or t he second l i ne
st at i c vol at i l e bi t RS;
/ *Pr ot ot ypes*/
voi d l cd_del ay( voi d) ;
voi d l cd_send_ni bbl e( byt e) ;
voi d l cd_send_byt e( byt e) ;
byt e l cd_r ead_byt e( voi d) ;
voi d l cd_i ni t ( voi d) ;
voi d l cd_cur sor ( l cd_cur sor _t ype) ;
voi d l cd_got oxy( byt e, byt e) ;
voi d l cd_bui l d_char ( byt e, byt e[ 7] ) ;
voi d l cd_use_bui l d_char ( byt e) ;
voi d l cd_er ase( l cd_di r ect i on, byt e) ;
voi d l cd_er ase_al l ( voi d) ;
byt e l cd_get c( byt e, byt e) ;
voi d l cd_moven( l cd_di r ect i on, char ) ;
voi d l cd_put ch( unsi gned char ) ;


/ *Funct i ons*/
65
voi d l cd_del ay( voi d) {
unsi gned char cont ;
cont =10;
whi l e( cont - - ) ;
}
voi d l cd_send_ni bbl e( byt e n) {
PI N_D4=BI TTEST( n, 0) ;
PI N_D5=BI TTEST( n, 1) ;
PI N_D6=BI TTEST( n, 2) ;
PI N_D7=BI TTEST( n, 3) ;
PI N_EN=1;
l cd_del ay( ) ;
PI N_EN=0;
l cd_del ay( ) ;
}
voi d l cd_send_byt e( byt e n) {
PI N_RS=0;
l cd_del ay( ) ;
whi l e( BI TTEST( l cd_r ead_byt e( ) , 7) ) ;
PI N_RS=RS;
l cd_del ay( ) ;
PI N_RW=0;
l cd_del ay( ) ;
PI N_EN=0;
l cd_send_ni bbl e( n>>4) ;
l cd_send_ni bbl e( n & 0x0f ) ;
}
byt e l cd_r ead_byt e( ) {
byt e l ow, hi gh;
l ow=0; hi gh=0;
#i f ndef USE_NO_PORT_LCD
TRI S_LCD=LCD_READ;
#el se
TRI S_EN=0; TRI S_RS=0; TRI S_RW=0;
TRI S_D4=1; TRI S_D5=1; TRI S_D6=1; TRI S_D7=1;
#endi f
PI N_RW=1;
l cd_del ay( ) ;
PI N_EN=1;
l cd_del ay( ) ;
i f ( PI N_D7) hi gh | = ( 1<<3) ;
i f ( PI N_D6) hi gh | = ( 1<<2) ;
i f ( PI N_D5) hi gh | = ( 1<<1) ;
i f ( PI N_D4) hi gh | = 1;
PI N_EN=0;
l cd_del ay( ) ;
PI N_EN=1;
l cd_del ay( ) ;
i f ( PI N_D7) l ow | = ( 1<<3) ;
i f ( PI N_D6) l ow | = ( 1<<2) ;
i f ( PI N_D5) l ow | = ( 1<<1) ;
i f ( PI N_D4) l ow | = 1;
PI N_EN=0;
l cd_del ay( ) ;
#i f ndef USE_NO_PORT_LCD
TRI S_LCD=LCD_WRI TE;
#el se
TRI S_EN=0; TRI S_RS=0; TRI S_RW=0; TRI S_D4=0; TRI S_D5=0; TRI S_D6=0; TRI S_D7=0;
#endi f
r et ur n ( ( hi gh<<4) | l ow) ;
}
voi d l cd_i ni t ( ) {
byt e i ;
#i f ndef USE_NO_PORT_LCD
TRI S_LCD=LCD_WRI TE;
#el se
TRI S_EN=0; TRI S_RS=0; TRI S_RW=0; TRI S_D4=0; TRI S_D5=0; TRI S_D6=0; TRI S_D7=0;
#endi f
l cd_del ay( ) ;
PI N_RS=0;
l cd_del ay( ) ;
PI N_RW=0;
l cd_del ay( ) ;
PI N_EN=0;
l cd_del ay( ) ;
f or ( i =1; i <=3; ++i ) {
66
l cd_send_ni bbl e( 3) ;
l cd_del ay( ) ;
}
l cd_send_ni bbl e( 2) ;
PI N_RS=RS==1?1: 0;
f or ( i =0; i <=3; ++i ) l cd_send_byt e( LCD_I NI T_STRI NG[ i ] ) ;
l cd_del ay( ) ;
}
voi d l cd_er ase_al l ( )
{
RS=0;
l cd_send_byt e( 0x1) ;
l cd_got oxy( 1, 1) ;
}
voi d l cd_got oxy( byt e x, byt e y) {
byt e addr ess;
i f ( y! =1)
addr ess=LCD_LI NE_TWO;
el se
addr ess=0;
addr ess+=x- 1;
RS=0;
l cd_send_byt e( 0x80| addr ess) ;
}

voi d l cd_cur sor ( l cd_cur sor _t ype l cdt ype)
{
RS=0;
swi t ch ( l cdt ype)
{
case l cd_cur sor _on:
l cd_send_byt e( 0x0E) ;
br eak;
case l cd_cur sor _of f :
l cd_send_byt e( 0x0C) ;
br eak;
case l cd_cur sor _bl i nk:
l cd_send_byt e( 0x0D) ;
br eak;
case l cd_cur sor _al t er nat e:
l cd_send_byt e( 0x0F) ;
br eak;
}
}
voi d l cd_bui l d_char ( unsi gned char addr ess, unsi gned char map[ ] )
{
unsi gned char Count ;
f or ( Count =0; Count <=7; Count ++)
{
RS=0;
l cd_send_byt e( addr ess+Count ) ;
RS=1;
l cd_send_byt e( map[ Count ] ) ;
}
}
voi d l cd_use_bui l d_char ( byt e number )
{
RS=1;
l cd_send_byt e( number ) ;
}
voi d l cd_er ase( l cd_di r ect i on di r , byt e n)
{
whi l e( n- - ) {
RS=0;
l cd_send_byt e( 0x10+di r *4) ;
l cd_put ch( ' ' ) ;
RS=0;
l cd_send_byt e( 0x10) ;
}
}
char l cd_get c( char x, char y)
{
byt e val ue;
l cd_got oxy( x, y) ;
whi l e( BI TTEST( l cd_r ead_byt e( ) , 7) ) ;
RS=1;
67
val ue=l cd_r ead_byt e( ) ;
RS=0;
r et ur n val ue;
}
voi d l cd_moven( l cd_di r ect i on di r , char n)
{
RS=0;
whi l e( n- - )
i f ( di r ) l cd_send_byt e( 0x14) ;
el se l cd_send_byt e( 0x10) ;
}
voi d l cd_put ch( unsi gned char c)
{
RS=0;
swi t ch( c) {
case ' \ f ' :
l cd_send_byt e( 0x1) ;
br eak;
case ' \ n' :
l cd_got oxy( 1, 2) ;
br eak;
case ' \ b' :
l cd_send_byt e( 0x10) ;
br eak;
def aul t :
RS=1;
l cd_send_byt e( c) ;
br eak;
}
}
#endi f


KEYBOARD.C

/ / Desi gn by Eng. Maur i ci o Lopes de Ol i vei r a

/ * The KEYB_CLOCK and KEYB_DATA pi ns shoul d be connect ed t o t he
keyboar d cor r esponded pi ns wi t h an 4K7 Pul l up.
The keyboar d al se needs GND and +5V*/

#i f ndef KEYB_DATA
#er r or KEYB_DATA pi n not def i ned. Use #def i ne KEYB_DATA PI N_XX
#endi f
#i f ndef KEYB_CLOCK
#er r or KEYB_CLOCK pi n not def i ned. Use #def i ne KEYB_CLOCK PI N_XX
#endi f
#def i ne PI N_KEYB_DATA R##KEYB_DATA
#def i ne TRI S_KEYB_DATA TRI S##KEYB_DATA
#def i ne PI N_KEYB_CLOCK R##KEYB_CLOCK
#def i ne TRI S_KEYB_CLOCK TRI S##KEYB_CLOCK

#def i ne PI N_I NPUT 0x01
#def i ne PI N_OUTPUT 0x00

#def i ne t r ue 1
#def i ne f al se 0

#def i ne bi t _cl ear ( nvar , nbi t ) ( nvar &= ~( 1<<nbi t ) )
#def i ne bi t _set ( nvar , nbi t ) ( nvar | = ( 1<<nbi t ) )

/ / f unct i ons pr ot ot ypes
voi d kbd_i ni t ( voi d) ;
unsi gned char kbd_r cv( voi d) ;
unsi gned char kbd_get c( voi d) ;

voi d kbd_i ni t ( voi d) {
TRI S_KEYB_CLOCK=PI N_I NPUT;
TRI S_KEYB_DATA=PI N_I NPUT;
}
68
voi d kbd_get s( char [ ] , unsi gned char ) ;


/ / ***** Keyboar d Funct i ons *****


/ ***********************************
kbd_r cv( ) : Recei ves byt es f r omkeyboar d
Ret ur n t he byt e r ecei ved
***********************************/
unsi gned char kbd_r cv( voi d)
{
unsi gned char cmd=0, cont ;
f or ( cont =1; cont <12; cont ++)
{
whi l e( PI N_KEYB_CLOCK) ;
i f ( ( cont >=2) &&( cont <=9) &&( PI N_KEYB_DATA) ) cmd| =( 1<<( cont - 2) ) ;
whi l e ( ! PI N_KEYB_CLOCK) ;
}
r et ur n cmd;
}


/ / Funct i ons keypad
#def i ne KBD_F1 0x81
#def i ne KBD_F2 0x82
#def i ne KBD_F3 0x83
#def i ne KBD_F4 0x84
#def i ne KBD_F5 0x85
#def i ne KBD_F6 0x86
#def i ne KBD_F7 0x87
#def i ne KBD_F8 0x88
#def i ne KBD_F9 0x89
#def i ne KBD_F10 0x8A
#def i ne KBD_F11 0x8B
#def i ne KBD_F12 0x8C
#def i ne KBD_UP 0x92
#def i ne KBD_DOWN 0x8C
#def i ne KBD_LEFT 0x8E
#def i ne KBD_RI GHT 0x90
#def i ne KBD_HOME 0X91



__EEPROM_DATA( 0x1C, 0x32, 0x21, 0x23, 0x24, 0x2B, 0x34, 0x33) ;
__EEPROM_DATA( 0x43, 0x3B, 0x42, 0x4B, 0x3A, 0x31, 0x44, 0x4D) ;
__EEPROM_DATA( 0x15, 0x2D, 0x1B, 0x2C, 0x3C, 0x2A, 0x1D, 0x22) ;
__EEPROM_DATA( 0x35, 0x1A, 0x45, 0x16, 0x1E, 0x26, 0x25, 0x2E) ;
__EEPROM_DATA( 0x36, 0x3D, 0x3E, 0x46, 0x70, 0x69, 0x72, 0x7A) ;
__EEPROM_DATA( 0x6B, 0x73, 0x74, 0x6C, 0x75, 0x7D, 0x05, 0x06) ;
__EEPROM_DATA( 0x04, 0x0C, 0x03, 0x0B, 0x83, 0x0A, 0x01, 0x09) ;
__EEPROM_DATA( 0x78, 0x07, 0x75, 0x72, 0x00, 0x00, 0x00, 0x00) ;
unsi gned char kbd_get c( )
{
unsi gned char r cv, cont ;
char keypad;
l oop:
r cv=kbd_r cv( ) ;
i f ( r cv==0xE0)
{
keypad=t r ue;
r cv=kbd_r cv( ) ;
}
el se keypad=f al se;
i f ( r cv==0xF0)
{
kbd_r cv( ) ;
got o l oop;
}
cont =0;
whi l e ( ( eepr om_r ead( cont ) ! =r cv) &&( cont <59) ) cont ++;
cont ++;
i f ( cont <=26) r cv=64+cont ; / / A- Z
el se i f ( ( cont >26) &&( cont <=36) ) r cv=21+cont ; / / 0- 9
el se i f ( ( cont >36) &&( cont <=46) ) / / 0- 9 Keypad
{
69
r cv=11+cont ;
i f ( keypad) r cv=r cv+90;
}
el se i f ( r cv==0x29) r cv=32; / / espao
el se i f ( r cv==0x1B) r cv=27; / / esc
el se i f ( r cv==0x5A) r cv=13; / / car r i age r et ur n
el se i f ( r cv==0x66) r cv=8; / / backspace
el se i f ( ( cont >46) &&( cont <=58) ) r cv=cont +82; / / Funct i ons Keypad
el se got o l oop; / / r cv=' \ 0' ;
r et ur n r cv;
}

voi d kbd_get s( char st r i ng[ ] , unsi gned char l enght )
{
char r ec=0;
char pos=0; / / Nmer os de Car act er es
char cont =0; / / posi o do cur sor
do
{
r ec = kbd_get c( ) ;
i f ( ( ( r ec<KBD_F1) | | ( r ec>KBD_F12) ) &&r ec! =0&&r ec! =13&&( ( r ec<129) | | ( r ec>140) ) )
{
i f
( ( r ec! =KBD_LEFT) &&( r ec! =KBD_RI GHT) &&( r ec! =KBD_UP) &&( r ec! =KBD_DOWN) &&( r ec! =8) &&( pos<l enght ) )
{
pr i nt f ( " %c" , r ec) ;
st r i ng[ cont ] =r ec;
i f ( pos==cont ) pos++;
cont ++;
}
i f ( ( r ec==8) &&( cont ! =0) )
{
i f ( cont ==pos) pos- - ;
el se st r i ng[ cont - 1] =' ' ;
cont - - ;
l cd_er ase( l ef t , 1) ;
}
i f ( ( r ec==KBD_LEFT) &&( cont ! =0) )
{
cont - - ;
l cd_moven( l ef t , 1) ;
}
i f ( ( r ec==KBD_HOME) &&( cont ! =0) )
{
l cd_moven( l ef t , cont ) ;
cont =0;
}
i f ( ( r ec==KBD_RI GHT) &&( cont ! =pos) )
{
cont ++;
l cd_moven( r i ght , 1) ;
}
}
} whi l e ( r ec! =13) ;
st r i ng[ pos] =' \ 0' ;
}


24CXX.C:

#i f ndef _24CXX_H
#def i ne _24CXX_H
#i f ndef _I 2C_MASTER_H
#er r or i 2c_mast er . h not i ncl uded
#endi f

#def i ne I 2C_EEPROM ( 0xA0)
#def i ne I 2C_EEPROM_A0 ( 0xA0 | 0x02)
#def i ne I 2C_EEPROM_A1 ( 0xA0 | 0x04)
#def i ne I 2C_EEPROM_A1_A0 ( 0xA0 | 0x06)
70
#def i ne I 2C_EEPROM_A2 ( 0xA0 | 0x08)
#def i ne I 2C_EEPROM_A0_A2 ( 0xA0 | 0x0A)
#def i ne I 2C_EEPROM_A1_A2 ( 0xA0 | 0x0C)
#def i ne I 2C_EEPROM_A0_A1_A2 ( 0xA0 | 0x0E)


char i 2c_eepr omReady( char ) ;
voi d i 2c_eepr omWr i t e( char , i nt , char ) ;
char i 2c_eepr omRead( char , i nt ) ;
char i 2c_eepr omReadCur r ent ( char ) ;
voi d i 2c_eepr omCur sor ( char , i nt ) ;
voi d i 2c_eepr omSequent i al Read( char , i nt , char *, unsi gned char ) ;
voi d i 2c_eepr omText Wr i t e( char , i nt , char *) ;
char i 2c_eepr omReady( char devi ce) {
char ack;
ack=i 2c_st ar t ( devi ce) ;
i 2c_st op( ) ;
r et ur n ack;
}

voi d i 2c_eepr omWr i t e( char devi ce, i nt addr ess, char dat a) {
i 2c_eepr omCur sor ( devi ce, addr ess) ;
i 2c_wr i t e( dat a) ;
i 2c_st op( ) ;
}
char i 2c_eepr omReadCur r ent ( char devi ce) {
char dat a;
i 2c_r est ar t ( devi ce | 0x01) ;
dat a=i 2c_r ead( 0) ;
i 2c_st op( devi ce) ;
r et ur n( dat a) ;
}
char i 2c_eepr omRead( char devi ce, i nt addr ess) {
i 2c_eepr omCur sor ( devi ce, addr ess) ;
r et ur n( i 2c_eepr omReadCur r ent ( devi ce) ) ;
}
voi d i 2c_eepr omCur sor ( char devi ce, i nt i 2c_addr ess) {
whi l e( ! i 2c_eepr omReady( devi ce) ) ;
i 2c_st ar t ( devi ce) ;
i 2c_wr i t e( i 2c_addr ess>>8) ;
i 2c_wr i t e( i 2c_addr ess) ;
}
voi d i 2c_eepr omSequent i al Read( char devi ce, i nt addr ess, char *dat a, unsi gned char si ze_st r ) {
unsi gned char cont ;
i 2c_eepr omCur sor ( devi ce, addr ess) ;
i 2c_r est ar t ( devi ce | 0x01) ;
f or ( cont =0; cont <( si ze_st r - 1) ; cont ++) dat a[ cont ] =i 2c_r ead( 1) ;
dat a[ si ze_st r - 1] =i 2c_r ead( 0) ;
dat a[ si ze_st r ] =' \ 0' ;
i 2c_st op( devi ce) ;
}
voi d i 2c_eepr omText Wr i t e( char devi ce, i nt addr ess, char *dat a) {
unsi gned char cont 2;
i nt cont 1, cont 3;
cont 1=0;
cont 2=addr ess;
cont 3=0;
whi l e( dat a[ cont 1] ! =' \ 0' )
{
whi l e( ! i 2c_eepr omReady( devi ce) ) ;
i 2c_st ar t ( devi ce) ;
i 2c_wr i t e( cont 2>>8) ;
i 2c_wr i t e( cont 2) ;
f or ( cont 3=0; cont 3<16; cont 3++)
{
i 2c_wr i t e( dat a[ cont 1++] ) ;
i f ( dat a[ cont 1] ==' \ 0' ) br eak;
}
i 2c_st op( ) ;
cont 2+=16;
}
}
#endi f


71
62256.C:

#i f ndef _62256_H
#def i ne _62256_H

#i f ndef RAM_LE_H
#er r or RAM_LE_H not def i ned
#endi f
#i f ndef RAM_LE_L
#er r or RAM_LE_L not def i ned
#endi f
#i f ndef PORT_RAM
#er r or PORT_RAM not def i ned
#endi f
#i f ndef RAM_OE
#er r or RAM_OE not def i ned
#endi f
#i f ndef RAM_WE
#er r or RAM_WE not def i ned
#endi f

#def i ne PORT_I NPUT 0xFF
#def i ne PORT_OUTPUT 0x00
#def i ne PI N_I NPUT 0x01
#def i ne PI N_OUTPUT 0x00

#def i ne T_RAM_LE_H TRI S##RAM_LE_H
#def i ne P_RAM_LE_H LAT##RAM_LE_H
#def i ne T_RAM_LE_L TRI S##RAM_LE_L
#def i ne P_RAM_LE_L LAT##RAM_LE_L
#def i ne T_RAM TRI S##PORT_RAM
#def i ne L_RAM LAT##PORT_RAM
#def i ne T_OE TRI S##RAM_OE
#def i ne P_OE LAT##RAM_OE
#def i ne T_WE TRI S##RAM_WE
#def i ne P_WE LAT##RAM_WE
#def i ne P_RAM PORT##PORT_RAM

voi d r am_I ni t ( voi d) ;
voi d r am_Cur sor ( unsi gned i nt ) ;
unsi gned char r am_ReadByt e( unsi gned i nt ) ;
voi d r am_Wr i t eByt e( unsi gned char , unsi gned i nt ) ;
voi d r am_Sequent i al Wr i t e( char *, unsi gned i nt ) ;
voi d r am_Sequent i al Read( char *, unsi gned i nt , unsi gned i nt ) ;

voi d r am_I ni t ( voi d) {
T_RAM_LE_L=T_RAM_LE_H=PI N_OUTPUT;
T_WE=PI N_OUTPUT;
T_OE=PI N_OUTPUT;
P_WE=1;
P_OE=1;
}
voi d r am_Cur sor ( unsi gned i nt addr ess) {
P_RAM_LE_H=0;
P_RAM_LE_L=0;
T_RAM=PORT_OUTPUT;
P_RAM=( unsi gned char ) ( addr ess>>8) ;
P_RAM_LE_H=1;
P_RAM_LE_H=0;
P_RAM=( unsi gned char ) ( addr ess&0xFF) ;
P_RAM_LE_L=1;
P_RAM_LE_L=0;
}
unsi gned char r am_ReadByt e( unsi gned i nt addr ess) {
unsi gned char r et ;
r am_Cur sor ( addr ess) ;
P_OE=0;
T_RAM=PORT_I NPUT;
r et =P_RAM;
P_OE=1;
r et ur n r et ;
72
}
voi d r am_Wr i t eByt e( unsi gned char val ue, unsi gned i nt addr ess) {
T_RAM=PORT_OUTPUT;
r am_Cur sor ( addr ess) ;
L_RAM=val ue;
P_WE=0;
P_WE=1;
T_RAM=PORT_I NPUT;
}
voi d r am_Sequent i al Wr i t e( char *val , unsi gned i nt i ni t i al _addr ess) {
i nt cont =0;
whi l e( val [ cont ++] ! =' \ 0' ) r am_Wr i t eByt e( val [ cont - 1] , i ni t i al _addr ess+cont - 1) ;
}
voi d r am_Sequent i al Read( char *val , unsi gned i nt i ni t i al _addr ess, unsi gned i nt si ze) {
i nt cont =0;
whi l e( cont ++! =si ze) val [ cont - 1] =r am_ReadByt e( i ni t i al _addr ess+cont - 1) ;
val [ cont - 1] =' \ 0' ;
}
#endi f


PCF8583.C:

/ *********************************************************************/
/ * PCF8583. h */
/ * Header f i l e f or t he cont r ol of t he PCF8583 */
/ * of Fer nando Hei t or ( 2003) */
/ * UPADATE: J une 2004 */
/ * ht t p: / / www. f er nando- hei t or . de */
/ * The f ol l owi ng r out i nes ar e her e i nt egr at ed: */
/ * Dect oHex( ) - dec. i n Hex. changes over */
/ * Hext oDec( ) - wandel t Hex. i n Dez. um */
/ * wr i t e8583_r t c( ) - Funct i on wr i t es t he i ndi cat ed byt e wi t h */
/ * addr ess i nt o t he PCF8583 */
/ * r ead8583_r t c( ) - Funct i on r eads i n t he i ndi cat ed */
/ * addr ess of PCF8583 */
/ * */
/ *********************************************************************/
#i f ndef _PCF_8583_H
#def i ne _PCF_8583_H
#def i ne BYTE unsi gned char
#i f ndef _I 2C_MASTER_H
#er r or i 2c_mast er . h not i ncl uded
#endi f
st r uct Ti me
{
BYTE hour ;
BYTE mi nut e;
BYTE seconds;
};

st r uct Dat e
{
BYTE year ;
BYTE mont h;
BYTE day;
BYTE weekday;
};

st r uct Count er
{
BYTE t housand;
BYTE hundr ed;
BYTE one;
};

BYTE sec_bef or e; / / Ar t i f i ci al var i abl e f or t he second exami nat i on

/ *********************************************
Def i ni t i ons f or A0 pi n
73
**********************************************/
#i f ndef RTC_A0_HI GH
#def i ne ADDRESS_WRI TE 0xA0 / / The addr ess A0 f or l et t er s, i f pi n A0 i s
because of t he PCF8583 on GND
#def i ne ADDRESS_READ 0xA1 / / The addr ess A1 f or vi nt ages, i f pi n A0 at t he
PCF8583 on GND l ei gt
#el se
#def i ne ADDRESS_WRI TE 0xA2 / / The addr ess A0 f or l et t er s, i f pi n A0 i s
because of t he PCF8583 on GND
#def i ne ADDRESS_READ 0xA3 / / The addr ess A1 f or vi nt ages, i f pi n A0 at t he
PCF8583 on GND l ei gt
#endi f


/ ********************************************
Def i ni t i ons f or t he PCF8583
********************************************/

/ / Used i n wr i t e8583_r t c
#def i ne SET_DATE_TI ME 0x01 / / St ar t addr ess i n t he PCF8583 r egi st er f or
descr i bi ng
#def i ne SET_ALARM 0x09 / / Wi t h t hi s addr ess set t i ng t he al ar mt i me begi ns

/ / Used i n r ead8583_r t c
#def i ne GET_DATE_TI ME 0x02 / / St ar t addr ess i n t he PCF8583 r egi st er f or
r eadi ng
#def i ne GET_ALARM 0x0A / / The al ar mt i me can be quer i ed by t hi s addr ess




/ **********************************************************/
/ *** di f f er ent adj ust ment possi bi l i t i es f or t he PCF8583 ***/
/ **********************************************************/

/ / Conf i gur at i ons f or t he cont r ol / st at us r egi st er
/ / Used i n conf i gur e8583_cont r ol
#def i ne al ar m_enabl e 0x04 / / Her e t he al ar mf unct i on i s act i vat ed
#def i ne cl ock_mode32khz 0x00 / / Cl ock f r equency of t he PCF8583 32, 768 kHz
#def i ne cl ock_mode50hz 0x10 / / Cl ock f r equency of t he PCF8583 50 Hz
#def i ne event count er _mode 0x20 / / Event - Count er Mode
#def i ne hol d_l ast _count _f 0x40

/ / Conf i gur at i ons f or al ar mt he cont r ol r egi st er
/ / Used i n conf i gur e8583_al ar m_r eg
#def i ne t i mer _hundsek 0x01 / / Ti mer f unct i on: Ti mer i s r el eased i n t he 100st el
seconds
#def i ne t i mer _seconds 0x02 / / Ti mer f unct i on: Ti mer i s r el eased i n t he 1- second
pul se
#def i ne t i mer _mi nut es 0x03 / / Ti mer f unct i on: Ti mer i s r el eased i n t he mi nut es
pul se
#def i ne t i mer _hour s 0x04 / / Ti mer f unct i on: Ti mer i s r el eased once per hour
#def i ne t i mer _days 0x05 / / Ti mer f unct i on: Ti mer i s dai l y r el eased
#def i ne t i mer _i nt _enabl e 0x08 / / Her e t he t i mer i nt er r upt i s act i vat ed
#def i ne dai l y_al ar m 0x10 / / Cl ock al ar mf unct i on DAI LY al ar m
#def i ne weekday_al ar m 0x20 / / Cl ock al ar mf unct i on weekday al ar m
#def i ne dat ed_al ar m 0x30 / / Cl ock al ar mf unct i on dat ed al ar m
#def i ne t i mer _al ar m_enabl e 0x40 / / Her e t he t i mer al ar mi s swi t ched on
#def i ne al ar m_i nt _enabl e 0x80 / / Her e t he al ar mi nt er r upt i s swi t ched on

/ / f ur t her conf i gur at i on opt i ons f or t he hour r egi st er addr ess 0x04
#def i ne STD_Anzei ge_12h 0x80
#def i ne STD_AM_Fl ag 0x00
#def i ne STD_PM_Fl ag 0x40


/ / Tr ansf or mat i on f r omdeci mal t o BCD
BYTE Dect oBCD( BYTE val ue)
{
r et ur n ( val ue%10 + 16 * ( val ue/ 10) ) ;
}

/ / Tr ansf or mat i on of BCD t o deci mal
BYTE BCDt oDec( BYTE val ue)
{
r et ur n ( val ue%16 + 10 * ( val ue/ 16) ) ;
74
}

BYTE Dect oHex( BYTE val ue)
{
r et ur n ( val ue%10 + 16 * ( val ue/ 10) ) ;
}

/ * Tr ansf or mat i on of hexadeci mal ( BCD) t o deci mal */
BYTE Hext oDec( BYTE val ue)
{
r et ur n ( val ue%16 + 10 * ( val ue/ 16) ) ;
}

voi d wr i t e8583_r t c( st r uct Ti me *t , st r uct Dat e *d, BYTE addr ess_r eg)
{
BYTE r t c_t emp;
i 2c_st ar t ( ADDRESS_WRI TE) ;
i 2c_wr i t e( addr ess_r eg) ;
i 2c_wr i t e( 0x00) ; / / Hundr eds of seconds ar e set her e t o 0
i 2c_wr i t e( Dect oBCD( t - >seconds) ) ; / / Seconds ar e st or ed i n addr ess 0x02
i 2c_wr i t e( Dect oBCD( t - >mi nut e) ) ; / / Mi nut es ar e st or ed i n addr ess 0x03
i 2c_wr i t e( Dect oBCD( t - >hour ) ) ; / / Hour s ar e st or ed i n addr ess 0x04
r t c_t emp = ( Dect oBCD( d- >day) ) & 0x3F;
i 2c_wr i t e( r t c_t emp | ( ( d- >year & 0x03) << 6) ) ; / / Year and day ar e st or ed i n addr ess 0x05
r t c_t emp = Dect oBCD( d- >mont h) ;
i 2c_wr i t e( d- >weekday<<5 | r t c_t emp) ; / / Her e mont h and weekday ar e summar i zed and wr i t t en
i 2c_st op( ) ;
}

voi d r ead8583_r t c( st r uct Ti me *t , st r uct Dat e *d, BYTE addr ess_r eg)
{
BYTE r t c_t emp;
i 2c_st ar t ( ADDRESS_WRI TE) ;
i 2c_wr i t e( addr ess_r eg) ;
i 2c_r est ar t ( ADDRESS_READ) ;
t - >seconds = BCDt oDec( i 2c_r ead( 1) & 0x7f ) ; / / Seconds i n addr ess 0x02 one sel ect s
t - >mi nut e = BCDt oDec( i 2c_r ead( 1) ) ; / / Mi nut es i n addr ess 0x03 one sel ect s
t - >hour = BCDt oDec( i 2c_r ead( 1) & 0x3f ) ; / / Hour s i n addr ess 0x04 one sel ect s
/ / Year and day i n t he addr ess 0x05 ar e pi cked out
r t c_t emp = i 2c_r ead( 1) ;
d- >year = ( r t c_t emp >> 6 ) & 0x03;
d- >day = BCDt oDec( r t c_t emp & 0x3f ) ;
/ / Weekday and mont h ar e pi cked out i n t he addr ess 0x06
r t c_t emp = i 2c_r ead( 0) ;
d- >weekday = r t c_t emp >> 5;
d- >mont h = BCDt oDec( r t c_t emp & 0x1f ) ;
i 2c_st op( ) ;
}


/ / By t he f unct i on t he r egi st er one conf i gur es t o cont r ol / st at us
voi d conf i gur e8583_cont r ol _r eg( BYTE cont r ol _r eg)
{
i 2c_st ar t ( ADDRESS_WRI TE) ;
i 2c_wr i t e( 0x00) ;
i 2c_wr i t e( cont r ol _r eg) ;
i 2c_st op( ) ;
}

/ / By t he f unct i on one conf i gur es t o al ar mcont r ol r egi st er
voi d conf i gur e8583_al ar m_r eg( BYTE al ar m_r eg)
{
i 2c_st ar t ( ADDRESS_WRI TE) ;
i 2c_wr i t e( 0x08) ;
i 2c_wr i t e( al ar m_r eg) ;
i 2c_st op( ) ;
}

/ / Mat er i al t i me Cl ock i s set t o 0, i f t i mer mode i s used
voi d wr i t e8583_zer ocl ock( )
{
i 2c_st ar t ( ADDRESS_WRI TE) ;
i 2c_wr i t e( 0x01) ;
i 2c_wr i t e( 0x00) ;
i 2c_wr i t e( 0x00) ;
i 2c_wr i t e( 0x00) ;
75
i 2c_wr i t e( 0x00) ;
i 2c_st op( ) ;
}

/ / Ti mer val ue i s set i n addr ess 0x0F
voi d wr i t e8583_t i mer ( BYTE al ar m_t i mer )
{
i 2c_st ar t ( ADDRESS_WRI TE) ;
i 2c_wr i t e( 0x07) ;
i 2c_wr i t e( 0x00) ;
i 2c_st op( ) ;
i 2c_r est ar t ( ADDRESS_WRI TE) ;
i 2c_wr i t e( 0x0f ) ;
i 2c_wr i t e( Dect oHex( al ar m_t i mer ) ) ;
i 2c_st op( ) ;
}

/ / Wi t h t hi s f unct i on PCF8583 i n t he Event Count er mode wi t h t he number of Event s i s
i ni t i al i zed
voi d wr i t e8583_event count er ( st r uct Count er *c)
{
i 2c_st ar t ( ADDRESS_WRI TE) ;
i 2c_wr i t e( 0x01) ;
i 2c_wr i t e( c- >one) ;
i 2c_wr i t e( c- >hundr ed) ;
i 2c_wr i t e( c- >t housand) ;
i 2c_st op( ) ;
}

/ / PCF8583 i n t he Event Count er mode i s i ni t i al i zed by t hi s f unct i on wi t h t he number of Event s
ar ound t he al ar mt o r el ease
voi d wr i t e8583_event al ar m( st r uct Count er *c)
{
i 2c_st ar t ( ADDRESS_WRI TE) ;
i 2c_wr i t e( 0x09) ; / / addr ess of f i r st wr i t e
i 2c_wr i t e( c- >one) ;
i 2c_wr i t e( c- >hundr ed) ;
i 2c_wr i t e( c- >t housand) ;
i 2c_st op( ) ;
}

/ / Her e t he Event Count er i s r ead, i . e. t he cur r ent number of Event s.
voi d r ead8583_event count er ( st r uct Count er *c)
{
BYTE var ;
i 2c_st ar t ( ADDRESS_WRI TE) ;
i 2c_wr i t e( 0x01) ;
i 2c_st ar t ( ADDRESS_READ) ;
var = i 2c_r ead( 1) ;
c- >one = Hext oDec( var ) ;
var = i 2c_r ead( 1) ;
c- >hundr ed = Hext oDec( var ) ;
var = i 2c_r ead( 0) ;
c- >t housand = Hext oDec( var ) ;
i 2c_st op( ) ;
}

/ / Her e t he Event al ar mi s pi cked out t ons of t he r el eases i . e. t he NUMBERS OF Event s ar ound
at al ar m.
voi d r ead8583_event _al ar m( st r uct Count er *c)
{
BYTE var ;
i 2c_st ar t ( ADDRESS_WRI TE) ;
i 2c_wr i t e( 0x09) ;
i 2c_r est ar t ( ADDRESS_READ) ;
var = i 2c_r ead( 1) ;
c- >one = Hext oDec( var ) ;
var = i 2c_r ead( 1) ;
c- >hundr ed = Hext oDec( var ) ;
var = i 2c_r ead( 0) ;
c- >t housand = Hext oDec( var ) ;
i 2c_st op( ) ;
}

#endi f
76

PRINTER.C:

#i f ndef _PRI NTER_H
#def i ne _PRI NTER_H
#def i ne BUSY C0
#def i ne STROBE C1
#def i ne HPRI NT B7
#def i ne PPRI NT D
#def i ne PORT_I NPUT 0xFF
#def i ne PORT_OUTPUT 0x00
#def i ne PI N_I NPUT 0x01
#def i ne PI N_OUTPUT 0x00
#def i ne L_HPRI NT LAT##HPRI NT
#def i ne T_HPRI NT TRI S##HPRI NT
#def i ne T_BUSY TRI S##BUSY
#def i ne R_BUSY R##BUSY
#def i ne T_STROBE TRI S##STROBE
#def i ne L_STROBE LAT##STROBE
#def i ne T_PRI NT TRI S##PPRI NT
#def i ne L_PRI NT LAT##PPRI NT
voi d pr i nt er ( unsi gned const char ) ;
voi d pr n_pr i nt f ( unsi gned const char [ ] ) ;
voi d pr i nt er ( unsi gned const char c) {
T_HPRI NT=PI N_OUTPUT;
T_STROBE=PI N_OUTPUT;
T_PRI NT=PORT_OUTPUT;
T_BUSY=PI N_I NPUT;
L_HPRI NT=0;
whi l e ( R_BUSY) ;
L_PRI NT=c;
L_STROBE=0;
L_STROBE=1;
T_STROBE=PI N_I NPUT;
T_HPRI NT=PI N_I NPUT;
}
voi d pr n_pr i nt f ( unsi gned const char st r [ ] ) {
unsi gned i nt cont =0;
whi l e( st r [ cont ] ! =' \ 0' ) {
pr i nt er ( st r [ cont ] ) ;
cont ++;
}
}
#endi f




I2C_MASTER.C:

/ *****************************************************************************************
Har dwar e I 2C si ngl e mast er r out i nes f or PI C18Fxxx and 18Fxxxx
f or HI - TEC PI C C COMPI LER.

i 2c_i ni t - i ni t i al i ze I 2C f unct i ons
i 2c_st ar t - i ssue St ar t condi t i on
i 2c_r epSt ar t - i ssue Repeat ed St ar t condi t i on
i 2c_st op - i ssue St op condi t i on
i 2c_r ead( x) - r ecei ve unsi gned char - x=0, don' t acknowl edge - x=1, acknowl edge
i 2c_wr i t e - wr i t e unsi gned char - r et ur ns ACK

by

77
Maur i ci o Ol i vei r a
E- mai l maur i ci ol opol @hot mai l . com

REGI STERS AND FLAGS
SSPI F: ( Per i pher al I nt er r upt Request Regi st er 1 - PI R1 - Bi t 3)
SSP I nt er r upt f l ag, i s set i n t he f ol l owi ng event s:
St ar t condi t i on, St op condi t i on, Dat a t r ansf er byt e t r ansmi t t ed/ r ecei ve
Acknowl edge t r ansmi t , r epeat ed St ar t

SSPBUF: ( SYNCHRONOUS SERI AL PORT) Recei ve Buf f er / Tr ansmi t Regi st er
SSPBUF i s t he buf f er r egi st er t o whi ch dat a byt es ar e wr i t t en t o or r ead f r om.

RCEN: SSPCON2 ( MSSP CONTROL REGI STER 2 - I 2C MODE) bi t 3
1 = Enabl es Recei ve mode f or I 2C oper at i on
0 = Recei ve I dl e

ACKDT: SSPCON2 bi t 5 - Acknowl edge Dat a bi t ( Mast er Recei ve mode onl y)
1 = Not Acknowl edge
0 = Acknowl edge

ACKEN: SSPCON2 bi t 4 - Acknowl edge Sequence Enabl e bi t
1 = I ni t i at e Acknowl edge sequence on SDA and SCL pi ns and t r ansmi t ACKDT dat a bi t .
Aut omat i cal l y cl ear ed by har dwar e.
0 = Acknowl edge sequence I dl e

SEN: SSPCON2 bi t 0 - St ar t Condi t i on Enabl e
1 = I ni t i at e St ar t condi t i on on SDA and SCL pi ns. Aut omat i cal l y cl ear ed by har dwar e.
0 = St ar t condi t i on I dl e

ACKSTAT: SSPCON2 bi t 6 - Acknowl edge St at us bi t
1 = Acknowl edge was not r ecei ved f r omsl ave
0 = Acknowl edge was r ecei ved f r omsl ave

RSEN: SSPCON2 bi t 1 - Repeat ed St ar t Condi t i on Enabl e bi t
1 = I ni t i at e Repeat ed St ar t condi t i on on SDA and SCL pi ns. Aut omat i cal l y cl ear ed by
har dwar e.
0 = Repeat ed St ar t condi t i on I dl e

PEN: SSPCON2 bi t 2 - St op Condi t i on Enabl e bi t
1 = I ni t i at e St op condi t i on on SDA and SCL pi ns. Aut omat i cal l y cl ear ed by har dwar e.
0 = St op condi t i on I dl e
**********************************************************************************************
************/
#i f ndef _I 2C_MASTER_H
#def i ne _I 2C_MASTER_H
voi d i 2c_i ni t ( unsi gned char ) ;
voi d i 2c_wai t For I dl e( voi d) ;
char i 2c_st ar t ( unsi gned char ) ;
char i 2c_r est ar t ( unsi gned char ) ;
voi d i 2c_st op( ) ;
unsi gned char i 2c_wr i t e( unsi gned char ) ;
unsi gned char i 2c_r ead( unsi gned char ) ;

voi d i 2c_i ni t ( unsi gned char ssp_add)
{
SSPCON1 = 0x38; / / set I 2C mast er mode
SSPCON2 = 0x00;
/ * cl ock = FOSC / ( 4 * ( SSPADD+1) ) - Max Cl ock - 100k*/
SSPADD = ssp_add; / / 100k at 4Mhz cl ock
CKE=1; / / use I 2C l evel s wor ked al so wi t h ' 0'
SMP=1; / / di sabl e sl ew r at e cont r ol wor ked al so wi t h ' 0'
}



voi d i 2c_wai t For I dl e( )
{
whi l e ( ( SSPCON2 & 0x1F) | | RW) {}; / / wai t f or i dl e and not wr i t i ng
}

char i 2c_st ar t ( unsi gned char i 2c_addr ess)
{
i 2c_wai t For I dl e( ) ;
SEN=1;
r et ur n ( i 2c_wr i t e( i 2c_addr ess) ) ;
}
78

char i 2c_r est ar t ( unsi gned char i 2c_addr ess)
{
i 2c_wai t For I dl e( ) ;
RSEN=1;
r et ur n ( i 2c_wr i t e( i 2c_addr ess) ) ;
}
voi d i 2c_st op( )
{
i 2c_wai t For I dl e( ) ;
PEN=1;
}



unsi gned char i 2c_r ead( unsi gned char ack )
{
char i 2cReadDat a;
i 2c_wai t For I dl e( ) ;
RCEN=1;
i 2c_wai t For I dl e( ) ;
i 2cReadDat a = SSPBUF;
i 2c_wai t For I dl e( ) ;
i f ( ack ) ACKDT=0;
el se ACKDT=1;
ACKEN=1; / / send acknowl edge sequence
r et ur n( i 2cReadDat a ) ;
}

unsi gned char i 2c_wr i t e( unsi gned char i 2cWr i t eDat a )
{
i 2c_wai t For I dl e( ) ;
SSPBUF = i 2cWr i t eDat a;
i 2c_wai t For I dl e( ) ;
r et ur n ( ! ACKSTAT ) ; / / f unct i on r et ur ns ' 1' i f t r ansmi ssi on i s acknowl edged
}
#endi f




FILE.C:

/ *******************************************************************
* Ar qui vo: f i l e1. c
* Descr i o: Funcoes Basi cas do Si st ema de Ar qui vos
*
*
* Equi pe de Si st emas Embut i dos - NCE/ UFRJ - 2005/ 2006
* Aut or es: Dani el da Cunha Schmi dt
* Vi ni ci us dos Sant os Si l va
*
* Baseado no codi go par a o Si st ema de Ar qui vos Zi LOG
* par a o eZ80
********************************************************************/


#i ncl ude " . . \ i ncl udes\ f i l ei ni t . c"

i nt f i l e_al l ocat e_sect or ( )
{
i nt bl k = 0;

/ / Pr ocur a por umset or vazi o na t abel a
whi l e( sect or _t abl e[ bl k] ! = 0xFFFF)
{

bl k++;
/ / Se nao achar set or vazi o, r et or na ' - 1'
i f ( bl k >= NSECTORS) r et ur n - 1;
79
}

/ / Ret or na o i ndi ce do pr i mei r o set or vazi o na t abel a
r et ur n bl k;
}


/ * Cr i a novo ar qui vo na EEPROM
Ret or na - 1 se o ar qui vo j a exi st e ou se
nao exi st e espaco. Ret or na 0 emcaso de sucesso.

name[ ] Nome do ar qui vo a ser cr i ado.
t ag 0 - Ar qui vo Sequenci al
n - Ar qui vo de Regi st r os, onde n eh o t amanho de cada r egi st r o. */
char f cr eat e( char name[ ] , char t ag)
{
i nt i dx, bl k, end_st ;
char i ;


/ / Pr ocur a o ar qui vo pr a ver se el e j a exi st e
i dx = f exi st s( name) ;

/ / Se j a exi st i r . . .
i f ( i dx >= 0)
{
r et ur n ( char ) - 1;
}

/ / Se nao exi st i r , zer a ' i dx'
i dx = 0;


/ / Pr ocur a ent r ada vazi a na t abel a de ar qui vos
whi l e( f i l e_t abl e[ i dx] . name[ 0] ! = 0xFF)
{
i dx++;

/ / Se nao exi st i r emmai s ent r adas vazi as. . .
i f ( i dx >= NFENTRI ES)
{
r et ur n ( char ) 0xFF;
}
}

/ / Pr ocur a por umset or vazi o par a al ocar o i ni ci o do ar qui vo
bl k = f i l e_al l ocat e_sect or ( ) ;
/ / Se nao exi st i r set or vazi o. . .
i f ( bl k < 0)
{
r et ur n ( char ) 0xFF;
}


/ / Escr eve o nome do novo ar qui vo
st r cpy( f i l e_t abl e[ i dx] . name, name) ;
f or ( i =0; i <TAM_STRI NG; i ++)
i 2c_eepr omWr i t e( I 2C_EEPROM_A0, f t _l ogi ct ophysi cal ( i dx, FTNAME) +i , name[ i ] ) ;

/ / Escr eve o numer o do pr i mei r o set or do novo ar qui vo
f i l e_t abl e[ i dx] . st ar t = bl k;
wr i t e_eepr om_i nt ( f t _l ogi ct ophysi cal ( i dx, FTSTART) , bl k, EEPROM_EXT) ;

/ / Cr i a uma ' t ag' pr o ar qui vo
end_st = FS_ADDRESS + bl k * SECTORSI ZE; / / <======== acer t ar ender eco ( end_st )
i 2c_eepr omWr i t e( I 2C_EEPROM_A0, end_st , t ag) ;

/ / O t amanho do ar qui vo eh 1 ( apenas a t ag)
f i l e_t abl e[ i dx] . si ze = 1;
wr i t e_eepr om_i nt ( f t _l ogi ct ophysi cal ( i dx, FTSI ZE) , 1, EEPROM_EXT) ;

/ / Sect or _t abl e[ bl k] r ecebe o numer o do pr oxi mo set or ocupado pel o ar qui vo
/ / Nest e caso, o pr opr i o set or ( o uni co! - por enquant o)
sect or _t abl e[ bl k] = bl k;
wr i t e_eepr om_i nt ( st _l ogi ct ophysi cal ( bl k) , bl k, EEPROM_I NT) ;

80
t emp = cr eat e_i nt ( st _l ogi ct ophysi cal ( bl k) , EEPROM_I NT) ;

r et ur n ( char ) 0;
}


/ * Apaga o ar qui vo da EEPROM
Ret or na - 1 se o ar qui vo nao exi st i r
Ret or na 0 emcaso de sucesso */
char f er ase( char name[ ] )
{
i nt i dx, bl k, bl k1;

/ * DEBUG
char l i do1[ ] , l i do2[ ] ;
*/

/ / pr ocur a o nome do ar qui vo par a ver se el e exi st e
i dx = f exi st s( name) ;

/ / Se ar qui vo nao exi st i r . . .
i f ( i dx < 0)
{
r et ur n ( char ) 0xFF;
}

/ / ' bl k' r ecebe o numer o do pr i mei r o set or do ar qui vo
bl k = f i l e_t abl e[ i dx] . st ar t ;

/ / Li ber a t odos os set or es do ar qui vo
whi l e( sect or _t abl e[ bl k] ! = 0xFFFF)
{

/ / ' bl k1' guar da o i ndi ce do pr oxi mo set or do ar qui vo
bl k1 = sect or _t abl e[ bl k] ;

i 2c_eepr omSequent i al Read ( I 2C_EEPROM_A0, st _l ogi ct ophysi cal ( bl k) , l i do1, 0x02) ;

/ / O i ndi ce eh apagado
sect or _t abl e[ bl k] = 0xFF;
wr i t e_eepr om_i nt ( st _l ogi ct ophysi cal ( bl k) , 0xFF, EEPROM_I NT) ;

/ * DEBUG
i 2c_eepr omSequent i al Read( I 2C_EEPROM_A0, st _l ogi ct ophysi cal ( bl k) , l i do2, 0x02) ;
bl k = bl k1;
}

i 2c_eepr omSequent i al Read( I 2C_EEPROM_A0, f t _l ogi ct ophysi cal ( i dx, FTSTART) , l i do1, 0x02) ;
/ / Apaga o set or i ni ci al do ar qui vo na t abel a
f i l e_t abl e[ i dx] . st ar t = 0xFF;
wr i t e_eepr om_i nt ( f t _l ogi ct ophysi cal ( i dx, FTSTART) , 0xFF, EEPROM_EXT) ;



/ / apaga o t amanho do ar qui vo na t abel a
f i l e_t abl e[ i dx] . si ze = ( i nt ) 0xFF;
i 2c_eepr omPageWr i t e ( I 2C_EEPROM_A0, f t _l ogi ct ophysi cal ( i dx, FTSI ZE) , ( char *) 0xFF,
si zeof ( i nt ) ) ;


/ / apaga o nome do ar qui vo na t abel a ( apaga so a pr i mei r a l et r a)
f i l e_t abl e[ i dx] . name[ 0] = ( char ) 0xFF;
i 2c_eepr omPageWr i t e( I 2C_EEPROM_A0, f t _l ogi ct ophysi cal ( i dx, FTNAME) , ( char *) 0xFF, 1) ;

r et ur n ( char ) 0;
}


/ * Pr ocur a pel o ar qui vo na t abel a de ar qui vos
Ret or na - 1 se o ar qui vo nao f or encont r ado
se f or emcont r ado, r et or na o i ndi ce do ar qui vo na t abel a */
i nt f exi st s( char name[ ] )
{
i nt i dx = 0;


81
whi l e( i dx < NFENTRI ES)
{
st r cpy( name_t emp, f i l e_t abl e[ i dx] . name) ;

st r cpy( buf , f i l e_t abl e[ i dx] . name) ;

i f ( st r cmp( f i l e_t abl e[ i dx] . name, name) == 0) r et ur n i dx;
i dx ++;
}

r et ur n - 1;
}


/ * Abr e umar qui vo.
Ret or na 0 se nenhumar qui vo como nome apont ado por name[ ] f or encont r ado
ou se nao ha mai s espaco na t abel a de ar qui vos aber t os.
Se o ar qui vo f or encont r ado, sua ent r ada na t abel a de ar qui vos aber t os
eh r et or nada.

name[ ] : Nome do ar qui vo a ser aber t o.

modos:
FM_APPEND - I nser e dados no f i mdo ar qui vo
FM_RDWR - Le ou escr eve no i ni ci o do ar qui vo
Se al gumout r o val or di f er ent e de FM_APPEND eh f or neci do, o
modo def aul t ed FM_RDWR. */
FI LE* f open( char name[ ] , char mode)
{
i nt i dx, i nd;
char out r o_nome[ 9] , buf [ 20] ;
i nd = - 1;
f or ( i dx = NFHANDLES- 1; i dx >= 0; i dx- - )
{
st r cpy( out r o_nome, f i l e_handl e_t abl e[ i dx] . pf i l e- >name) ;
i f ( st r cmp( out r o_nome, name) == 0)
{
r et ur n NULL;
}

i f ( f i l e_handl e_t abl e[ i dx] . pf i l e == ( f i l e_ent r y *) 0)
i nd = i dx;
}

i f ( i nd < 0)
{
r et ur n NULL;
}

i dx = f exi st s( name) ;


i f ( i dx < 0)
{
r et ur n NULL;
}


/ / Associ a a ent r ada do ar qui vo a ' t abel a de ar qui vos aber t os'
f i l e_handl e_t abl e[ i nd] . pf i l e = &f i l e_t abl e[ i dx] ;

f i l e_handl e_t abl e[ i nd] . t ag = i 2c_eepr omRead( I 2C_EEPROM_A0, FS_ADDRESS +
( f i l e_handl e_t abl e[ i nd] . pf i l e- >st ar t ) * SECTORSI ZE ) ;

/ / Set a o val or de ' of f set '
i f ( mode)
{
f i l e_handl e_t abl e[ i nd] . of f set = f i l e_handl e_t abl e[ i nd] . pf i l e- >si ze;

f i l e_handl e_t abl e[ i nd] . of f set , EEPROM_I NT) ;
}
el se
{
/ / Se f or FM_RDWR, escr eve/ l e no i ni ci o do ar qui vo
/ / pf - > of f set = 0;
f i l e_handl e_t abl e[ i nd] . of f set = 0;
82

}

r et ur n &f i l e_handl e_t abl e[ i nd] ;
}

/ * Fecha umar qui vo pr evi ament e aber t o.
Ret or na 0 se bemsucedi do ou - 1 caso cont r ar i o.

pf : Pont ei r o par a o ar qui vo aber t o ( r et or nado por f open) */
i nt f cl ose( FI LE* pf )
{
i nt i dx;

f or ( i dx = 0; i dx < NFHANDLES; i dx++)
i f ( pf == &f i l e_handl e_t abl e[ i dx] )
{
pf - > pf i l e = NULL;
/ / zer a o ' of f set '
pf - > of f set = 0;
r et ur n 0;
}
r et ur n - 1;
}

/ * Le de umar qui vo.

bf r [ ] : Buf f er par ar r eceber os dados l i dos
si ze: Numer o de byt es a ser eml i dos
pf : Pont ei r o par a o ar qui vo */
i nt f r ead ( voi d bf r [ ] , i nt si ze, FI LE *pf )
{
i nt r dsi ze, r dsi ze0, r est dat a, abssecof f s;
i nt csec, secof f s;


/ / ver i f i ca se o t amanho do ar qui vo eh val i do
i f ( si ze < 1)
r et ur n EOF;

/ / numer o de byt es a ser eml i dos
r dsi ze0 = si ze;



i f ( r dsi ze0 < 1)
r et ur n EOF;

r dsi ze = r dsi ze0;

/ / ' bpt r ' r ecebe o ender eco do buf f er apont ado por ' bf r '
/ / bpt r = bf r ;

/ / f i sr t sect or wi t h f i l e dat a
csec = pf - >pf i l e- >st ar t ;
secof f s = 0;
/ / go t hr ough al l sect or s of t he f i l e
whi l e( csec ! = 0xFFFF )
{
/ / r est dat a i s t he l engt h of t he dat a i n t hi s sect or
/ / af t er t he f i l e of f set
/ / pf - >of f set = 0; / / <========================
r est dat a = secof f s + SECTORSI ZE - pf - >of f set ; / / <=================== ver i f i car
pf - >of f set ! ! ! !
i f ( r est dat a > 0 )
{
/ / comput e absol ut e addr ess i n memor y
/ / 14. 10. 2003 14: 09 t he expl i ci t conver si on of csec t o ( i nt ) i s
necessar y
abssecof f s = FS_ADDRESS + ( i nt ) csec * SECTORSI ZE + pf - >of f set - secof f s;
/ / l cd_er ase_al l ( ) ;
/ / i f t he r est i s mor e t hen dat a r equest ed
/ / t hen i n t hi s sect or r ead l ast t i me
i f ( r est dat a >= r dsi ze )
{
/ / copy r ecor ds i nt o t he dest i nat i on buf f er
83
i 2c_eepr omSequent i al Read( I 2C_EEPROM_A0, abssecof f s, bf r , si ze) ;
pf - >of f set += r dsi ze; / / <=========== mudar pf - >of f set par a
out r a var i avel
/ / r ead n r ecor ds, st op
/ / or i f end of f i l e, st op
r et ur n r dsi ze0;
} el se
/ / el se r ead t i l l t he end of t hi s sect or
/ / and cont i nue i n t he next sect or
{
i 2c_eepr omSequent i al Read( I 2C_EEPROM_A0, abssecof f s, bf r , si ze) ;
bf r += r est dat a;
pf - >of f set += r est dat a; / / <=========== mudar pf - >of f set par a
out r a var i avel
r dsi ze - = r est dat a;
r dsi ze) ;
}
}

/ / move t o next sect or
csec = sect or _t abl e[ csec] ;
secof f s += SECTORSI ZE;
}

r et ur n EOF;
}

/ * Escr eve emumar qui vo

bf r [ ] : Buf f er que cont emos dados a ser emescr i t os
pf : Pont ei r o par a o ar qui vo */
i nt f wr i t e ( char bf r [ ] , i nt si ze, FI LE *pf ) / / <==== Ret i r ar si ze como par amet r o! ! ! !
{
i nt wr si ze, wr si ze0, r est dat a, abssecof f s;
i nt nsec, csec, secof f s;
i nt i ;

/ / char bpt r [ ] ;
/ / poi nt er t o t he act ual f i l e dat a on t he di sk
/ / voi d *f pt r ;

/ / ver i f i ca se o t amanho do ar qui vo eh val i do
i f ( si ze < 1)
r et ur n EOF;

/ / t he t ot al si ze of dat a t o wr i t e
wr si ze0 = si ze;
/ / t he cur r ent amount of dat a l ef t f or wr i t i ng
wr si ze = wr si ze0;

/ / f i sr t sect or wi t h f i l e dat a
csec = pf - >pf i l e- >st ar t ;

/ / sect or of f set
secof f s = 0;

/ / go t hr ough al l sect or s of t he f i l e
whi l e( csec ! = 0xFFFF )
{
/ / r est dat a i s t he space avai l abl e f or wr i t i ng
/ / i n t hi s sect or af t er t he f i l e of f set poi nt er
/ / ' r est dat a' eh o espaco di sponi vel par a escr i t a no set or
r est dat a = secof f s + SECTORSI ZE - pf - >of f set ;
/ / i f t he sect or cont ai ns t he of f set , t hen
/ / t he r est dat a mor e t han 0, can wr i t e her e
/ / se ' r est dat a' >0, podemos escr ever aqui
i f ( r est dat a > 0 )
{
/ / comput e absol ut e addr ess i n memor y
/ / 14. 10. 2003 14: 09 t he expl i ci t conver si on of csec t o ( i nt ) i s
necessar y
abssecof f s = FS_ADDRESS + ( i nt ) csec * SECTORSI ZE + pf - >of f set - secof f s;

i f ( r est dat a >= wr si ze )
{
/ / copy r ecor ds i nt o t he dest i nat i on buf f er
84

/ / i 2c_eepr omPageWr i t e( I 2C_EEPROM_A0, abssecof f s, bf r , wr si ze) ;
f or ( i =0; i <wr si ze; i ++)
i 2c_eepr omWr i t e( I 2C_EEPROM_A0, abssecof f s+i , bf r [ i ] ) ;


/ / adj ust t he poi nt er
pf - >of f set += wr si ze;
/ *
/ / adj ust t he si ze of t he f i l e
pf - >pf i l e- >si ze = pf - >of f set ;
/ / mapei a ' pf - >pf i l e- >si ze' par a end. f i si co
i dx = ( pf - >pf i l e - f i l e_t abl e) / si zeof ( f i l e_ent r y) ;
pr i nt f ( " \ ni dx = %d pf - >of f set = %d" , i dx, pf - >of f set ) ;
del ay_t mr 0( 31250) ;
wr i t e_eepr om_i nt ( f t _l ogi ct ophysi cal ( i dx, FTSI ZE) , pf - >of f set ,
EEPROM_EXT) ;
r et ur n wr si ze0;
}
el se
{
/ / copy r ecor ds i nt o t he dest i nat i on buf f er
f or ( i =0; i <r est dat a; i ++)
i 2c_eepr omWr i t e( I 2C_EEPROM_A0, abssecof f s+i ,
bf r [ i ] ) ;

/ / move t he buf f er poi nt er
bf r += r est dat a;
/ / adj ust t he poi nt er
pf - >of f set += r est dat a;
/ *
/ / adj ust t he si ze of t he f i l e
pf - >pf i l e- >si ze = pf - >of f set ;
/ / mapei a ' pf - >pf i l e- >si ze' par a end. f i si co
i dx = ( pf - >pf i l e - f i l e_t abl e) / si zeof ( f i l e_ent r y) ;
wr i t e_eepr om_i nt ( f t _l ogi ct ophysi cal ( i dx, FTSI ZE) , pf - >of f set ,
EEPROM_EXT) ;
wr si ze - = r est dat a;
}
}

nsec = sect or _t abl e[ csec] ;
i f ( nsec == csec )
{
/ / al l ocat e a new sect or
nsec = f i l e_al l ocat e_sect or ( ) ;
/ / cannot al l ocat e?
i f ( nsec == - 1 )
{
put s( " ERRO: Tabel a de set or es chei a! ! " ) ;
kbd_get c( ) ;
r et ur n EOF; / / ( wr si ze0 - r est dat a) ;
}

/ / bi nd t he new sect or as a next i n t he f i l e chai n
sect or _t abl e[ csec] = nsec;
wr i t e_eepr om_i nt ( st _l ogi ct ophysi cal ( csec) , nsec, EEPROM_I NT) ;
sect or _t abl e[ nsec] = nsec;
wr i t e_eepr om_i nt ( st _l ogi ct ophysi cal ( nsec) , nsec, EEPROM_I NT) ;
}

csec = nsec;
secof f s += SECTORSI ZE;
}

r et ur n EOF;
}



85
FILEINIT.C:

/ *******************************************************************
* Ar qui vo: f i l ei ni t . c
* Descr i o: I ni ci al i za o si st ema de ar qui vos
*
*
* Equi pe de Si st emas Embut i dos - NCE/ UFRJ - 2005/ 2006
* Aut or es: Dani el da Cunha Schmi dt
* Vi ni ci us dos Sant os Si l va
*
* Baseado no codi go par a o Si st ema de Ar qui vos Zi LOG
* par a o eZ80
********************************************************************/
/ * I ni ci al i za o si st ema de ar qui vos.
I ni ci al i za = Gr ava 0xFF emt odas as posi coes das t abel as de set or es, ar qui vos aber t os
ar qui vos e na ar ea de dados ( eepr omext er na) . */
voi d i ni t _f i l e_syst em( )
{
i nt addr , i ;
char senha1[ 9] = " OPERADOR" ;
char senha2[ 9] = " GERENTE" ;
char senha3[ 9] = " ROOT" ;
char senha4[ 9] = " SI STEMA" ;


addr = SECTABLE_ADDRESS;
/ / I ni ci al i za a t abel a de set or es ( EEPROM I NTERNA)
f or ( i = 0 ; i < ( i nt ) SECTABLE_SI ZE ; i ++)
eepr om_wr i t e( addr ++, 0xFF) ;

addr = FHANDTABLE_ADDRESS;
/ / I ni ci al i za a t abel a de ar qui vos aber t os ( EEPROM I NTERNA)
f or ( i = 0 ; i < ( i nt ) FHANDTABLE_SI ZE ; i ++)
eepr om_wr i t e( addr ++, 0x00) ;

addr = FTABLE_ADDRESS;
/ / I ni ci al i za a t abel a de ar qui vos ( EEPROM EXTERNA)
f or ( i = 0 ; i < ( i nt ) FTABLE_SI ZE ; i ++)
i 2c_eepr omWr i t e( I 2C_EEPROM_A0, addr ++, 0xFF) ;

addr = FS_ADDRESS;
/ / I ni ci al i za o si st ema de ar qui vos ( EEPROM EXTERNA)
f or ( i = 0 ; i < ( i nt ) FS_SI ZE ; i ++)
i 2c_eepr omWr i t e( I 2C_EEPROM_A0, addr ++, 0xFF) ;

/ / Escr eve as senhas padr ao na EEPROM ext er na
addr = 0x1FA0;
f or ( i = 0; i < 10; i ++)
i 2c_eepr omWr i t e( I 2C_EEPROM_A0, addr ++, senha1[ i ] ) ;

/ / addr = 0x3E5;
f or ( i = 0; i < 10; i ++)
i 2c_eepr omWr i t e( I 2C_EEPROM_A0, addr ++, senha2[ i ] ) ;

/ / addr = 0x3EE;
f or ( i = 0; i < 10; i ++)
i 2c_eepr omWr i t e( I 2C_EEPROM_A0, addr ++, senha3[ i ] ) ;

/ / addr = 0x3F7;
f or ( i = 0; i < 10; i ++)
i 2c_eepr omWr i t e( I 2C_EEPROM_A0, addr ++, senha4[ i ] ) ;

pr i nt f ( " \ nSi st ema de Ar qui vos i ni ci al i zado. . . " ) ;
}
86

FILECONF.H:


/ *******************************************************************
* Ar qui vo: f i l econf . h
* Descr i o: Par amet r os basi cos do Si st ema de Ar qui vos
*
*
* Equi pe de Si st emas Embut i dos - NCE/ UFRJ - 2005/ 2006
* Aut or es: Dani el da Cunha Schmi dt
* Vi ni ci us dos Sant os Si l va
*
* Baseado no codi go par a o Si st ema de Ar qui vos Zi LOG
* par a o eZ80
********************************************************************/

#i f ndef __FI LECONF_H_
#def i ne __FI LECONF_H_

/ * Numer o de ent r adas na t abel a de ar qui vos */
#def i ne NFENTRI ES 32

/ * Numer o maxi mo de ar qui vos aber t os */
#def i ne NFHANDLES 10

/ * Numer o de set or es na EEPROM */
#def i ne NSECTORS 60 / / 8 Kb FS

/ * Tamanho( byt es) de umset or na EEPROM */
#def i ne SECTORSI ZE 128

/ * Tamanho( byt es) da EEPROM ext er na */
#def i ne EXT_EEPROM_SI ZE 8192 / / <===== sobr am96 byt es

/ / Tamanho( byt es) da EEPROM i nt er na / / j a est a def i ni do! ! !
/ / #def i ne EEPROM_SI ZE 256 / / <===== sobr am22 byt es

/ * Tamanho( byt es) da t abel a de ar qui vos ( f i l e t abl e) */
#def i ne FTABLE_SI ZE ( si zeof ( f i l e_ent r y) *NFENTRI ES) / / 416 byt es

/ * Tamanho( byt es) da t abel a de ar qui vos aber t os ( f i l e handl e t abl e) */
#def i ne FHANDTABLE_SI ZE ( si zeof ( f i l e_handl e) *NFHANDLES) / / 50 byt es

/ * Tamanho( byt es) da t abel a de set or es */
#def i ne SECTABLE_SI ZE ( si zeof ( i nt ) *NSECTORS) / / 120 byt es

/ * Tamanho do si st ema de ar qui vos */
#def i ne FS_SI ZE ( EXT_EEPROM_SI ZE - FTABLE_SI ZE) / / 7776 byt es

/ * Ender eco f i si co i ni ci al da t abel a de ar qui vos ( EEPROM EXTERNA) */
#def i ne FTABLE_ADDRESS 0x00

/ / Ender eco f i si co i ni ci al da t abel a de set or es ( EEPROM I NTERNA)
#def i ne SECTABLE_ADDRESS 0x40 / / Comeca apos o espaco ut i l i xado pel a bi bl i ot eca do
t ecl ado ( 64 byt es)

/ * Ender eco f i si co i ni ci al da t abel a de ar qui vos aber t os ( EEPROM I NTERNA) */
#def i ne FHANDTABLE_ADDRESS ( SECTABLE_ADDRESS + SECTABLE_SI ZE) / / 0xB8( 184)

/ * Ender eco f i si co i ni ci al do si st ema de ar qui vos ( EEPROM EXTERNA) */
#def i ne FS_ADDRESS ( FTABLE_ADDRESS + FTABLE_SI ZE) / / 0x1A0( 416)

/ * Tamanho padr ao da st r i ng em' f i l e_t abl e[ i ] . name' ( 8 car act er es + ' \ 0' ) */
#def i ne TAM_STRI NG 9

#endi f

87
ESTACIONAMENTO.C:
#i ncl ude <pi c18. h>
#i ncl ude <st di o. h>
#i ncl ude <st dl i b. h>
#i ncl ude <st r i ng. h>
#i ncl ude <ct ype. h>
/ * I ni ci al i zacao - Faca as coi sas nessa or dem: */
/ * I ni ci al i zacao dos dados da bi bl i ot eca de t ecl ado */
#i ncl ude " . . \ i ncl udes\ keyboar d_eepr om. h"
/ * I ni ci al i zacao do LCD */
#def i ne l cd_t ype 2
#def i ne LCD_EN A2
#def i ne LCD_RS A0
#def i ne LCD_RWA1
#def i ne LCD_D4 A3
#def i ne LCD_D5 A4
#def i ne LCD_D6 A5
#def i ne LCD_D7 B3
#def i ne USE_NO_PORT_LCD
#i ncl ude " . . \ i ncl udes\ l cd. h"
voi d put ch( unsi gned char c) ;
voi d put ch( unsi gned char c) {
l cd_put ch( c) ;
}
/ * I ni ci al i zao do t ecl ado */
#def i ne KEYB_DATA E1
#def i ne KEYB_CLOCK E0
#i ncl ude " . . \ i ncl udes\ keyboar d. h"
/ * I ni ci al i zacao da i mpr essor a */
#i ncl ude " . . \ i ncl udes\ pr i nt er . h" / / Coment ado por f al t a de memor i a! !
/ * I ni ci al i zacao do I 2C */
#i ncl ude " . . \ i ncl udes\ i 2c_mast er . h"
/ * I ni ci al i zacao do PCF8583 ( RTC) */
#i ncl ude " . . \ i ncl udes\ pcf 8583. h"
/ *I ni ci al i zacao da EEPROM I 2C */
#i ncl ude " . . \ i ncl udes\ 24Cxx. h"
#def i ne I 2C_MEMORY I 2C_EEPROM_A0
/ *I ni ci al i zacao do t i mer */
#i ncl ude " . . \ i ncl udes\ del ay_t i mer . h"
/ * I ni ci al i zacao do Si t ema de Ar qui vos */
#i ncl ude " . . \ i ncl udes\ f i l econf . h"
/ * Def i ni coes Bsi cas e Pr ot ot i pos de Funcoes do Si st ema de Ar qui vo */
#i ncl ude " . . \ i ncl udes\ f i l e. h"
/ * Funcoes de Acesso a memor i a */
#i ncl ude " . . \ i ncl udes\ memor i a. c"
/ / Var i avel usada com' spr i nt f '
char buf [ 80] ;
/ * Funcoes Basi cas do Si st ema de Ar qui vo */
#i ncl ude " . . \ i ncl udes\ f i l e1. c"
#i ncl ude " . . \ i ncl udes\ f ase2. c"
t ypedef enum{oper ador , ger ent e, r oot , si st ema} ni vel _acesso; / / NOVO NI VEL: SI STEMA - > ==
r oot , mas senha NAO pode ser al t er ada
/ / sempr e que o har dwar e eh i ni ci ado, ni vel de acesso == oper ador
ni vel _acesso ni vel _oper ador = 1;
char codi go_oper ador [ 3] = " 00" ;
t ypedef st r uct
{
i nt i nt ei r o;
i nt f r ac;
} st _f l oat ;
#i ncl ude " . . \ r equi si t os\ Menus. c"
voi d mai n( )
{
st r uct Dat e d;
i nt di as;
l ong i nt D;
char c;
char buf f er [ 20] ;
f l oat val ;
FI LE* t est e;
/ / i ni ci al i zacao dos di sposi t i vos de har dwar e
i ni t _t mr 0( PRE_SCALE_256) ;
l cd_i ni t ( ) ;
88
l cd_cur sor ( l cd_cur sor _bl i nk) ;
i 2c_i ni t ( 0x45) ;
kbd_i ni t ( ) ;
ADCON1=0x0F; / / Por t usado pel o t ecl ado par a TTL
l cd_er ase_al l ( ) ;
i ni t _f i l e_syst em( ) ;
l oad_sect or _t abl e( ) ;
l oad_f i l e_t abl e( ) ;
r t c_st ar t ( ) ;
whi l e( 1)
{
menu( ) ;
}
}
MENUS.C:

#def i ne SemPer mi ssao " Voce nao t emper mi ssao par a acessar \ nest e menu! "
#def i ne Dat aI nval i da " Dava I nval i da. \ nTent e novament e. "
#def i ne Hor aI nval i da " Hor a I nval i da. \ nTent e novament e. "

#def i ne mOper acoes_L1 " Ent . cx. Sai . cx. t r ocaOp. Fecha. at Raso\ n"
#def i ne mOper acoes_L2 " oP. espec. r ec. Mensal . Tab. pr ec. pAt i o"

#def i ne mOpEspeci ai s_L1 " Mensal . Rel og. Senhas Par am. \ n"
#def i ne mOpEspeci ai s_L2 " Tab. pr ec. cp. I ni c. Oper ador "

#def i ne mMensal i st as_L1 " I ncl ui r Al t er ar Excl ui r Li st ar \ n"
#def i ne mMensal i st as_L2 " Pagament o Dat al i mi t e"

#def i ne mPat i o_L1 " Ent r ada Sai da Li st ar \ n"

#def i ne mPar amet r os_L1 " Cabecal ho cOr es Mar cas"
#def i ne mMant er I nf o_L1 " I ncl ui r Al t er ar Excl ui r Li st ar "

#def i ne EVER ; ;

#def i ne ENTRADA 0
#def i ne SAI DA 1

#def i ne PLC_MAX 8
#def i ne COD_MAX 4
#def i ne NOME_MAX 21

#def i ne TRUE 1
#def i ne FALSE 0
#def i ne ENTER 13
#def i ne ESC 27
#def i ne BACKSPACE 8

/ / Pr ot ot i pos
voi d menu ( voi d) ;
voi d menu_op_especi ai s ( voi d) ;
voi d menu_par am_si st ema ( voi d) ;
voi d menu_mar cas ( voi d) ;
voi d menu_oper ador es ( voi d) ;
voi d menu_pat i o ( voi d) ;
i nt ent r ada_pat i o ( voi d) ;
i nt sai da_pat i o ( voi d) ;
voi d l i st ar _pat i o ( voi d) ;
voi d menu_mensal ( voi d) ;
i nt i ncl ui r _mensal i st a ( voi d) ;
i nt excl ui r _mensal i st a ( voi d) ;
i nt al t er ar _mensal i st a ( voi d) ;
i nt l i st ar _mensal i st a ( voi d) ;
voi d aber t ur a_cai xa ( voi d) ;
i nt ent r ada_cai xa ( voi d) ;
i nt sai da_cai xa ( voi d) ;
voi d i mpr i me_mov_cai xa ( char mov, char val or [ ] ) ;
voi d f echament o_cai xa ( voi d) ;
voi d i ncl ui r _mar cas ( voi d) ;
i nt al t er ar _mar cas ( voi d) ;
i nt excl ui r _mar cas ( voi d) ;
89
i nt l i st ar _mar cas ( voi d) ;
voi d al t er a_r el ogi o ( voi d) ;
i nt al t er a_senhas ( voi d) ;
i nt t r oca_ni vel _acesso ( voi d) ;
voi d i ncl ui r _oper ador es ( voi d) ;
i nt al t er ar _oper ador es ( voi d) ;
i nt excl ui r _oper ador es ( voi d) ;
i nt l i st ar _oper ador es ( voi d) ;
i nt t r oca_oper ador es ( voi d) ;
voi d conf i gur a_cabecal ho ( voi d) ;
voi d conf i gur a_t ab_pr eco ( voi d) ;
voi d l i st ar _t ab_pr eco ( voi d) ;
i nt i mpr i me_ent r ada ( char [ ] , char [ ] , i nt , i nt ) ;
voi d conf i gur a_pgt o_mensal i st a ( voi d) ;
voi d conf i gur a_dat a_mensal i st a ( voi d) ;
voi d l er _ano( voi d) ;
voi d gr ava_ano( voi d) ;
l ong i nt cal cul a_di as_cor r i dos( st r uct Dat e *d1, st r uct Dat e *d2) ; / / our ai t i !
l ong i nt cal cul a_per manenci a ( st r uct Ti me *t 1, st r uct Dat e *d1, st r uct Ti me *t 2, st r uct Dat e
*d2) ; / / OK
st _f l oat * cal cul a_val or ( i nt hor a_per m, i nt mi n_per m, char nome_t ab[ ] ) ;
voi d i ni ci a_di spl ay_pat i o ( voi d) ;
voi d pega_codMar ca ( char [ ] ) ;
voi d cur sor _pl aca_pat i o ( voi d) ;
voi d i ni ci a_di spl ay_mensal ( voi d) ;
char pega_nome ( char [ ] , i nt al t er a_nome) ; / / al t er a_nome = 1: al t er ao do
nome; al t er a_nome = 0: i ncl ui ndo pr i mei r a vez
char pega_cl asse ( char [ ] , i nt al t er a_cl asse) ; / / al t er a_cl asse = 1: al t er ao
da cl asse; al t er a_cl asse = 0: i ncl ui ndo pr i mei r a vez
voi d cur sor _pl aca_mensal ( voi d) ;
char pega_pl aca ( char [ ] , i nt pl aca2, i nt al t er a_pl aca, i nt pl aca_pat i o) ; / /
al t er a_pl aca = 1: al t er ao da pl aca; al t er a_pl aca = 0: i ncl ui ndo pr i mei r a vez
voi d pega_num ( char cod_l en, i nt i ni ci o, i nt f i m, char codi go[ ] ) ;
voi d pega_val or ( char val _l en, char val or [ ] ) ;

/ / ***********************************************************************************
/ / voi d menu( )
/ /
/ / ***********************************************************************************
voi d menu( )
{

char opcao, buf ;
char nome[ 9] ;
l cd_er ase_al l ( ) ;
put s( mOper acoes_L1) ;
put s( mOper acoes_L2) ;

opcao = kbd_get c( SOLETRA) ;

swi t ch( opcao) / / t est ar com' el se i f '
{
case ' E' :
t r oca_ni vel _acesso ( ) ;
br eak;

case ' S' :
l cd_er ase_al l ( ) ;
spr i nt f ( buf , " ni vel de acesso: %d" , ni vel _oper ador ) ;
put s( buf ) ;
del ay_t mr 0( 62000) ;
br eak;

case ' O' :
t r oca_oper ador es ( ) ;
br eak;

case ' F' :
br eak;

case ' R' :
l cd_er ase_al l ( ) ;
st r cpy( nome, f i l e_t abl e[ 0] . name) ;
put s( nome) ;
st r cpy( nome, f i l e_t abl e[ 1] . name) ;
put s( " \ n" ) ;
90
put s( nome) ;
kbd_get c( LETRAENUMERO) ;
br eak;

case ' P' :
i f ( ni vel _oper ador ) menu_op_especi ai s( ) ;
el se
{
l cd_er ase_al l ( ) ;
put s( SemPer mi ssao) ;
}
br eak;

case ' M' :
br eak;

case ' T' :
conf i gur a_t ab_pr eco ( ) ;
br eak;

case ' A' :
menu_pat i o( ) ;
br eak;
}

}

/ / ***********************************************************************************
/ / voi d menu_op_especi ai s( )
/ /
/ / ***********************************************************************************
voi d menu_op_especi ai s( )
{
char opcao;

l cd_er ase_al l ( ) ;
put s( mOpEspeci ai s_L1) ;
put s( mOpEspeci ai s_L2) ;
opcao = kbd_get c( SOLETRA) ;
swi t ch( opcao)
{
case ' M' :
menu_mensal ( ) ;
br eak;

case ' R' :
i f ( ni vel _oper ador >= 1)
al t er a_r el ogi o( ) ;
br eak;

case ' S' :
i f ( ni vel _oper ador > 1)
al t er a_senhas( ) ;
br eak;

case ' P' :
menu_par am_si st ema( ) ;
br eak;

case ' T' :
l i st ar _t ab_pr eco( ) ;
br eak;

case ' I ' :
i mpr i me_ent r ada( ) ;
br eak;

case ' O' :
menu_oper ador es( ) ;
br eak;

}
}

/ / ***********************************************************************************
/ / voi d menu_par amet r os_si st ema( )
91
/ /
/ / ***********************************************************************************
voi d menu_par am_si st ema( )
{
char opcao;

l cd_er ase_al l ( ) ;
put s( mPar amet r os_L1) ;

opcao = kbd_get c( SOLETRA) ;

swi t ch( opcao)
{
case ' C' :
conf i gur a_cabecal ho ( ) ;
br eak;

case ' O' :
/ / menu_cor es( ) ;
br eak;

case ' M' :
menu_mar cas( ) ;
br eak;
}
}
/ / ***********************************************************************************
/ / voi d menu_mar cas( )
/ /
/ / ***********************************************************************************
voi d menu_mar cas( )
{
char opcao;

l cd_er ase_al l ( ) ;
put s( mMant er I nf o_L1) ;

opcao = kbd_get c( SOLETRA) ;

swi t ch( opcao)
{
case ' I ' :
i ncl ui r _mar cas( ) ;
br eak;

case ' A' :
al t er ar _mar cas( ) ;
br eak;

case ' E' :
excl ui r _mar cas( ) ;
br eak;

case ' L' :
l i st ar _mar cas( ) ;
br eak;

}

}
/ / ***********************************************************************************
/ / voi d menu_oper ador es( )
/ /
/ / ***********************************************************************************
voi d menu_oper ador es( )
{
char opcao;

l cd_er ase_al l ( ) ;
put s( mMant er I nf o_L1) ;

opcao = kbd_get c( SOLETRA) ;

swi t ch( opcao)
{
case ' I ' :
92
i ncl ui r _oper ador es( ) ;
br eak;

case ' A' :
al t er ar _oper ador es( ) ;
br eak;

case ' E' :
excl ui r _oper ador es( ) ;
br eak;

case ' L' :
l i st ar _oper ador es ( ) ;
br eak;

}

}
/ / ***********************************************************************************
/ / voi d menu_pat i o( )
/ /
/ / ***********************************************************************************
voi d menu_pat i o( )
{
char opcao;

l cd_er ase_al l ( ) ;
put s( mPat i o_L1) ;

opcao = kbd_get c( SOLETRA) ;

swi t ch( opcao) / / t est ar com' el se i f '
{
case ' E' :
ent r ada_pat i o( ) ;
br eak;

case ' S' :
sai da_pat i o( ) ;
br eak;

case ' L' :
l i st ar _pat i o( ) ;
br eak;
}
}

/ / ***********************************************************************************
/ / voi d menu_mensal ( )
/ /
/ / ***********************************************************************************
voi d menu_mensal ( )
{
char opcao;

l cd_er ase_al l ( ) ;
put s( mMensal i st as_L1) ;
put s( mMensal i st as_L2) ;

opcao = kbd_get c( SOLETRA) ;

swi t ch( opcao) / / t est ar com' el se i f '
{
case ' I ' :
i ncl ui r _mensal i st a( ) ;
br eak;

case ' A' :
al t er ar _mensal i st a ( ) ;
br eak;

case ' E' :
excl ui r _mensal i st a( ) ;
br eak;

case ' L' :
93
l i st ar _mensal i st a( ) ;
br eak;

case ' P' :
pagament o_mensal i st a( ) ;
br eak;

case ' D' :
dat a_l i mi t e( ) ;
br eak;

}
}

/ / ***********************************************************************************/
/ / voi d al t er a_r el ogi o ( )
/ /
/ / ***********************************************************************************
voi d al t er a_r el ogi o ( )
{

st at i c i nt xpos, ypos;
char l i do_t emp[ 3] , op, t emp1[ 3] , t emp2[ 3] , t emp3[ 3] , t emp4[ 3] ;
i nt ano_padr ao;
st r uct Ti me t 0;
st r uct Dat e d0;
st r uct Dat e t empd0;

st at i c FI LE *r el ogi o;
i nt num;

r el ogi o = f open( " r el ogi o" , FM_RDWR) ;
r el ogi o- >of f set = 1;
f r ead ( buf _ano_padr ao, 2, r el ogi o) ;
buf _ano_padr ao[ 2] = ' \ 0' ;
num= at oi ( buf _ano_padr ao) ;
f or ( EVER)
{
r ead8583_r t c( &t 0, &d0, GET_DATE_TI ME) ;
l cd_er ase_al l ( ) ;
i f ( d0. day < 10)
{
st r cpy ( t emp4, i t oa( d0. day) ) ;
spr i nt f ( t emp1, " 0%s" , t emp4) ;
}
el se
st r cpy ( t emp1, i t oa( d0. day) ) ;

i f ( d0. mont h < 10)
{
st r cpy ( t emp4, i t oa( d0. mont h) ) ;
spr i nt f ( t emp2, " 0%s" , t emp4) ;
}
el se
st r cpy ( t emp2, i t oa( d0. mont h) ) ;

i f ( ( d0. year + num) < 10)
{
st r cpy ( t emp4, ( i t oa( d0. year + num) ) ) ;
spr i nt f ( t emp3, " 0%s" , t emp4) ;
}
el se
st r cpy ( t emp3, i t oa( num) ) ;

spr i nt f ( buf , " Dat a At ual : %s/ %s/ %s\ n" , t emp1, t emp2, t emp3) ;
put s( buf ) ;
put s( " Nova Dat a : / / " ) ;
xpos=13;
ypos=2;
l cd_got oxy( xpos, ypos) ;
kbd_get s( l i do_t emp, 2, 1, SONUMERO) ;
d0. day = at oi ( l i do_t emp) ;
xpos += 3;
l cd_got oxy( xpos, ypos) ;
kbd_get s( l i do_t emp, 2, 1, SONUMERO) ;
d0. mont h = at oi ( l i do_t emp) ;
94
xpos += 3;
l cd_got oxy( xpos, ypos) ;
kbd_get s( l i do_t emp, 4, 1, SONUMERO) ;
d0. year = at oi ( l i do_t emp) ;
l cd_er ase_al l ( ) ;
pr i nt f ( " %d\ n" , d0. year ) ;
pr i nt f ( " %d" , num+ 4) ;
kbd_get c( LETRAENUMERO) ;
i f ( ( d0. year >= ( num+4) ) )
{
r el ogi o- >of f set = 1;
st r cpy ( buf _ano_padr ao, i t oa( d0. year ) ) ;
f wr i t e ( buf _ano_padr ao, 2, r el ogi o) ;
}
xpos = 12;
i f ( ( ( d0. day >= 1) && ( d0. day <= 31) ) && ( ( d0. mont h >= 1) && ( d0. mont h
<=12) ) ) / / Fal t a r est r i o p/ ano. Bi ssext o: mod 4 ! = 100, excet o 400, e ! = 3300
i f ( ! ( ( ( d0. day >= 30) && ( d0. mont h == 2) ) | | ( ( d0. day == 31) && (
( d0. mont h == 4) | | ( d0. mont h == 6) | | ( d0. mont h == 9) | | ( d0. mont h == 11) ) ) ) )
i f ( ! ( ( ( d0. day == 29) && ( d0. mont h == 2) ) && ( d0. year %4) ) )
{ / / wr i t e8583_r t c( &t 0, &d0, SET_DATE_TI ME) ;
t empd0 = d0;
br eak;
}
}

f or ( EVER)
{
l cd_er ase_al l ( ) ;
i f ( t 0. hour < 10)
{
st r cpy ( t emp4, i t oa( t 0. hour ) ) ;
spr i nt f ( t emp1, " 0%s" , t emp4) ;
}
el se
st r cpy ( t emp1, i t oa( t 0. hour ) ) ;
i f ( t 0. mi nut e < 10)
{
st r cpy ( t emp4, i t oa( t 0. mi nut e) ) ;
spr i nt f ( t emp2, " 0%s" , t emp4) ;
}
el se
st r cpy ( t emp2, i t oa( t 0. mi nut e) ) ;

i f ( t 0. seconds < 10)
{
st r cpy ( t emp4, i t oa( t 0. seconds) ) ;
spr i nt f ( t emp3, " 0%s" , t emp4) ;
}
el se
st r cpy ( t emp3, i t oa( t 0. seconds) ) ;

spr i nt f ( buf , " Hor a At ual : %s: %s: %s\ n" , t emp1, t emp2, t emp3) ;
put s( buf ) ;
put s( " Nova Hor a : : : " ) ;
xpos=13;
ypos=2;
l cd_got oxy( xpos, ypos) ;
kbd_get s( l i do_t emp, 2, 1, SONUMERO) ;
t 0. hour = at oi ( l i do_t emp) ;
xpos += 3;
l cd_got oxy( xpos, ypos) ;
kbd_get s( l i do_t emp, 2, 1, SONUMERO) ;
t 0. mi nut e = at oi ( l i do_t emp) ;
xpos += 3;
l cd_got oxy( xpos, ypos) ;
kbd_get s( l i do_t emp, 4, 1, SONUMERO) ;
t 0. seconds = at oi ( l i do_t emp) ;
xpos = 12;
i f ( ( ( t 0. hour >=0) && ( t 0. hour < 24) ) && ( ( t 0. mi nut e >=0) && ( t 0. mi nut e <
60) ) && ( ( t 0. seconds >= 0) && ( t 0. seconds < 60) ) )
br eak;
}

wr i t e8583_r t c( &t 0, &t empd0, SET_DATE_TI ME) ;
f cl ose( r el ogi o) ;
95
}
/ / ***********************************************************************************
/ / voi d aber t ur a_cai xa ( )
/ /
/ / ***********************************************************************************
voi d aber t ur a_cai xa ( )
{
char nome_ar q[ 9] = " cai xa" , val or [ 7] ;
i nt num;
FI LE* cai xa;
num= f exi st s( nome_ar q) ;
i f ( num< 0) f cr eat e( nome_ar q, 0) ;
cai xa = f open( nome_ar q, FM_RDWR) ;
l cd_er ase_al l ( ) ;
put s( " Val or ( R$xxx. xx) : " ) ;
l cd_got oxy( 19, 1) ;
pega_val or ( 6, val or ) ;
i nser e_seq( val or , 7, cai xa, 1) ;
f cl ose( cai xa) ;
}
/ / ***********************************************************************************
/ / i nt ent r ada_cai xa ( )
/ /
/ / ***********************************************************************************
i nt ent r ada_cai xa ( )
{
char nome_ar q[ 6] = " cai xa" , val or [ 7] , val or _cai xa[ 8] ;
i nt i nt ei r o = 0, f r ac = 0, t emp, t emp2;
FI LE* cai xa;
i f ( st r cmp( codi go_oper ador , " 00" ) == 0)
{
l cd_er ase_al l ( ) ;
put s ( " ERRO: Nao exi st e oper ador l ogado no\ nsi st ema! " ) ;
kbd_get c( LETRAENUMERO) ;
r et ur n - 1;
}
i f ( f exi st s( nome_ar q) < 0)
{
l cd_er ase_al l ( ) ;
put s ( " ERRO: Aber t ur a de Cai xa nao r eal i zada! " ) ;
kbd_get c( LETRAENUMERO) ;
r et ur n - 1;
}
cai xa = f open( nome_ar q, FM_RDWR) ;
l cd_er ase_al l ( ) ;
put s( " Val or ( R$xxx. xx) : " ) ;
l cd_got oxy( 19, 1) ;
pega_val or ( 6, val or ) ;
consul t a( 0, val or _cai xa, cai xa) ;
/ / Passa a par t e f r aci onar i a de ' val or ' par a a var . ' f r ac'
t emp2 = st r l en( val or ) ;
st r ncpy( buf , &val or [ t emp2 - 3] , 2) ;
buf [ 2] = ' \ 0' ;
f r ac = at oi ( buf ) ;
/ / Passa a par t e f r aci onar i a de ' val or _cai xa' par a a var . ' t emp'
t emp2 = st r l en( val or _cai xa) ;
st r ncpy( buf , &val or _cai xa[ t emp2 - 3] , 2) ;
buf [ 2] = ' \ 0' ;
t emp = at oi ( buf ) ;
/ / Soma a par t e f r aci onar i a
f r ac += t emp;
i f ( f r ac >= 100)
{
f r ac - = 100;
i nt ei r o++;
}
/ / Passa a par t e i nt ei r a de ' val or ' par a a var . ' i nt ei r o'
t emp2 = st r l en( val or ) ;
st r ncpy( buf , val or , t emp2 - 3) ;
buf [ t emp2 - 3] = ' \ 0' ;
i nt ei r o = at oi ( buf ) ;
/ / Passa a par t e i nt ei r a de ' val or _cai xa' par a a var . ' t emp'
t emp2 = st r l en( val or _cai xa) ;
st r ncpy( buf , val or _cai xa, t emp2 - 3) ;
buf [ t emp2 - 3] = ' \ 0' ;
t emp = at oi ( buf ) ;
96
/ / Soma a par t e i nt ei r a
i nt ei r o += t emp;
/ / Tr ansf or ma o r esul t emst r i ng
st r cpy( val or _cai xa, i t oa( i nt ei r o) ) ;
st r cat ( val or _cai xa, " . " ) ;
st r cat ( val or _cai xa, i t oa( f r ac) ) ;
t emp2 = st r l en( val or _cai xa) + 1;
i nser e_seq( val or _cai xa, t emp2, cai xa, 1) ;
put s( " \ nVal or t ot al do cai xa: " ) ;
l cd_got oxy( 23, 1) ;
put s( val or _cai xa) ;
kbd_get c( LETRAENUMERO) ;
f cl ose( cai xa) ;
i mpr i me_mov_cai xa ( ENTRADA, val or _cai xa) ;
r et ur n 0;
}
/ / ***********************************************************************************
/ / i nt sai da_cai xa ( )
/ /
/ / ***********************************************************************************
i nt sai da_cai xa ( )
{
char nome_ar q[ 6] = " cai xa" , val or [ 7] , val or _cai xa[ 8] ;
i nt i nt ei r o = 0, f r ac = 0, t emp, t emp2;
FI LE* cai xa;
/ / Ver i f i ca se ha oper ador l ogado no si st ema
i f ( st r cmp( codi go_oper ador , " 00" ) == 0)
{
l cd_er ase_al l ( ) ;
put s ( " ERRO: Nao exi st e oper ador l ogado no\ nsi st ema! " ) ;
kbd_get c( LETRAENUMERO) ;
r et ur n - 1;
}
/ / Ver i f i ca se o ar q ' cai xa' exi st e
i f ( f exi st s( nome_ar q) < 0)
{
l cd_er ase_al l ( ) ;
put s ( " ERRO: Aber t ur a de Cai xa nao r eal i zada! " ) ;
kbd_get c( LETRAENUMERO) ;
r et ur n - 1;
}
cai xa = f open( nome_ar q, FM_RDWR) ;
l cd_er ase_al l ( ) ;
put s( " Val or ( R$xxx. xx) : " ) ;
l cd_got oxy( 19, 1) ;
pega_val or ( 6, val or ) ;
consul t a( 0, val or _cai xa, cai xa) ;
/ / Passa a par t e i nt ei r a de ' val or ' par a a var . ' t emp'
t emp2 = st r l en( val or ) ;
st r ncpy( buf , val or , t emp2 - 3) ;
buf [ t emp2 - 3] = ' \ 0' ;
t emp = at oi ( buf ) ;
/ / Passa a par t e i nt ei r a de ' val or _cai xa' par a a var . ' i nt ei r o'
t emp2 = st r l en( val or _cai xa) ;
st r ncpy( buf , val or _cai xa, t emp2 - 3) ;
buf [ t emp2 - 3] = ' \ 0' ;
i nt ei r o = at oi ( buf ) ;
/ / Di mi nui a par t e i nt ei r a
i nt ei r o - = t emp;
/ / Passa a par t e f r aci onar i a de ' val or ' par a a var . ' t emp'
t emp2 = st r l en( val or ) ;
st r ncpy( buf , &val or [ t emp2 - 3] , 2) ;
buf [ 2] = ' \ 0' ;
t emp = at oi ( buf ) ;

/ / Passa a par t e f r aci onar i a de ' val or _cai xa' par a a var . ' f r ac'
t emp2 = st r l en( val or _cai xa) ;
st r ncpy( buf , &val or _cai xa[ t emp2 - 3] , 2) ;
buf [ 2] = ' \ 0' ;
f r ac = at oi ( buf ) ;

/ / Di mi nui a par t e f r aci onar i a
f r ac - = t emp;
i f ( f r ac < 0)
{
f r ac *= - 1;
97
i nt ei r o- - ;
}

i f ( i nt ei r o < 0)
{
l cd_er ase_al l ( ) ;
put s( " ERRO: Di nhei r o i nsuf i ci ent e emcai xa! ! " ) ;
put s( " \ nVal or t ot al do cai xa: " ) ;
l cd_got oxy( 23, 2) ;
put s( val or _cai xa) ;
kbd_get c( LETRAENUMERO) ;
f cl ose( cai xa) ;
r et ur n - 1;

}

/ / Tr ansf or ma o r esul t emst r i ng
st r cpy( val or _cai xa, i t oa( i nt ei r o) ) ;
st r cat ( val or _cai xa, " . " ) ;
st r cat ( val or _cai xa, i t oa( f r ac) ) ;

t emp2 = st r l en( val or _cai xa) + 1;
i nser e_seq( val or _cai xa, t emp2, cai xa, 1) ;

/ / l cd_er ase_al l ( ) ;
put s( " \ nVal or t ot al do cai xa: " ) ;
l cd_got oxy( 23, 1) ;
put s( val or _cai xa) ;
kbd_get c( LETRAENUMERO) ;

f cl ose( cai xa) ;

i mpr i me_mov_cai xa ( SAI DA, val or _cai xa) ;

r et ur n 0;

}


/ / ***********************************************************************************
/ / voi d i mpr i me_mov_cai xa ( char mov, char val or [ ] )
/ /
/ / ***********************************************************************************
voi d i mpr i me_mov_cai xa ( char mov, char val or [ ] )
{
st r uct Ti me t 0;
st r uct Dat e d0;
i nt t emp;
st r cpy( buf , " \ n\ n === ENTRADA DE CAI XA ===" ) ;
i f ( mov) st r cpy( buf , " \ n\ n === SAI DA DE CAI XA ===" ) ;
pr n_pr i nt f ( buf ) ;
pr n_pr i nt f ( " \ n\ n" ) ;
pr n_pr i nt f ( " \ t Codi go do Oper . : " ) ;
pr n_pr i nt f ( codi go_oper ador ) ;
pr n_pr i nt f ( " \ n" ) ;
pr n_pr i nt f ( " \ t Val or da Oper . . : " ) ;
pr n_pr i nt f ( val or ) ;
pr n_pr i nt f ( " \ n" ) ;
r ead8583_r t c( &t 0, &d0, GET_DATE_TI ME) ;
st r cpy( buf , " \ 0" ) ;
i f ( st r l en( i t oa( d0. day) ) == 1) st r cat ( buf , " 0" ) ;
st r cat ( buf , i t oa( d0. day) ) ;
st r cat ( buf , " / " ) ;
i f ( st r l en( i t oa( d0. mont h) ) == 1) st r cat ( buf , " 0" ) ;
st r cat ( buf , i t oa( d0. mont h) ) ;
st r cat ( buf , " / " ) ;
t emp = descobr e_ano( ) + d0. year ;
st r cat ( buf , i t oa( t emp) ) ;
st r cat ( buf , " - " ) ;
i f ( st r l en( i t oa( t 0. hour ) ) == 1) st r cat ( buf , " 0" ) ;
st r cat ( buf , i t oa( t 0. hour ) ) ;
st r cat ( buf , " ; " ) ;
i f ( st r l en( i t oa( t 0. mi nut e) ) == 1) st r cat ( buf , " 0" ) ;
st r cat ( buf , i t oa( t 0. mi nut e) ) ;
st r cat ( buf , " : " ) ;
i f ( st r l en( i t oa( t 0. seconds) ) == 1) st r cat ( buf , " 0" ) ;
98
st r cat ( buf , i t oa( t 0. seconds) ) ;
pr n_pr i nt f ( " \ t " ) ;
pr n_pr i nt f ( buf ) ;
pr n_pr i nt f ( " \ n\ n\ n\ n\ n" ) ;
}

/ / ***********************************************************************************
/ / i ncl ui r _mar cas ( )
/ /
/ / ***********************************************************************************
voi d i ncl ui r _mar cas ( )
{
char mar ca[ 11] , buf f er [ 15] =" \ 0" , nome_ar q[ 6] = " mar ca" ;
FI LE* t ab_mar ca;
i nt cod, num;
/ / Se nao exi st i r , cr i a o ar qui vo ' mar ca' . O ar qui vo eh aber t o par a uso.
num= f exi st s( nome_ar q) ;
i f ( num< 0) f cr eat e( nome_ar q, 15) ;
t ab_mar ca = f open( nome_ar q, FM_RDWR) ;
/ / Cal cul a o numer o do codi go
num= pr ox_vazi o( t ab_mar ca) ;
cod = ( ( num- 1) / t ab_mar ca- >t ag ) + 1 ;
/ / Compl et a o campo ' cod_mar ca' par a que t enha 3 car act er es
i f ( cod < 10) st r cpy( buf f er , " 00" ) ;
el se i f ( cod > 9 && cod < 100) st r cpy( buf f er , " 0" ) ;
/ / Faz i nt er f ace comusuar i o e r ecol he os dados
st r cat ( buf f er , i t oa( cod) ) ;
l cd_er ase_al l ( ) ;
spr i nt f ( buf , " Cod. Mar ca: %s\ nMar ca: " , buf f er ) ;
put s( buf ) ;
l cd_got oxy( 8, 2) ;
kbd_get s( mar ca, 10, 0, LETRAENUMERO) ;
l cd_got oxy( 25, 2) ;
put s( " Cl asse( 1- 6) : " ) ;
l cd_got oxy( 38, 2) ;
pega_num( 1, 1, 6, &buf f er [ 3] ) ;
/ / Copi a os campos em' buf f er ' e i nser e o r egi st r o: COD | CLASSE | MARCA
st r cat ( buf f er , mar ca) ;
i nser e( buf f er , t ab_mar ca) ;
/ / Fecha ar qui vo
f cl ose( t ab_mar ca) ;
}
/ / ***********************************************************************************
/ / i nt al t er ar _mar cas ( )
/ /
/ / ***********************************************************************************
i nt al t er ar _mar cas ( )
{
char novo_r eg[ 12] , r egi st r o[ 15] , cl asse[ 2] , nome_ar q[ 6] = " mar ca" ;
char l en;
i nt of f set ;
FI LE* t ab_mar ca;
/ / Ver i f i ca se a t abel a de mar cas exi st e
i f ( f exi st s( nome_ar q) < 0)
{
l cd_er ase_al l ( ) ;
put s ( " ERRO: Tabel a de Mar cas nao conf i gur ada! " ) ;
kbd_get c( LETRAENUMERO) ;
r et ur n - 1;
}

/ / Abr e ar qui vo ' mar ca'
t ab_mar ca = f open( nome_ar q, FM_RDWR) ;
l cd_er ase_al l ( ) ;
put s ( " Cod. Mar ca: " ) ;
l cd_got oxy( 13, 1) ;
pega_num( 3, 1, 999, novo_r eg) ;
of f set = consul t a( novo_r eg, r egi st r o, t ab_mar ca) ;
/ / Se codi go nao exi st i r => ERRO!
i f ( of f set < 0)
{
l cd_er ase_al l ( ) ;
put s ( " ERRO: Codi go nao cadast r ado! " ) ;
kbd_get c( LETRAENUMERO) ;
f cl ose( t ab_mar ca) ;
r et ur n - 1;
99
}
/ / Senao, al t er a a mar ca
el se
{
st r cpy( novo_r eg, " \ 0" ) ;
l cd_er ase_al l ( ) ;
spr i nt f ( buf , " Mar ca: %s\ nNova Mar ca: " , &r egi st r o[ 4] ) ;
put s( buf ) ;
l cd_got oxy( 13, 2) ;
kbd_get s( &novo_r eg[ 1] , 10, 0, LETRAENUMERO) ;
l cd_er ase_al l ( ) ;
spr i nt f ( buf , " Cl asse: %c\ nNova Cl asse: " , r egi st r o[ 3] ) ;
put s( buf ) ;
l cd_got oxy( 14, 2) ;
/ / kbd_get s( cl asse, 1, 0, SONUMERO) ;
pega_num( 1, 1, 6, cl asse) ;
novo_r eg[ 0] = cl asse[ 0] ;
l en = st r l en( novo_r eg) ;
al t er a( novo_r eg, of f set +3, l en+1, t ab_mar ca) ;
}
/ / Fecha ar qui vo
f cl ose( t ab_mar ca) ;
r et ur n 0;
}
/ / ***********************************************************************************
/ / excl ui r _mar cas ( )
/ /
/ / ***********************************************************************************
i nt excl ui r _mar cas ( )
{
char cod_mar ca[ 4] , r egi st r o[ 15] , opcao[ 2] , nome_ar q[ 6] = " mar ca" ;
FI LE* t ab_mar ca;
i nt of f set ;
/ / Ver i f i ca se a t abel a de mar cas exi st e
i f ( f exi st s( nome_ar q) < 0)
{
l cd_er ase_al l ( ) ;
put s ( " ERRO: Tabel a de Mar cas nao conf i gur ada! " ) ;
kbd_get c( LETRAENUMERO) ;
r et ur n - 1;
}
/ / Abr e ar qui vo ' mar ca'
t ab_mar ca = f open( nome_ar q, FM_RDWR) ;
/ / Pega o codi go da mar ca a ser excl ui da
l cd_er ase_al l ( ) ;
put s( " Cod. Mar ca: " ) ;
l cd_got oxy( 13, 1) ;
/ / kbd_get s( cod_mar ca, 3, 0, SONUMERO) ;
pega_num( 3, 1, 999, cod_mar ca) ;
of f set = consul t a( cod_mar ca, r egi st r o, t ab_mar ca) ;
/ / Se codi go nao exi st i r => ERRO!
i f ( of f set < 0)
{
l cd_er ase_al l ( ) ;
put s ( " ERRO: Codi go nao cadast r ado! " ) ;
kbd_get c( LETRAENUMERO) ;
f cl ose( t ab_mar ca) ;
r et ur n - 1;
}
/ / Senao, excl ui a mar ca
el se
{
f or ( EVER)
{
l cd_er ase_al l ( ) ;
spr i nt f ( buf , " %s - %s" , cod_mar ca, &r egi st r o[ 4] ) ;
put s( buf ) ;
put s( " \ nExcl ui r ?( S/ N) : " ) ;
l cd_got oxy( 16, 2) ;
kbd_get s( opcao, 1, 1, SOLETRA) ;
i f ( opcao[ 0] == ' S' )
{
r emove( of f set , t ab_mar ca) ;
br eak;
}
el se i f ( opcao[ 0] == ' N' )
100
{
l cd_er ase_al l ( ) ;
put s( " Oper acao Cancel ada! " ) ;
kbd_get c( LETRAENUMERO) ;
br eak;
}
el se cont i nue;
}
}

/ / Fecha ar qui vo
f cl ose( t ab_mar ca) ;
r et ur n 0;
}

/ / ***********************************************************************************
/ / i nt l i st ar _mar cas ( )
/ /
/ / ***********************************************************************************
i nt l i st ar _mar cas ( )
{
char cod_mar ca[ 4] , cl asse[ 2] , r egi st r o[ 15] , nome_ar q[ 6] = " mar ca" ;
char cod = 0, t am;
i nt t em_r egi st r o;
FI LE* t ab_mar ca;
/ / Ver i f i ca se a t abel a de mar cas exi st e
i f ( f exi st s( nome_ar q) < 0)
{
l cd_er ase_al l ( ) ;
put s ( " ERRO: Tabel a de Mar cas nao conf i gur ada! " ) ;
kbd_get c( LETRAENUMERO) ;
r et ur n - 1;
}
/ / Abr e ar qui vo ' mar ca'
t ab_mar ca = f open( nome_ar q, FM_RDWR) ;
/ / ' t am' r ecebe o numer o de r egi st r os exi st ent es no ar qui vo
t am= ( ( t ab_mar ca- >pf i l e- >si ze - 1) / t ab_mar ca- >t ag ) ;
l cd_er ase_al l ( ) ;
put s( " I mpr i mi ndo. . . " ) ;
pr n_pr i nt f ( " \ n\ n\ t ======= TABELA DE MARCAS =======\ n\ n" ) ;
pr n_pr i nt f ( " CODI GO\ t \ t CLASSE\ t \ t MARCA\ n\ n" ) ;
whi l e ( t am> 0)
{
/ / Codi go da mar ca a ser pr ocur ada
cod++;
i f ( cod < 10) st r cpy( cod_mar ca, " 00" ) ;
el se i f ( cod > 9 && cod < 100) st r cpy( cod_mar ca, " 0" ) ;
st r cat ( cod_mar ca, i t oa( cod) ) ;
t em_r egi st r o = consul t a( cod_mar ca, r egi st r o, t ab_mar ca) ;
/ / Se codi go nao f oi encont r ado, pr ocur a pr oxi mo codi go
i f ( t em_r egi st r o < 0) cont i nue ;
/ / Se f oi encont r ado, i mpr i me
st r ncpy( cl asse, &r egi st r o[ 3] , 1) ;
pr n_pr i nt f ( cod_mar ca) ;
pr n_pr i nt f ( " \ t \ t " ) ;
pr n_pr i nt f ( cl asse) ;
pr n_pr i nt f ( " \ t \ t " ) ;
pr n_pr i nt f ( &r egi st r o[ 4] ) ;
pr n_pr i nt f ( " \ n" ) ;
t am- - ;
}
pr n_pr i nt f ( " \ n\ n\ n\ n\ n\ n\ n\ n" ) ;
/ / Fecha ar qui vo
f cl ose( t ab_mar ca) ;
r et ur n 0;
}

/ / ***********************************************************************************
/ / al t er a_senhas ( )
/ /
/ / ***********************************************************************************
i nt al t er a_senhas ( )
{
char i , opcao[ 2] , nova_senha[ 9] ;
i nt addr ess = END_SENHA;
f or ( EVER)
101
{
l cd_er ase_al l ( ) ;
put s ( " Escol ha a senha a ser al t er ada: \ n( O) per ador ( G) er ent e ( R) oot " ) ;
l cd_got oxy( 33, 1) ; / / 33 == st r l en( " Escol ha a senha a ser al t er ada: " )
kbd_get s( opcao, 1, 0, SOLETRA) ;
i f ( opcao[ 0] == ' G' ) addr ess += 9;
el se i f ( opcao[ 0] == ' R' ) addr ess += 18;
el se cont i nue;
l cd_er ase_al l ( ) ;
put s ( " Di gi t e a nova senha: " ) ;
l cd_got oxy( 22, 1) ;
kbd_get s( nova_senha, 8, 0, LETRAENUMERO) ;
f or ( i = 0; i < 9; i ++)
i 2c_eepr omWr i t e( I 2C_EEPROM_A0, addr ess++, nova_senha[ i ] ) ;
l cd_er ase_al l ( ) ;
put s( " Senha al t er ada comsucesso! ! \ n" ) ;
addr ess - = 9;
i 2c_eepr omSequent i al Read( I 2C_EEPROM_A0, addr ess, buf , 9) ;
put s( buf ) ;
kbd_get c( LETRAENUMERO) ;
r et ur n 0;
}
}
/ / ***********************************************************************************
/ / t r oca_ni vel _acesso ( )
/ /
/ / ***********************************************************************************
i nt t r oca_ni vel _acesso ( )
{
char senha_l i da[ 9] , senha[ 9] , novo_ni vel [ 2] , ni vel [ 2] , nome_ar q[ 9] = " oper ador " ;
char i , j ;
i nt addr ess = END_SENHA;
FI LE* op;
op = f open( nome_ar q, FM_RDWR) ;
i f ( op == NULL ) r et ur n - 1;
l cd_er ase_al l ( ) ;
put s( " Ni vel ( 1- 4) : " ) ;
l cd_got oxy( 13, 1) ;
kbd_get s( novo_ni vel , 1, 0, SONUMERO) ;
st r cpy( buf , " \ 0" ) ;
/ / Busca o r egi st r o r ef er ent e ao codi go do oper ador
i f ( consul t a( codi go_oper ador , buf , op) < 0 )
{
l cd_er ase_al l ( ) ;
put s( " ERRO: Oper ador nao cadast r ado! " ) ;
kbd_get c( LETRAENUMERO) ;
f cl ose( op) ;
r et ur n - 1;
}
/ / Copi a o ni vel do oper ador par a a var i avel ' ni vel ' e ver i f i ca se el e pode oper ar no
ni vel r equi si t ado
st r ncpy( ni vel , &buf [ 2] , 1) ;
i f ( at oi ( novo_ni vel ) > at oi ( ni vel ) )
{
l cd_er ase_al l ( ) ;
put s( " ERRO: Voce nao pode oper ar nest e ni vel ! ! " ) ;
kbd_get c( LETRAENUMERO) ;
f cl ose( op) ;
r et ur n - 1;
}
put s( " \ nSenha: " ) ;
l cd_got oxy( 8, 2) ;
kbd_get s( senha_l i da, 8, 0, LETRAENUMERO) ;
/ / Pr ocur a a senha
f or ( i =0; i <4; i ++)
{
f or ( j = 0; j < 9 ; j ++)
senha[ j ] = i 2c_eepr omRead( I 2C_EEPROM_A0, addr ess++) ;
l cd_er ase_al l ( ) ;
put s( " addr ess: " ) ;
l cd_got oxy( 10, 1) ;
addr ess - = 9;
put s( i t oa( addr ess) ) ;
put s( " \ nsenha: " ) ;
l cd_got oxy( 10, 2) ;
put s( senha) ;
102
kbd_get c( LETRAENUMERO) ;
addr ess += 9;
/ / Ver i f i ca se a senha l i da eh a senha do ni vel r equi si t ado
i f ( ( st r cmp( senha, senha_l i da) == 0) && ( at oi ( novo_ni vel ) == ( i +1) ) )
{
ni vel _oper ador = i +1;
f cl ose( op) ;
r et ur n 0;
}
}

f cl ose( op) ;
r et ur n - 1;
}
/ / ***********************************************************************************
/ / voi d i ncl ui r _oper ador es ( )
/ /
/ / ***********************************************************************************
voi d i ncl ui r _oper ador es ( )
{
char buf f er [ 24] = " \ 0" , nome[ 21] , nome_ar q[ 9] = " oper ador " ;
i nt num, cod;
FI LE* op;
/ / Se o ar q nao exi st e, cr i a. Depoi s abr e o ar q par a uso
num= f exi st s( nome_ar q) ;
i f ( num< 0) f cr eat e( nome_ar q, 24) ;
op = f open( nome_ar q, FM_RDWR) ;
/ / Cal cul a o numer o do codi go do oper ador
num= pr ox_vazi o( op) ;
cod = ( ( num- 1) / op- >t ag ) + 1 ;
/ / Compl et a o campo ' cod' par a que t enha 2 car act er es
i f ( cod < 10) st r cat ( buf f er , " 0" ) ;
st r cat ( buf f er , i t oa( cod) ) ;
/ / Recol he os dados do usuar i o
l cd_er ase_al l ( ) ;
spr i nt f ( buf , " Cod. Op: %s Nome: " , buf f er ) ;
put s( buf ) ;
l cd_got oxy( 20, 1) ;
kbd_get s( nome, 20, 0, LETRAENUMERO) ;
put s( " \ nNi vel ( 1- 3) : " ) ;
l cd_got oxy( 14, 2) ;
/ / kbd_get s( &buf f er [ 2] , 1, 0, SONUMERO) ;
pega_num( 1, 1, 3, &buf f er [ 2] ) ;
/ / Concat ena os campos do r egi st r o
st r cat ( buf f er , nome) ;
/ / I nser e o r egi st r o no ar qui vo apont ado por ' op'
i nser e( buf f er , op) ;
/ / Fecha ar qui vo
f cl ose( op) ;
}

/ / ***********************************************************************************
/ / voi d al t er ar _oper ador es ( )
/ /
/ / ***********************************************************************************
i nt al t er ar _oper ador es ( )
{
char novo_r eg[ 22] , buf f er [ 24] , ni vel [ 2] , nome_ar q[ 9] = " oper ador " ;
char l en;
i nt of f set ;
FI LE* op;
/ / Ver i f i ca se a t abel a de oper ador es exi st e
i f ( f exi st s( nome_ar q) < 0)
{
l cd_er ase_al l ( ) ;
put s ( " ERRO: Tabel a de Op. nao conf i gur ada! " ) ;
kbd_get c( LETRAENUMERO) ;
r et ur n - 1;
}
/ / Abr e o ar qui vo
op = f open( nome_ar q, FM_RDWR) ;
/ / Pega o codi go do oper ador a ser al t er ado
l cd_er ase_al l ( ) ;
put s( " Cod. Op: " ) ;
l cd_got oxy( 10, 1) ;
pega_num( 2, 1, 99, novo_r eg) ;
103
/ / Pega o r egi st r o r ef er ent e ao codi go
of f set = consul t a( novo_r eg, buf f er , op) ;
i f ( of f set < 0)
{
l cd_er ase_al l ( ) ;
put s ( " ERRO: Codi go nao cadast r ado! " ) ;
kbd_get c( LETRAENUMERO) ;
f cl ose( op) ;
r et ur n - 1;
}
el se
{
l cd_er ase_al l ( ) ;
spr i nt f ( buf , " Nome: %s\ nNovo Nome: " , &buf f er [ 3] ) ;
put s( buf ) ;
l cd_got oxy( 12, 2) ;
kbd_get s( &novo_r eg[ 1] , 20, 0, LETRAENUMERO) ;
l cd_er ase_al l ( ) ;
spr i nt f ( buf , " Ni vel : %c\ nNovo Ni vel : " , buf f er [ 2] ) ;
put s( buf ) ;
l cd_got oxy( 13, 2) ;
pega_num( 1, 1, 3, ni vel ) ;
novo_r eg[ 0] = ni vel [ 0] ;
l en = st r l en( novo_r eg) ;
al t er a( novo_r eg, of f set +2, l en+1, op) ;
}
f cl ose( op) ;
r et ur n 0;
}
/ / ***********************************************************************************
/ / voi d excl ui r _oper ador es ( )
/ /
/ / ***********************************************************************************
i nt excl ui r _oper ador es ( )
{
char buf f er [ 24] = " \ 0" , cod_op[ 3] , opcao[ 2] , nome_ar q[ 9] = " oper ador " ;
i nt of f set ;
FI LE* op;
/ / Ver i f i ca se a t abel a de oper ador es exi st e
i f ( f exi st s( nome_ar q) < 0)
{
l cd_er ase_al l ( ) ;
put s ( " ERRO: Tabel a de Op. nao conf i gur ada! " ) ;
kbd_get c( LETRAENUMERO) ;
r et ur n - 1;
}
op = f open( nome_ar q, FM_RDWR) ;
/ / Pega o codi go do oper ador a ser al t er ado
l cd_er ase_al l ( ) ;
put s( " Cod. Op: " ) ;
l cd_got oxy( 10, 1) ;
pega_num( 2, 1, 99, cod_op) ;
of f set = consul t a( cod_op, buf f er , op) ;
i f ( of f set < 0)
{
l cd_er ase_al l ( ) ;
put s ( " ERRO: Tabel a de Op. nao conf i gur ada! " ) ;
f cl ose( op) ;
kbd_get c( LETRAENUMERO) ;
r et ur n - 1;
}
el se
{
f or ( EVER)
{
l cd_er ase_al l ( ) ;
spr i nt f ( buf , " %s - %s" , cod_op, &buf f er [ 3] ) ;
put s( buf ) ;
put s( " \ nExcl ui r ?( S/ N) : " ) ;
l cd_got oxy( 16, 2) ;
kbd_get s( opcao, 1, 1, SOLETRA) ;
i f ( opcao[ 0] == ' S' )
{
r emove( of f set , op) ;
br eak;
}
104
el se i f ( opcao[ 0] == ' N' )
{
l cd_er ase_al l ( ) ;
put s( " Oper acao Cancel ada! " ) ;
kbd_get c( LETRAENUMERO) ;
br eak;
}
el se cont i nue;
}

}
/ / Fecha ar qui vo
f cl ose( op) ;
r et ur n 0;
}
/ / ***********************************************************************************
/ / i nt l i st ar _oper ador es ( )
/ /
/ / ***********************************************************************************
i nt l i st ar _oper ador es ( )
{
char cod_op[ 3] = " \ 0" , ni vel [ 2] = " \ 0" , r egi st r o[ 24] , nome_ar q[ 9] = " oper ador " ;
char cod = 0, t am;
i nt t em_r egi st r o;
FI LE* op;
/ / Ver i f i ca se a t abel a de oper ador es exi st e
i f ( f exi st s( nome_ar q) < 0)
{
l cd_er ase_al l ( ) ;
put s ( " ERRO: Tabel a de Op. nao conf i gur ada! " ) ;
kbd_get c( LETRAENUMERO) ;
r et ur n - 1;
}
/ / Abr e ar qui vo ' oper ador '
op = f open( nome_ar q, FM_RDWR) ;
/ / ' t am' r ecebe o numer o de r egi st r os exi st ent es no ar qui vo
t am= ( ( op- >pf i l e- >si ze - 1) / op- >t ag ) ;
l cd_er ase_al l ( ) ;
put s( " I mpr i mi ndo. . . " ) ;
pr n_pr i nt f ( " \ n\ n\ t =======TABELA DE OPERADORES ======\ n\ n" ) ;
pr n_pr i nt f ( " CODI GO\ t NI VEL\ t NOME\ n\ n" ) ;
whi l e ( t am> 0)
{
cod++;
i f ( cod < 10) st r cpy( cod_op, " 0" ) ;
st r cat ( cod_op, i t oa( cod) ) ;
t em_r egi st r o = consul t a( cod_op, r egi st r o, op) ;
i f ( t em_r egi st r o < 0) cont i nue ;
st r ncpy( ni vel , &r egi st r o[ 2] , 1) ;
pr n_pr i nt f ( cod_op) ;
pr n_pr i nt f ( " \ t " ) ;
pr n_pr i nt f ( ni vel ) ;
pr n_pr i nt f ( " \ t " ) ;
pr n_pr i nt f ( &r egi st r o[ 3] ) ;
pr n_pr i nt f ( " \ n" ) ;
t am- - ;
}
pr n_pr i nt f ( " \ n\ n\ n\ n\ n\ n\ n\ n" ) ;
f cl ose( op) ;
r et ur n 0;
}

/ / ***********************************************************************************
/ / i nt t r oca_oper ador es ( )
/ /
/ / ***********************************************************************************
i nt t r oca_oper ador es ( )
{
char cod_op[ 3] , opcao[ 2] , nome_ar q[ 9] = " oper ador " ;
FI LE* op;
/ / Ver i f i ca se a t abel a de oper ador es exi st e
i f ( f exi st s( nome_ar q) < 0)
{
l cd_er ase_al l ( ) ;
put s ( " ERRO: Tabel a de Op. nao conf i gur ada! " ) ;
kbd_get c( LETRAENUMERO) ;
105
r et ur n - 1;
}
/ / Abr e ar qui vo
op = f open( nome_ar q, FM_RDWR) ;
i f ( op- >pf i l e- >si ze == 1)
{
l cd_er ase_al l ( ) ;
put s ( " ERRO: Tabel a de Op. vazi a! ! " ) ;
kbd_get c( LETRAENUMERO) ;
f cl ose( op) ;
r et ur n - 1;
}

l cd_er ase_al l ( ) ;
i f ( st r cmp( codi go_oper ador , " 00" ) == 0 ) put s( " Nao ha nenhumoper ador l ogado no
si st ema" ) ;
el se
{
consul t a( codi go_oper ador , buf , op) ;
put s( " Op. : " ) ;
l cd_got oxy( 6, 1) ;
put s( codi go_oper ador ) ;
l cd_got oxy( 8, 1) ;
put s( " - " ) ;
l cd_got oxy( 11, 1) ;
put s( &buf [ 3] ) ;
}
f or ( EVER)
{

/ / Pega o cod. do novo oper ador do si st ema
l cd_got oxy( 1, 2) ;
put s( " Cod. Op. : " ) ;
l cd_got oxy( 10, 2) ;
kbd_get s( cod_op, 2, 0, SONUMERO) ;
/ / Se o codi go nao exi st i r , pega o cod. novament e
i f ( consul t a( cod_op, buf , op) < 0) cont i nue;
l cd_er ase_al l ( ) ;
put s( cod_op) ;
l cd_got oxy( 3, 1) ;
put s( " - " ) ;
l cd_got oxy( 6, 1) ;
put s( &buf [ 3] ) ;
l cd_got oxy( st r l en( &buf [ 3] ) +7, 1) ;
put s( " ?( S/ N) " ) ;
l cd_got oxy( st r l en( &buf [ 3] ) +14, 1) ;
kbd_get s( opcao, 1, 1, SOLETRA) ;
/ / Se as i nf or macoes sao cor r et as. . .
i f ( opcao[ 0] == ' S' )
{
/ / At ual i za ' codi go_oper ador '
st r cpy( codi go_oper ador , cod_op) ;
l cd_er ase_al l ( ) ;
put s( " Oper ador t r ocado comsucesso! ! " ) ;
kbd_get c( LETRAENUMERO) ;
br eak;
}
el se i f ( opcao[ 0] == ' N' )
{
l cd_er ase_al l ( ) ;
put s( " Oper acao cancel ada! ! " ) ;
kbd_get c( LETRAENUMERO) ;
br eak;
}

}
f cl ose( op) ;
r et ur n 0;
}

/ / ***********************************************************************************
/ / voi d conf i gur a_cabecal ho ( )
/ /
/ / ***********************************************************************************
voi d conf i gur a_cabecal ho ( ) / / FALTA PROGRAMAR AS EXCEES! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
{
106
char i , j , t amanho, c, buf [ 20] , of f set ;
FI LE *cabecal ho, *r odape;
char expande[ 2] , st r [ 41] ;
i nt num, t am;
num= f exi st s( " cabeca" ) ;
i f ( num< 0)
{
f cr eat e( " cabeca" , 41) ;
cabecal ho = f open( " cabeca" , FM_RDWR) ;
}
el se
{
cabecal ho = f open( " cabeca" , FM_RDWR) ;
t am= ( ( cabecal ho- >pf i l e- >si ze - 1) / ( cabecal ho- >t ag) ) ;
cabecal ho- >of f set = 1;
whi l e ( t am)
{
r emove( of f set , cabecal ho) ;
cabecal ho- >of f set += ( cabecal ho- >t ag- 1) ;
t am- - ;
}
}
f or ( i =1; i <=5; i ++)
{
l cd_er ase_al l ( ) ;
spr i nt f ( buf , " Cabecal ho %d: " , i ) ;
put s( buf ) ;
l cd_got oxy( 13, 1) ;
kbd_get s( st r , 40, 0, LETRAENUMERO) ;
t amanho = st r l en( st r ) ;
whi l e ( ( t amanho < 3) && ( st r [ 0] ! = ' \ 0' ) )
{
l cd_er ase( l ef t , t amanho) ;
put s( " Mi ni mo de 3 car act er es! " ) ;
l cd_got oxy( 36, 1) ;
whi l e( ( c = kbd_get c( LETRAENUMERO) ) ! = ENTER) ;
l cd_er ase( l ef t , st r l en( " Mi ni mo de 3 car act er es! " ) ) ;
kbd_get s( st r , 40, 0, LETRAENUMERO) ;
t amanho = st r l en( st r ) ;
}
i f ( st r [ 0] ! = ' \ 0' )
i nser e( st r , cabecal ho) ;
/ / Ver i f i car se est e passo r eal ment e necessr i o, poi s na passagem, pode cont er
l i xo no st r
f or ( j = 0; j < t amanho; j ++)
st r [ j ] = ' \ 0' ;
}
cabecal ho- >of f set = 124;
f r ead ( buf , 4, cabecal ho) ;
l cd_er ase_al l ( ) ;
put s( " debuga cabec\ n" ) ;
put s( buf ) ;
kbd_get c( LETRAENUMERO) ;
f cl ose( cabecal ho) ;
num= f exi st s( " r odape" ) ;
i f ( num< 0) f cr eat e( " r odape" , 41) ;
r odape = f open( " r odape" , FM_RDWR) ;
/ / Conf i gur a r odape
f or ( i =1; i <=3; i ++)
{
l cd_er ase_al l ( ) ;
spr i nt f ( buf , " Rodape %d: " , i ) ;
put s( buf ) ;
l cd_got oxy( 10, 1) ;
kbd_get s( st r , 40, 0, LETRAENUMERO) ;
t amanho = st r l en( st r ) ;
whi l e ( ( t amanho < 3) && ( st r [ 0] ! = ' \ 0' ) )
{
l cd_er ase( l ef t , t amanho) ;
put s( " Mi ni mo de 3 car act er es! " ) ;
l cd_got oxy( 33, 1) ;
whi l e( ( c = kbd_get c( LETRAENUMERO) ) ! = ENTER) ;
l cd_er ase( l ef t , st r l en( " Mi ni mo de 3 car act er es! " ) ) ;
kbd_get s( st r , 40, 0, LETRAENUMERO) ;
t amanho = st r l en( st r ) ;
}
107
i f ( st r [ 0] ! = ' \ 0' )
i nser e( st r , cabecal ho) ;
/ / Ver i f i car se est e passo r eal ment e necessr i o, poi s na passagem, pode cont er
l i xo no st r
f or ( j = 0; j < t amanho; j ++)
st r [ j ] = ' \ 0' ;
}
f cl ose( r odape) ;
}

/ / ***********************************************************************************
/ / voi d conf i gur a_t ab_pr eco ( )
/ /
/ / ***********************************************************************************
voi d conf i gur a_t ab_pr eco ( ) / / FAZER VALI DACAO! ! CAMPOS PRECI SAM TER O TAMANHO
ESPECI FI CADO! ! ! !
{
char num_t ab[ 2] , desi st enci a[ 3] , t ol _hor a[ 3] , t ol _24[ 2] , f i m[ 3] , val or [ 6] , nome_t ab[ 5]
= " t ab\ 0" ;
/ / char f r aci onado[ ] , f r acao[ ] ;
st at i c char t est e;
st at i c i nt num, i ni ci o, l en, num_i nt = 9;
FI LE* pr eco;
l cd_er ase_al l ( ) ;
put s( " Di gi t e o numer o da t abel a a ser \ nconf i gur ada ( 1- 6) : " ) ;
l cd_got oxy( 20, 2) ;
pega_num( 1, 1, 6, num_t ab) ;
st r cat ( nome_t ab, num_t ab) ;
num= f exi st s( nome_t ab) ;
i f ( num< 0) f cr eat e( nome_t ab, 0) ;
pr eco = f open( nome_t ab, FM_RDWR) ;
l cd_er ase_al l ( ) ;
put s( " Tempo de Desi st enci a ( xx mi n) : \ nTol er anci a na Hor a ( xx mi n) : " ) ;
l cd_got oxy( 32, 1) ;
kbd_get s( desi st enci a, 2, 0, SONUMERO) ;
st r cpy( buf , desi st enci a) ;
l cd_got oxy( 30, 2) ;
kbd_get s( t ol _hor a, 2, 0, SONUMERO) ;
/ / pega_codi go( 2, 0, 99, t ol _hor a) ;
st r cat ( buf , t ol _hor a) ;
l cd_er ase_al l ( ) ;
put s( " Tol er anci a 24h ( x hs) : " ) ;
l cd_got oxy( 24, 1) ;
kbd_get s( t ol _24, 1, 0, SONUMERO) ;
st r cat ( buf , t ol _24) ;
num= at oi ( num_t ab) ;
i ni ci o = 0;
do
{
st r cpy( val or , " \ 0" ) ;
l cd_er ase_al l ( ) ;
put s( " Tabel a at e hs de per manenci a" ) ;
l cd_got oxy( 8, 1) ;
put s( i t oa( num) ) ;
l cd_got oxy( 14, 1) ;
put s( i t oa( i ni ci o) ) ;
l cd_got oxy( 21, 1) ;
i f ( num_i nt )
pega_num( 2, i ni ci o+1, 24, f i m) ;
el se
{
st r cpy( f i m, " 24\ 0" ) ;
put s( " 24\ 0" ) ;
}
st r cat ( buf , f i m) ;
put s( " \ nVal or ( R$xx. xx) : " ) ;
l cd_got oxy( 18, 2) ;
pega_val or ( 5, val or ) ;
st r cat ( buf , val or ) ;
i ni ci o = at oi ( f i m) ;
num_i nt - - ;
} whi l e( i ni ci o < 24) ;
l en = st r l en( buf ) ;
i nser e_seq( buf , l en, pr eco, 1) ;
f cl ose( pr eco) ;
}
108

/ / ***********************************************************************************
/ / voi d l i st ar _t ab_pr eco ( )
/ /
/ / ***********************************************************************************
voi d l i st ar _t ab_pr eco ( )
{
char t ab[ 2] , desi st enci a[ 3] , t ol [ 3] , t ol 24[ 2] , hor a[ 3] , val or [ 6] , nome_t ab[ 5] =
" t ab\ 0" ;
char i , j , i ni ci o, f i m, num= 0, num_i nt er val os;
i nt t am;
FI LE* t ab_pr eco;
whi l e ( 1)
{
l cd_er ase_al l ( ) ;
put s( " Tabel a( s) ? ( 1- 6/ T) : " ) ;
l cd_got oxy( 21, 1) ;
kbd_get s( t ab, 1, 0, SONUMERO) ;
/ / Se f or di gi t ado umnumer o ent r e 1 e 6 ( i ncl usi ve) , aj ust a as var i avei s
' i ni ci o' e ' f i m' e i mpr i me a t abel a cor r espondent e
i f ( ( at oi ( t ab) > 0) && ( at oi ( t ab) < 7) )
{
i ni ci o = at oi ( t ab) ;
f i m= i ni ci o;
br eak;
}
/ / Se f or di gi t ado ' T' , aj ust a as var i avei s ' i ni ci o' e ' f i m' e i mpr i me t odas as
t abel as
i f ( t ab[ 0] == ' T' )
{
i ni ci o = 1;
f i m= 6;
br eak;
}
}
put s( " \ nI mpr i mi ndo. . . " ) ;
pr n_pr i nt f ( " \ n\ n\ t === TABELA DE PRECOS ===\ n" ) ;
f or ( i = i ni ci o; i <= f i m; i ++)
{
st r cat ( nome_t ab, i t oa( i ) ) ;
i f ( f exi st s( nome_t ab) < 0 )
{
pr n_pr i nt f ( " \ n\ n\ t A TABELA " ) ;
pr n_pr i nt f ( i t oa( i ) ) ;
pr n_pr i nt f ( " NAO ESTA CONFI GURADA! \ n\ n\ n" ) ;
st r cpy( nome_t ab, " t ab\ 0" ) ;
cont i nue;
}
t ab_pr eco = f open( nome_t ab, FM_RDWR) ;
consul t a ( 0, buf , t ab_pr eco) ;
st r ncpy( desi st enci a, buf , 2) ;
st r ncpy( t ol , &buf [ 2] , 2) ;
st r ncpy( t ol 24, &buf [ 4] , 1) ;
desi st enci a[ 2] = ' \ 0' ;
t ol [ 2] = ' \ 0' ;
t ol 24[ 1] = ' \ 0' ;
pr n_pr i nt f ( " \ nTABELA " ) ;
pr n_pr i nt f ( i t oa( i ) ) ;
pr n_pr i nt f ( " - Cl asse " ) ;
pr n_pr i nt f ( i t oa( i ) ) ;
pr n_pr i nt f ( " \ n\ nDESI STENCI A\ t TOLERANCI A\ t TOLERANCI A 24HS\ n" ) ;
pr n_pr i nt f ( desi st enci a) ;
pr n_pr i nt f ( " mi n\ t \ t " ) ;
pr n_pr i nt f ( t ol ) ;
pr n_pr i nt f ( " mi n\ t \ t " ) ;
pr n_pr i nt f ( t ol 24) ;
pr n_pr i nt f ( " h\ n\ n" ) ;
/ / Cal cul a o numer o de i nt er val os
t am= st r l en( buf ) ;
num_i nt er val os = ( t am- 5) / 7;
/ / I mpr i me os i nt er val os da t abel a
f or ( j = 0; j < num_i nt er val os; j ++)
{
/ / ' Zer a' as var i avei s
st r cpy( hor a, " \ 0" ) ;
st r cpy( val or , " \ 0" ) ;
109

/ / Copi a o val or es p/ as var i avei s e i mpr i me
st r ncpy ( hor a, &buf [ 5 + ( j *7) ] , 2) ;
hor a[ 2] = ' \ 0' ;
val or [ 5] = ' \ 0' ;
st r ncpy ( val or , &buf [ 7 + ( j *7) ] , 5) ;
pr n_pr i nt f ( " At e " ) ;
pr n_pr i nt f ( hor a) ;
pr n_pr i nt f ( " hs de per manenci a: R$ " ) ;
pr n_pr i nt f ( val or ) ;
pr n_pr i nt f ( " \ n" ) ;
}

st r cpy( nome_t ab, " t ab\ 0" ) ;
f cl ose ( t ab_pr eco) ;
}
pr n_pr i nt f ( " \ n\ n\ n\ n\ n\ n\ n\ n" ) ;
}

/ / ***********************************************************************************
/ / i nt ent r ada_pat i o ( )
/ /
/ / ***********************************************************************************
i nt ent r ada_pat i o ( voi d)
{
char pl aca[ 8] , cod_mar ca[ 4] , nome_mar ca[ 11] , ent r ada_pat i o[ 23] ;
char t emp[ 3] , c, mar ca[ 11] , er r o[ ] = " Codi goI nval i do! " ;
FI LE *t ab_mar ca, *cl i ent e;
st at i c FI LE* ent r ada;
st r uct Ti me t 0;
st r uct Dat e d0;
i nt num, num_mensal , of f set , mensal i st a, cod_ent r ada;

num= f exi st s( " ent r ada" ) ;
i f ( num< 0)
f cr eat e( " ent r ada" , 22) ;
ent r ada = f open( " ent r ada" , FM_RDWR) ;

i f ( ent r ada == NULL)
{
f cl ose( ent r ada) ;
r et ur n - 1;
}

num= f exi st s( " mar ca" ) ;
i f ( num< 0)
{
l cd_er ase_al l ( ) ;
put s( " Conf i gur e as Mar cas! " ) ;
whi l e( ( c = kbd_get c( LETRAENUMERO) ) ! = ENTER) ;
f cl ose( ent r ada) ;
r et ur n - 1;
}
t ab_mar ca = f open( " mar ca" , FM_RDWR) ;

i f ( t ab_mar ca == NULL)
{
f cl ose( ent r ada) ;
f cl ose( t ab_mar ca) ;
r et ur n - 1;
}

num_mensal = f exi st s( " mensal " ) ;
i f ( num_mensal >= 0)
cl i ent e = f open( " mensal " , FM_RDWR) ;

/ / Zer a a var i avel " ent r ada_pat i o"
f or ( c = 0; c < 22; c++)
ent r ada_pat i o[ c] = ' \ 0' ;

l cd_er ase_al l ( ) ;
l cd_cur sor ( l cd_cur sor _bl i nk) ;
l cd_er ase_al l ( ) ;
l cd_got oxy( 34, 2) ;
mensal i st a = - 1;
mensal i st a = consul t a( pl aca, buf , cl i ent e) ;
110
i f ( num_mensal >= 0)
f cl ose( cl i ent e) ;

of f set = - 1;

whi l e( of f set < 0) {
pega_codMar ca( cod_mar ca) ;
of f set = consul t a( cod_mar ca, mar ca, t ab_mar ca) ;
i f ( of f set < 0) l cd_er ase( l ef t , 3) ;
}
l cd_got oxy( 24, 1) ;
c = 4;
whi l e ( mar ca[ c] ! = ' \ 0' )
{
put ch( mar ca[ c] ) ;
c++;
}
whi l e( ( c = kbd_get c( LETRAENUMERO) ) ! = ENTER) ;
r ead8583_r t c( &t 0, &d0, GET_DATE_TI ME) ;
st r cat ( ent r ada_pat i o, pl aca) ;
st r cat ( ent r ada_pat i o, cod_mar ca) ;
i f ( st r l en( i t oa( d0. year ) ) == 1) st r cat ( ent r ada_pat i o, " 0" ) ;
st r cat ( ent r ada_pat i o, i t oa( d0. year ) ) ;
i f ( st r l en( i t oa( d0. mont h) ) == 1) st r cat ( ent r ada_pat i o, " 0" ) ;
st r cat ( ent r ada_pat i o, i t oa( d0. mont h) ) ;
i f ( st r l en( i t oa( d0. day) ) == 1) st r cat ( ent r ada_pat i o, " 0" ) ;
st r cat ( ent r ada_pat i o, i t oa( d0. day) ) ;
i f ( st r l en( i t oa( t 0. hour ) ) == 1) st r cat ( ent r ada_pat i o, " 0" ) ;
st r cat ( ent r ada_pat i o, i t oa( t 0. hour ) ) ;
i f ( st r l en( i t oa( t 0. mi nut e) ) == 1) st r cat ( ent r ada_pat i o, " 0" ) ;
st r cat ( ent r ada_pat i o, i t oa( t 0. mi nut e) ) ;
i f ( st r l en( i t oa( t 0. seconds) ) == 1) st r cat ( ent r ada_pat i o, " 0" ) ;
st r cat ( ent r ada_pat i o, i t oa( t 0. seconds) ) ;
cod_ent r ada = i nser e( ent r ada_pat i o, ent r ada) ;
l cd_er ase_al l ( ) ;
pr i nt f ( " %d" , mensal i st a) ;
whi l e( ( c = kbd_get c( LETRAENUMERO) ) ! = ENTER) ;
l cd_er ase_al l ( ) ;
l cd_er ase_al l ( ) ;
pr i nt f ( " %d" , cod_ent r ada) ;
whi l e( ( c = kbd_get c( LETRAENUMERO) ) ! = ENTER) ;
l cd_er ase_al l ( ) ;
f cl ose( ent r ada) ;
f cl ose( t ab_mar ca) ;
i mpr i me_ent r ada( ent r ada_pat i o, mar ca, mensal i st a, cod_ent r ada) ;
r et ur n 0;
}

/ / ***********************************************************************************
/ / voi d l i st ar _pat i o ( )
/ /
/ / ***********************************************************************************
voi d l i st ar _pat i o ( )
{
FI LE *ent r ada, *mensal i st a;
char cont , cont 1, cont 2;
char t am, buf f er [ 50] =" " , i mpr essao[ 12] ;
st r uct Ti me hor a_at ual ;
st r uct Dat e dat a_at ual ;
i f ( f exi st s( " ent r ada" ) < 0)
{
l cd_er ase_al l ( ) ;
put s ( " ERRO: Tabel a de Ent r ada nao conf i gur ada! " ) ;
kbd_get c( LETRAENUMERO) ;
r et ur n;
}
ent r ada = f open( " ent r ada" , FM_RDWR) ;
t am= ( ( ent r ada- >pf i l e- >si ze - 1) / ( ent r ada- >t ag) ) ;
i f ( t am==0)
{
l cd_er ase_al l ( ) ;
put s ( " ERRO: Tabel a de Ent r ada vazi a! " ) ;
cont =kbd_get c( LETRAENUMERO) ;
r et ur n;
}
i f ( f exi st s( " mensal " ) >=0) mensal i st a=f open( " mensal " , FM_RDWR) ;
111
ent r ada- >of f set =1;
l cd_er ase_al l ( ) ;
r ead8583_r t c( &hor a_at ual , &dat a_at ual , GET_DATE_TI ME) ;
put s( " I mpr i mi ndo. . . " ) ;
spr i nt f ( buf f er , " \ n\ n\ t LI STA PATI O %02d/ %02d/ %02d
%02d: %02d: %02d\ 0" , dat a_at ual . day, dat a_at ual . mont h, dat a_at ual . year , hor a_at ual . hour , hor a_at ual . m
i nut e, hor a_at ual . seconds) ;
pr n_pr i nt f ( buf f er ) ;
pr n_pr i nt f ( " \ n\ nPLACA TI PO MARCA HORA DATA\ n\ 0" ) ;
f or ( cont 1=1; cont 1<=t am; cont 1++)
{
cont 2=0;
pr i nt er ( ' \ n' ) ;
f r ead ( buf f er , 22, ent r ada) ;
i f ( ( buf f er [ 2] >=' 0' ) &&( buf f er [ 2] <=' 9' ) ) cont 2=1;
st r ncpy( i mpr essao, buf f er , 7- cont 2) ;
i mpr essao[ 7- cont 2] =' \ 0' ;
pr n_pr i nt f ( i mpr essao) ;
pr n_pr i nt f ( " " ) ;
i f ( cont 2) pr i nt er ( ' ' ) ;
i f ( f exi st s( " mensal " ) >=0)
i f ( consul t a( i mpr essao, buf , mensal i st a) >0) pr i nt er ( ' M' ) ;
el se pr i nt er ( ' A' ) ;
el se pr i nt er ( ' A' ) ;
pr n_pr i nt f ( " " ) ;
st r ncpy( i mpr essao, buf f er +7- cont 2, 3) ;
i mpr essao[ 3] =' \ 0' ;
pr n_pr i nt f ( i mpr essao) ;
pr n_pr i nt f ( " " ) ;
st r ncpy( i mpr essao, buf f er +16- cont 2, 2) ;
i mpr essao[ 2] =' \ 0' ;
pr n_pr i nt f ( i mpr essao) ;
pr i nt er ( ' : ' ) ;
st r ncpy( i mpr essao, buf f er +18- cont 2, 2) ;
i mpr essao[ 2] =' \ 0' ;
pr n_pr i nt f ( i mpr essao) ;
pr i nt er ( ' : ' ) ;
st r ncpy( i mpr essao, buf f er +20- cont 2, 2) ;
i mpr essao[ 2] =' \ 0' ;
pr n_pr i nt f ( i mpr essao) ;
pr n_pr i nt f ( " " ) ;
st r ncpy( i mpr essao, buf f er +14- cont 2, 2) ;
i mpr essao[ 2] =' \ 0' ;
pr n_pr i nt f ( i mpr essao) ;
pr i nt er ( ' / ' ) ;
st r ncpy( i mpr essao, buf f er +12- cont 2, 2) ;
i mpr essao[ 2] =' \ 0' ;
pr n_pr i nt f ( i mpr essao) ;
pr i nt er ( ' / ' ) ;
st r ncpy( i mpr essao, buf f er +10- cont 2, 2) ;
i mpr essao[ 2] =' \ 0' ;
pr n_pr i nt f ( i mpr essao) ;
}
pr n_pr i nt f ( " \ n\ n\ n\ n\ n\ n\ n\ n\ n\ n\ n\ n" ) ;
f cl ose( ent r ada) ;
f cl ose( mensal i st a) ;
}

/ / ***********************************************************************************
/ / i nt sai da_pat i o ( )
/ /
/ / ***********************************************************************************
i nt sai da_pat i o ( voi d)
{
char codi go[ 7] , cod_mar ca[ 4] , nome_mar ca[ 11] , conf i r ma[ 2] , r eg_mar ca[ 15] , t emp[ 3] ,
t emp2[ 3] ;
st at i c char cl i ent e[ 22] = " \ 0" ;
char t est e, nome_t ab[ 5] = " t ab\ 0" , c;
FI LE* mar ca;
FI LE* ent r ada;
FI LE *r el ogi o;
st r uct Ti me t 0;
st r uct Dat e d0;
st r uct Ti me t f ;
st r uct Dat e df ;
i nt t empo_per manenci a;
112
i nt i nt ei r o, f r ac, ano, i nt _codi go, mi n_per m_t emp;
l ong i nt hor a_per m, mi n_per m;
st _f l oat *val or ;

ent r ada = f open( " ent r ada" , FM_RDWR) ;
i f ( ent r ada == NULL ) r et ur n - 1;

mar ca = f open( " mar ca" , FM_RDWR) ;
i f ( mar ca == NULL )
{
f cl ose( ent r ada) ;
r et ur n - 1;
}
ano = descobr e_ano( ) ;
l cd_er ase_al l ( ) ;
put s( " Sai da- > Codi go ( ou Pl aca) : " ) ;
l cd_got oxy( 28, 1) ;
kbd_get s( codi go, 7, 0, LETRAENUMERO) ;
/ / Se f or menor que 7 eh codi go ( o of f set ) e l e di r et o, se f or i gual a 7 eh pl aca,
/ / t emque f azer consul t a
i f ( st r l en( codi go) < 7)
{
ent r ada- >of f set = codi go;
i nt _codi go = at oi ( codi go) ;
f r ead( cl i ent e, ent r ada- >t ag, ent r ada) ;
}
el se
{
i nt _codi go = consul t a( codi go, cl i ent e, ent r ada) ;
}

f cl ose( ent r ada) ;
/ / Consul t a a mar ca do aut o par a descobr i r a cl asse e abr i r a t abel a de pr ecos cor r et a
st r ncpy( cod_mar ca, &cl i ent e[ 7] , 3) ;
cod_mar ca[ 3] = ' \ 0' ;
l cd_er ase_al l ( ) ;
consul t a( cod_mar ca, r eg_mar ca, mar ca) ;
f cl ose( mar ca) ;
st r ncpy( buf , &r eg_mar ca[ 3] , 1) ;
buf [ 1] = ' \ 0' ;
st r cat ( nome_t ab, buf ) ;
st r ncpy ( t emp, &cl i ent e[ 10] , 2) ;
t emp[ 2] =' \ 0' ;
d0. year = at oi ( t emp) ;
d0. year += ano;
st r ncpy ( t emp, &cl i ent e[ 12] , 2) ;
t emp[ 2] =' \ 0' ;
d0. mont h = at oi ( t emp) ;
st r ncpy ( t emp, &cl i ent e[ 14] , 2) ;
t emp[ 2] =' \ 0' ;
d0. day = at oi ( t emp) ;
st r ncpy ( t emp, &cl i ent e[ 16] , 2) ;
t emp[ 2] =' \ 0' ;
t 0. hour = at oi ( t emp) ;
st r ncpy ( t emp, &cl i ent e[ 18] , 2) ;
t emp[ 2] =' \ 0' ;
t 0. mi nut e = at oi ( t emp) ;
st r ncpy ( t emp, &cl i ent e[ 20] , 2) ;
t emp[ 2] =' \ 0' ;
t 0. seconds = at oi ( t emp) ;
/ / Obt ema dat a e hor a at ual
r ead8583_r t c( &t f , &df , GET_DATE_TI ME) ;
df . year += ano;
l cd_er ase_al l ( ) ;
l cd_got oxy( 9, 1) ;
put s( i t oa( d0. day) ) ;
l cd_got oxy( 11, 1) ;
put s( " / " ) ;
l cd_got oxy( 12, 1) ;
put s( i t oa( d0. mont h) ) ;
l cd_got oxy( 14, 1) ;
put s( " / " ) ;
l cd_got oxy( 15, 1) ;
put s( i t oa( d0. year +2000) ) ;
l cd_got oxy( 20, 1) ;
put s( i t oa( t 0. hour ) ) ;
113
l cd_got oxy( 22, 1) ;
put s( " : " ) ;
l cd_got oxy( 23, 1) ;
put s( i t oa( t 0. mi nut e) ) ;
l cd_got oxy( 25, 1) ;
put s( " : " ) ;
l cd_got oxy( 26, 1) ;
put s( i t oa( t 0. seconds) ) ;
l cd_got oxy( 9, 2) ;
put s( i t oa( df . day) ) ;
l cd_got oxy( 11, 2) ;
put s( " / " ) ;
l cd_got oxy( 12, 2) ;
put s( i t oa( df . mont h) ) ;
l cd_got oxy( 14, 2) ;
put s( " / " ) ;
l cd_got oxy( 15, 2) ;
put s( i t oa( df . year +2000) ) ;
l cd_got oxy( 20, 2) ;
put s( i t oa( t f . hour ) ) ;
l cd_got oxy( 22, 2) ;
put s( " : " ) ;
l cd_got oxy( 23, 2) ;
put s( i t oa( t f . mi nut e) ) ;
l cd_got oxy( 25, 2) ;
put s( " : " ) ;
l cd_got oxy( 26, 2) ;
put s( i t oa( t f . seconds) ) ;
kbd_get c( LETRAENUMERO) ;
/ / Cal cul a a per manenci a
t empo_per manenci a = cal cul a_per manenci a( &t 0, &d0, &t f , &df ) ;
hor a_per m= ( t empo_per manenci a / 3600) ;
mi n_per m= t empo_per manenci a - hor a_per m*3600;
mi n_per m= ( mi n_per m/ 60) ;
mi n_per m_t emp = mi n_per m;
l cd_er ase_al l ( ) ;
put s( " per manenci a\ n" ) ;
put s( i t oa( hor a_per m) ) ;
l cd_got oxy( 10, 2) ;
put s( i t oa( mi n_per m) ) ;
kbd_get c( LETRAENUMERO) ;
val or = cal cul a_val or ( hor a_per m, mi n_per m, nome_t ab) ;
l cd_er ase_al l ( ) ;
put s( " depoi s de cal cul a_val or \ n" ) ;
put s( i t oa( val or - >i nt ei r o) ) ;
kbd_get c( LETRAENUMERO) ;
l cd_er ase_al l ( ) ;
l cd_got oxy( 9, 1) ;
put s( i t oa( d0. day) ) ;
l cd_got oxy( 11, 1) ;
put s( " / " ) ;
l cd_got oxy( 12, 1) ;
put s( i t oa( d0. mont h) ) ;
l cd_got oxy( 14, 1) ;
put s( " / " ) ;
l cd_got oxy( 15, 1) ;
put s( i t oa( d0. year +2000) ) ;
l cd_got oxy( 20, 1) ;
put s( i t oa( t 0. hour ) ) ;
l cd_got oxy( 22, 1) ;
put s( " : " ) ;
l cd_got oxy( 23, 1) ;
put s( i t oa( t 0. mi nut e) ) ;
l cd_got oxy( 25, 1) ;
put s( " : " ) ;
l cd_got oxy( 26, 1) ;
put s( i t oa( t 0. seconds) ) ;
l cd_got oxy( 9, 2) ;
put s( i t oa( df . day) ) ;
l cd_got oxy( 11, 2) ;
put s( " / " ) ;
l cd_got oxy( 12, 2) ;
put s( i t oa( df . mont h) ) ;
l cd_got oxy( 14, 2) ;
put s( " / " ) ;
l cd_got oxy( 15, 2) ;
114
put s( i t oa( df . year +2000) ) ;
l cd_got oxy( 20, 2) ;
put s( i t oa( t f . hour ) ) ;
l cd_got oxy( 22, 2) ;
put s( " : " ) ;
l cd_got oxy( 23, 2) ;
put s( i t oa( t f . mi nut e) ) ;
l cd_got oxy( 25, 2) ;
put s( " : " ) ;
l cd_got oxy( 26, 2) ;
put s( i t oa( t f . seconds) ) ;
kbd_get c( LETRAENUMERO) ;
spr i nt f ( buf , " Ent r ada: %2d/ %2d/ %4d %2d: %2d: %2d Per m: %2dh %s" , d0. day, d0. mont h,
( d0. year +2000) , t 0. hour , t 0. mi nut e, t 0. seconds, hor a_per m, t emp2) ;
put s( buf ) ;
spr i nt f ( buf , " Sai da: %2d/ %2d/ %4d %2d: %2d: %2d R$%2d. %2d" , df . day, df . mont h,
( df . year +2000) , t f . hour , t f . mi nut e, t f . seconds, i nt ei r o, f r ac) ;
put s( buf ) ;
kbd_get c( ) ;
l cd_er ase_al l ( ) ;
put s( " Ent r ada: " ) ;
i f ( d0. day < 10)
{
l cd_got oxy( 9, 1) ;
put s( " 0" ) ;
l cd_got oxy( 10, 1) ;
put s( i t oa( d0. day) ) ;
}
el se
{
l cd_got oxy( 9, 1) ;
put s( i t oa( d0. day) ) ;
}

l cd_got oxy( 11, 1) ;
put s( " / " ) ;

i f ( d0. mont h < 10)
{
l cd_got oxy( 12, 1) ;
put s( " 0" ) ;
l cd_got oxy( 13, 1) ;
put s( i t oa( d0. mont h) ) ;
}
el se
{
l cd_got oxy( 12, 1) ;
put s( i t oa( d0. mont h) ) ;
}

l cd_got oxy( 14, 1) ;
put s( " / " ) ;

l cd_got oxy( 15, 1) ;
put s( i t oa( d0. year +2000) ) ;

i f ( t 0. hour < 10)
{
l cd_got oxy( 20, 1) ;
put s( " 0" ) ;
l cd_got oxy( 21, 1) ;
put s( i t oa( t 0. hour ) ) ;
}
el se
{
l cd_got oxy( 20, 1) ;
put s( i t oa( t 0. hour ) ) ;
}

l cd_got oxy( 22, 1) ;
put s( " : " ) ;

i f ( t 0. mi nut e < 10)
{
l cd_got oxy( 23, 1) ;
put s( " 0" ) ;
115
l cd_got oxy( 24, 1) ;
put s( i t oa( t 0. mi nut e) ) ;
}
el se
{
l cd_got oxy( 23, 1) ;
put s( i t oa( t 0. mi nut e) ) ;
}

l cd_got oxy( 25, 1) ;
put s( " : " ) ;

i f ( t 0. seconds < 10)
{
l cd_got oxy( 26, 1) ;
put s( " 0" ) ;
l cd_got oxy( 27, 1) ;
put s( i t oa( t 0. seconds) ) ;
}
el se
{
l cd_got oxy( 26, 1) ;
put s( i t oa( t 0. seconds) ) ;
}

l cd_got oxy( 29, 1) ;
put s( " Per m. : " ) ;

i f ( hor a_per m< 10)
{
l cd_got oxy( 35, 1) ;
put s( " 0" ) ;
l cd_got oxy( 36, 1) ;
put s( i t oa( hor a_per m) ) ;
}
el se
{
l cd_got oxy( 35, 1) ;
put s( i t oa( hor a_per m) ) ;
}

l cd_got oxy( 37, 1) ;
put s( " : " ) ;

i f ( mi n_per m< 10)
{
l cd_got oxy( 38, 1) ;
put s( " 0" ) ;
l cd_got oxy( 39, 1) ;
put s( i t oa( mi n_per m) ) ;
}
el se
{
l cd_got oxy( 38, 1) ;
put s( i t oa( mi n_per m) ) ;
}

put s( " \ nSai da: " ) ;

i f ( df . day < 10)
{
l cd_got oxy( 9, 2) ;
put s( " 0" ) ;
l cd_got oxy( 10, 2) ;
put s( i t oa( df . day) ) ;
}
el se
{
l cd_got oxy( 9, 2) ;
put s( i t oa( df . day) ) ;
}

l cd_got oxy( 11, 2) ;
put s( " / " ) ;

i f ( df . mont h < 10)
116
{
l cd_got oxy( 12, 2) ;
put s( " 0" ) ;
l cd_got oxy( 13, 2) ;
put s( i t oa( df . mont h) ) ;
}
el se
{
l cd_got oxy( 12, 2) ;
put s( i t oa( df . mont h) ) ;
}

l cd_got oxy( 14, 2) ;
put s( " / " ) ;

l cd_got oxy( 15, 2) ;
put s( i t oa( df . year +2000) ) ;

i f ( t f . hour < 10)
{
l cd_got oxy( 20, 2) ;
put s( " 0" ) ;
l cd_got oxy( 21, 2) ;
put s( i t oa( t f . hour ) ) ;
}
el se
{
l cd_got oxy( 20, 2) ;
put s( i t oa( t f . hour ) ) ;
}

l cd_got oxy( 22, 2) ;
put s( " : " ) ;

i f ( t f . mi nut e < 10)
{
l cd_got oxy( 23, 2) ;
put s( " 0" ) ;
l cd_got oxy( 24, 2) ;
put s( i t oa( t f . mi nut e) ) ;
}
el se
{
l cd_got oxy( 23, 2) ;
put s( i t oa( t f . mi nut e) ) ;
}

l cd_got oxy( 25, 2) ;
put s( " : " ) ;

i f ( t f . seconds < 10)
{
l cd_got oxy( 26, 2) ;
put s( " 0" ) ;
l cd_got oxy( 27, 2) ;
put s( i t oa( t f . seconds) ) ;
}
el se
{
l cd_got oxy( 26, 2) ;
put s( i t oa( t f . seconds) ) ;
}

l cd_got oxy( 29, 2) ;
put s( " R$. : " ) ;

l cd_got oxy( 34, 2) ;
put s( i t oa( val or - >i nt ei r o) ) ;
l cd_got oxy( 37, 2) ;
put s( " . " ) ;
l cd_got oxy( 38, 2) ;
put s( i t oa( val or - >f r ac) ) ;
kbd_get c( LETRAENUMERO) ;
l cd_er ase_al l ( ) ;
put s( " I mpr i mi r Reci bo de Sai da? ( S/ N) : " ) ;
l cd_got oxy( 33, 1) ;
117
i nt ei r o = 1;
i nt _codi go = 0;
whi l e ( ! ( i nt _codi go) )
{
c = kbd_get c( SOLETRA) ;
swi t ch ( c)
{
case ' N' : case ' n' :
i nt ei r o = 0;
i nt _codi go = 1;
br eak;

case ' S' :
i nt ei r o = 1;
i nt _codi go = 1;
br eak;
}
}
i f ( i nt ei r o)
i nt _codi go = 2;
el se
i nt _codi go = 1;
do
{
/ / CABECALHOS
i f ( ! ( f exi st s( " cabeca" ) < 0) )
{
FI LE *cabecal ho;
char t am;

cabecal ho = f open( " cabeca" , FM_RDWR) ;

i f ( cabecal ho == NULL)
{
f cl ose( cabecal ho) ;
r et ur n - 1;
}

/ / ' t am' r ecebe o numer o de r egi st r os exi st ent es no ar qui vo
t am= ( ( cabecal ho- >pf i l e- >si ze - 1) / ( cabecal ho- >t ag) ) ;

cabecal ho- >of f set = 1;

whi l e( t am)
{
f r ead( buf , 40, cabecal ho) ;
pr n_pr i nt f ( " \ t " ) ;
pr n_pr i nt f ( buf ) ;
pr n_pr i nt f ( " \ n" ) ;
cabecal ho- >of f set ++;
t am- - ;
}

f cl ose( cabecal ho) ;
pr n_pr i nt f ( " \ n\ n" ) ;
}

i f ( i nt _codi go == 2)
spr i nt f ( buf , " ==== RECI BO DE SAI DA ====" ) ;

i f ( i nt _codi go == 1)
spr i nt f ( buf , " ==== TI CKET DE SAI DA ====" ) ;

/ / SAI DA: CODI GO DE ENTRADA
pr n_pr i nt f ( buf ) ;
pr n_pr i nt f ( " \ n\ n" ) ;
spr i nt f ( buf , " Sai da: %d" , i nt _codi go) ;
pr n_pr i nt f ( buf ) ;
pr n_pr i nt f ( " \ n\ n" ) ;

pr n_pr i nt f ( " ENTRADA SAI DA PERM. \ n" ) ;
spr i nt f ( buf , " %d/ %d/ %d %d/ %d/ %d %d: %d " , d0. day, d0. mont h,
( d0. year +2000) , df . day, df . mont h, ( df . year +2000) , hor a_per m, mi n_per m_t emp) ;
pr n_pr i nt f ( buf ) ;
pr n_pr i nt f ( " \ n" ) ;
118
spr i nt f ( buf , " %d: %d %d: %d" , t 0. hour , t 0. mi nut e, t f . hour ,
t f . mi nut e) ;
pr n_pr i nt f ( buf ) ;
pr n_pr i nt f ( " \ n\ n\ n" ) ;
st r ncpy( buf , &cl i ent e[ 0] , 7) ;
buf [ 7] = ' \ 0' ;
pr n_pr i nt f ( " \ t " ) ;
pr n_pr i nt f ( buf ) ;
pr n_pr i nt f ( " - " ) ;
st r ncpy( buf , &r eg_mar ca[ 4] , 10) ;
buf [ 10] = ' \ 0' ;
pr n_pr i nt f ( buf ) ;
pr n_pr i nt f ( " \ n\ n" ) ;
i f ( ! ( f exi st s( " r odape" ) < 0) )
{
FI LE *r odape;
char t am;
r odape = f open( " r odape" , FM_RDWR) ;
t am= ( ( r odape- >pf i l e- >si ze - 1) / ( r odape- >t ag) ) ;
r odape- >of f set = 1;
pr i nt er ( ' \ n' ) ;
whi l e( t am)
{
f r ead( buf , 40, r odape) ;
pr n_pr i nt f ( " \ t " ) ;
pr n_pr i nt f ( buf ) ;
pr n_pr i nt f ( " \ n" ) ;
r odape- >of f set ++;
t am- - ;
}
f cl ose( r odape) ;
}
pr n_pr i nt f ( " \ n\ n\ n" ) ;
pr n_pr i nt f ( " \ n\ n\ n" ) ;
l cd_er ase_al l ( ) ;
put s ( " Pr essi one qual quer t ecl a par a cont i nuar . " ) ;
kbd_get c( LETRAENUMERO) ;
i nt _codi go- - ;
}whi l e ( i nt _codi go) ;
}

st _f l oat * cal cul a_val or ( i nt hor a_per m, i nt mi n_per m, char nome_t ab[ ] )
{
char t empo_st r [ 3] , t empo_st r 2[ 3] , val or _i nt er val o[ 3] = " 00" ;
i nt desi st , t ol , t ol 24, i = 5, i nt er val o, l en, t emp, t emp2;
i nt di as, hor as;
st _f l oat val or ;
FI LE* pr eco;
l cd_er ase_al l ( ) ;
put s( " nome_t ab\ n" ) ;
put s( nome_t ab) ;
kbd_get c( LETRAENUMERO) ;
val or . i nt ei r o = 0;
val or . f r ac = 0;
pr eco = f open( nome_t ab, FM_RDWR) ;
i f ( pr eco == NULL ) r et ur n - 1;
/ / Le a t abel a de pr ecos
consul t a( 0, buf , pr eco) ;
st r ncpy( t empo_st r , buf , 2) ;
t empo_st r [ 2] = ' \ 0' ;
desi st = at oi ( t empo_st r ) ;
/ / Tol er anci a na hor a
st r ncpy( t empo_st r , &buf [ 2] , 2) ;
t empo_st r [ 2] = ' \ 0' ;
t ol = at oi ( t empo_st r ) ;
/ / Tol er anci a 24h
st r ncpy( t empo_st r , &buf [ 4] , 1) ;
t empo_st r [ 1] = ' \ 0' ;
t ol 24 = at oi ( t empo_st r ) ;
/ / Cal cul amos os di as de per manenci a e as hor as r est ant es( semcont ar os di as) de
per manenci a
di as = hor a_per m/ 24;
hor as = hor a_per m%24;
/ / Ver i f i ca o t empo de desi st enci a
i f ( ( hor a_per m== 0) && ( mi n_per m<= desi st ) )
{
119
val or . i nt ei r o = 0;
val or . f r ac = 0;
l cd_er ase_al l ( ) ;
put s( " Sai u: t empo de desi st enci a" ) ;
kbd_get c( LETRAENUMERO) ;
f cl ose( pr eco) ;
r et ur n &val or ;
}
/ / Ver i f i ca o t empo de t ol er anci a na hor a
i f ( mi n_per m<= t ol ) mi n_per m= 0;
/ / Ver i f i ca o t empo de t ol er anci a nas 24h ==> VERI FI CAR! ! ! ! ! ! ! ! ! !
i f ( ( ( mi n_per m== 0) && ( hor as <= t ol 24) ) | | ( ( mi n_per m> 0) && ( hor as < t ol 24) ) )
{
mi n_per m= 0;
hor as = 0;
}
/ / Se ' mi n_per m' f or mai or que os t empos de t ol er anci a e desi st enci a, el es sao cont ados
nas hor as de per manenci a
i f ( mi n_per m> 0) hor as++;
l cd_er ase_al l ( ) ;
put s( " t ab_pr eco\ n" ) ;
put s( buf ) ;
kbd_get c( LETRAENUMERO) ;
/ / * Se f i cou mai s de 24h, pega o val or r ef er ent e a umdi a
i f ( di as > 0)
{
l en = st r l en( buf ) ;
l cd_er ase_al l ( ) ;
put s( &buf [ l en - 6] ) ;
kbd_get c( LETRAENUMERO) ;
st r ncpy( t empo_st r , &buf [ l en - 6] , 2) ;
val or . i nt ei r o = at oi ( t empo_st r ) ;
st r ncpy( t empo_st r , &buf [ l en - 3] , 2) ;
val or . f r ac = at oi ( t empo_st r ) ;
/ / Se ' hor as' == 0, f i cou exat ament e n*24 hs no pat i o
i f ( hor as == 0)
{
t emp = val or . f r ac * di as;
t emp2 = t emp / 100;
val or . f r ac = t emp - ( t emp2 * 100) ;
t emp = val or . i nt ei r o * di as;
val or . i nt ei r o = t emp + t emp2;
f cl ose( pr eco) ;
r et ur n &val or ;
}
}
/ / * Pega o val or r ef er ent e a per i odos menor es que 24h e cal cul a o val or a ser pago
whi l e ( st r cmp( val or _i nt er val o, " 24" ) ! = 0 )
{
st r ncpy( val or _i nt er val o, &buf [ i ] , 2) ;
val or _i nt er val o[ 2] = ' \ 0' ;
i nt er val o = at oi ( val or _i nt er val o) ;
i f ( hor as <= i nt er val o )
{
st r ncpy( t empo_st r , &buf [ i +2] , 2) ;
t empo_st r [ 2] = ' \ 0' ;
l cd_er ase_al l ( ) ;
put s( " Par t e I nt ei r a: \ n" ) ;
put s( t empo_st r ) ;
kbd_get c( LETRAENUMERO) ;
t emp = at oi ( t empo_st r ) ;
val or . i nt ei r o += t emp;
st r ncpy( t empo_st r , &buf [ i +5] , 2) ;
t empo_st r [ 2] = ' \ 0' ;
t emp = at oi ( t empo_st r ) ;
val or . f r ac += t emp;
i f ( val or . f r ac >= 100)
{
val or . f r ac - = 100;
val or . i nt ei r o ++;
}
l cd_er ase_al l ( ) ;
put s( " Sai u: f i cou 24hs e uns quebr ados\ n" ) ;
put s( i t oa( val or . i nt ei r o) ) ;
kbd_get c( LETRAENUMERO) ;
f cl ose( pr eco) ;
120
r et ur n &val or ;
}

i += 7;
}
l cd_er ase_al l ( ) ;
put s( " Sai u: deu mer da! " ) ;
kbd_get c( LETRAENUMERO) ;
r et ur n - 1;
}
l ong i nt cal cul a_di as_cor r i dos( st r uct Dat e *d1, st r uct Dat e *d2)
{
i nt di as_i ni ci o_mes[ 12] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
l ong i nt di as_cor r i dos, di a1, di a2;
i nt j = 0;
i nt i , ano1, ano2;
/ / Quant os di as do ano passar amat cada uma das dat as especi f i cadas, excl usi ve.
di a1 = di as_i ni ci o_mes[ ( d1- >mont h - 1) ] + d1- >day;
di a2 = di as_i ni ci o_mes[ ( d2- >mont h - 1) ] + d2- >day;
ano1 = d1- >year + 2000;
ano2 = d2- >year + 2000;
/ / Se est amos no mesmo ano. . .
i f ( ano1 == ano2)
{
di as_cor r i dos = di a2 - di a1; / / Cal cul a- se a di f er ena
i f ( ( ! ( ano1 %4) ) && ( ( d1- >mont h <= 2) && ( d2- >mont h > 2) ) )
di as_cor r i dos++; / / Se o ano eh bi ssext o, a dat a i ni ci al eh ant er i or a
f ever ei r o e a dat a f i nal eh apos f ever ei r o
r et ur n di as_cor r i dos;
}
/ / Daqui pr a f r ent e no est amos no mesmo ano. . .
i = ano1;
i ++;
/ / Aj ust a os anos bi ssext os per di dos no cami nho.
whi l e( i < ano2)
{
i f ( ! ( i %4) )
j ++;

i ++;
}

/ / Mai s anos bi ssext os:
/ / Aqui eh o caso de t er mos a dat a i ni ci al ant es de f ever ei r o
i f ( ! ( ano1 %4) )
i f ( ( d1- >mont h == 1) | | ( ( d1- >mont h == 2) && ( d1- >day < 29) ) )
j ++;

/ / E aqui eh o caso de t er mos a dat a f i nal apos f ever ei r o
i f ( ! ( ano2 %4) )
i f ( ( d2- >mont h >= 2) | | ( ( d2- >mont h == 2) && ( d2- >day == 29) ) )
j ++;
/ / Quant os di as passar amdesde a dat a i ni ci al at e o f i mdaquel e ano +
/ / Quant os di as passar amat e a dat a f i nal no ul t i mo ano +
/ / Var i os anos i nt ei r os per di dos no cami nho +
/ / Aj ust es par a anos bi ssext os
di as_cor r i dos = ( 365 - di a1) + di a2 + ( d2- >year - d1- >year - 1) *365 + j ;

r et ur n di as_cor r i dos;
}
/ * Cal cul a o t empo ( emhor as, mi nut os e segundos) que passar ament e doi s i nst ant es de
t empo.
Os val or es cal cul ados sao r et or nados ( por r ef er enci a) na segunda est r ut ur a de t empo
( *t 2) */
l ong i nt cal cul a_per manenci a ( st r uct Ti me *t 1, st r uct Dat e *d1, st r uct Ti me *t 2, st r uct Dat e
*d2)
{
const l ong i nt di a_em_segundos = 86400;
l ong i nt t empo1, t empo2, di f _t empo, di as_cor r i dos;
f l oat t emp;
i nt i ;
di f _t empo = 0;
di as_cor r i dos = cal cul a_di as_cor r i dos( d1, d2) ;
/ / Segundos decor r i dos desde 0: 00 at e o i nst ant e de t empo i ni ci al
t empo1 = t 1- >hour *60; / / Eh f ei o, mas nao da over f l ow!
t empo1 = t empo1*60 + t 1- >mi nut e*60 + t 1- >seconds;
121
t empo2 = t 2- >hour *60;
t empo2 = t empo2*60 + t 2- >mi nut e*60 + t 2- >seconds;
/ / Se est amos no mesmo di a, apenas cal cul a- se a di f er enca
i f ( ! ( di as_cor r i dos) )
{
i f ( t 1- >hour > t 2- >hour )
r et ur n - 1;
el se
{
di f _t empo = ( t empo2 - t empo1) ;
r et ur n di f _t empo;
}
}
el se
{
f or ( i =0; i < ( di as_cor r i dos - 1) ; i ++) / / Ser i a di f _t empo = ( di as_cor r i dos -
1) *di a_em_segundos, mas. . . da over f l ow
di f _t empo += di a_em_segundos;
}
/ / Tempo dos di as i nt er medi ar i os ( cal cul ado aci ma) +
/ / Tempo decor r i do do i nst ant e i ni ci al at e o f i mdo pr i mei r o di a +
/ / Tempo decor r i do at e o i nst ant e f i nal
di f _t empo += ( di a_em_segundos - t empo1) + t empo2;
r et ur n di f _t empo;
}
/ / ***********************************************************************************
/ / i nt i ncl ui r _mensal i st a( )
/ /
/ / ***********************************************************************************
i nt i ncl ui r _mensal i st a ( voi d)
{
FI LE *cl i ent e;
/ / i nt t amanho_nome, t amanho_cl asse, t amanho_pl aca1, t amanho_pl aca2;
char codMensal [ COD_MAX] , nome[ NOME_MAX] , cl asse[ 2] , pl aca1[ PLC_MAX] , pl aca2[ PLC_MAX] ;
char c, nome_ar q[ 9] = " mensal " , buf [ 60] ;
i nt num, pr ox, cod;

l cd_er ase_al l ( ) ;
l cd_cur sor ( l cd_cur sor _bl i nk) ;

num= f exi st s( nome_ar q) ;
i f ( num< 0)
f cr eat e( nome_ar q, 43) ;
cl i ent e = f open( nome_ar q, FM_RDWR) ;

i f ( cl i ent e == NULL)
{
f cl ose( cl i ent e) ;
r et ur n - 1;
}
/ / Zer a a var i avel gl obal " buf "
st r cpy( buf , " \ 0" ) ;
/ / Cal cul a o numer o do codi go
pr ox = pr ox_vazi o( cl i ent e) ;
cod = ( ( pr ox - 1) / cl i ent e- >t ag ) + 1 ;
/ / Compl et a o campo ' cod_mar ca' par a que t enha 3 car act er es / / <==== TESTAR! ! ! !
i f ( cod < 10) st r cpy( codMensal , " 00" ) ;
el se i f ( cod > 9 && pr ox < 100) st r cpy( codMensal , " 0" ) ;
st r cat ( codMensal , i t oa( cod) ) ;
l cd_er ase_al l ( ) ;
i ni ci a_di spl ay_mensal ( ) ;
/ / Escr eve no di spl ay o codi go do cl i ent e
l cd_got oxy( 12, 1) ;
put s( codMensal ) ;
/ / Posi ci ona o cur sor no nome
l cd_got oxy( 21, 1) ;
pega_nome( nome, 0) ;
/ / Posi ci ona o cur sor na cl asse
l cd_got oxy( 15, 2) ;
pega_cl asse( cl asse, 0) ;
l cd_er ase_al l ( ) ;
cur sor _pl aca_mensal ( ) ;
pega_pl aca( pl aca1, 0, 0, 0) ;
l cd_got oxy( 11, 2) ;
pega_pl aca( pl aca2, 1, 0, 0) ; / / Se f or a pl aca2, a f uno acei t ar ENTER como ent r ada
st r cat ( buf , codMensal ) ;
122
st r cat ( buf , " @" ) ;
st r cat ( buf , nome) ;
st r cat ( buf , " @" ) ;
st r cat ( buf , cl asse) ;
st r cat ( buf , " @" ) ;
st r cat ( buf , pl aca1) ;
st r cat ( buf , " @" ) ;
st r cat ( buf , pl aca2) ;
l cd_er ase_al l ( ) ;
put s( buf ) ;
whi l e( ( c = kbd_get c( LETRAENUMERO) ) ! = ENTER) ;
l cd_er ase_al l ( ) ;
i nser e( buf , cl i ent e) ;
f cl ose( cl i ent e) ;
r et ur n 0;
}
/ / ***********************************************************************************
/ / i nt excl ui r _mensal i st a( )
/ /
/ / ***********************************************************************************
i nt excl ui r _mensal i st a ( )
{
FI LE *cl i ent e;
char codMensal [ COD_MAX] ;
char nome_ar q[ 8] = " mensal " , c, i , j , pl aca2 = FALSE, nao_conf i r mado;
i nt codi go_i ncor r et o = TRUE, of f set ;
i f ( f exi st s( nome_ar q) < 0)
r et ur n - 1;
cl i ent e = f open( nome_ar q, FM_RDWR) ;
i f ( cl i ent e == NULL)
{
f cl ose( cl i ent e) ;
r et ur n - 1;
}
of f set = 0;
whi l e ( codi go_i ncor r et o) / / Fazer est a exceo. Fal t amdet al hes.
{
/ / Zer a a var i avel gl obal " buf "
st r cpy( buf , " \ 0" ) ;
/ / Di spl ay
l cd_er ase_al l ( ) ;
put s( " Codi go do mensal i st a: " ) ;
l cd_got oxy( 22, 1) ;
/ / Pega o codi go do mensal i st a a ser excl u do
f or ( i = 0; i < COD_MAX; i ++)
{
/ / ESC sai
i f ( ( codMensal [ i ] = kbd_get c( SONUMERO) ) == ESC)
r et ur n - 1;

i f ( i < 3)
{
i f ( codMensal [ i ] == BACKSPACE)
i f ( ( i >= 1) && ( i <=2) )
{
l cd_er ase( l ef t , 1) ;
i - = 2;
cont i nue;
}

whi l e ( ! ( codMensal [ i ] >= ' 0' && codMensal [ i ] <= ' 9' ) ) / /
Enquant o no est i ver ent r e 0 e 9. . .
codMensal [ i ] = kbd_get c( SONUMERO) ;

put ch( codMensal [ i ] ) ;
}

el se
whi l e ( codMensal [ i ] ! = ENTER)
{
i f ( codMensal [ i ] == BACKSPACE)
{
l cd_er ase( l ef t , 1) ;
i - = 2;
br eak;
}
123

/ / ESC sai
i f ( codMensal [ i ] == ESC)
r et ur n - 1;

codMensal [ i ] = kbd_get c( SONUMERO) ;
}
}

codMensal [ 3] = ' \ 0' ; / / Col oca o t er mi no de vet or no codMensal
l cd_er ase_al l ( ) ;
put s( " Ant es do consul t a" ) ;
l cd_got oxy( 1, 1) ;
kbd_get c( LETRAENUMERO) ;
of f set = consul t a( codMensal , buf , cl i ent e) ;
l cd_er ase_al l ( ) ;
put s( " Passou pel o consul t a" ) ;
l cd_got oxy( 1, 1) ;
kbd_get c( LETRAENUMERO) ;
l cd_er ase_al l ( ) ;
put s( buf ) ;
l cd_got oxy( 1, 1) ;
kbd_get c( LETRAENUMERO) ;
i f ( of f set < 0)
{
l cd_er ase_al l ( ) ;
put s( " Mensal i st a nao cadast r ado! " ) ;
whi l e( ( c = kbd_get c( LETRAENUMERO) ) ! = ENTER) ;
cont i nue;
}
l cd_er ase_al l ( ) ;
put s( " Passou do of f set " ) ;
l cd_got oxy( 1, 1) ;
kbd_get c( LETRAENUMERO) ;
/ / Vai pr ocur ar a pl aca do mensal i st a no buf f er _mensal :
cod_mensal @nome@cl asse@pl aca1@pl aca2
i = 4;
j = 2;
whi l e ( j - - )
{
/ / Posi ci ona buf apont ando par a a pr i mei r a l et r a da pl aca
whi l e( buf [ i ] ! = ' @' )
i ++;
i ++;
}
l cd_got oxy( 1, 2) ;
l cd_er ase_al l ( ) ;
put s( " Pl aca1: " ) ;
l cd_got oxy( 8, 1) ;
kbd_get c( LETRAENUMERO) ;
/ / Escr eve a pl aca encont r ada, e a pl aca2 caso exi st a
whi l e( buf [ i ] ! = ' \ 0' )
{
put ch( buf [ i ] ) ;
i f ( pl aca2 == FALSE)
i f ( buf [ i +1] == ' @' ) / / Ver i f i ca se cont mpl aca 2
{
i ++;
pl aca2 = TRUE;

l cd_got oxy( 17, 1) ;
put s( " Pl aca2: " ) ;
l cd_got oxy( 24, 1) ;
kbd_get c( LETRAENUMERO) ;
}
i ++;
}
pl aca2 = FALSE;
put s( " \ nExcl ui r ?( s/ n) : " ) ;
l cd_got oxy( 15, 2) ;
nao_conf i r mado = TRUE;
whi l e ( nao_conf i r mado)
{
c = kbd_get c( SOLETRA) ;
swi t ch ( c)
{
124
case ' N' : case ' n' :
nao_conf i r mado = FALSE;
br eak;

case ' S' : case ' s' :
r emove( of f set , cl i ent e) ;
nao_conf i r mado = FALSE;
codi go_i ncor r et o = FALSE;
l cd_er ase_al l ( ) ;
put s( " Mensal i st a excl ui do comsucesso! " ) ;
l cd_got oxy( 1, 1) ;
whi l e( ( c = kbd_get c( LETRAENUMERO) ) ! = ENTER) ;
br eak;

def aul t :
put ch( c) ;
l cd_got oxy( 17, 2) ;
put s( " I NVALI DO! " ) ;
l cd_got oxy( 26, 2) ;
whi l e( ( c = kbd_get c( LETRAENUMERO) ) ! = ENTER) ;
l cd_er ase( l ef t , 11) ;
br eak;
}
}
}
f cl ose( cl i ent e) ;
r et ur n 0;
}


/ / ***********************************************************************************
/ / i nt al t er ar _mensal i st a( )
/ /
/ / ***********************************************************************************
i nt al t er ar _mensal i st a ( )
{
FI LE *cl i ent e;
char codMensal [ COD_MAX] , novo_nome[ NOME_MAX] , nova_cl asse[ 2] = {' \ 0' },
nova_pl aca1[ PLC_MAX] , nova_pl aca2[ PLC_MAX] ;
char i , j = 0, k, c, t am_nome, t am_cl asse, t am_pl aca, nome_ar q[ 8] = " mensal " ,
nome_i ncor r et o;
i nt of f set ;

i f ( f exi st s( nome_ar q) < 0)
r et ur n - 1;

cl i ent e = f open( nome_ar q, FM_RDWR) ;

i f ( cl i ent e == NULL)
{
f cl ose( cl i ent e) ;
r et ur n - 1;
}

l cd_er ase_al l ( ) ;

/ / Zer a a var i avel gl obal " buf "
st r cpy( buf , " \ 0" ) ;

put s( " Cod. Mensal . : " ) ;
l cd_got oxy( 13, 1) ;

/ / Pega o codi go do mensal i st a a ser excl u do
f or ( i = 0; i < COD_MAX; i ++)
{
/ / ESC sai
i f ( ( codMensal [ i ] = kbd_get c( SONUMERO) ) == ESC)
r et ur n - 1;

i f ( i < 3)
{
i f ( codMensal [ i ] == BACKSPACE)
i f ( ( i >= 1) && ( i <=2) )
{
l cd_er ase( l ef t , 1) ;
i - = 2;
125
cont i nue;
}

whi l e ( ! ( codMensal [ i ] >= ' 0' && codMensal [ i ] <= ' 9' ) ) / / Enquant o no
est i ver ent r e 0 e 9. . .
codMensal [ i ] = kbd_get c( SONUMERO) ;

put ch( codMensal [ i ] ) ;
}

el se
whi l e ( codMensal [ i ] ! = ENTER)
{
i f ( codMensal [ i ] == BACKSPACE)
{
l cd_er ase( l ef t , 1) ;
i - = 2;
br eak;
}

/ / ESC sai
i f ( codMensal [ i ] == ESC)
r et ur n - 1;

codMensal [ i ] = kbd_get c( SONUMERO) ;
}
}

codMensal [ 3] = ' \ 0' ; / / Col oca o t er mi no de vet or no codMensal

l cd_er ase_al l ( ) ;

of f set = consul t a( codMensal , buf , cl i ent e) ;
i f ( of f set < 0)
{
l cd_er ase_al l ( ) ;
put s( " Mensal i st a nao cadast r ado! " ) ;
whi l e( ( c = kbd_get c( LETRAENUMERO) ) ! = ENTER) ;
f cl ose( cl i ent e) ;
r et ur n - 1;
}

/ / TROCA NOME
/ / Apont a par a o nome do mensal i st a no buf : cod_mensal @nome@cl asse@pl aca1@pl aca2
i = 4;
k = i ;
l cd_er ase_al l ( ) ;
put s( " Nome: " ) ;
l cd_got oxy( 6, 1) ;

whi l e( buf [ i ] ! = ' @' )
{
put ch( buf [ i ] ) ;
i ++;
}
put ch( ' \ n' ) ;
put s( " Nome: " ) ;
l cd_got oxy( 6, 2) ;
t am_nome = pega_nome( novo_nome, 1) ;
nome_i ncor r et o = TRUE;
whi l e ( nome_i ncor r et o)
{
i f ( t am_nome == 0)
{
/ / Se nenhumnovo_nome di gi t ado, novo_nome r ecebe o nome ant i go( buf ) .
whi l e ( buf [ k] ! = ' @' )
{
novo_nome[ j ] = buf [ k] ;
j ++;
k++;
}
novo_nome[ j ] = ' \ 0' ;
nome_i ncor r et o = FALSE;
}
el se
nome_i ncor r et o = FALSE;
126
}
i ++;
k = i ;
l cd_er ase_al l ( ) ;
put s( " Cl asse( t / d/ n) : " ) ;
l cd_got oxy( 15, 1) ;
whi l e( buf [ i ] ! = ' @' )
{
put ch( buf [ i ] ) ;
i ++;
}
put ch( ' \ n' ) ;
put s( " Cl asse( t / d/ n) : " ) ;
l cd_got oxy( 15, 2) ;
t am_cl asse = pega_cl asse( nova_cl asse, 1) ;
i f ( t am_cl asse == 0)
{
j = 0;
whi l e ( buf [ k] ! = ' @' )
{
nova_cl asse[ j ] = buf [ k] ;
j ++;
k++;
}
/ / nova_cl asse r ecebe f i nal de l i nha
nova_cl asse[ j ] = ' \ 0' ;
}
i ++;
k = i ;
l cd_er ase_al l ( ) ;
put s( " Pl aca1- " ) ;
l cd_got oxy( 8, 1) ;
whi l e( buf [ i ] ! = ' @' )
{
put ch( buf [ i ] ) ;
i ++;
}
put ch( ' \ n' ) ;
put s( " Pl aca1- " ) ;
l cd_got oxy( 8, 2) ;
t am_pl aca = pega_pl aca( nova_pl aca1, 0, 1, 0) ;
i f ( t am_pl aca == 0)
{
/ / j passa a apont ar novament e par a o i n ci o do vet or
j = 0;
whi l e ( buf [ k] ! = ' @' )
{
nova_pl aca1[ j ] = buf [ k] ;
j ++;
k++;
}
/ / nova_pl aca r ecebe f i nal de l i nha
nova_pl aca1[ j ] = ' \ 0' ;
}
/ / TROCA PLACA 2
/ / Apont a par a a pl aca2 do mensal i st a no buf : cod_mensal @nome@cl asse@pl aca1@pl aca2
i ++;
k = i ;
l cd_er ase_al l ( ) ;
put s( " Pl aca2- " ) ;
l cd_got oxy( 8, 1) ;
i f ( buf [ i ] ! = ' \ 0' )
whi l e( buf [ i ] ! = ' \ 0' )
{
put ch( buf [ i ] ) ;
i ++;
}
put ch( ' \ n' ) ;
put s( " Pl aca2- " ) ;
l cd_got oxy( 8, 2) ;
t am_pl aca = pega_pl aca( nova_pl aca2, 1, 1, 0) ;
i f ( t am_pl aca == 0)
{
/ / j passa a apont ar novament e par a o i n ci o do vet or
j = 0;
whi l e ( buf [ k] ! = ' @' )
127
{
nova_pl aca2[ j ] = buf [ k] ;
j ++;
k++;
}
/ / nova_pl aca r ecebe f i nal de l i nha
nova_pl aca2[ j ] = ' \ 0' ;
}
/ / Zer a a var i avel gl obal " buf "
f or ( c = 0; c < 43; c++)
buf [ c] = ' \ 0' ;
/ / Concat ena TUDO
st r cat ( buf , codMensal ) ;
st r cat ( buf , " @" ) ;
st r cat ( buf , novo_nome) ;
st r cat ( buf , " @" ) ;
st r cat ( buf , nova_cl asse) ;
st r cat ( buf , " @" ) ;
st r cat ( buf , nova_pl aca1) ;
st r cat ( buf , " @" ) ;
st r cat ( buf , nova_pl aca2) ;
/ / Test a t odas as concat enacoes
al t er a( buf , of f set , 42, cl i ent e) ;
f cl ose( cl i ent e) ;
r et ur n 0;
}

/ / ***********************************************************************************
/ / voi d l i st ar _mensal i st a( )
/ / 24 ci ma, 25 bai xo
/ / ***********************************************************************************
i nt l i st ar _mensal i st a ( )
{
FI LE *cl i ent e;
char t am, i , cont ;
char nome_ar q[ ] = " mensal " ;
i f ( f exi st s( nome_ar q) < 0)
r et ur n - 1;
cl i ent e = f open( nome_ar q, FM_RDWR) ;
i f ( cl i ent e == NULL)
{
f cl ose( cl i ent e) ;
r et ur n - 1;
}
l cd_er ase_al l ( ) ;
/ / Zer a a var i avel gl obal " buf "
st r cpy( buf , " \ 0" ) ;
t am= ( ( cl i ent e- >pf i l e- >si ze - 1) / ( cl i ent e- >t ag) ) ;
cl i ent e- >of f set = 1;
pr n_pr i nt f ( " ==== LI STAGEM DE MENSALI STA ===\ n\ n\ n" ) ;
cont =0;
whi l e( t am)
{
f r ead( buf , 42, cl i ent e) ;
pr n_pr i nt f ( " Codi go: " ) ;
f or ( i =0; i <42; i ++)
i f ( buf [ i ] ! =' @' ) pr i nt er ( buf [ i ] ) ;
el se
{
++cont ;
swi t ch( cont )
{
case 1:
pr n_pr i nt f ( " Nome: " ) ;
br eak;
case 2:
pr n_pr i nt f ( " \ nTi po: " ) ;
br eak;
case 3:
pr n_pr i nt f ( " Pl aca1: " ) ;
br eak;
case 4:
pr n_pr i nt f ( " Pl aca2: " ) ;
br eak;
}
}
128
pr n_pr i nt f ( " \ n\ n" ) ;
cont =0;
cl i ent e- >of f set ++;
t am- - ;
}
pr n_pr i nt f ( " \ n\ n\ n\ n\ n\ n\ n\ n\ n\ n\ n\ n" ) ;
f cl ose( cl i ent e) ;
f cl ose( cl i ent e) ;
r et ur n 0;
}

/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - I NI CI A DI SPLAY PATI O- - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

voi d i ni ci a_di spl ay_pat i o ( voi d)
{
put s( " Ent r ada: " ) ;

put s( " Pl aca: " ) ;
l cd_got oxy( 14, 2) ;

put s( " Cod. Mar ca: " ) ;
l cd_got oxy( 14, 2) ;
}

/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - TRATAMENTO DA PLACA- - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

voi d cur sor _pl aca_mensal ( voi d)
{
put s( " Pl acas: 1- " ) ;

/ / l cd_got oxy( 1, 2) ;

put s( " 2- " ) ;

l cd_got oxy( 11, 1) ;
}

char pega_pl aca ( char pl aca[ ] , i nt pl aca2, i nt nova_pl aca, i nt pl aca_pat i o)
{
char c, t am_pl aca, er r o[ ] = " I NVALI DO! " ;
i nt i , pl aca_i ncor r et a = TRUE;

whi l e( pl aca_i ncor r et a)
{
kbd_get s( pl aca, PLC_MAX - 1, 0, LETRAENUMERO) ; / / Li mi t a em7 car act er es

t am_pl aca = st r l en( pl aca) ;

/ / Acei t a ENTER na di gi t ao da pl aca
i f ( pl aca2 | | nova_pl aca)
i f ( t am_pl aca == 0)
{
pl aca_i ncor r et a = FALSE;
cont i nue;
}
i f ( t am_pl aca == 6)
i f ( ( pl aca[ 0] >= ' a' && pl aca[ 0] <= ' z' ) | | ( pl aca[ 0] >= ' A' && pl aca[ 0] <=
' Z' ) ) / / Se f or l et r a. . .
i f ( ( pl aca[ 1] >= ' a' && pl aca[ 1] <= ' z' ) | | ( pl aca[ 1] >= ' A' && pl aca[ 1] <=
' Z' ) ) / / Se f or l et r a. . .
f or ( i = 2; i < PLC_MAX - 2; i ++)
{
i f ( pl aca[ i ] >= ' 0' && pl aca[ i ] <= ' 9' ) / / Se no f or l et r a. . .
pl aca_i ncor r et a = FALSE;
el se
{
pl aca_i ncor r et a = TRUE;
br eak;
}
}

i f ( t am_pl aca == 7)
i f ( ( pl aca[ 0] >= ' a' && pl aca[ 0] <= ' z' ) | | ( pl aca[ 0] >= ' A' && pl aca[ 0] <=
' Z' ) ) / / Se f or l et r a. . .
129
i f ( ( pl aca[ 1] >= ' a' && pl aca[ 1] <= ' z' ) | | ( pl aca[ 1] >= ' A' && pl aca[ 1] <=
' Z' ) ) / / Se f or l et r a. . .
i f ( ( pl aca[ 2] >= ' a' && pl aca[ 1] <= ' z' ) | | ( pl aca[ 2] >= ' A' && pl aca[ 1]
<= ' Z' ) ) / / Se f or l et r a. . .
f or ( i = 3; i < PLC_MAX - 1; i ++)
{
i f ( pl aca[ i ] >= ' 0' && pl aca[ i ] <= ' 9' ) / / Se no f or l et r a. . .
pl aca_i ncor r et a = FALSE;
el se
{
pl aca_i ncor r et a = TRUE;
br eak;
}
}

i f ( pl aca_i ncor r et a && ! pl aca2)
{
l cd_er ase( l ef t , t am_pl aca) ;
put s( er r o) ;
i f ( nova_pl aca)
l cd_got oxy( 8 + st r l en( er r o) , 2) ;
i f ( pl aca_pat i o)
l cd_got oxy( 14 + st r l en( er r o) , 2) ;
el se
l cd_got oxy( 20, 1) ;
whi l e( ( c = kbd_get c( LETRAENUMERO) ) ! = ENTER) ; / / Esper a ENTER
l cd_er ase( l ef t , st r l en( er r o) ) ;

}

i f ( pl aca_i ncor r et a && pl aca2)
{
l cd_er ase( l ef t , t am_pl aca) ;
put s( er r o) ;
i f ( nova_pl aca)
l cd_got oxy( 8 + st r l en( er r o) , 2) ;
el se
l cd_got oxy( 20, 2) ;
whi l e( ( c = kbd_get c( LETRAENUMERO) ) ! = ENTER) ; / / Esper a ENTER
l cd_er ase( l ef t , st r l en( er r o) ) ;

}

}
r et ur n t am_pl aca;
}

/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - TRATAMENTO DO CODI GO MARCA- - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

voi d pega_codMar ca ( char cod_mar ca[ ] )
{
i nt i ;

/ / whi l e( codMar ca_i ncor r et a)
/ / {
f or ( i = 0; i < COD_MAX; i ++)
{
cod_mar ca[ i ] = kbd_get c( SONUMERO) ;
i f ( i < 3)
{
i f ( cod_mar ca[ i ] == BACKSPACE)
i f ( ( i >= 1) && ( i <=2) )
{
l cd_er ase( l ef t , 1) ;
i - = 2;
cont i nue;
}
whi l e ( ! ( cod_mar ca[ i ] >= ' 0' && cod_mar ca[ i ] <= ' 9' ) ) / / Enquant o no
est i ver ent r e 0 e 9. . .
cod_mar ca[ i ] = kbd_get c( SONUMERO) ;

put ch( cod_mar ca[ i ] ) ;
}

el se
130
whi l e ( cod_mar ca[ i ] ! = ENTER)
{
i f ( cod_mar ca[ i ] == BACKSPACE)
{
l cd_er ase( l ef t , 1) ;
i - = 2;
br eak;
}
cod_mar ca[ i ] = kbd_get c( SONUMERO) ;
}
}

cod_mar ca[ 3] = ' \ 0' ; / / Col oca o t er mi no de vet or no cod_mar ca
}

/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - I NI CI A DI SPLAY MENSAL- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

voi d i ni ci a_di spl ay_mensal ( voi d)
{
put s( " Cod. Mensal : " ) ;
l cd_got oxy( 12, 1) ;

put s( " Nome: " ) ;
l cd_got oxy( 1, 2) ;

put s( " Cl asse( t / d/ n) : " ) ;
l cd_got oxy( 1, 1) ;
}

/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - TRATAMENTO DO NOME- - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

char pega_nome ( char nome[ ] , i nt novo_nome)
{
char c, t am_nome, er r o[ ] = " Mi ni mo 3 car act er es! " ;
i nt nome_i ncor r et o = TRUE;

whi l e( nome_i ncor r et o)
{
kbd_get s( nome, NOME_MAX - 1, 0, LETRAENUMERO) ;

t am_nome = st r l en( nome) ;

/ / Acei t a ENTER na di gi t ao do nome
i f ( novo_nome)
i f ( t am_nome == 0)
{
nome_i ncor r et o = FALSE;
cont i nue;
}
i f ( t am_nome < 3)
{
l cd_er ase( l ef t , t am_nome) ;
put s( er r o) ;
i f ( novo_nome)
l cd_got oxy( 6 + st r l en( er r o) , 2) ;
el se
l cd_got oxy( 21 + st r l en( er r o) , 1) ;
whi l e( ( c = kbd_get c( LETRAENUMERO) ) ! = ENTER) ;
l cd_er ase( l ef t , st r l en( er r o) ) ;
}
el se
{
nome_i ncor r et o = FALSE;
}
}
r et ur n t am_nome;
}

/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - TRATAMENTO DA CLASSE- - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

char pega_cl asse ( char cl asse[ ] , i nt nova_cl asse)
{
char c, t am_cl asse;
131
i nt cl asse_i ncor r et a = TRUE, nao_conf i r mado;

whi l e ( cl asse_i ncor r et a)
{
nao_conf i r mado = TRUE;
kbd_get s( cl asse, 1, 1, SOLETRA) ;
t am_cl asse = st r l en( cl asse) ;
/ / Acei t a ENTER na di gi t ao da cl asse
i f ( nova_cl asse)
i f ( t am_cl asse == 0)
{
cl asse_i ncor r et a = FALSE;
cont i nue;
}
swi t ch ( *cl asse)
{
case ' T' : case ' t ' :
put s( " 24h? ( s/ n) " ) ;
l cd_got oxy( 27, 2) ;
whi l e( nao_conf i r mado)
{
c = kbd_get c( SOLETRA) ;
swi t ch ( c)
{
case ' N' : case ' n' :
l cd_er ase( l ef t , st r l en( " t 24h? ( s/ n) " ) ) ;
nao_conf i r mado = FALSE;
br eak;

case ' S' : case ' s' :
cl asse_i ncor r et a = FALSE;
nao_conf i r mado = FALSE;
br eak;
}
}
br eak;

case ' D' : case ' d' :
put s( " Di ur no? ( s/ n) " ) ;
l cd_got oxy( 30, 2) ;
whi l e( nao_conf i r mado)
{
c = kbd_get c( SOLETRA) ;
swi t ch ( c)
{
case ' N' : case ' n' :
l cd_er ase( l ef t , st r l en( " d Di ur no?
( s/ n) " ) ) ;
nao_conf i r mado = FALSE;
br eak;

case ' S' : case ' s' :
cl asse_i ncor r et a = FALSE;
nao_conf i r mado = FALSE;
br eak;
}
}
br eak;

case ' N' : case ' n' :
put s( " Not ur no? ( s/ n) " ) ;
l cd_got oxy( 31, 2) ;
whi l e( nao_conf i r mado)
{
c = kbd_get c( SOLETRA) ;
swi t ch ( c)
{
case ' N' : case ' n' :
l cd_er ase( l ef t , st r l en( " n Not ur no?
( s/ n) " ) ) ;
nao_conf i r mado = FALSE;
br eak;

case ' S' : case ' s' :
cl asse_i ncor r et a = FALSE;
nao_conf i r mado = FALSE;
132
br eak;
}
}
br eak;

def aul t :
put s( " I NVALI DO! " ) ;
l cd_got oxy( 26, 2) ;
whi l e( ( c = kbd_get c( LETRAENUMERO) ) ! = ENTER) ;
l cd_er ase( l ef t , 11) ;
br eak;
}
}

r et ur n t am_cl asse;
}

/ / ***********************************************************************************
/ / i nt i mpr i me_ent r ada ( char , char , i nt )
/ /
/ / ***********************************************************************************


i nt i mpr i me_ent r ada ( char ent [ ] , char mar c[ ] , i nt mensal , i nt cod_ent r ada)
{
FI LE *cabecal ho, *r odape;
char t am;
char i , c;
/ / Zer a a var i avel gl obal " buf "
st r cpy( buf , " \ 0" ) ;
i f ( f exi st s( " cabeca" ) < 0)
{
l cd_er ase_al l ( ) ;
put s( " Conf i gur e o Cabecal ho! " ) ;
whi l e( ( i = kbd_get c( LETRAENUMERO) ) ! = ENTER) ;
r et ur n - 1;
}
i f ( f exi st s( " r odape" ) < 0)
{
l cd_er ase_al l ( ) ;
put s( " Conf i gur e o Rodape! " ) ;
whi l e( ( i = kbd_get c( LETRAENUMERO) ) ! = ENTER) ;
r et ur n - 1;
}
/ *I MPRI ME CABEALHO*/
cabecal ho = f open( " cabeca" , FM_RDWR) ;
i f ( cabecal ho == NULL)
{
f cl ose( cabecal ho) ;
r et ur n - 1;
}
/ / ' t am' r ecebe o numer o de r egi st r os exi st ent es no ar qui vo
t am= ( ( cabecal ho- >pf i l e- >si ze - 1) / ( cabecal ho- >t ag) ) ;
cabecal ho- >of f set = 1;
whi l e( t am)
{
f r ead( buf , 40, cabecal ho) ;
pr n_pr i nt f ( buf ) ;
pr n_pr i nt f ( " \ n" ) ;
cabecal ho- >of f set ++;
t am- - ;
}
f cl ose( cabecal ho) ;
i f ( cod_ent r ada ! = - 1)
{
pr n_pr i nt f ( " Ent r ada: " ) ;
spr i nt f ( c, " %d" , cod_ent r ada) ;

l cd_er ase_al l ( ) ;
put ch( c) ;
whi l e( ( c = kbd_get c( LETRAENUMERO) ) ! = ENTER) ;
l cd_er ase_al l ( ) ;

pr i nt er ( c) ;
pr i nt er ( ' \ n' ) ;
}
133
/ *I MPRI ME DADOS DO CLI ENTE*/
i f ( mensal >= 0)
pr n_pr i nt f ( " \ nCLI ENTE MENSALI STA\ n" ) ;
i f ( ( ent [ 2] >= ' 0' ) && ( ent [ 2] <= ' 9' ) )
{
/ / I mpr i me a DATA
f or ( i = 13; i < 15; i ++)
pr i nt er ( ent [ i ] ) ;
pr i nt er ( ' / ' ) ;
f or ( i = 11; i < 13; i ++)
pr i nt er ( ent [ i ] ) ;
pr i nt er ( ' / ' ) ;
f or ( i = 9; i < 11; i ++)
pr i nt er ( ent [ i ] ) ;
pr n_pr i nt f ( " " ) ;
/ / I mpr i me a HORA
f or ( i = 15; i < 17; i ++)
pr i nt er ( ent [ i ] ) ;
pr i nt er ( ' : ' ) ;
f or ( i = 17; i < 19; i ++)
pr i nt er ( ent [ i ] ) ;
pr i nt er ( ' \ n' ) ;
/ / I mpr i me PLACA e MARCA
pr n_pr i nt f ( " Pl aca: " ) ;
f or ( i = 0; i < 6; i ++)
pr i nt er ( ent [ i ] ) ;
pr n_pr i nt f ( " " ) ;
pr n_pr i nt f ( " Mar ca: " ) ;
c = 4;
whi l e ( mar c[ c] ! = ' \ 0' )
{
pr i nt er ( mar c[ c] ) ;
c++;
}
}
el se
{
/ / I mpr i me a DATA
f or ( i = 14; i < 16; i ++)
pr i nt er ( ent [ i ] ) ;
pr i nt er ( ' / ' ) ;
f or ( i = 12; i < 14; i ++)
pr i nt er ( ent [ i ] ) ;
pr i nt er ( ' / ' ) ;
f or ( i = 10; i < 12; i ++)
pr i nt er ( ent [ i ] ) ;
pr n_pr i nt f ( " " ) ;
/ / I mpr i me a HORA
f or ( i = 16; i < 18; i ++)
pr i nt er ( ent [ i ] ) ;
pr i nt er ( ' : ' ) ;
f or ( i = 18; i < 20; i ++)
pr i nt er ( ent [ i ] ) ;
pr i nt er ( ' \ n' ) ;
/ / I mpr i me PLACA e MARCA
pr n_pr i nt f ( " Pl aca: " ) ;
f or ( i = 0; i < 7; i ++)
pr i nt er ( ent [ i ] ) ;
pr n_pr i nt f ( " " ) ;
pr n_pr i nt f ( " Mar ca: " ) ;
c = 4;
whi l e ( mar c[ c] ! = ' \ 0' )
{
pr i nt er ( mar c[ c] ) ;
c++;
}
}
pr n_pr i nt f ( " \ n" ) ;
/ *I MPRI ME RODAP*/
r odape = f open( " r odape" , FM_RDWR) ;
i f ( r odape == NULL)
{
f cl ose( r odape) ;
r et ur n - 1;
}
/ / ' t am' r ecebe o numer o de r egi st r os exi st ent es no ar qui vo
134
t am= ( ( r odape- >pf i l e- >si ze - 1) / ( r odape- >t ag) ) ;
r odape- >of f set = 1;
pr i nt er ( ' \ n' ) ;
whi l e( t am)
{
f r ead( buf , 40, r odape) ;
pr n_pr i nt f ( buf ) ;
pr n_pr i nt f ( " \ n" ) ;
r odape- >of f set ++;
t am- - ;
}
f cl ose( r odape) ;
pr i nt er ( ' \ n' ) ;
pr i nt er ( ' \ n' ) ;
pr i nt er ( ' \ n' ) ;
r et ur n 0;
}

/ / ***********************************************************************************
/ / voi d pega_num( char cod_l en, i nt i ni ci o, i nt f i m, char codi go[ ] )
/ /
/ / ***********************************************************************************
voi d pega_num( char cod_l en, i nt i ni ci o, i nt f i m, char codi go[ ] )
{
char i , l en = cod_l en;
l cd_moven( r i ght , cod_l en) ;
do
{
l cd_er ase( l ef t , l en) ;
kbd_get s( codi go, cod_l en, 0, SONUMERO) ;
l en = st r l en( codi go) ;
i f ( l en ! = cod_l en) cont i nue;
f or ( i = 0; i < l en; i ++)
i f ( codi go[ i ] == ' . ' ) cont i nue;

} whi l e ( ( at oi ( codi go) < i ni ci o) | | ( at oi ( codi go) > f i m) ) ;
}

/ / ***********************************************************************************
/ / i nt pega_val or ( char val _l en, char val or [ ] )
/ /
/ / ***********************************************************************************
voi d pega_val or ( char val _l en, char val or [ ] )
{
char i , l en = val _l en, nao_eh_num;
l cd_moven( r i ght , val _l en) ;
do
{
nao_eh_num= 0;
l cd_er ase( l ef t , l en) ;
kbd_get s( val or , val _l en, 0, SONUMERO) ;
l en = st r l en( val or ) ;
i f ( l en < val _l en ) cont i nue;

f or ( i = 0; i < l en; i ++)
i f ( val or [ i ] == ' . ' ) nao_eh_num++;
} whi l e ( ! ( ( nao_eh_num== 1) && ( val or [ val _l en - 3] == ' . ' ) ) ) ;
}
i nt descobr e_ano ( )
{
FI LE *r el ogi o;
char t emp[ 3] ;
i nt num;
r el ogi o = f open( " r el ogi o" , FM_RDWR) ;
r el ogi o- >of f set = 1;
f r ead ( t emp, 2, r el ogi o) ;
t emp[ 2] = ' \ 0' ;
num= at oi ( t emp) ;
f cl ose( r el ogi o) ;
r et ur n num;
}
135
APNDICE B MANUAL DE USO DAS BIBLIOTECAS USADAS NO
HARDWARE

MANUAL DE USO DAS BIBLIOTECAS DO HARDARE DO SISTEMA DE
ESTACIONAMENTO

TIMER0

Inicializao:
Para usarmos a biblioteca de contagem de tempo usando o Timer0, o primeiro procedimento que
devemos executar incluir o cabealho delay_timer.h e aps isso, inicializarmos o timer 0 com a
funo init_tmr0().
Ex.:
#include "includes\delay_timer.h" //incluso do header
void main()
{
init_tmr0(PRE_SCALE_256); //inicializao do timer0 com prescale de 1:256 no modo 16 bits


void init_tmr0(int value)
A funo init_tmr0 inicializa o timer0 do PIC, onde value recebe valor do prescale para o timer0.
Value Prescale
PRE_SCALE_2 1:2
PRE_SCALE_4 1:4
PRE_SCALE_8 1:8
PRE_SCALE_16 1:16
PRE_SCALE_32 1:32
PRE_SCALE_64 1:64
PRE_SCALE_128 1:128
PRE_SCALE_256 1:256

void delay_tmr0(int value)
Atribui 65536-value para o TMR0, inicializa o timer0 e aguarda o overflow.
Uma frmula aproximada para o clculo do valor necessrio para um determinado tempo de delay T
(em segundos), um prescale P e uma freqncia de oscilao F :

) 16 ( ) ( P T F Value

Exemplo de uso da biblioteca
#include <pic18.h>
#include "includes\delay_timer.h"
void main()
{
TRISD0=0;
136
init_tmr0(NO_SCALE); //inicializao do timer0 com prescale de 1:256
while(1)
{
LATD0=0;
delay_tmr0(6250);
LATD0=1;
delay_tmr0(6250);
/* T=(4*PRE_SCALE)*4*2/Fosc*(value)=0,01s (100 Hz) */
}
}


LCD

Inicializao

LCD usando um port especfico:

#include <pic18.h>
#include <stdio.h>
#define lcd_type 2
#define USE_PORTX_LCD , onde X A, B, C ou D. p.e. USE_PORTA_LCD
#include "includes\lcd.h"
void putch(unsigned char c);
void putch(unsigned char c) {
lcd_putch(c);
}
void main(void)
{
lcd_init();
lcd_erase_all();
lcd_cursor(lcd_cursor_blink);

.

LCD sem usar um port especfico:

#include <pic18.h>
#include <stdio.h>
#define lcd_type 2
#define LCD_EN A2
#define LCD_RS A0
#define LCD_RW A1
#define LCD_D4 A3
#define LCD_D5 A4
#define LCD_D6 A5
#define LCD_D7 B3
#define USE_NO_PORT_LCD
#include "includes\lcd.h"
void putch(unsigned char c);
void putch(unsigned char c) {
lcd_putch(c);
}
137
void main(void)
{
lcd_init();
lcd_erase_all();
lcd_cursor(lcd_cursor_blink);

...

void lcd_init(void):
Inicializa o LCD.

void lcd_cursor(lcd_cursor_type):
Muda o tipo do cursor do LCD. O tipo lcd_cursor_type composto dos seguintes valores:
lcd_cursor_on, lcd_cursor_off, lcd_cursor_blink e lcd_cursor_alternate. Ex.
lcd_cursor(lcd_cursor_on).

void lcd_gotoxy( byte x,byte y):
Posiciona o cursor na coluna x e linha y no LCD.

void lcd_erase(lcd_direction dir,byte n):
Apaga n bytes na direo dir (right ou left so os valores possveis para o tipo lcd_direction).
Ex.: lcd_erase(right,3) Apaga 3 caracteres direita do cursor.

void lcd_erase_all(void):
Apaga todo o contedo do visor.

byte lcd_getc(byte x,byte y):
Obtm um caracter na coluna x, linha y.

void lcd_moven(lcd_direction,char):
Move o cursor n vezes numa direo.

void lcd_putch(unsigned char):
Imprime um caracter no visor do lcd.


TECLADO PS/2
Inicializao
Antes de usarmos a biblioteca de manipulao do teclado PS/2, devemos definir os pinos
KEYB_DATA e KEYB_CLOCK.
#define KEYB_DATA C4
#define KEYB_CLOCK C5

unsigned char kbd_getc():
Retorna um caracter pela entrada do teclado. Sendo vlidos nmeros, letras e teclado de funes.

void kbd_gets(char string[], unsigned char lenght):
Retorna um vetor de char string com tamanho mxino length pelo teclado, exibindo os caracteres no
LCD.

EEPROM I2C

Inicializao:
138
Antes de usarmos a biblioteca de manipulao da EEPROM I2C devemos inicializar o barramento
I2C. Ex:
#include <pic18.h>
#include <stdio.h>
#include <string.h>
#include "includes/i2c_master.h"
#include "includes/24cxx.h"
#define I2C_MEMORY I2C_EEPROM_A0
void main()
{
i2c_init(0x45);

OBS: A freqncia utilizada pela linha SCL dada pela frmula clock_scl=FOSC / (4 *
(SSPADD+1)) , onde SSPADD o valor a ser passado pela funo i2c_init. Deve-se observar o
datasheet dos componentes I2C para no usarmos uma freqncia que esteja acima da mxima
projetada para o dispositivo I2C.

void i2c_eepromWrite(char device,int address, char data):
Escreve data no endereo address no dispositivo device. Device pode ter os seguintes valores:
I2C_EEPROM - A0, A1 e A2 aterrados
I2C_EEPROM_A0 - A0 alto e A1 e A2 aterrados
I2C_EEPROM_A1 -
I2C_EEPROM_A1_A0
I2C_EEPROM_A2
I2C_EEPROM_A0_A2
I2C_EEPROM_A1_A2
I2C_EEPROM_A0_A1_A2


char i2c_eepromReadCurrent(char device):
Retorna um byte lido no endereo currente no dispositivo device.

char i2c_eepromRead(char device,int address):
Retorna um byte lido no dispositivo device no endereo address.

void i2c_eepromCursor(char device,int i2c_address):
Posiona o cursor de endereo do dispositivo device no endereo i2c_address.

void i2c_eepromPageWrite(char device,int address, char *data,unsigned char size_str) :
Escreve um vetor de char iniciando no endereo address, no dispositivo device com tamanho size_str.
Uma pgina pode ter no mximo 16 bytes.
Ex.:
#include <pic18.h>
#include <stdio.h>
#include <string.h>
#include "includes/i2c_master.h"
#include "includes/24cxx.h"
#define I2C_MEMORY I2C_EEPROM_A0
void main()
{
int addr=0x0000;
char str[]="Mauricio Lopes de Oliveira\0";
char str2[20];
i2c_init(0x45);
139
i2c_eepromPageWrite(I2C_MEMORY,addr,str,16);
i2c_eepromPageWrite(I2C_MEMORY,addr+16,(str+16),10);
}

void i2c_eepromSequentialRead(char device,int address,char *data,unsigned char size_str):
Realiza uma leitura sequencial de size_str bytes no dispositivo device, iniciando no endereo address.
Ex.:
#include <pic18.h>
#include <stdio.h>
#include <string.h>
#include "includes/i2c_master.h"
#include "includes/24cxx.h"
#define I2C_MEMORY I2C_EEPROM_A0
void main()
{
int addr=0x0000;
char str[]="Mauricio Lopes de Oliveira\0";
char str2[20];
i2c_init(0x45);
i2c_eepromPageWrite(I2C_MEMORY,addr,str,16);
i2c_eepromPageWrite(I2C_MEMORY,addr+16,(str+16),10);
i2c_eepromSequentialRead(I2C_MEMORY,addr,str2,26);
while(1);
}

RAM
Inicializao:
#define RAM_LE_H B6 // LE do Latch do byte alto do endereo de memria.
#define RAM_LE_L B4 // LE do Latch do byte baixo do endereo de memria.
#define PORT_RAM D //port de dados
#define RAM_OE B2 //OE da RAM
#define RAM_WE B1 //WE da ram
#include "includes/62256.h"

void ram_Init(void):
Incializa a RAM. Este comando deve ser usado antes de qualquer instruo de utilizao da RAM.

void ram_Cursor(unsigned int address):
Coloca addres no barramento de endereo da RAM.

unsigned char ram_ReadByte(unsigned int address):
Retorna um byte lido no endereo address.

void ram_WriteByte(unsigned char value,unsigned int address):
Grava um byte value no endereo address.

void ram_SequentialWrite(char *val,unsigned int initial_address):
Realiza uma escrita sequencial do vetor de char val iniciando em initial_address.
Ex.:
#include <pic18.h>
#include <stdio.h>
#include <string.h>
#define RAM_LE_H B6
#define RAM_LE_L B4
140
#define PORT_RAM D
#define RAM_OE B2
#define RAM_WE B1
#include "includes/62256.h"
void main(void)
{
char str[]="Mauricio Lopes\0";
char str2[14];
ram_Init();
ram_SequentialWrite(str,0x7FF0);
ram_SequentialRead(&str2,0x7FF0,14);
while(1);
}

void ram_SequentialRead(char *val,unsigned int initial_address,unsigned int size):
Realiza uma leitura sequencial colocando no vetor de char val de initial_address at
initial_address+size.
Ex.:
#include <pic18.h>
#include <stdio.h>
#include <string.h>
#define RAM_LE_H B6
#define RAM_LE_L B4
#define PORT_RAM D
#define RAM_OE B2
#define RAM_WE B1
#include "includes/62256.h"
void main(void)
{
char str[]="Mauricio Lopes\0";
char str2[14];
ram_Init();
ram_SequentialWrite(str,0x7FF0);
ram_SequentialRead(&str2,0x7FF0,14);
while(1);
}

PCF8583

Inicializao:
Antes de usarmos a biblioteca de manipulao da EEPROM I2C devemos inicializar o barramento
I2C, observando a velocidade mxima do dispositivo para que haja a comunicao.
Ex:
#include <pic18.h>
#include <stdio.h>
#include <string.h>
#include "includes/i2c_master.h"
#include "includes/24cxx.h"
#define I2C_MEMORY I2C_EEPROM_A0
void main()
{
i2c_init(0x45);

141
OBS: A freqncia utilizada pela linha SCL dada pela frmula clock_scl=FOSC / (4 *
(SSPADD+1)) , onde SSPADD o valor a ser passado pela funo i2c_init. Deve-se estar atento para
as especificaes do dispositivo para no usarmos uma freqncia que esteja acima da mxima
projetada para o dispositivo I2C.

void write8583_rtc(struct Time *t, struct Date *d, BYTE address_reg):
Ajusta a hora e a data ou o alarme atravs das estruturas Time ou Date.
Time e Date possuem as seguintes estruturas:
struct Time
{
BYTE hour;
BYTE minute;
BYTE seconds;
};
struct Date
{
BYTE year;
BYTE month;
BYTE day;
BYTE weekday;
};

A varivel address_reg pode ser: SET_DATE_TIME ou SET_ALARM .
Ex.:
write8583_rtc(&hora,&data,SET_DATE_TIME);
ou
write8583_rtc(&alarm_hora,&alarm_data,SET_ALARM);

void read8583_rtc(struct Time *t, struct Date *d, BYTE address_reg):
L o clock ou o alarme do RTC atravs de Date e Time.
A varivel addres_reg pode ser: GET_DATE_TIME ou GET_ALARM
Ex.:
read8583_rtc(&zeit,&datum,GET_DATE_TIME);
ou
read8583_rtc(&alarmzeit,&alarmdatum,GET_ALARM);

void configure8583_control_reg(BYTE control_reg):
Configura o reg. de controle do RTC.
A varivel control_reg pode ser:
alarm_enable - Here the alarm function is activated
clock_mode32khz - Clock frequency of the PCF8583 32,768 kHz
clock_mode50hz - Clock frequency of the PCF8583 50 Hz

void configure8583_alarm_reg(BYTE alarm_reg):
Configura o registrador de alarme do RTC.


Ex. de uso do RTC:
#include <pic18.h>
#include <stdio.h>
#include <string.h>
#include "includes/i2c_master.h"
#include "includes/pcf8583.h"
void main(void)
142
{
int op;
struct Time t0;
struct Date d0;
i2c_init(0xFA);
init_tmr0(0x08);
t0.hour =15;
t0.minute =0;
t0.seconds =0;
d0.year =0;
d0.month =5;
d0.day =31;
d0.weekday =6;
write8583_rtc(&t0,&d0,SET_DATE_TIME);
op=2;
configure8583_control_reg(clock_mode32khz);
while (1)
{
read8583_rtc(&t0, &d0, GET_DATE_TIME);
if (op!=t0.seconds)
{
printf("Hora %02u:%02u:%02u We:%02u\n", t0.hour, t0.minute, t0.seconds,d0.weekday);
printf("Data: %02u.%02u.%02u", d0.day , d0.month , d0.year);
lcd_gotoxy(1,1);
op=t0.seconds;
}
}
}

IMPRESSORA

Inicializao:
Para fazer uso da impressora devemos antes de incluir o seu respectivo header, atrinuirmos definies
(defines) com os pinos necessrios para o controle da impressora. Caso eles no sejam atribudos o
padro ser o usado no hardware atualmente.
Ex.:
#define BUSY C0
#define STROBE C1
#define HPRINT B7
#define PPRINT D
#include includes/printer.h

void printer(unsigned char c)
Esta funo imprime um caracter pela impressora matricial.

void prn_printf(const char *str)
Esta funo imprime uma string pela impressora.
Ex de uso:

#include <pic18.h>
#include <stdio.h>
#define BUSY C0
#define STROBE C1
143
#define HPRINT B7
#define PPRINT D
#include includes/printer.h
void main()
{
printer('m');
printer('a');
printer('u');
}


144
APNDICE C GLOSSRIO DO SISTEMA DE ESTACIONAMENTO
Classe: Diviso dos clientes com relao ao tipo de automvel. O sistema permite um
mximo de 6 classes.
Cliente: Motorista do automvel. Pode ser Cliente Mensalista ou Cliente Avulso.
o Cliente Avulso: Motorista de automvel no cadastrado no sistema.
o Cliente Mensalista (Mensal.): Motorista cadastrado no sistema que paga uma taxa
mensal pelo acesso ao estacionamento.
Cdigo de Marca (Cod.Marca.): Seqncia de 3 dgitos que identifica um modelo de
automvel no sistema.
Cdigo do Mensalista (Cod.Mensal.): Seqncia de 3 dgitos que identifica um mensalista
no sistema.
Cdigo do Operador (Cod.Op.): Seqncia de 2 dgitos que identifica um operador do
sistema.
Cdigo do Ticket: Nmero inteiro aleatrio gerado pelo sistema, maior ou igual a 1000 e
menor ou igual a 9999, que impresso nos tickets de entrada emitidos pelo terminal. Usado
para identificar um automvel no ptio e dar sada em automveis.
Display: Visor LCD de 2 linhas x 40 colunas que serve de interface visual entre o meio
externo e o sistema.
Estacionamento: Local de abrangncia do terminal. rea devidamente preparada para o uso
do servio em questo.
Gerente: Ator que administra o estacionamento.
Tabela de Preos: Tabela que armazena o custo de permanncia por frao de tempo.
Tempo de Desistncia: Durao mxima de tempo para entrar e sair sem pagar (5 minutos).
Tempo de Tolerncia na Hora: Quanto tempo a mais da hora o cliente poder ultrapassar
sem pagar uma nova hora (5 minutos).
Tempo de Tolerncia nas 24 Horas: Tolerncia em perodos superiores a 24 horas (1 hora).
Terminal: Conjunto constitudo por: 1 teclado, 1 display, e 1 unidade de processamento.
Ticket de Entrada: Documento que contm como informao relevante o horrio de entrada
do automvel e o cdigo do ticket.
145
Caso o cliente perca o documento, a sada ser realizada pela placa do automvel.
Obedece ao seguinte modelo:

Ticket de Recibo: Documento que fornecido ao cliente caso solicite.
Obedece ao seguinte modelo:
CABEALHO1
Cabealho2
Cabealho3
Cabealho4
Cabealho5
RECIBO
ENTRADA SADA PERM
mm/dd/aaaa hh:mm hh:mm
xxxyyyy (placa) marca

Rodap1
Rodap2
Rodap3
146

Ticket de Sada: O documento dever ser impresso na sada mediante pagamento
correspondente impresso no ticket.
Obedece ao seguinte modelo:
CABEALHO1
Cabealho2
Cabealho3
Cabealho4
Cabealho5
RECIBO
ENTRADA SADA PERM
mm/dd/aaaa hh:mm hh:mm

xxxyyyy (placa) marca

Rodap1
Rodap2
Rodap3

147


Operador: Ator que utiliza o terminal. Pode ser um gerente ou qualquer outra pessoa operando o
terminal.
CABEALHO1
Cabealho2
Cabealho3
Cabealho4
Cabealho5

Sada: Cdigo de Entrada
ENTRADA SADA PERM
mm/dd/aaaa hh:mm hh:mm

xxxyyyy (placa) marca

Rodap1
Rodap2
Rodap3

Cabealho2
Cabealho3
Cabealho4
Cabealho5

RECIBO
ENTRADA SADA PERM
mm/dd/aaaa hh:mm hh:mm
xxxyyyy (placa) marca


Rodap1
Rodap2
Rodap3

148
APNDICE D ANLISE DE REQUISITOS DO SISTEMA DE
ESTACIONAMENTO

1 - O operador do terminal libera a entrada de um cliente do estacionamento no ptio
Fluxo normal:
o O display exibe:
Entrada:
Placa: Cod.Marca:
o O operador digita a placa do automvel e pressiona enter;
o O operador digita o cdigo de 3(trs) dgitos associado a marca do automvel;
o Assim que o operador digita o cdigo de 3 dgitos da marca do automvel o
sistema exibe, aps o cdigo digitado, a marca associada;
o O operador verifica que a marca do automvel est correta e pressiona enter;
o O sistema imprime o ticket de entrada;
Observaes:
o Como entrada para o campo placa o sistema aceita uma seqncia de 2 letras
(automveis antigos) e no mximo 3 letras seguida por 4 algarismos;
o Como entrada para o campo Cod.Marca o sistema aceita apenas uma seqncia
de 3 nmeros
o Modelo de relatrio de Ticket de Entrada: ver Glossrio
Excees:
o A placa digitada pelo operador incorreta.
Ao: o campo Placa no display limpo e o sistema fica esperando o
operador digitar uma nova placa.
o O cdigo de marca digitado pelo operador incorreto, i.e., o cdigo digitado
no est cadastrado na tabela de marcas.
Ao: o sistema fica esperando o operador digitar um novo cdigo.

149
o O operador verifica que o cdigo digitado no confere com a marca exibida no
display pelo sistema.
Ao: operador pressiona Backspace. O sistema limpa o campo Marca. O
operador digita um novo cdigo de marca e pressiona enter.
o O operador tenta dar entrada em um automvel que j est no ptio.
Ao: O sistema exibe a mensagem: Automvel j no estacionamento;
O operador pressiona enter; Sistema apaga os campos Placa e Marca
e espera o operador digitar uma nova Placa e Marca.

2 - O operador do terminal libera a sada de um cliente do estacionamento.
Fluxo normal:
o O display exibe:
Sada de automvel
Cdigo:
o O operador digita o cdigo do ticket e pressiona enter;
o O sistema exibe no display:
Entrada: dd/mm/aaaa hh:mm:ss Permanncia: hh:mm
Sada : dd/mm/aaaa hh:mm:ss Valor: R$ xx,xx R$ xx,xx
o O operador verifica o valor a pagar, recebe o pagamento do cliente e pressiona
enter;
o O sistema imprime o ticket de sada.
o O sistema emite o ticket de recibo se o cliente solicitar.
Observaes:
o Como entrada para o campo Codigo o sistema aceita apenas uma seqncia de
exatamente 3 algarismos.
o Modelo de relatrio de Ticket de Sada: ver Glossrio
Excees:
o O operador digita a placa do automvel no campo cdigo.
Ao: O sistema d sada pela placa do automvel
150
o O operador digita o cdigo de mensalista no campo cdigo.
Ao: O sistema d sada pelo cdigo do mensalista

o O cdigo de sada/mensalista ou a placa digitado pelo operador no constam no
sistema ou so invlidos.
Ao: o sistema exibe a mensagem Cdigo Invlido. O operador pressiona
enter. O sistema limpa o campo Cdigo e fica esperando o operador digitar
um novo cdigo.


3 - O operador do terminal realiza abertura de caixa.
Fluxo Normal:
o O display exibe:
Cd. Operador:
o O operador digita o seu cdigo e tecla enter.
o O display exibe:
o Valor: R$ xxx,xx
o O operador confere o valor e pressiona a tecla enter.
Excees:
o O operador cancela a operao pressionando a tecla Esc ou a tecla
Backspace.
Ao: o Sistema cancela a operao e volta a exibir a tela inicial.

4 - O operador do terminal realiza entrada de caixa.
Fluxo Normal:
o O display exibe:
Valor: R$ xx,xx
o O gerente confere o valor e pressiona a tecla enter;
o O sistema emite um ticket de confirmao da operao.
151
Observaes:
o Modelo do ticket:
Cdigo do Oper.:
Valor da Oper....:
Data/Hora.........:
5 - O operador do terminal realiza sada de caixa
Fluxo Normal:
o O display exibe:
Valor: R$ xx,xx
o O gerente confere o valor e pressiona a tecla enter;
o O sistema emite um ticket de confirmao da operao.
Observaes:
o Modelo do ticket:
Cdigo do Oper.;
Valor da Oper....:
Data/Hora.........:

6 - O operador do terminal lista os automveis presentes no ptio
Fluxo normal:
o O sistema imprime a relao dos automveis presentes no ptio.
o Modelo de Tabela de Entrada:
Placa Cd. Marca Data Hora
YYYAAAA YYY DD/MM/AA HH:MM:SS


152
===TABELA DE PRECOS ===
TABELA n Classe n

DESISTENCIA TOLERANCIA TOLERANCIA 24HS
xx min xx min x h

Ate xx hs de permanencia: R$ xx.xx
7 - O operador do terminal lista a tabela de preos
Fluxo Normal:
o O dislay exibe:
Tabela(s) (1-6/T):
Onde T indica todas as tabelas.
o O operador digita o numero da tabela que deseja imprimir e pressiona a
tecla enter
o O sistema imprime a(s) tabela(s) que o operador solicitou.
Observaes:
o O sistema imprime a(s) tabela(s) de preo contendo: o nmero da tabela; a
classe a qual se aplica; todos os intervalos de tempo e os valores
associados e se cada intervalo ou no fracionado.
o Modelo de relatrio de listagem de tabela de preos

=
=
=

T
A
B
E
L
A

o Durante a digitao do campo Tabela(s) (1-6/t) o sistema aceita apenas
seqncias de exatamente 1 nmero de 1 6 e o caractere T.

8 - O operador do terminal troca o nvel de acesso (operador/gerente/root/sistema)
Fluxo Normal:
o O display exibe:
153
Nivel(1-4):
Senha :
o O operador digita o nvel para o qual deseja mudar;
o O sistema verifica se o operador pode mudar para aquele nvel;
o O operador digita a senha para trocar de nvel e pressiona enter;
o O sistema troca o nvel de acesso restringindo/permitindo acesso
funes especficas do sistema.
Observaes:
o O nvel root tem acesso a todas as funes do sistema alm de poder
alterar sua senha.
o O nvel sistema tem os mesmos privilgios de root, mas a senha de
sistema no pode ser alterada.
o Os nveis operador e gerente esto descritos no apndice C

Excees:
o A senha digitada pelo operador para troca de nvel invlida
Ao: O sistema exibe a mensagem Senha Invlida; limpa o campo
senha e espera o operador digitar novamente uma senha.

9 - O operador do terminal imprime a tabela com cdigos das marcas
Fluxo normal:
o O sistema imprime a relao das marcas cadastradas no sistema com seus
respectivos cdigo, classe e descrio.
o Modelo de Tabela de Marcas:
Cod.Marca Classe Descrio
Xx Y Descrio textual que identifica o automvel

10 - O gerente inclui itens na tabela de marcas
154
Fluxo Normal:
o O display exibe:
Cod.Marca: xxx
Marca:
o O gerente digita a marca/modelo do automvel e pressiona enter;
o O display exibe
Classe:
o O gerente digita a classe do automvel e pressiona enter.
Observaes:
o O campo Cod.Marca exibe o cdigo atribudo pelo sistema marca que est
sendo cadastrada.
o Durante a digitao do campo marca, o sistema aceita apenas seqncias
alfanumricas de pelo menos 1 caractere.
o Durante a digitao do campo classe, o sistema aceita apenas os algarismos
1,2,3,4,5 e 6;

11- O gerente remove itens na tabela de marcas
Fluxo Normal:
o O display exibe:
Cod.Marca:
o O gerente digita o cdigo e pressiona enter;
o O display exibe:
XXX ABC
Excluir? (S/N)
o Onde XXX representa o cdigo e ABC a marca associada.
o O gerente confirma teclando S.
Observaes:
o Durante a digitao do campo cdigo, o sistema aceita apenas seqncias de
exatamente 3 dgitos.
155
o Durante a confirmao da pergunta Excluir? (S/N) o sistema aceita apenas os
caracteres S ou N como entrada.

12 - O gerente edita itens na tabela de marcas
Fluxo Normal:
o O display exibe:
Cod.Marca:
o O gerente digita o cdigo e pressiona enter;
o O display exibe:
Marca: ABC
Nova Marca:
onde ABC representa a marca associada.
o O gerente digita a nova marca e pressiona enter;
o O display exibe:
Classe: X
Nova Classe:
o O gerente digita a nova classe e pressiona enter.
Observaes:
o Durante a digitao do campo cdigo, o sistema aceita apenas seqncias de
exatamente 3 dgitos.
o Durante a digitao do campo marca, o sistema aceita apenas seqncias
alfanumricas de pelo menos 1 caractere.
o Durante a digitao do campo classe, o sistema aceita apenas os algarismos
1,2,3,4,5 e 6;


13 - gerente inclui novos clientes mensalistas no sistema
Fluxo Normal:
o O display exibe:
156
Cod.Mensal Nome:
Classe (t/d/n):
o O gerente digita o nome do mensalista e pressiona enter;
o O gerente digita a classe do mensalista;
o O sistema exibe a classe do mensalista associada ao caractere digitado;
o O gerente verifica a classe do mensalista e pressiona enter;
o O display exibe:
Placas: 1-

o O gerente digita a placa do primeiro automvel do cliente e pressiona enter;
o O gerente digita a placa do segundo automvel do cliente e pressiona enter;
Observaes:
o O campo Cod.Mensal exibe o cdigo atribudo pelo sistema ao mensalista que
est sendo cadastrado.
o Durante a digitao do campo nome, o sistema aceita apenas seqncias
alfanumricas de pelo menos 3 caracteres.
o Durante a digitao dos campos placa1 e placa2, o sistema aceita apenas uma
seqncia de no mnimo 2 e no mximo 3 caracteres alfabticos seguida por 4
dgitos.

14 - O gerente remove clientes mensalistas do sistema
Fluxo Normal:
o O display exibe:
Cd. do Mensalista: xxx
o O gerente digita o cdigo do mensalista;
o O display exibe:
Placa1: Placa2:
Excluir? (S/N): x
o O gerente confirma pressionando S e teclando enter.
157
Observaes:
o Durante a digitao do campo cdigo, o sistema aceita apenas seqncias de
exatamente 3 dgitos.
o Durante a confirmao da pergunta Excluir? (S/N) o sistema aceita apenas os
caracteres S e N como entrada.

15 - O gerente edita cadastro de clientes mensalistas
Fluxo Normal:
o O display exibe:
Cod.Mensal.: xxx
o O gerente digita o cdigo do mensalista;
o O display exibe:
Nome: ABC
Nome:
o Onde ABC representa o nome atual do Cliente Mensalista.
o O gerente digita um novo nome para o mensalista e pressiona enter;
o O display exibe:
Classe (t/d/n): t/d/n
Classe (t/d/n):
o O gerente digita a nova classe do mensalista;
o O sistema exibe a classe do mensalista associada ao caractere digitado;
o O gerente verifica a classe do mensalista e pressiona enter;
o O display exibe:
Placa1- xxxyyyy
Placa1-
o Onde xxxyyyy representa a placa1 atual do Cliente Mensalista
o O gerente digita a nova placa do primeiro automvel do cliente e pressiona enter;
o O display exibe:
158
Placa2- xxxyyyy
Placa2-
o Onde xxxyyyy representa a placa2 atual do Cliente Mensalista
o O gerente digita a nova placa do segundo automvel do cliente e pressiona enter;


Observaes:
o Durante a digitao do campo nome, o sistema aceita apenas seqncias alfanumricas
de pelo menos 3 caracteres.
o Durante a digitao do campo classe, o sistema aceita apenas os caracteres T, D, N;
o Durante a digitao dos campos placa1 e placa2, o sistema aceita apenas uma seqncia
de no mnimo 2 e no mximo 3 caracteres alfabticos seguida por 4 dgitos.

16 - O gerente configura a tabela de preos
Fluxo Normal:
o O display exibe:
Digite o numero da tabela a ser
configurada (1-6):
o O gerente digita o numero da tebela e pressiona a tecla enter
o O display exibe:
Tempo de Desistncia (min):
o O gerente digita o tempo de desistncia e pressiona a tecla enter
o O display exibe:
Tolerncia na Hora (min):
o O gerente digita o tempo de tolerncia na hora e pressiona a tecla enter
o O display exibe:
Tolerncia 24h (h):
o O gerente digita o tempo de tolerncia nas 24h e pressiona a tecla enter
159

o O processo abaixo executado at que Y atinja o valor 24.
o O display exibe:
Tabela n X ate Y hs de permanencia
Onde X o fim do intervalo de tempo anterior e comeo do intervalo atual e
Y o fim do intervalo de tempo atual. Se no existe um intervalo de tempo
anterior definido, i.e., o gerente est inserindo o valor para o primeiro
intervalo de tempo, X =0.
o O gerente digita o valor do fim do intervalo de tempo atual e pressiona a tecla
enter.
o O display exibe:
Valor (R$xx.xx):
o O gerente digita o valor do intervalo e pressiona a tecla enter.
Observaes:
o A tabela de preos inclui o tempo de desistncia, o tempo de tolerncia na hora
e o tempo de tolerncia nas 24h.
o A tolerncia nas 24h na soma dos dias no cumulativa.
o Durante a digitao do campo No. de Tabelas o sistema aceita apenas a
digitao de uma seqncia de exatamente 1 algarismo.
o Durante a digitao dos campos Tempo de Desistncia (min), Tolerncia na
Hora (min) e Tolerncia 24h (min) o sistema aceita apenas nmeros que
pertenam ao intervalo [1;60].
o Durante a digitao do campo Y, o sistema permite apenas a digitao de
nmeros que pertenam ao intervalo [1;24].

17 - O gerente configura o cabealho e o rodap dos tickets de entrada, sada e recibo.
Fluxo Normal:
o O display exibe:
Cabealho 1:
o O gerente digita o texto para o cabealho 1 e pressiona enter;
160
o O display exibe:
Cabealho 2:
o O gerente digita o texto para o cabealho 2 e pressiona enter;
o O display exibe:
Cabealho 3:
o O gerente digita o texto para o cabealho 3 e pressiona enter;
o O display exibe:
Cabealho 4:
o O gerente digita o texto para o cabealho 4 e pressiona enter;
o O display exibe:
Cabealho 5:
o O gerente digita o texto para o cabealho 5 e pressiona enter;
o O display exibe:
Rodap 1:
o O gerente digita o texto para o rodap 1 e pressiona enter;
o O display exibe:
Rodap 2:
o O gerente digita o texto para o rodap 2 e pressiona enter;
o O display exibe:
Rodap 3:
o O gerente digita o texto para o rodap 3 e pressiona enter;
Observaes:
o O sistema permite um mximo de 5 linhas de cabealho e 3 linhas de rodap. A fonte
pode ser impressa em tamanho normal (padro da impressora, mximo de 40
caracteres).
o Durante a digitao dos campos Cabealho1-5 e Rodap1-3, o sistema aceita apenas
seqncias alfanumricas de pelo menos 3 caracteres.

161
18 - O gerente configura a data e a hora do Sistema.
Fluxo Normal:
o O display exibe:
Datas: dd/mm/aa
Nova Data: / /
o O gerente digita a nova data e pressiona enter
o O display exibe:
Hora: hh:mm:ss
Nova Hora: : :
o O gerente digita a nova hora e pressiona enter
Observaes:
o Durante a digitao do campo Data o sistema aceita apenas uma seqncia de 6
algarismos onde: o nmero formado pelos dois primeiros algarismos pertena ao
intervalo [0;31], o nmero formado pelo terceiro e quarto algarismo pertena ao
intervalo [0;12] e o nmero formado pelos quatro ltimos algarismos pertena ao
intervalo [00;99].
Excees:
o A data digitada pelo operador invlida. So consideradas datas invlidas:
29/02/aaaa se o nmero formando por aaaa no for mltiplo de 4 ou for mltiplo
de 400; e, 31/mm/aaaa para mm igual a 04, 06, 09 ou 11.
Ao: o Sistema exibe a mensagem Data Invlida, limpa o campo Data e espera
que o operador digite uma nova data.

19 - O gerente inclui operadores no sistema
Fluxo Normal:
o O display exibe:
Codigo:
Nome:
o O gerente digita um nome que identificar o operador e pressiona enter;
162
o O display exibe:
Nvel (1-3)
o O gerente digita o nvel do operador inserido
Observaes:
o Durante a digitao do campo nome, o sistema aceita apenas seqncias
alfanumricas de pelo menos 3 caracteres.
o Durante a digitao do campo Nvel, o sistema aceita apenas os algarismos 1,2 e
3.

20 - O gerente edita o cadastro de operadores do sistema
Fluxo Normal:
o O display exibe:
Cod. Op:
o O gerente digita o cdigo do operador;
o O display exibe:
Nome:
Novo Nome:
o O gerente digita o nome do operador e pressiona enter;
o O display exibe:
Nvel:
Novo Nvel:
o O gerente digita o novo nvel do operador editado
Observaes:
o Durante a digitao do campo cdigo, o sistema aceita apenas seqncias de
exatamente 2 dgitos.
o Durante a digitao do campo nome, o sistema aceita seqncias alfanumricas
de pelo menos 3 caracteres.
o Durante a digitao do campo Nvel, o sistema aceita apenas os algarismos 1,2 e
3.
163

21 - O gerente remove operadores do sistema
Fluxo Normal:
o O display exibe:
Cod. Op:
o O gerente digita o cdigo do operador e pressiona enter;
o O display exibe:
Excluir (S/N)?
o O gerente digita S e pressiona enter;
Observaes:
o Durante a digitao do campo cdigo, o sistema aceita apenas seqncias de
exatamente 2 dgitos.
o Durante a confirmao da pergunta Excluir? (S/N) o sistema aceita apenas os
caracteres s,S,n e N como entrada.

Вам также может понравиться