Você está na página 1de 57

Curso bsico de linguagem C para microcontroladores PIC

________________________________________________________________________________
ndice
Linguagem C...................................................................................................... 3
Programao de Microcontroladores em linguagem C...................................... 3
Princpio de programao
- lgebra Booleana.......................................................................................... 5
- pera!es...................................................................................................... 5
- "epresentao #r$%ica das Portas L&gicas.................................................... 5
'ntroduo ( Linguagem C
- )ari$*eis........................................................................................................ +
- ,ipos de -ados.............................................................................................. +
- .uali%icadores............................................................................................... +
- -eclarao de *ari$*eis................................................................................. /
- peradores matem$ticos
- 0ritm1ticos................................................................................................. /
- "elacionais................................................................................................. /
- peradores L&gicos bit-a-bit...................................................................... 2
- peradores L&gicos relacionais................................................................. 2
- -eclara!es de controle
- -eciso 3 Comando '4............................................................................... 5
- -eciso 3 Comando '4-6L76.................................................................... 5
- -eciso 3 78',C9-C076........................................................................ :;
- Lao 4"...................................................................................................... ::
- Lao 89'L6................................................................................................. ::
- Lao --89'L6.......................................................................................... :<
- Ponteiros........................................................................................................ :<
- Matri=es......................................................................................................... :3
0mbiente Mi>roC........................................................................................... :?
- Criando um no*o pro@eto............................................................................... :5
- Primeiro Pro@eto............................................................................................ :+
- #ra*ando o pro@eto........................................................................................ :2
0cionamento de Bot!es...................................................................................... <?
6studo dos ,imers e 'nterrup!es
- ,imer ;.......................................................................................................... <+
1
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
- ,imer :.......................................................................................................... 3;
- ,imer <.......................................................................................................... 33
4un!es............................................................................................................... 32
-ebug no Mi>roC............................................................................................... 35
-isplaA de Cristal LBuido CLC-D...................................................................... ?<
Con*erso 0E-................................................................................................... ?+
Comunicao 7erial CF70",D........................................................................... ?2
66P"G 'nterna................................................................................................ 53
P8M................................................................................................................... 55
2
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Linguagem C
H uma linguagem de programao de prop&sito geralI estruturadaI imperati*aI procedural de
alto e baiJo n*elI criada em :5/< por Dennis Ritchie no 0,K, Bell LabsI para desen*ol*er o
sistema operacional FG'L CBue %oi originalmente escrito em 0ssemblAD. -esde entoI espalMou-se
por muitos outros sistemas e tornou-se uma das linguagens de programao mais usadas
in%luenciando muitas outras linguagensI especialmente o CNNI Bue %oi desen*ol*ida como uma
eJtenso para C.
4onteO 8'P'P6-'0
Programao de Microcontroladores em linguagem C
0tualmenteI a maioria dos microcontroladores eJistentes nos mercado contam com
compiladores em C para o desen*ol*imento de so%tQareI pois a linguagem C permite a construo
de programas e aplica!es muito mais compleJas do Bue o 0ssemblA.
compilador C tem a capacidade de Rtradu=irS com alto grau de inteligTncia e *elocidade o
c&digo em C para o c&digo de m$BuinaI portanto podemos di=er Bue a linguagem C possui grande
e%iciTncia.
6ssa e%iciTncia da linguagem C %a= com Bue o programador preocupe-se mais com a
programao em si e o compilador assume responsabilidades como locali=ao da mem&riaI
opera!es matem$ticas e l&gicasI *eri%icao de bancos de mem&rias e outros..
3
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Princpio de Programao
lgebra Booleana
Ga matem$tica e na ciTncia da computaoI as $lgebras booleanas so estruturas alg1bricas
Bue Rcaptam a essTnciaS das opera!es l&gicas 6I F e GU CG0-I " e G,DI bem como das
opera!es da teoria de con@untos somaI produto e complemento.
lgebra Booleana deri*a do nome de George BooleI matem$tico inglTs Bue %oi o primeiro a
de%in-las como parte de um sistema de c&digo em meados do s1culo L'L. 4oram aplicadas pela
primeira *e= em eletrVnica por Claude Shannon no s1culo LL.
s operadores de $lgebra booleana so %reBuentemente escritos com 6I F ou GU Cmais
comuns so os eBui*alentes em inglTsI 0G-I " ou G,D. Ga descrio de circuitos podem ser
utili=ados G0G- CG, 0G-DI G" CG, "D e L" C" eJclusi*oD.
pera!es"
# $%& %' (#
( ) * ( ) * ( * ( ) *
; ; + ; ; + ; 1 ; ; 1
; : 1 ; : + : + ; : +
: ; 1 : ; + : ; +
: : 1 : : 1 : : 1
#epresentao ,r-ica das Portas L.gicas"
/
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
CG,.O
0
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Introduo 1 Linguagem C
2ari3eis"
0s *ari$*eis podem conter letras e nWmerosI sempre comeando com letras e no de*em ter nome
de pala*ras reser*adas pelo compilador comoI por eJemploI %orI doI intI etc.
'ipos de &ados O
&ado" #epresenta"
-cMar Caracteres
-int GWmeros inteiros
-%loat e double GWmeros decimais Cponto %lutuanteD
-*oid )alores nulos
4uali-icadores"
4uali-icador *igni-icado
-signed 7inali=ado
-unsigned Go sinali=ado
-sMort 'nteiro menor Bue o padro
-long 'nteiro maior Bue o padro
'ipo 'aman5o 2alores
signed cMar 2 bits -:<2 ( :</
CunsignedD cMar 2 bits ; ( <55
CsignedD sMort CintD 2 bits -:<2 ( :</
unsigned sMort CintD 2 bits ; ( <55
CsignedD int :+ bits -3</+2 ( 3</+/
unsigned int :+ bits ; ( +5535
CsignedD long CintD 3< bits -<:?/?23+?2 ( <:?/?23+?/
unsigned long CintD 3< bits ; ( ?<5?5+/<55
%loat 3< bits CN-D :I:/5?5?35;2<e
-32
( CN-D +I2;5+?//??;/e
32
double 3< bits CN-D :I:/5?5?35;2<e
-32
( CN-D +I2;5+?//??;/e
32
long double 3< bits CN-D :I:/5?5?35;2<e
-32
( CN-D +I2;5+?//??;/e
32
X Pala*ras entre parenteses so opcionais.
6
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
&eclarao de 2ari3eis"
Fm *ari$*el 1 declarada da seguinte %ormaO
YBuali%icadorZ N Ytipo de dadoZ N Ynome da *ari$*elZ N Y*alorZ[
onde o *alor pode ou no ser iniciali=ado.
6JemplosO unsigned int J \ :<3?5[
int conta[
sMort J:[
Para atribuir *alores (s *ari$*eisO
conta \ :;;[ Catribui-se o *alor :;; ( *ari$*el contaD
J: \ :5[ Catribui-se o *alor :5 ( *ari$*el J:D
peradores Matemticos"
$ritm7ticos"
perador &escrio 89emplo
N 7oma dos argumentos a N b
- 7ubtrao dos argumentos a - b
X Multiplicao dos argumentos a X b
E -i*iso dos argumentos a E b
] "esto da di*iso Cs& pode ser utili=ado com *alores
inteirosD
a ] b
NN 7oma : ao argumento aNN
-- 7ubtrai : ao argumento a--
:
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
#elacionais"
7o utili=ados para comparao entre argumentos e retornam uma resposta *erdadeira ou %alsa.
Como em linguagem C no eJiste uma *ari$*el booleana para um resultado *erdadeiro
ou %alsoI todo *alor igual a ; ser$ considerado %also e todo *alor di%erente de ; CBualBuer *alorD ser$
considerado *erdadeiro.
perador &escrio 89emplo
\\ Compara se igual a a \\ 5
^\ Compara se di%erente de a ^\ 5
Z Compara se maior Bue a Z 5
Y Compara se menor Bue a Y 5
Z\ Compara se maior ou igual a a Z\ 5
Y\ Compara se menor ou igual a a Y\ 5
peradores l.gicos bit;a;bit"
perador &escrio
K 6 C0G-D
_ F C"D
` F 6LCLF7') CL"D
a Complemento CG,D
ZZ -eslocamento ( direita
YY -eslocamento ( esBuerda
peradores l.gicos relacionais"
perador &escrio
KK Comparao l&gica 6 C0G-D
__ Comparao l&gica F C"D
^ Comparao l&gica Complemento CG,D
<
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
&eclara!es de controle"
&eciso = Comando I>"
comando '4 1 utili=ado para a*aliar uma determinada condio e determinar se ela 1 *erdadeiraI
caso se@aI eJecuta os bloco contido dentro desta condio. 7ua %orma geral 1O
i% CeJpD comando[

7e o resultado da condio re%erente a eJpresso CeJpD %or *erdadeiroI o comando ser$ eJecutadoI
caso contr$rioI o programa segue sem eJecutar o comando.
i% CeJpD
b
comando:[
comando<[
c
Para o caso acimaI a mesma eJplicao anterior se encaiJaI sendo Bue agoraI se a condio da
eJpresso %or *erdadeiraI sero eJecutados os comando: e comando<.
6JemplosO
i% CcontaZ5;D conta \ ;[
i% CcontaZ5;D
b
conta \ ;[
conta:NN[
c
&eciso = Comando I>;8L*8"
Geste casoI a condio '4 1 utili=ada da mesma %orma acimaI sendo Bue agoraI se a condio da
eJpresso %or %alsa a condio 6L76 ser$ eJecutada. 7ua %orma 1O
i% CeJpD comando:[
else comando<[
Caso a eJpresso se@a *erdadeiraI o comando: ser$ eJecutadoI caso se@a %alsaI o comando< ser$
eJecutado.
6JemploO
i% CcontaZ;D
b
conta \ ;[
conta:NN[
c
?
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
else contaNN[
H poss*el tamb1m encadear di*ersos comando '4I como a %orma abaiJoO
i% CeJp:D comando:[
else i% CeJp<Dcomando<[
else i%CeJp3D comando3[
....
&eciso *@I'CA;C$*8"
.uando eJistem muitos *alores para testar de uma s& *ari$*elI o comando '4 pode %icar meio
con%uso ou sem muita e%iciTnciaI para isso podemos utili=ar o 78',C9-C076. 7egue sua %ormaO
sQitcMC*ari$*elD
b
case *alor:O comando:[
....
brea>[
case *alor<O comando<[
....
brea>[
....
....
de%aultO comandoG[
....
....
c
Geste casoI a *ari$*el ser$ testada e se o *alor dela %or igual a *alor:I o comando: ser$ eJecutadoI
se %or igual ao *alor<I o comando< ser$ eJecutado e assim por dianteI agora se o *alor %or di%erente
de BualBuer caso CcaseDI o comandoG ser$ eJecutado.
6JemploO
sQitcMCcontaD
b
case :; O conta:NN[
brea>[
case :5O conta<NN[
brea>[
case <;O conta:NN[
conta<NN
brea>[
de%aultO conta3NN[
c
Geste casoI se o *alor de conta %or igual a :;I conta: ser$ incrementadoI se o *alor %or igual a :5I o
*alor de conta< ser$ incrementadoI caso o *alor de conta se@a igual a <;I tanto conta: Buanto conta<
1+
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
sero incrementadosI para todos outros *alores di%erentesI o *alor de conta3 ser$ incrementado.

Lao >#"
6ste 1 um dos comandos de lao Cloop ou repetioD dispon*eis na linguagem CI a sua %orma 1O
%orCiniciali=ao[condioCt1rminoD[incrementoD comandoO
ouI

%orCiniciali=ao[condioCt1rminoD[incrementoD
b
comando:[
comando<[
c
ondeO
inicialiBao" essa seo conter$ uma iniciali=ao para a *ari$*el[
condio" respons$*el por contar a condio de %inali=ao do lao[
incremento" aBui pode conter uma ou mais *ari$*eis para incremento da *ari$*el.
6JemploO
int conta[
int a \ ;[

%or Cconta\;[contaY\:;[contaNND a \ a N conta[
Lao @AIL8"
Geste laoI os comandos sero repetidos enBuanto a eJpresso %or *erdadeiraI sua %orma 1O
QMile CeJpD
b
comando[
c
6JemploO
int J[

QMileCJY\:;D JNN[
11
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Lao &;@AIL8"
6ste lao 1 uma *ariao do comando 89'L6I sendo Bue neste caso o comando ser$ eJecutado
antes de testa se a condio 1 *erdadeira. 7ua %orma 1O
do
b
comando[
c
QMileCeJpD[
comando ser$ eJecutado pelo menos uma *e= antes de *eri%icar a condio da eJpresso.
6JemploO
int J[
int A[

do
b
JNN[
c QMileCA^\:D[
Ponteiros"
Podemos di=er Bue um ponteiro 1 uma *ari$*el onde ser$ arma=enado o endereo de outra *ari$*elI
ou se@aI o ponteiro 1 um apontador para uma outra *ari$*el.
0 sintaJe para a declarao de uma *ari$*el ponteiro 1O
,'P XGM6
onde TIPO 1 um tipo de dados *$lido e NOME 1 o nome da *ari$*el. 6JemploO
int Xidade[
12
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
6Jibindo uma string usando um ponteiroO
Fma string 1 uma matri= de caracteres. Podemos usar um ponteiro para eJib-la assimO
unsigned cMar XtJt \ d6Jibindo uma string usando um ponteiro.d[
do
b
Fsart_8riteCXtJtD[ EEen*ia um caracter pela serial
XtJtNN[ EEincrementa o ponteiro
delaA_msC:;;D[
c QMile CXtJt ^\ ef;eD[
c
bs.O )er eJemplo serial3I p$gina ?2.
MatriBes"
Fma matri= 1 uma estrutura de dados Bue pode arma=enar *$rios *alores do mesmo tipo.
0 sintaJe para declarar uma matri= 1O
,'P GM6g.F0G,'-0-6h[
onde ,'P 1 o tipo dos dados Bue sero arma=enados na matri=. ,odos os dados colocados na
matri= de*em ser deste tipo. GM6 1 o nome a ser dado a matri=. 6ste nome identi%icar$ a matri=
no c&digo do programa. 6 .F0G,'-0-6 1 a Buantidade m$Jima de itens a ser arma=enados.
6JemplosO
int nr_de_li*rosg5;h[ EEesta matri= pode arma=enar at1 5; *alores do tipo int.
%loat notag3;h[ EEesta matri= pode arma=enar at1 3; *alores do tipo %loat.
s *alores arma=enados na matri= so cMamados de delementos da matri=d. primeiro elemento da
matri= 1 indeJado como item =ero e o Wltimo 1 indeJado como .F0G,'-0-6 menos :. 0ssimI
para nossa matri= notaI mostrada no eJemplo acimaI o primeiro elemento 1 notag;h e o Wltimo
elemento 1 notag<5h.
)ocT pode iniciali=ar os elementos de uma matri= na sua declarao usando a sintaJeO
int notasg5h \ b+;I/;I35I5;I+2c[
bs.O )er eJemplo na p$gina ?5.

13
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
$mbiente MiCroC
compilador Mi>roC %oi desen*ol*ido pela Mi>roele>troni>a e 1 com ele Bue *amos desen*ol*er
nossos pro@etos. 0baiJo est$ a tela inicial do compilador.
1/
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Criando um no3o proDeto"
mi>roC organi=a as aplica!es dentro de pro@etosI onde nele 1 poss*el ter *$rios arBui*os %onte.
0 compilao do arBui*o %onte somente poder$ ser reali=ada se %i=er parte de um pro@eto.
Para criar um pro@eto basta clicar menu RPro@ectS e em seguida escolMa a opo RGeQ Pro@ectS. 0
seguinte tela ser$ apresentadaO
-6m Project NameI de*e-se in%ormar o nome do pro@eto[
-6m Project PathI de*er$ conter o caminMo da pasta onde o pro@eto ser$ sal*o[
-Description 1 opcional e pode-se relatar algo sobre o pro@eto[
-6m DeviceI de*e-se escolMer o dispositi*o a ser utili=ado no pro@eto[
-6m ClockI in%orma-se a %reBiTncia do cristal Bue ser$ utili=ado na montagem do circuito[
-6m Device FlagsI as in%ormao so em relao ( con%igurao dos %us*eis.
10
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Primeiro ProDeto
&e-inindo o proDeto"
-Pro@ect Game O PiscaLed
-Pro@ect PatM O fMi>roCfPro@:f
--escription O ....
--e*ice O P:+42//0
-Cloc> O ;;?.;;;;;;
--e*ice 4lagsO -e%ault
Circuito"
6strutura b$sica de um programa em C utili=ando o compilador mi>roCO
3oid mainEF
G
HH8ste 7 o bloco principal do programa e 7 o Inico Jue a linguagem C precisa para -uncionarK
L
obs.O ,udo Bue *em precedido de EE 1 cMamado coment$rio e no 1 interpretado pelo compilador.
,amb1m pode-se %a=er coment$rio assimO EX 'sto 1 um coment$rio XE
16
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
C.digo do ProDeto"
*oid mainCD
b
P",- \ ;[
,"'7- \ ;I EECon%igura os pinos da porta - como sada
QMileC:D EEComeo do loop Cin%initoD
b
P",- \ aP",-[ EE,roca situao dos pinos na porta -
delaA_msC:;;;D[ EE,empo de atraso de : segundo
c
c
-epois de escre*ermos o c&digoI de*emos compilar o pro@eto para Bue possamos gra*ar no
microcontrolador. 0 compilao se d$ pressionando-se Rctrl N 45S ou clicando no menu Project e
escolMer a opo Build, con%orme abaiJo.
1:
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
6stando o pro@eto sem errosI as in%orma!es abaiJo de*em ser mostradas na parte de baiJo do
programa.
,ra3ando o ProDeto
Ftili=aremosI para gra*ar o programa no microcontroladorI o programa 'CP"# como segue a
%igura abaiJoO

1<
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
0ntes de gra*armos o programaI precisamos con%igurar o 'CP"# para o correto %uncionamento
com a placa CF7CP'C. Para issoI clica-se em Con%igurao e escolMe-se a opo e9ardQaree ouI
diretamenteI pressiona-se a tecla 43.
0 tela de eCon%igura!es de 9ardQaree aparecer$. 6ntoI escolMe-seI em eProgramadorOe a opo
e,0', 7erial ProgrammereI con%orme acima e de*e-se tamb1m em eComunicaoe Mabilitar a opo
e'*erter MCL"e. Clica-se em ePe e o programa 'CP"# estar$ pronto.
0brindo o programaO
)amosI entoI escolMer o dispositi*o a ser gra*ado na @anela destacada em *ermelMoI con%orme
abaiJoO
1?
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
0gora abriremos o programa re%erente ao nosso pro@eto. Clica-se em e0rBui*oe e escolMe-se a opo
e0brireO
Ga @anela Bue se abre a seguirI de*eremos encontrar o arBui*o do nosso pro@etoI Bue neste caso 1 o
arBui*o MPiscaLedK5e9MK programa 'CP"# ter$ a aparTncia parecida com a %igura abaiJoO
2+
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
'denti%icao dos bot!esO
-Ler ,udoO Fsado para a leitura do conteWdo gra*ado no microcontrolador[
-Programar ,udoO Fsado para gra*armos o programa no microcontrolador[
-Limpar ,udoO Fsado para limparmos o conteWdo gra*ado no microcontrolador[
-)eri%icarO Fsado para %a=er uma comparao do conteWdo gra*ado no microcontrolador com o
programa aberto.
#ra*ando o programaO
Para gra*ar o programa no microcontroladorI pressionaremosI ento o boto eLimpar ,udoeI para
certi%icarmos Bue o microcontrolador estar$ pronto para o nosso programa e logo ap&sI pressiona-se
eProgramar ,udoe.
Ga @anela Bue 1 mostradaI con%irmamos a pergunta clicando em e7ime.
21
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
0p&s a gra*aoI se tudo esti*er corretoI a seguinte mensagem aparecer$O
ProntoI nosso programa @$ est$ no microcontrolador.
ProDetos de -i9ao"
-6ste pro@eto %a= piscar o led conectado ao pino ; da porta -
*oid mainCD
b
,"'7-.4; \ ;[ EECon%igura o pino ; da porta - com sada
QMile C:D
b
P",-.4; \ ;[ EE4a= com Bue o pino ; da Porta - tenMa n*el l&gico ;
delaA_msC5;;D[ EE,empo de atraso de 5;;ms
P",-.4; \ :[ EE4a= com Bue o pino : da porta - tenMa n*el l&gico :
delaA_msC5;;D[ EE,empo de atraso de 5;;ms
c
c
- pro@eto abaiJo tem a mesma %unoI s& Bue utili=a a direti*a jde%ine para identi%icaoI
con%orme abaiJoO
jde%ine -irLed ,"'7-.4; EE'denti%ica a *ari$*el ,"'7-.4; como -irLed
jde%ine Led P",-.4; EE'denti%ica a *ari$*el P",-.4; como Led
*oid mainCD
b
-irLed \ ;[ EECon%igura o pino ; da porta - com sada
QMile C:D
b
Led \ ;[ EE4a= com Bue o pino ; da Porta - tenMa n*el l&gico ;
delaA_msC5;;D[ EE,empo de atraso de 5;;ms
Led \ :[ EE4a= com Bue o pino : da porta - tenMa n*el l&gico :
delaA_msC5;;D[ EE,empo de atraso de 5;;ms
c
c
22
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
obs.O s registradores especiaisI ,"'7-I P",-I P",0I ,"'70I 'G,CGI ,M"; e outros so
tratadosI pelo compiladorI como *ari$*eisI portantoI podemos atribuir *alor e trat$-los eJatamente
como uma *ari$*el BualBuer.
89ercNcio proposto"
-4a=er um programa onde todos os L6-7 sero acesos em seBiTnciaI eJemploO acende L6-:I
atraso de 3;;msI acende L6-<I outro atraso de 3;;ms e assim por diante at1 o L6-2I em seguida
%a=er com Bue todos apaguem tamb1m comeando do L6-: e terminando no L6-2.
23
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
$cionamento de Bot!es
&e-inindo o proDeto"
-Pro@ect Game O Botao
-Pro@ect PatM O fMi>roCfPro@<f
--escription O ....
--e*ice O P:+42//0
-Cloc> O ;;?.;;;;;;
--e*ice 4lagsO -e%ault
Circuito"
2/
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
C.digo do ProDeto"
jde%ine botao P",-.4;
jde%ine led P",-.4:
*oid mainCD
b
,"'7- \ ;J;:[ EECon%igura o pino ; da porta - como entrada e o restante como sada
P",- \ ;J;;[ EEkera toda a porta -
QMileC:D EELoop principal
b
i% Cbotao \\ :D EECompara o *alor do pino ; ao *alor : Cn*el l&gico altoD
led \ :[ EE7endo o *alor igual a :I ento acende o led conectado ao
EEpino : da porta -.
c
c
ProDeto de -i9ao"
jde%ine botao P",-.4;
jde%ine led P",-.4:
*oid mainCD
b
,"'7- \ ;J;:[ EECon%igura o pino ; da porta - como entrada e o restante como sada
P",- \ ;J;;[ EEkera toda a porta -
QMileC:D EELoop principal
b
i% Cbotao \\ :D EECompara o *alor do pino ; ao *alor : Cn*el l&gico altoD
b EE7endo o *alor igual a :I eJecuta os comandos do bloco
led \ :[ EEColoca em : o pino : da porta -I acendendo o L6-
delaA_msC:;;;D[ EE0traso de : segundo
led \ ;[ EEColoca em ; o pino : da porta -I apagando o L6-
c
c
c
20
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
8studo dos 'imers e interrup!es
'IM8# +
,imer ; 1 um contador interno e pode contar estmulos eJternos ou contar internamenteI
utili=ando o oscilador. 6le possui um prescaler de at1 :O<5+ e tem 2 bitsI ou se@aI para um prescaler
de :O:I Ma*er$ um overflo CestouroD a cada <5+ contagens C; ( <55D . Para o controle do ,imer ;I
*amos utili=ar os registros especiais P,'G_"6# e 'G,CGI como segueO
P'I%O#8,
%ome E"BPF 'G,6-# ,C7 ,76 P70 P7< P7: P7;
Bit / + 5 ? 3 < : ;
'C* P 1" 'ncremento a cada transio no pino "0?E,;CP'.
'C* P +" 'ncremento a cada ciclo de m$Buina.
'*8 P 1" 'ncremento na borda de descida.
'*8 P +" 'ncremento na borda de subida.
P*$ P 1" Prescale aplicado ao 8-,.
P*$ P +" Prescale aplicado ao ,M";.
P*2 P*1 P*+ 'M# @&'
; ; ; :O< :O:
; ; : :O? :O<
; : ; :O2 :O?
; : : :O:+ :O2
: ; ; :O3< :O:+
: ; : :O+? :O3<
: : ; :O:<2 :O+?
: : : :O<5+ :O:<2
Para utili=armos a interrupo do ,M";I de*emos setar o registro 'G,CG.,;'6 e tamb1m o
registro 'G,CG.#'6 Cinterrupo geralD. -este modoI toda *e= Bue Mou*er um estouro do ,M";I
o %lag 'G,CG.,;'4 ser$ setadoI de*endo ser limpo Buando do tratamento da interrupo
I%'C%
%ome #'6 P6'6 ,'6 'G,6 "B'6 ,;'4 'G,4 "B'4
Bit / + 5 ? 3 < : ;
26
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Contando um tempo com o 'imer +"
)amos supor Bue Bueremos contar um tempo com o timer ; de :;;us e o prescaler se@a de :O:.
Geste casoI s& temos a opo :O: Buando aplicamos o prescaler ao 8-,I ento tanto o timer; como
o 8-, estaro com prescaler de :O:.
.uando %a=emos o prescaler igual a :O:I estamos %a=endo com Bue o ,M"; incremente seu *alor
em : a cada ciclo de m$BuinaI ou se@aI para um cristal de ?M9=I o incremento se dar$ a cada :us.
6nto para um tempo de :;;usI Bueremos Bue o ,M"; se@a incrementado :;; *e=es.
estouro do ,imer; ocorre Buando o ,M"; cMega ( contagem <5+I portantoI no nosso casoI
Ma*er$ um estouro a cada <5+usI mas o Bue Bueremos 1 :;;us.
BastaI ento iniciali=armos o ,M"; com o *alor de <5+ 3 :;; \ 106K
Inserindo no c.digo os 3alores de contagem"
Go Mi>roCI toda *e= Bue ocorre uma interrupoI o programa entra na %uno einterrupte e nela
sero tratadas as interrup!es ocorridas.
*oid interruptCD b
b
,M"; \ :5+[ EE )alor inicial para o ,imer;
'G,CG \ ;J<;[ EE 7eta ,;'6 e limpa ,;'4
c
*oid mainCD b

P,'G_"6# \ ;J2;[ EE 0tribui prescaler de :O: ao to ,M";
,M"; \ :5+[ EE )alor inicial para o ,imer;
'G,CG \ ;J0;[ EE 9abilita a interrupo do ,M";I seta os registros #'6 e ,;'6

QMileC:D bc

c
ProDeto"
4aamos um L6- piscar a cada : segundo utili=ando o ,imer;.
#esoluo"
6ntoO : segundo \ :;;;;;;us ou
: segundo \ :;;;; J :;;us.
2:
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
unsigned int cnt[ EEcontador para acerto do tempo C*er eunsigned inte na p$g. ?D
*oid interruptCD
b
cntNN[ EE 'ncrementa o *alor de cnt a cada interrupo
,M"; \ :5+[ EE )alor inicial para o ,imer;
'G,CG \ ;J<;[ EE 7eta ,;'6 e limpa ,;'4
c
*oid mainCD b

P,'G_"6# \ ;J2;[ EE 0tribui prescaler de :O: ao to ,M";
,M"; \ :5+[ EE )alor inicial para o ,imer;
'G,CG \ ;J0;[ EE 9abilita a interrupo do ,M";I seta os registros #'6 e ,;'6
,"'7-.4; \ ;[ EE 4a= pino ; da porta - como sada
P",-.4; \ ;[ EE Limpa o pino ; da porta -I L6- apagado

cnt \ ;[

QMileC:D b
i% Ccnt Z\ :;;;;D EE 6Jecuta o bloco abaiJo 76 a *ari$*el cnt %or maior ou igual a :;;;;
b
P",-.4; \ aP",-.4;[ EE'n*erte a situao do pino ; da porta -.
cnt \ ;[ EEkera cnt para um no*o ciclo.
c
c
c
$Dustando alguns 3alores"
7eguindo o eJemplo acimaI *amos a@ustar os *alores para um prescaler de :O3<I ento %icaria assimO
)alor 'nicial para o ,M"; \ <5+ 3 :5/ \ 55.
Calculando :5/ J 3< \ 5;<? J <;; \ :;;?2;; us Y\Z :I;;5s
unsigned cnt[
*oid interruptCD b
cntNN[ EE 'ncrementa o *alor de cnt a cada interrupo
,M"; \ 55[ EE )alor 'nicial para o ,M";
'G,CG \ ;J<;[ EE 7eta ,;'6 e limpa ,;'4
cEEa
*oid mainCD b
P,'G_"6# \ ;J2?[ EE 0tribui prescaler de :O3< ao ,M";
,M"; \ 55[ EE )alor 'nicial para o ,M";
'G,CG \ ;J0;[ EE 9abilita a interrupo do ,M"
2<
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
,"'7-.4; \ ;[
P",-.4; \ ;[
cnt \ ;[ EE 'niciali=a cnt
do b
i% Ccnt \\ <;;D b
P",-.4; \ aP",-.4;[ EE 'n*erte os *alores do pino ; da porta -
cnt \ ;[ EE 'niciali=a cnt no*amente
c
c QMileC:D[
c
2?
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
'IM8# 1
,imer : tem suas caractersticas muito parecidas com as do ,imer ;I sendo Bue ele tamb1m pode
operar como contador ou tempori=adorI mas agoraI com :+ bits.
-esta %ormaI podemos concluir Bue um ciclo de contagem do ,imer : se incia em ; e termina em
+5535 CeBui*alente aos :+ bits do contador com prescaler de :O:D.
#egistradores associados"
%ome Bit : Bit 6 Bit 0 Bit / Bit 3 Bit 2 Bit 1 Bit +
I%'C% #'6 P6'6 ,'6 'G,6 "B'6 ,;'4 'G,4 "B'4
PI#1 P7P'4 0-'4 "C'4 "L'4 77P'4 CCP:'4 ,M"<'4 ,M":'4
PI81 P7P'6 0-'6 "C'6 "L'6 77P'6 CCP:'6 ,M"<'6 ,M":'6
'M#1L Contador 2 bits 3 Parte menos signi%icati*a
'M#1A Contador 2 bits 3 Parte mais signi%icati*a
'1C% - - ,:CPP7: ,:CPP7< ,:7C6G E,:7lGC ,M:C7 ,M":G
#egistrador '1C%
,:CPP7; e ,:CPP7:I so utili=ados para selecionar : dos ? %atores de prescaler.
,:CPP7: ,:CPP7; Prescaler
; ; :O:
; : :O<
: ; :O?
: : :O2
,:7C6G
1 ; 9abilita oscilador eJterno. pino "C; e "C: so con%igurados como entrada e no podero
ser utili=ados como 'E.
+ ; -esabilita oscilador eJterno. "C; opera como entrada para sinal eJterno para contagem
C,:CP'DI "C: opera como 'E.
E,:7lGC
1 ; 7incronismo desligado.
+ ; 7incronismo ligado.
3+
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
,M":C7
1 ; Cloc> eJterno *ia "C;E,:CP'.
+ ; Cloc> interno atra*1s dos ciclos de m$Buina.
#egistrador PI#1
Geste registrador so sinali=ados os %lgs das interrup!es e estouro dos ,imer: e ,imer<.
#egistrador PI81
"egistrador onde so Mabilitadas as interrup!es.
Calculando o tempo total de estouro do ,imer :O
Ga placa em BuestoI o microcontrolador est$ trabalMando com um cristal eJterno de ?M9=I ento o
tempo total do timer :I utili=ando o maior prescaler :O2 e cloc> interno pelo ciclo de m$BuinaI ser$O
C+553+ 3 *alor do contadorD J C:EC47CE?DD J prescaler
Go casoI o *alor do contador ser$ ; CBueremos o tempo totalDI entoO
,empo \ C+5+3+ 3 ;D J :us J 2
,empo \ 5<?I<2ms
,empo m$Jimo com prescaler :O:O
,empo \ C+5+3+ 3 ;D J :us J :
,empo \ +5I535ms
ProDeto"
Con%igurar o timer : para %ornecer um tempo de :;;ms e com isso %a=er todos os L6-es da porta -
piscarem a cada :s.
#esoluo"
Como com o prescaler :O:I conseguiremos no m$Jimo +5I535msI ento teremos Bue utili=ar um
prescaler de :O<I ento teremosO
,empo \ C+553+ 3 ,M":D J C:EC47CE?D J prescaler
:;;ms \ C+553+ 3 ,M":D J :us J <
31
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
,M": \ :553+ \ ;J3CB;
C.digo do proDeto"
unsigned sMort cnt[
*oid interruptCD b
cntNN [
P'":.,M":'4 \ ;[ EE Limpa o %lag ,M":'4
,M":9 \ ;J3C[ EE 'niciali=a registro do ,imer :
,M":L \ ;JB;[
c
*oid mainCD b
P",- \ ;J;;[ EE 'niciali=a P",-
,"'7- \ ;[ EE P",- 1 sada
,:CG \ ;J::[ EE 0@uste do ,imer:
P'":.,M":'4 \ ;[ EE Limpa o %lag ,M":'4
,M":9 \ ;J3C[ EE 'niciali=a o registro do ,imer:
,M":L \ ;JB;[
P'6:.,M":'6 \ :[ EE 9abilita a interrupo do ,imer:
cnt \ ;[ EE iniciali=a cnt
'G,CG \ ;JC;[ EE Mabilita #'6I P6'6
do b
i% Ccnt \\ :;D b EE se cnt 1 :; C:; J :;;ms \ :;;;msD
P",- \ aP",-[ EE ,roca posio da porta -
cnt \ ;[ EE =era cnt
c
c QMile C:D[
c
32
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
'imer 2
timer < tamb1m 1 um contador de 2 bitsI sendo relacionado somente ao cloc> internoI a di%erena
deste timer 1 Bue ele no conta de ; ( <55C2 bitsD. .uem imp!e o limite de contagem 1 o *alor do
registrador P"<. 6nto sempre Bue o registrador ,M"< ti*er o mesmo *alor Bue P"<I o timer 1
resetadoI *oltando a =ero. .uando isto ocorreI um outro contador Bue cMamamos de postcaler 1
incrementado e Buando Mou*er o t1rmino do da contagem do postcalerI uma interrupo ser$
gerada.
#egistradores associados"
%ome Bit : Bit 6 Bit 0 Bit / Bit 3 Bit 2 Bit 1 Bit +
I%'C% #'6 P6'6 ,'6 'G,6 "B'6 ,;'4 'G,4 "B'4
PI#1 P7P'4 0-'4 "C'4 "L'4 77P'4 CCP:'4 ,M"<'4 ,M":'4
PI81 P7P'6 0-'6 "C'6 "L'6 77P'6 CCP:'6 ,M"<'6 ,M":'6
'M#2 Contador 2 bits
'2C% - ,F,P73 ,F,P7< ,F,P7: ,F,P7; ,M"<G ,<CPP7: ,<CPP7;
P#2 Limite de contagem para o timer <
#egistrador '2C%" *eleo do postcaler do timer <
'Q'P*3 'Q'P*2 'Q'P*1 'Q'P*+ P'*C$L8#
; ; ; ; :O:
; ; ; : :O<
; ; : ; :O3
; ; : : :O?
; : ; ; :O5
; : ; : :O+
; : : ; :O/
; : : : :O2
: ; ; ; :O5
: ; ; : :O:;
: ; : ; :O::
: ; : : :O:<
: : ; ; :O:3
: : ; : :O:?
: : : ; :O:5
: : : : :O:+
33
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
,M"<G
1 ; ,imer < desati*ado.
+ ; ,imer < ati*ado.
7eleo do prescaler!
'2CRP*1 '2CRP*+ P#8*C$L8#
; ; :O:
; : :O?
: ; :O:+
: : :O:+
"#s$! %s duas &ltimas op'(es s)o realmente iguais$
Calculando o tempo total de estouro do ,imer <O
,empo \ prescaler J postcaler J P"< J C:EC47CE?DD
,empo \ :+ J :+ J <55 J :us
,empo \ +5I<2ms
ProDeto 1"
Con%igurar o timer para piscar os leds da porta - a cada : segundo.
#esoluo"
Geste casoI podemos utili=ar os *alores acima sendo Bue teremos um estouro do timer a cada
+5I<2ms. 0ssimI para Bue possamos %a=er uma contagem de : segundoI de*eremos multiplicar o
*alor por :5 Bue resultar$ em 5/5I< msI aproJimadamente ;I5/ s.
C.digo do proDeto"
unsigned sMort cnt[
*oid interruptCD b
i% CP'":.,M"<'4D b
cntNN [ EE incrementa cnt
P'":.,M"<'4 \ ;[ EE limpa %lag ,M"<'4
,M"< \ ;[
c
c
3/
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
*oid mainCD b
cnt \ ;[ EE iniciali=a cnt
P",- \ ;J44[ EE 'niciali=a P",-
,"'7- \ ;[ EE P",- 1 sada
,<CG \ ;J44[ EE 0@ustes do ,imer<
,M"< \ ;[ EE 'niciali=a registro do ,imer<
P"< \ ;J44[ EE 'niciali=a P"< com o *alor <55 Cno 1 necess$rio
EE para este casoI pois ele @$ tem com de%ault esse
EE *alorD.
P'6:.,M"<'6 \ :[ EE Mabilita interrupo
'G,CG \ ;JC;[ EE Mabilita #'6I P6'6
QMile C:D b EE loop in%inito
i% Ccnt \\ :5D b EE se cnt \ :5
P",- \ aP",-[ EE troca posio na P",-
cnt \ ;[ EE =era cnt
c
c
c
ProDeto 2"
Con%igurar o timer< para uma interrupo a cada 5;ms e %a=er piscar os Leds da porta - a cada :
segundo.
#esoluo"
*alor m$Jimo de estouro para o timer< 1 de +5I<2ms utili=ando prescaler e postcaler :O:+I ento
para 5;ms temosO
P"< \ :55I3: Y\Z :55
30
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
C.digo do proDeto"
unsigned sMort cnt[
*oid interruptCD b
i% CP'":.,M"<'4D b
cntNN [ EE incrementa cnt
P'":.,M"<'4 \ ;[ EE limpa %lag ,M"<'4
,M"< \ ;[
P"< \ :55[
c
c
*oid mainCD b
cnt \ ;[ EE iniciali=a cnt
P",- \ ;J44[ EE 'niciali=a P",-
,"'7- \ ;[ EE P",- 1 sada
,<CG \ ;J44[ EE 0@ustes do ,imer<
,M"< \ ;[ EE 'niciali=a registro do ,imer<
P"< \ :55[ EE 'niciali=a P"<.
P'6:.,M"<'6 \ :[ EE Mabilita interrupo
'G,CG \ ;JC;[ EE Mabilita #'6I P6'6
QMile C:D b EE loop in%inito
i% Ccnt \\ <;D b EE se cnt \ :5
P",- \ aP",-[ EE troca posio na P",-
cnt \ ;[ EE =era cnt
c
c
c
importante 1 Bue o *alor do P"< 3 ,M"< se@a de :55I ento podemos %a=erO
C&digoO
unsigned sMort cnt[
*oid interruptCD b
i% CP'":.,M"<'4D b
cntNN [ EE incrementa cnt
P'":.,M"<'4 \ ;[ EE limpa %lag ,M"<'4
,M"< \ 55[
P"< \ <;;[
c
c
36
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
*oid mainCD b
cnt \ ;[ EE iniciali=a cnt
P",- \ ;J44[ EE 'niciali=a P",-
,"'7- \ ;[ EE P",- 1 sada
,<CG \ ;J44[ EE 0@ustes do ,imer<
,M"< \ 55[ EE 'niciali=a registro do ,imer<
P"< \ <;;[ EE 'niciali=a P"<.
P'6:.,M"<'6 \ :[ EE Mabilita interrupo
'G,CG \ ;JC;[ EE Mabilita #'6I P6'6
QMile C:D b EE loop in%inito
i% Ccnt \\ <;D b EE se cnt \ :5
P",- \ aP",-[ EE troca posio na P",-
cnt \ ;[ EE =era cnt
c
c
c
3:
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
>un!es
0 linguagem C nos permite RmontarS blocos de comandos para Bue possamos eJecut$-los
sem a necessidade de repeti-los no bloco principal.
6sses blocos so cMamados 4un!es e so parecidos com as cMamadas de sub-rotinas em
assemblA.
Gos eJemplos anterioresI usamos uma %uno para cMamar e tratarmos as interrup!esI s&
Bue esta %uno 1 cMamada pelo pr&prio compilador diratemente.
Como declarar a %uno
,ipo N Gome da 4uno CparmmetroD
Bloco de 6Jecuo
6JO int.adio Cint aI int bD
"eturn a e b
C5amando a -uno"

'nt adicao Cint aI int bD
b
return a N b[
c
)oid main C D
b
'nt c[
,"'7- \ ;J;;[
P",- \ ;J;;[
c \ adicao C<I 3D [
8Mile C: D b
P",- \ c[
c
c
3<
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
&ebug no MiCro C
Clicando no menu R"unS e escolMendo-se a opo R7tart -ebuggerSI a @anela abaiJo ser$ mostrada
6m R7elect *ariable %rom ListSI seleciona-se Portd e clica-se em R0ddSI
3?
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
"epete-se a operao para as *ari$*eis RaSI RbS e RcS
Para iniciar a simulao C-ebuggerD de*e-se clicar no boto con%orme a %igura abaiJo ou pode-se
iniciar a simulao simplesmente pressionando-se a tecla R45S
/+
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
0 tecla R4/S %a= a simulao passo a passo e R4+S inicia o modo R"unS
-"unEPause -ebugger C4+D
-7top -ebugger CCtrl \ 4:<D
-7tep o*er C42D
-7tep ut CCtrl N 42D
-"un to cursor C4?D
-7tep 'nto C4/D
/1
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
&isplaS de Cristal LNJuido ELC&F
Pinagem do LC&
Pino -escrio
: #nd
< N5)
3 0@uste de contraste
? 7eleo "7O : - dadoI ; - escrita
5 7eleo "E8I : 3 leituraI ; - escrita
+ 6m 3 Mabilita pE dado ou escrita em : ou transio : -Z ;I ; - desabita
/
Barramento de -ados
2
5
:;
::
:<
:3
:?
6ndereos dos caracteres pEum LC- de < linMas e :+ colunas
2; 2: 2< 23 2? 25 2+ 2/ 22 25 20 2B 2C 2- 26 24
C; C: C< C3 C? C5 C+ C/ C2 C5 C0 CB CC C- C6 C4
/2
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Biblioteca LC- no Mi>roC para o modo de ? bits.
LCD_Custon_ConfigO 'niciali=a e con%igura a linguagem do microcontrolador con%orme
especi%icao.
7intaJeO LC-_Custon_Con%igI CcMar\data.portI cMar db3I cMar db<I cMar db<I cMar db:I cMar
d3;I cMarNctel-portI cMar resI cMar rQI cMar emD[
ndeO data port \Z porta ondeos dados db;Idb:I db< e db3sero conectados
Ctel-port \Z porta onde os controles r5I Q e em do LC- sero conectados
6JemploO LC-_Custom_Con%igCKPortdI 3I<I:I;I nPortbI "I 3I ?D[
LCD_Custon_Out! 6scre*e um teJto no LC- na linMa e coluna espec%ica
7intaJeO LC-_Custon_ut CcMar roQI cMar calI cMar teJtD
ndeO roQ \ linMa
Col \ coluna
6JemploO LC-_Custom_ut C:I 3IS9elloSDI

LCD_Custon_Out_CP! 6scre*e um teJto no LC- na posio corrente do cursor
7intaJeO LC-_Custon_ut_CP CcMar teJtD
6JemploO LC-_Custon_ut_CP CR0BuiSDI
LCD_Custon_Chr! 6scre*e um caracter numa linMa e numa coluna espec%ica no LC-
7intaJeO LC-_Custon_CMr CcMar roQI cMar calI cMar cMaracterD
6JemploO LC-_Custon_CMr C<I 3ISrSDI
LCD_Custon_Chr_CP! 6scre*e um caracter na posio corrente do cursor
7intaJeO LC-_Custon_CMr_CP CcMar cMaracterD
6JemploO LC-_Custon_CMr_CP CRcSDI
LCD_ Custon_CMD! 6n*ia um comando pEo LC-
7intaJeO LC-_Custon_CM- CcMar out_cMarDI
ndeO out_cMar \ comando con%orme tabela de comandos dispon*eisO
6JemploO LC-_Custon_CM- CLC--ClearDI
/3
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Comandos &isponN3eis
Comando Prop.sito
LCD_First_Row Mo*e o cursor pE:a.linMa
LCD_Second_Row Mo*e o cursor pE<a.linMa
LCD_Third_Row Mo*e o cursor pE3a.linMa
LCD_Fourth_Row Mo*e o cursor pE?a.linMa
LCD_Clear Limpa o displaA
LCD_Return_Home Mo*e cursor para a primeira coluna da primeira linMa
LCD_Cursor_Off -esliga o cursor
LCD_Underline_On Liga o RFnderline R no cursor
LCD_lin!_Cursor_On Liga o modo piscante do cursor
LCD_Mo"e_Cursor_Left Mo*e o cursor pEa esBuerda sem mo*er o teJto
LCD_lin!_Cursor_Right Mo*e o cursor pEa direita sem mo*er o teJto
LCD_Turn_On Liga o *isor do LC-
LCD_Turn_Off -esliga o *isor do LC- sem perder os dados
LCD_Shift_Left Mo*e o teJto pEa esBuerda
LCD_Shift_Right Mo*e o teJto pEa direita
//
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
ProDeto LC&
6scre*er o teJto RLC- -isplaA ,estS na primeira linMa do displaA de LC-
#esoluo ; C.digo do ProDeto"
cMar XteJt \ dLC- -isplaA ,estd[
*oid mainCD b
unsigned i[
,"'7B \ ;[ EE P",B is output
Lcd_Custom_Con%igCKP",BI/I+I5I?IKP",BI:I<I;D[ EE 'nitiali=e LC- on P",B
Lcd_Custom_CmdCLcd_CF"7"_44D[ EE ,urn o%% cursor
Lcd_Custom_utC:I :I teJtD[ EE Print teJt at LC-
QMileC:D b
Lcd_Custom_CmdCLC-_"6,F"G_9M6D[
Lcd_Custom_CmdCLC-_FG-6"L'G6_GD[
%orCi\;[iY\:5[iNND b
Lcd_Custom_CmdCLC-_M)6_CF"7"_"'#9,D[
-elaA_msC:;;D[
c
%orCi\;[iY\:5[iNND b
Lcd_Custom_CmdCLC-_M)6_CF"7"_L64,D[
-elaA_msC:;;D[
c
Lcd_Custom_CmdCLC-_,F"G_44D[
-elaA_msC5;;D[
Lcd_Custom_CmdCLC-_,F"G_GD[
c

c
/0
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Con3erso $H&
- Biblioteca 0-C no Mi>roC
Go Mi>roC utili=a-se a %uno abaiJo para leitura do con*ersor 0- do P'C
#DC_Read$channel%& 4a= a leitura da con*erso 0- no canal especi%icado
7intaJeO 0-C_"ead Cunsigned sMort cMannelD
nde cMannel \ canal do pro*edor 0- Bue dese@amos ler
6JemploO
'nt ad
ad\ 0-C_"eadA C;DI EElT o canal 0do do P'C e arma=ena o
EE*alor na *aria*el ad.
6sta %uno retorna um *alor sem sinal de :; bitsI ou se@aI de ; ( :;<3.
ProDeto $&C"
4a=er uma leitura do canal do P'Ce mostrar os 2 bits menos sigini%icati*os nos LC-os conectados (
porta -.
#esoluo"
Primeiramente 1 necess$rio con%igurar o registrador 0-CG:. Gele podemos de%inir o modo de
trabalMo dos pinos de 0E-I con%orme a tabela 0-CG: ( seguirO
$&C%1
PC>,
T3 +U
$%: $%6 $%0 $%/ $%3 $%2 $%1 $%+ 2#8>V 2#8>
;
;;;; 0 0 0 0 0 0 0 0 )-- )77
;;;: 0 0 0 0 )"64N 0 0 0 0G3 )77
;;:; - - - 0 0 0 0 0 )-- )77
;;:: 0 0 0 0 )"64N 0 0 0 0G3 )77
;:;; - - - - 0 - 0 0 )-- )77
;:;: - - - - )"64N - 0 0 0G3 )77
;::: - - - - - - - - - -
:;;; 0 0 0 0 )"64N )"64- 0 0 0G3 0G<
:;;: - - 0 0 0 0 0 0 )-- )77
:;:; - - 0 0 )"64N 0 0 0 0G3 )77
:;:: - - 0 0 )"64N )"64- 0 0 0G3 0G<
::;; - - - 0 )"64N )"64- 0 0 0G3 0G<
::;: - - - - )"64N )"64- 0 0 0G3 0G<
:::; - - - 0 - - - 0 )-- )77
:::: - - - 0 )"64N )"64- - 0 0G3 0G<
/6
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
.ueremosI entoI utili=ar a con*erso no canal ; C"0;DI ento atribumos o 0-CG: com o *alor
:::; ou :? ou ainda J6.
C.digo"

unsigned int ad[
*oid mainCD b
0-CG: \ ;J;6[ EE Con%igure analog inputs and )re%
,"'70 \ ;J44[ EE P",0 is input
,"'7- \ ;J;;[ EE Pins "B/I "B+ are outputs
do b
ad \ 0dc_"eadC;D[ EE #et results o% 0- con*ersion
P",- \ ad[ EE 7end loQer 2 bits to P",-
c QMileC:D[
c
ProDeto $&C 2"
Mostrar o *alor da con*erso no LC-
C.digo"
unsigned int ad[
cMar tJtg/h[
*oid mainCD b
0-CG: \ ;J;6[ EE Con%igure analog inputs and )re%
,"'70 \ ;J44[ EE P",0 is input

Lcd_Custom_Con%igCKP",BI/I+I5I?IKP",BI:I<I;D[ EE 'nitiali=e LC- on P",B
Lcd_Custom_CmdCLcd_CF"7"_44D[ EE ,urn o%% cursor
do b
ad \ 0dc_"eadC;D[ EE #et results o% 0- con*ersion
'nt,o7trCadItJtD[

Lcd_Custom_utC:I :I d0- \ dD[

Lcd_Custom_utC:I 5I tJtD[ EE Print teJt at LC-
c QMileC:D[
c
/:
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
Comunicao *erial EQ*$#'F
F70",\ Qni*ersal *AncMronous $sAncMronous #ecei*er 'ransmitter
Biblioteca F70", no M'P"C
Usart_init& 'niciali=a o modo de comunicao serial in%ormando o Band-"ate C,aJa de
ComunicaoD utili=ado para a comunicao
7intaJeO Fsart_init CBaud"ateD
6JemploO Fsart_init C5+;;DI iniciali=a a serial com taJa de 5+;; bps.
Usart_Data_Read'& )eri%ica se eJiste algum bAte no bu%%er de recepo serialI retornando : se
eJistir e ; se no eJistir nenMum bAte.
7intaJeO *ar \ Fsart_-ata_"eadAC DI
onde *ar \ *ari$*el.
6JemploO i% CFsart_-ata_"eadACDD EEse eJistir algum bAte no bu%%erI eJecuta a eJpresso abaiJoO
b
.....eJpresso......
c
Usart_Read& LT o *alor arma=enado no bu%%er de recepo serial.
7intaJeO recepo \ Fsart_readC D[
6JemploO i% CFsart_-ata_"eadACDD EEse eJistir algum bAte no bu%%erI eJecuta a eJpresso abaiJoO
b
recei*e \ Fsart_"eadCD[ EEarma=ena o bAte recebido na *ari$*el
EErecei*e.
c

Usart_(rite& transmite um bAte pela serial.
7intaJeO Fsart_8rite CbAte cMrDI
6JemploO Fsart_8riteCe0eD[ ou Fsart_8rite C+:D[ EE escre*e o caracter R0S na serial.
/<
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
ProDeto *erial"
:-D 6n*iar o caracter R0S pela serial.
#esoluo"
Geste casoI *amos atuar sobre o boto conectado ao pino ; da porta - e a cada atuaoI o caracter
R0S ser$ en*iado para a serial.
Ftili=amosI agoraI uma maneira di%erente de *eri%icar o acionamento de um boto Bue 1 atra*1s da
biblioteca F,'L e o comando BF,,GI con%orme segueO
7intaJeO unsigned sMort ButtonCunsigned sMort XportI unsigned sMort pinI unsigned sMort timeI
unsigned sMort acti*e_stateD[
6JemploO i% CButtonCKP",-I;I:I:DD
b
...comando.....
c
Para o eJemplo acimaI conclui-se Bue se o boto conectado ao pino ; da porta -I por um tempo de
: msI o estado do pino mudar$ para n*el l&gico : e o Bue est$ entre cMa*es ser$ eJecutado.
C.digo"
*oid mainCD b
EE 'nitiali=a o m&dulo F70", C2 bitI baud rate 5+;;I no paritA bit..D
Fsart_'nitC5+;;D[
QMile C:D b
i% CButtonCKP",-I;I:;;I:DD EE7e o boto conectado ao pino ; da Porta -I o comando
EEabaiJo ser$ eJecutado.
Fsart_8riteCe0eD[ EE6n*ia o caracter R0S pela serial.
c
c
bs.O 4aa uma eJperTncia modi%icando para baiJo o tempo de :;;ms.
ProDeto *erial 2"
<-D "eceber um caracter do PC e en*i$-lo no*amente pela serialI al1m de acender o L6-: se o
caracter %or RaSe apagar o led se o caracter %or RbS.
/?
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
C.digo"
unsigned sMort i[
*oid mainCD b
,"'7- \ ;J;;[
P",- \ ;J;;[
EE 'nitiali=a F70", C2 bitI baud rate 5+;;I no paritA bit..D
Fsart_'nitC5+;;D[
do b
i% CFsart_-ata_"eadACDD b EE 7e algum dado %or recebido
i \ Fsart_"eadCD[ EE LT o dado recebido
Fsart_8riteCiD[ EE 6n*ia o dado pela serial no*amente
i% Ci\\eaeD P",-.4; \ :[ EE7e o caracter %or eaeI acende o L6- :
i% Ci\\ebeD P",-.4; \ ;[ EE7e o caracter %or ebeI apaga o L6- :
c
c QMile C:D[
c
ProDeto *erial 3"
3-D 6n*iar a pala*ra RM'C"CG,"L0-"S pela serial.
#esoluo"
Go Mi>roCI no eJiste uma maneira de en*iarmos uma stringI somente podemos en*iar : caracter
por *e=I portanto podemos en*iar assimO
Fsart_8riteCeMeD[
Fsart_8riteCe'eD[
Fsart_8riteCeCeD[
......
u podemos utili=ar uma maneira mais usual Bue 1 a utili=ao de ponteiros Bue ser$ mostrada no
c&digo abaiJoO
Go caso de ponteirosI podemos di=er Bue cada caracter ser$ RcolocadoS numa posio do ponteiroI
ou se@aI o caracter RMS ser$ colocado ou estar$ apontando para a posio ;I o caracter R'S ser$
colocado ou estar$ apontando para aa posio : e assim por diante at1 o %inalI sendo Bue a Wltima
posio ser$ ocupada por um *alor nulo e essa ser$ a %inali=ao do ponteiro.
M ' C " C G , " L 0 - " f;
; : < 3 ? 5 + / 2 5 :; :: :< :3 :? :5 :+
0+
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
C.digo"
unsigned cMar XtJt \ dM'C"CG,"L0-"d[
*oid mainCD
b
EE 'nitiali=a F70", C2 bitI baud rate 5+;;I no paritA bit..D
Fsart_'nitC5+;;D[
do
b
Fsart_8riteCXtJtD[ EEen*ia um caracter pela serial
XtJtNN[ EEincrementa o ponteiro
delaA_msC:;;D[
c QMile CXtJt ^\ ef;eD[ EE)eri%ica a %inali=ao do ponteiro
c
ProDeto *erial /"
?-D "eceber do PC a string RL-:S e acender o L6-: e se a string %or R-L:SI apagar o L6-:.
#esoluo"
Geste caso utili=aremos uma matri= com ? posi!es ou ? endereos Crecg?hD onde sero
arma=enados os *alores recebidos pela serialI lembrando Bue 1 necess$rio sempre iniciali=armos
com ; o posicionamento. Go casoI a *ari$*el i ser$ a respons$*el pelo posicionamento da matri=.
C.digo"
cMar recg?h[
sMort i[
*oid trata_serialCD
b
i% CCrecg;h \\ eLeD KK Crecg:h \\ e-eD KK Crecg<h \\ e:eDD EE 4a= a comparao dos *alores
EE arma=enados na Matri= erece
P",-.4; \ :[
i% CCrecg;h \\ e-eD KK Crecg:h \\ eLeD KK Crecg<h \\ e:eDD
P",-.4; \ ;[
c
*oid mainCD
b
,"'7- \ ;J;;[
P",- \ ;J;;[
01
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
EE 'nitiali=a F70", C2 bitI baud rate 5+;;I no paritA bit..D
Fsart_'nitC5+;;D[
i\;[
QMileC:D b
i% CFsart_-ata_"eadACDD EE7e eJistir um caracter no bu%%er da serial
b
recgih \ Fsart_"eadCD[ EE caracter ser$ lido e colocado na matri= erece
iNN[ EE'ncrementa o *alor da posio da matri=
i% Crecgi-:h \\ ;J;-D b EE)eri%ica se o *alor arma=enado na Matri= 1
EE ;J;- CC&digo MeJa para o 07C'' YenterZD
trata_serialCD[ EE 7endo ;J;-I *ai para a %uno trata_serial
EE%orCi\;[iY\3[iNND EE eLimpae a Matri=
EE recgih \ ef;e[
i\;[ EE "einiciali=a o posicionamento da matri=

c
c

c
c
02
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
88P#% Interna
Biblioteca 66P"G
))PRO*_Read& LT um bAte da mem&ria 66P"G
7intaJeO )ari$*el \ 66P"G_"ead CbAte adressDI
B7O P'C :+42//0 tem <5+ bAtes de mem&ria 66P"G
6JemploO tmp \ 66P"G_"eadC;D[ EELT a posio ; e carrega o *alor na *ari$*el tmp
))PRO*_(rite& 6scre*e um bAte na mem&ria 66P"G
7intaJeO 66P"G_8rite CbAte adressI bAte dadoD
6JemploO 66P"G_8rite C;I :;;D[ EE escre*e o *alor :;; no endereo ; da mem&ria 66P"G.
ProDeto 88P#%"
:-D 6scre*er o *alor +: Cecaracter RaSD no endereo ; da mem&ria 66P"GI ap&s ler o *alor e
escre*er no LC-.
C.digo"
*oid mainCD
b
Lcd_Custom_Con%igCKP",BI/I+I5I?IKP",BI:I<I;D[ EE 'nitiali=a o LC- na P",B
Lcd_Custom_CmdCLcd_CF"7"_44D[ EE -esliga o cursor
66P"M_8riteC;I;J+:D[ EE 6scre*e o c&digo ;J+: Cecaracter eaeD na 66P"M do P'C
Lcd_Custom_utC:I:IdLeitura 66P"MdD[ EE6scre*e na primeira linMa do LC-
QMileC:D b
i% CbuttonCKP",-I;I:;;I:DD EE7e o boto no pino ; da porta - %or acionado
b
Lcd_Custom_CMrC<I :I 66P"M_"eadC;DD[ EE 4a= a leitura no endereo ;
EE da 66P"M do P'C e
EE escre*e o conteWdo na
EE linMa < do LC-
c
c
c
03
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
ProDeto 88P#% 2"
<-D "eceber da serial um caracterI escre*er no endereo :; da mem&ria 66P"GI ler este *alor da
mem&riaI escre*er no LC- e en*ia-lo ( serial.
C.digo"
unsigned sMort i[
*oid mainCD
b
Fsart_'nitC5+;;D[
Lcd_Custom_Con%igCKP",BI/I+I5I?IKP",BI:I<I;D[ EE 'nitiali=a LC- na P",B
Lcd_Custom_CmdCLcd_CF"7"_44D[ EE -esliga o cursor
Lcd_Custom_utC:I:IdLeitura 66P"MdD[ EE6scre*e na primeira linMa do LC-
QMileC:D b
i% CFsart_-ata_"eadACDD EE 7e eJistir um caracter no bu%%er da serial
b
i \ Fsart_"eadCD[ EE 4a= a leitura do bu%%er e arma=ena na *ari$*el i
Fsart_8riteCiD[ EE 6scre*e o conteWdo da *ari$*el i na 7erial
66P"M_8riteC:;IiD[ EE 6scre*e o conteWdo da *ari$*el i na 66P"M
c
i% CbuttonCKP",-I;I:;;I:DD EE7e o boto no pino ; da porta - %or acionado
b
Lcd_Custom_CMrC<I :I 66P"M_"eadC:;DD[ EE6scre*e na segunda linMa
EEdo LC- o *alor arma=enado
EEno endereo :; da 66P"M.
c
c
c
0/
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
P@M ; EPulse @idt5 ModulationF
0 modulao P8M Cmodulao por largura de pulsoD consiste basicamente na aplicao de uma
onda Buadrada de amplitude igual ( )CC e %reBiTncia alta substituindo a tenso contnua. 0 tenso
m1dia *aria em %uno do tempo em Bue a onda %ica em n*el alto C)CCD e do tempo em Bue a
onda %ica em n*el b$sico C;)D.
0 relao entre o tempo em Bue a onda %ica em n*el alto e o perodo total 1 conMecido como -utA
CAcle Bue 1 normalmente eJpresso em percentual. Portanto para um -utA CAcle de 5; ]I metade
do tempo a onda se mant1m em n*el alto e a outra metade do tempo a onda se mant1m em n*el
baiJo. Por eJemploI uma modulao de amplitude 5) e -utA CAcle de 5; ]. ,em o mesmo e%eito
de uma tenso contnua de <I5 ) Bue 1 a tenso m1dia para este caso.
Biblioteca P8M no Mi>roC
P(M_init& 'niciali=a o m&dulo P8M in%ormando a %reBiTncia de operao.
7intaJeO P8M_init CFnsigned long 4reBD

6JemploO P8M_initC5;;;D[ EE iniciali=a o m&dulo P8M com %reBuTncia de 5P9=.
P(M_Change_Dut'& 0ltera o *alor do -utA-CAcle.
7intaJeO P8M_CMange_-utA CFnsigned CMar -utAD
-utA 1 uma *alor do tipo cMarI portanto de ; ( <55I onde <55 representa :;; ] de -utA
CAcle .
6JemploO P8M_CMange_-utA C:5<D[ EEcon%igura o -utA-CAcle pE /5 ].
P(M_Start& 'niciali=a a gerao do P8M.
7intaJeO P8M_7tartC D[
00
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
P(M_Sto+& 'nterrompe a gerao do P8M.
ProDeto P@M"
Controlar o brilMo de um LedI ligado ao CCP: C"C<DI utili=ando P8M e *ariando o -utA-CAcle de
; a :;; ].
C.digo"
*oid mainCD
b
unsigned i[
i \ ;[
PQm_'nitC5;;;D[ EE'ndica ao m&dulo P8M o %uncionamento com %reBuencia de 5P9=
PQm_7tartCD[ EE'niciali=a o Modo P8M
QMileC:Db
PQm_CMange_-utACiD[ EEModi%ica o -utA_cAcle
iNN[
i% CiZ\:;;D i \ ;[
delaA_msC5;D[
c

c
06
Curso bsico de linguagem C para microcontroladores PIC
________________________________________________________________________________
ProDeto P@M 2"
Controlar o brilMo do Led utili=ando P8M e *ariando o -utA-CAcle de acordo com a leitura do 0E-
e mostrar no LC- o *alor do -utA.
C.digo"
unsigned int ad[
cMar tJtg/h[
*oid mainCD
b
0-CG: \ ;J;6[ EE Con%igura as entradas anal&gicas e re%erTncia
,"'70 \ ;J44[ EE 4a= P",0 como entrada
PQm_'nitC:;;;;D[ EE'ndica ao m&dulo P8M o %uncionamento com %reBuencia de :;P9=
PQm_7tartCD[ EE'niciali=a o modo P8M
Lcd_Custom_Con%igCKP",BI/I+I5I?IKP",BI:I<I;D[ EE 'nitiali=a LC- na P",B
Lcd_Custom_CmdCLcd_CF"7"_44D[ EE -esliga o cursor
QMileC:D b
ad \ 0-C_"eadC;D[ EE4a= a leitura da con*erso 0- e arma=ena na *ari$*el eade.
PQm_CMange_-utACadE?D[ EE Modi%ica o -utA_cAcle
ad \ CCad E?D X :;;D E <55[
'nt,o7trCadItJtD[ EE con*erte a *ari$*el inteira eade na *ari$*el teJto tJt
EE Cmatri=D
Lcd_Custom_utC:I :I d-utA \ dD[ EE 6scre*e na linMa : do LC-
Lcd_Custom_utC:I /I tJtD[ EE 6scre*e o *alor de -utA no LC-
c

c
0:

Você também pode gostar