You are on page 1of 64

//DESCARGA GRATUITA // "intaño = 2 , núm e ro 6" /* SEPTIEM BRE 2009 */

de s arrol
lo de una l
ibre ría e n C para aprove ch ar
todo e lpote ncialde e s tos dis pl
ays

una bibl iote ca PALpara PIC18 m ás un puñado


de com pone nte s al canz an para ge ne rar
s e ñal
e s de TVe n bl anco y ne gro

Pre s e ntación de l
a "7m a Com pe te ncia Nacionalde Robótica"
.s taff

núm e ro = 6;año = 2;

Dire cción, Re dacción y Corre cción:


Arie lPal az z e s i
Arge ntina
arie l
pal
az z e s i@ gm ail
.com

Dis e ño y Diagram ación:


Lucas M artín Tre s e r
Arge ntina
l
m tre s e r@ gm ail
.com

Cons e jo Editorial :
M ario Sacco
.indice
Arge ntina
s e rvice .s e rvis ys te m @ gm ail.com

Al e jandro Cas anova


Arge ntina
inf.pic.s uk y@ l
ive .com .ar

Pabl o
Es paña M ódul
o PIC TRAINER 28 0x05
q uick bas ic@ te rra.e s PIC16F628A e n as s e m bl e r (ii) 0x0B
Libre ría de gráficos para GLCD 0x18
Bruno Gavando Te cl
ado m atriciale n PSI 0x23
Francia 7m a Com pe te ncia de Robótica 0x26
bruno.gavand@ ad-val
ore m .fr Brújul a digitalde pre cis ión 0x29
¡Un PIC e n tu TV! 0x2E
De s carga Gratuita.
Es te conte nido s e rige por l
al ice ncia
de Cre ative Com m ons “Lice ncia Cre ative
Com m ons Atribución-No Com e rcial -Sin
O bras De rivadas 3.0”
.e ditorial
Dos m e s e s h an pas ado de s de l a s al ida de lnúm e ro cinco de l a
, y talcom o prom e tim os , tie ne s e n tu pantal la una nue va e dición.
Es ta ve z h e m os s um ado colaboradore s y te m as , com o para q ue cada ve z
m ás le ctore s e ncue ntran al
guna articul o q ue l
e s re s ul
te de util
idad.

Sin dudas , e l"aconte cim ie nto" m ás im portante q ue tuvo l ugar e n los m e s e s


q ue pas aron de s de l a ultim a ve z q ue e s cribí una e ditorialpara l a re vis ta fue
la caída de ls e rvidor q ue al oja a uControly e lforo. Son cos as q ue pas an: e l
h ardw are pue de fal l
ar, ¡y vaya s i l o h ace !. Durante una s e m ana e s tuvim os
fue ra de l ine a. , de El e ctrónica y Se guridad Digital ,
nue s tro w e bm as te r de cabe ce ra, h iz o m al abare s para conve rtir una s e rie de
de s prol ijos arch ivos de re s pal do nue vam e nte e n una página w e b funcional .
Es tar fue ra de l ine a una s e m ana im pl ica s e r dado de baja de l os índice s de
Googl e , e ntre otras cos as . Pas am os de l as 2600 vis itas diarias q ue te níam os
ante s de l cras h , a unas 100 e n l os dos o tre s días pos te riore s a l a
re s tauración de lback up. Sin e m bargo, e n tre s s e m anas vol vim os a te ne r e l
trafico us ual . Quie ro aprove ch ar e s te e s pacio para agrade ce r l a pacie ncia y
fide lidad de nue s tros vis itante s .

Se guim os s um ando proye ctos y curs os . Com o s ie m pre , h ay varie dad de


conte nidos com o para q ue todos e ncue ntre n al go de util idad. Elq ue re cién
com ie nz a a e xpe rim e ntar con l
a el e ctrónica y program ación de m icrocontro-
l
adore s e n le nguaje C s e guram e nte s e s e ntirá m as cóm odos con l os dis plays
GLCD (Graph ic LCD) l ue go de le e r e larticulo q ue l e de dicam os e n e s te
núm e ro. Para q uie ne s gus tan de program ar e n BASIC, h e m os pre parado un
articulo s obre com o ge s tionar te clados m atricial e s de s de e lBASIC de lPIC
Sim ulator IDE.

Se guim os con e le xce l e nte curs o de program ación de PICs e n as s e m bl e r,


e s pe cial
m e nte e nfocado a uno de l os m ode l os m as e xitos os de M icroch ip: e l
16F628A. Si e s tás s iguie ndo la s e rie de artícul os de dicados a l a cons trucción
de le ntre nador para PICs , te gus tará s abe r q ue ya te ne m os l is to e lm ódul o
para PICs de 28 pine s . ¡Es e lcom pl e m e nto ide alpara e lcurs o de as s e m bl
e r!

Por ul tim o, s i aún no conoce s nue s tro foro aprove ch am os para re com e ndarte
q ue pas e s por él . Es ta publ icación s olo re coge algunos de los te m as q ue al l
á
s e tratan, y e lform ato PDF no pe rm ite ni l a colaboración ni e linte rcam bio de
opinione s q ue tie ne l ugar e n e lforo. Se guram e nte podrás apre nde r m uch o
m ás vis itándol o pe riódicam e nte y, s obre todo, ayudarnos a m e jorar l a re vis ta.
¡H as ta e lpróxim o núm e ro!

Foro uControl: h ttp://w w w .ucontrol .com .ar/foros m f/inde x.ph p


Ele ctrónica y Se guridad Digital: h ttp://w w w .m axis im onaz z i.com .ar

//página 0x04
m ódul
o PIC TRAINER 28
Es te e s te rce r m ódul o de nue s tro e ntre nador. Su función e s l a de s e rvir com o
s oporte a l os m icrocontrol adore s PIC de 28 pine s , com o e l16F874A. Aligualq ue
s us h e rm anos , e m ple a un PCB de una s ol a cara, por l
o q ue s u m ontaje de be ría
s e r pos ible aún para aq ue l los e s tudiante s o aficionados q ue e s tán com e nz ando
trans itar e s te apas ionante cam ino.

//por: Arie lPal az z e s i //


arie l
palaz z e s i@ gm ail .com

Siguie ndo con l a s e rie


de pl acas de s tinadas a form ar
parte de nue s tro e ntre nador Elm ódul o cons is te bás i-
m odul ar PIC TRAINER, vam os cam e nte e n un z ócal o e ncar-
a ve r com o cons truir e lm ódu- gado de al ojar alm icrocontrol a-
lo q ue pe rm ite re al iz ar e xpe ri- dor bajo prue ba, un m e canis m o
m e ntos con PICs de 28 pine s . de RESET, un cone ctor q ue
Dado q ue e ldis e ño de lcircui- pe rm ite l a program ación de l
to y l a pl aca de circuito im pre - inte grado s in re tirarl o de l a
s o s e as e m e ja m uch o a l as pl aca, una s e rie de cone ctore s
dos ante riore s (PIC TRAINER IDC e ncargados de com unicar
40 y PIC TRAINER 18), s ol o al m ódul o con l as pl acas de
ve re m os s us puntos m ás re - am pl iación pre vis tas (o con l as
le vante s , pudie ndo e l l e ctor q ue e l l e ctor de s arrol le ), una
cons ul tar l os otros artícul os e tapa de al im e ntación y un par
de l a s e rie para conoce r m ás de LEDs y pul s adore s de s tina-
de talle s inte re s ante s s obre e l dos a prove e r una m ínim a
proye cto. Aligualq ue ante s , capacidad de e ntrada y s al ida
te ne m os q ue re com e ndar onboard.
fue rte m e nte l a cons ul ta de l as La al im e ntación de l m ó-
h ojas de datos de l os ch ips dul o s e h a re s ue l to m e diante
q ue q ue ram os pinch ar e n e s - uno de l os popul are s re gul ado-
ta pl aca, ya q ue a pe s ar de re s de vol taje inte grados de l a
q ue M icroch ip dis tribuye l a s e rie LM 78xx. Se trata de un
función de cada pin cas i s ie m - LM 7805, q ue pue de proporcio-
pre de l a m is m a form a, e s to nar 5V pe rfe ctam e nte e s tabl es
no s e garantiz a e n e l100% de a partir de una fue nte de
los m ode l os . corrie nte continua con una te n-
s ión de e ntre 7.5 y 15V. Una bor-

//página 0x05
//página 0x06
ne ra de dos tornil l
os pe rm ite
al im e ntar a l a pl aca, y un
diodo 1N4007 prote ge al
circuito de una cone xión con
la pol aridad e q uivocada. Tal
com o re com ie nda l a h oja de
datos de l re gul ador de
vol taje , h e m os col ocado l os
dos conde ns adore s de 0.1
uF de rigor. Ade m ás , un
conde ns ador e l e ctrolítico de
470uF/16V fil tra e l poco
rippl e q ue pue da h abe r
e s capado al fil tro de l a
fue nte e xte rna, y un diodo
LED, e n s e rie con un re s is tor
de 220V, s e e ncie nde para
indicarnos q ue e l circuito
e s tá al im e ntado.
Talcom o ocurría con
las pl acas para m icrocontro-
ladore s de 18 o 40 pine s , e n
lugar de util iz ar un cris tal
com o os cil ador de l PIC
h e m os col ocado 3 de e l los ,
tam bie n s e l e ccionabl es me-
diante una s e rie de jum pe rs
(ide ntificados com o JP4, JP5
y JP6). De e s ta m ane ra
podre m os probar nue s tros
program as o m icrocontrol a-
dore s a dife re nte s fre cue n-
cias de trabajo. Los dos
conde ns adore s de 22pF
com pl e tan e s ta parte de l
circuito. En cas o de util iz ar
PICs q ue funcione n a m ás
de 20 M H z , e s pos ibl e q ue
h aya q ue cam biarl os por
conde ns adore s de 15pF o
al go m e nos . Re corde m os pue de cam biarl os a gus to. Si de s e am os s e l e ccionar l
os
q ue s i s e col oca m ás de un En e lcas o util iz ar l
os pul s adore s , de be m os re cor-
jum pe r a l a ve z e lm icrocon- pul s adore s o LEDs e xis - dar q ue e s tos pone n e lpin
trol ador no funcionará. te nte s e n l
a placa, para ingre - corre s pondie nte a 5V cuan-
En cuanto a l os cris - s ar (o re pre s e ntar) datos a do s on pre s ionados . M ie n-
tal e s , h e m os e l e gido (com o (o de ) nue s tro program a, de - tras q ue e s tán e n re pos o, l
as
pue de ve rs e e n e le s q ue m a be re m os m ove r l os jum pe rs e ntradas s e m antie ne n a
el éctrico) val ore s de 4M H z , JP1 y JP2, q ue pe rm ite n s e - GND a través de s e ndos
8M H z y 20M H z , pe ro nada le ccionar s i cone ctam os al re s is tore s de 10K .
im pide util iz ar otros . Ell e ctor PIC e lLED o e lpul s ador. Los cone ctore s s igue n

//página 0x07
e n e le ntre nador.
La única e xce pción, o
de s vío de l o norm al , q ue
pue de s ve r e n e l diagram a
de l os cone ctore s e s e n l os
pine s corre s pondie nte s a
RB6 (CLO CK ) y RB7 (DA-
TA), ya q ue pos e e n un
re s is tor de 220 oh m s e n
s e rie . Cum pl e n con l a fun-
ción de pe rm itir program ar e l
PIC m e diante e l cone ctor
ICSP s in ne ce s idad de
re tirar e lcabl e q ue cone cta
e le ntre nador con e lm odul o
de turno. Por s upue s to, s i l o
de s e as pue de s re e m pl az ar
e s os dos re s is tore s por s e n-
dos pue nte s . Sol o de be rás
q uitar e l cabl e pl ano a l a
h ora de re program ar e lPIC.
Elpin 1, q ue corre s -
ponde al RESET e n l os
m icrocontrol adore s PIC de
28 pine s com patibl e s con
e s te e ntre nador, e s ta unido a
un pul s ador a través de un
re s is tor de 470 oh m s y a + V
m e diante otro de 4.7K y un
diodo 1N4148. Al pre s ionar
e lpul s ador, e lm icrocontrol a-
dor s e re s e te a. Durante e l
funcionam ie nto norm al de l
program a, e lpin e s ta a + V.
El diodo im pide l os probl e-
m as q ue podrían s urgir e ntre
las al im e ntacione s de l m ó-
dul o y de l program ador al
util iz ar e lcone ctor ICSP.

las m is m as norm as q ue e xpl i- s olo s e e m pl


e a uno (+ V) y
cam os e n e lartícul o principal los otros cuatro e s tán s in Si ya h as m ontado
de nue s tra re vis ta núm e ro 4, cone ctar. De l o cinco inte rior, alguno de nue s tros proye c-
as í q ue no de be rías te ne r uno corre s ponde a GND y tos , e s tarás altanto de q ue
probl e m as a l a h ora de los otros 4 a datos . De be rias bas ta con de s cargar e l
de te rm inar la función de ca- te ne r a m ano e lgrafico con arch ivo PDF corre s pondie nte
da pin. Com o re gl a ge ne ral, la función de cada pin a alPCB de s de nue s tra W e b,
re cue rda q ue de l os pine s m ano cuando de cidas h ace r y m e diante l a form a q ue m ás
e xte riore s de cada cone ctor al gún program a para cargar te gus te (pue de s us ar e l

//página 0x08
“m étodo de l a pl anch a”e xpl i- Una ve z m ontado
cado e n l a re vis ta num e ro 1) todo, s in col ocar e lPIC e n
de be s trans fe rir e ldis e ño a su l ugar, al im e nta e lcircuito Ya pode m os com e n-
un troz o de PCB virge n. con una te ns ión de e ntre 7.5 z ar a e xpe rim e ntar con PICs
Lue go, l o s um e rge s e n un y 12V. ElLED “Pow e r”de be - de 28 pine s . H ay m uch o
baño de cl oruro férrico; y por ría e nce nde rs e . Si e s as í, para apre nde r con e l los y, s i
ul tim o, l ue go de una bue na ve rifica con un m ul tím e tro de cide s e ncarar l a cons -
lim pie z a, l e h ace s l os aguje - q ue l a te ns ión e ntre l os pi- trucción de al guno de l os
ros . ne s 8 (GND) y 20 (Vcc) de l m ódul os acce s orios (com o e l
Al a h ora de s ol dar l os z ócal o de l m icrocontrol ador m ódul o de 8 E/S publ icado
com pone nte s te n e n cue nta s e a de 5V. Tam bién pue de s e n e lnúm e ro ante rior de l a
q ue por l o ge ne ral re s ul ta ve rificar q ue e n l os cone cto- re vis ta uControl ), podrás m ul -
m ás s e ncil lo s i prim e ro col o- re s de e xpans ión e s té pre - tiplicar por 100 l as pos ibil
ida-
cas l os q ue s on m ás bajos , s e nte e s a te ns ión. Si todo de s de e s te e ntre nador.
com o l os pue nte s , diodos , e s ta bie n, ya tie ne s l is to tu
z ócal os y re s is tore s ; y de jas e ntre nador. Cas o contrario,
para e lfinall os cone ctore s , re pas a l as s ol daduras y po-
re gul ador de vol taje y con- s ición de l os com pone nte s .
de ns adore s . As e gúrate de
q ue , invol untariam e nte , no
h ace s un pue nte e ntre dos
puntos de lcircuito.
Pre s ta e s pe cial ate n-
ción a l a h ora de s ol dar l os
com pone nte s q ue tie ne n “po-
laridad” , com o l os diodos ,
LEDs y conde ns adore s e l e c-
trol íticos . Tam bién e s im por-
tante q ue col oq ue s e lz ócal o
de s tinado al PIC e n l a
dire cción corre cta, ya q ue de
h ace rl o m alpue de s confun-
dirte cuando ins e rte s e lm i-
crocontrol ador, dañándol o.

//página 0x09
PIC16F628A e n as s e m bl
er
s e gunda parte
En e s ta s e gunda parte de ltutorialde program ación e n l e nguaje as s e m bl
e r nos
introducire m os e n e lm ane jo de ldire ccionam ie nto indire cto y e n e lm undo de l as
inte rrupcione s de lm icrocontrol ador. Expl icare m os q ué s on, para q ué s irve n, de
cuántas dis pone m os y s u im pl e m e ntación e n nue s tros program as . ¡M anos a l a
obra!
//por: Al e jandro Cas anova //
inf.pic.s uk y@ live .com .ar

En l a program ación de dor cargare m os l a tabl a para


los m icrocontrol adore s PIC l a control ar e l dis pl ay de 7 s e g-
m ayoría de l as ins truccione s m e ntos e n l a m e m oria de datos
e m pl e an dire ccionam ie nto di- (GPR) con dire ccionam ie nto in-
re cto, pe ro tam bién e s pos i- dire cto.
bl e q ue ope re n e n un m odo Lue go, alre al iz ar e lcon-
de dire ccionam ie nto indire c- te o l e e re m os e lcódigo corre s -
to. Para e s te m odo s e e m pl e- pondie nte al m ace nado y l o e n-
an dos re gis tros e s pe cial es: viare m os alPO RTB.
m odo de e lFSR y e lINDF (e s te úl tim o Aq uí utiliz am os e l re gis -
dire ccionam ie nto no e s un re gis tro fís ico). tro STATUS nue vam e nte , pe ro
indire cto s e El re gis tro FSR se para controlde l as ope racione s
e m pl e an dos e m pl e a para “s e ñal ar o apuntar” aritm éticas . Se guardará e lcó-
re gis tros a una dire cción de l a m e m oria digo de 7 Se gm e ntos de l0 al9 ,
e s pe cial es:el RAM cuyo conte nido pue de s e r en l os re gis tros 0x30 a 0x39 . Si
FSR y e lINDF le ído o e s crito de form a indire c- nue s tro contador nos dire cciona
ta e m pl e ando cual q uie r ins truc- e lre gis tro ubicado e n 0x3A, q ue
ción q ue us e com o ope rando al s e ria e l “10” , lo re s e te am os y
re gis tro INDF. Es ta form a de dire ccionam os e l“0” , ós e a re gis -
dire ccionam ie nto e s particul ar- tro 0x30. Es to l o h ace m os
m e nte útilcuando s e m ane jan re al iz ando l a re s ta de lre gis tro
tabl as o arre gl os de datos . sel e ccionado y 0x3A, FSR –
Utiliz are m os e l dire ccio- 0x3A, y s i e lre s ul tado e s ce ro,
nam ie nto Indire cto para cre ar l a re s e te am os .
tabl a de controlde lDis pl ay de 7 Elbit Z (Z e ro) de lre gis tro
s e gm e ntos y e n e s te cas o no STATUS, e s te indica s i una
utiliz are m os e lpul s ador, s ol o se ope ración l ógica o aritm ética
h ará e lcontador autom ático de re al iz ada da com o re s ul tado
0 a 9 . Aliniciar e lm icrocontrol a- ce ro. Tam bién te ne m os e lbit C

//página 0x0B
;DIRECTO :
;De finim os re gis tro e n l
a m e m oria de datos .-
M iRe gis tro e q u 0x20 ;Ubicado e n 0x20.-

;Cargam os dato e n e lre gis tro.-


m ovlw 0x8A ;
m ovw fM iRe gis tro ;M iRe gis tro = 0x8a.-
;Le e m os dato de lre gis tro.-
m ovfw M iRe gis tro ;M ove m os e lvalor q ue te nga M iRe gis tro a W .-
m ovw fPO RTB ;Por e je m pl
o, l
o cargam os e n PO RTB.-

;INDIRECTO :
;Cargam os dato e n e lre gis tro.-
m ovl
w 0x20 ;
m ovw fFSR ;Dire ccionam os Re gis tro de datos ubicado e n 0x20.-
m ovl
w 0x8A ;
m ovw fINDF ;Cargam os re gis tro dire ccionado con e lval
or 0x8A.-

;Le e m os dato e n e lre gis tro.-


m ovlw 0x20 ;
m ovw fFSR ; Dire ccionam os Re gis tro de datos ubicado e n 0x20.-
m ovfw INDF ;M ove m os e lvalor q ue te nga e lre gis tro s e l
e ccionado a W .-
m ovw fPO RTB ;Por e je m pl
o, l
o cargam os e n PO RTB.-

(Carry) (0), q ue e n ins truccio-


ne s aritm éticas s e activa
cuando s e pre s e nta un
acarre o de s de e l bit m as
s ignificativo de lre s ultado, e l
bit DC (Digit Carry), q ue e n
ope racione s aritm éticas s e
activa s i ocurre acarre o e ntre
e lbit3 y bit4.

//página 0x0C
;**** Encabe z ado ****
Lis tp=16f628A ;l
is tdire ctive to de fine proce s s or
#incl ude <p16f628A.inc> ;proce s s or s pe cific variabl e de finitions
_ _ CO NFIG _ CP_ O FF & _ W DT_ O FF & _ BO DEN_ O N & _ PW RTE_ O N &
_ INTO SC_ O SC_ NO CLK O UT & _ DATA_ CP_ O FF & _ LVP_ O FF & _ M CLRE_ O N
;**** De finición de variabl
e s ****
Contador equ 0x20 ;Se l e ccionam os pos ición e n l a RAM (GPR) para guardar
Contador1 e q u 0x21 ;Re gis tro util iz ado e n de m ora.-
Contador2 e q u 0x22 ;Re gis tro util iz ado e n de m ora.-

Re s e t
org 0x00 ;Aq uí com ie nz a e lm icro.-
goto Inicio ;Sal to a inicio de m i program a.-
;**** Program a principal****
;**** Configuración de pue rtos ****
org 0x05
Inicio
bs f STATUS,RP0 ;Pas am os de Banco 0 a Banco 1.-
clrf TRISB ;PO RTB com o s al ida.-
bcf STATUS,RP0 ;Pas o de lBanco 1 alBanco 0
cal l Config_ Tabl a ;Cargam os re gis tros con Código de 7 s e gm e ntos .-
m ovfw INDF ;Le e m os código de 7 Se gm e ntos para e lCERO .-
m ovw fPO RTB ;M os tram os e lCERO .-
;**** Bucl e de vis ualiz ación ****
Bucl e
cal l De m ora_ 19 0m s ;De m ora para vis ual iz ar Dis pl
ay
incf FSR,1 ;Incre m e ntam os Punte ro.-
m ovl w 0x3A ;Cons ul tam os s i s e pide código para m os trar "10",
s ubw f FSR,0 ;s i e s as í re s e te am os FSR, apunta a 0x30--> "0".-
btfs s STATUS,Z ;Si Z =1 --> 0x3A - FSR = 0.-
goto M ue s tro_ Dis pl ay ;No, m ue s tro dis pl ay.-
m ovl w 0x30 ;Si re s e te o punte ro.-
m ovw fFSR ;
M ue s tro_ Dis pl ay
m ovfw INDF ;Le o Re gis tro q ue apunta FSR.-
m ovw fPO RTB ;Lo cargo e n PO RTB.-
goto Bucl e ;Continuo conte o.-
;**** De m ora ****
De m ora_ 19 0m s
m ovl w 0xFF ;
m ovw fContador1 ;Iniciam os contador1.-
Re pe ticion1
m ovl w 0xFF ;
m ovw fContador2 ;Iniciam os contador2
Re pe ticion2
de cfs z Contador2,1 ;De cre m e nta Contador2 y s i e s 0 s al e .-
goto Re pe ticion2 ;Si no e s 0 re pe tim os cicl o.-
de cfs z Contador1,1 ;De cre m e nta Contador1.-
goto Re pe ticion1 ;Si no e s ce ro re pe tim os cicl o.-
re turn ;Re gre s a de l a s ubrutina.-

//página 0x0D
;**** Cargam os tabl a e n m e m oria ****
Config_ Tabl a
m ovl w 0x30 ;
m ovw fFSR ;Dire ccionam os e lre gis tro 0x30 de l a m e m oria RAM (GPR).-
m ovl w 0x3F ;Cargam os e lcódigo para m os trar e lCERO .-
m ovw fINDF ;Lo guardam os donde apunta FSR --> 0x30.-
;....................
incf FSR,1 ;Incre m e ntam os FSR, ah ora apunta a 0x31.-
m ovl w 0x06 ;Cargam os código para UNO .-
m ovw fINDF ;Lo guardam os donde apunta FSR.-
;....................
incf FSR,1 ;Incre m e ntam os FSR, ah ora apunta a 0x32.-
m ovl w 0x5B ;Cargam os código para DO S.-
m ovw fINDF ;Lo guardam os donde apunta FSR.-
;....................
incf FSR,1 ;Incre m e ntam os FSR, ah ora apunta a 0x33.-
m ovl w 0x4F ;Cargam os código para TRES.-
m ovw fINDF ;Lo guardam os donde apunta FSR.-
;....................
incf FSR,1 ;Incre m e ntam os FSR, ah ora apunta a 0x34.-
m ovl w 0x66 ;Cargam os código para CUATRO .-
m ovw fINDF ;Lo guardam os donde apunta FSR.-
;....................
incf FSR,1 ;Incre m e ntam os FSR, ah ora apunta a 0x35.-
m ovl w 0x6D ;Cargam os código para CINCO .-
m ovw fINDF ;Lo guardam os donde apunta FSR.-
;....................
incf FSR,1 ;Incre m e ntam os FSR, ah ora apunta a 0x36.-
m ovl w 0x7D ;Cargam os código para SEIS.-
m ovw fINDF ;Lo guardam os donde apunta FSR.-
;....................
incf FSR,1 ;Incre m e ntam os FSR, ah ora apunta a 0x37.-
m ovl w 0x07 ;Cargam os código para SIETE.-
m ovw fINDF ;Lo guardam os donde apunta FSR.-
;....................
incf FSR,1 ;Incre m e ntam os FSR, ah ora apunta a 0x38.-
m ovl w 0xFF ;Cargam os código para O CH O .-
m ovw fINDF ;Lo guardam os donde apunta FSR.-
;....................
incf FSR,1 ;Incre m e ntam os FSR, ah ora apunta a 0x39 .-
m ovl w 0x6F ;Cargam os código para NUEVE.-
m ovw fINDF ;Lo guardam os donde apunta FSR.-
;....................
m ovl w 0x30 ;
m ovw fFSR ;Dire ccionam os Re gis tro de lCERO .-
re turn ;Cargado l os val ore s , re tornam os .-
;..................................................................
e nd

//página 0x0E
com paradore s anal ógicos .
• Inte rrupción provocada por
Una de l as caracte rís - e l m ódulo CCP e n m odo
ticas m ás im portante de l os com paración o captura.
m icrocontrol adore s e s q ue
tie ne n l a pos ibilidad de m a- Cada fue nte de inte -
ne jar inte rrupcione s . Se trata rrupción e s ta control ada por
de un aconte cim ie nto q ue 2 bits . Un bit l ocalde inte -
h ace q ue e l m icro de je de rrupcione s (te rm inado e n E)
lado l o q ue s e e ncue ntra de pe rm is o o proh ibición de El bit GIE s e borra
re aliz ando, atie nda e s e s uce - e je cución. Si e s ta e n 0 bl o- autom áticam e nte cuando s e
s o, re gre s e y continúe con l o q ue ará l a s ol icitud de inte - re conoce una inte rrupción
s uyo. rrupción, y s i e s ta e n 1 para e vitar q ue s e produz ca
H ay dos tipos de inte - pe rm itirá l a e je cución. Un bit otra m ie ntras s e e s tá ate n-
rrupcione s pos ibl e s , una e s q ue actúa com o s e ñal iz ador die ndo a l a prim e ra y al
m e diante una acción e xte rna (te rm inado e n F) e lcuale s re tornar de l a inte rrupción
(e s de cir por l a activación de activado (pue s to a 1) s i s e con l a ins trucción RETFIE, e l
uno de s us pine s ), l a otra e s h a producido l a inte rrupción. bit GIE s e vue l ve a activar
inte rna (por e je m pl o cuando Ade m ás e xis te n 2 bits poniéndos e a 1. En cam bio
ocurre e lde s bordam ie nto de de controlgl obal , e lbit GIE los bits s e ñal iz adore s o ban-
uno de s us re gis tros ) (INTCO N <7>) e lcuals i e s ta de ras de inte rrupción de be n
En e l16F628A h ay 10 de s activado bl oq ue a todas s e r pue s tos a ce ro por e l
fue nte s de inte rrupción: las s ol icitude s de inte rrup- tratam ie nto de l a inte rrupción
ción y e lbit PEIE (INTCO N re aliz ada por e l us uario
• Fl anco as ce nde nte o de s - <6>) q ue s e ría com o un (program ador).
ce nde nte de l pin RB0/INT, s e gundo bit de controlgl obal Cuando una inte rrup-
q ue re gre s a alPIC de lm odo de inte rrupcione s e xce ptuan- ción e s tá h abil itada (s u bit
SLEEP. do a de s bordam ie nto de l local de h abil itación e s tá
• Por l os pine s RB4 a RB7, Tim e r0, de te cción de fl anco activado, e lbit GIE e s tá acti-
configurados com o e ntrada y e n RB0 y cam bio de e s tado vado y/o de pe ndie ndo de lca-
e n cas o de q ue al guno de de RB4-RB7. s o e lbit PEIE e s tá activado)
el los cam bie de e s tado. Lo ante rior de s crito y ocurre e l e ve nto q ue l a
• Por de s bordam ie nto de l pue de e nte nde rs e obs e rvan- activa, e l val or de PC s e
re gis tro TM R0, cuando e s te do e ldiagram a l ógico de l a guarda e n l a PILA y e n és te
re gis tro pas a de 255 a 0 e n figura #2. s e carga e l0x04 (único ve c-
de cim al . tor de inte rrupción). Es a
• Por de s bordam ie nto de l Nota: Todos e s tos bits al partir de e s ta dire cción q ue
re gis tro Tim e r1, cuando pas a re s e te ars e o iniciars e e lm i- s e de be col ocar e ltratam ie n-
de 65535 a 0 e n de cim al . cro s e e ncue ntran e n 0. to de l a inte rrupción, de te c-
• Por de s bordam ie nto de l
re gis tro TM R2, cuando e s te
re gis tro s upe ra e l val or de l
re gis tro PR2.
• Alcom pl e tar l
a e s critura de
l a EEPRO M de datos .
• Cuando s e re cibe un dato
por USART.
• Cuando s e com pl e ta e l
e nvío de un dato por USART.
• O curre un cam bio e n l os

//página 0x0F
tando por m e dio de l os bits guie nte ins trucción. b) M odo Captura: H a ocu-
bande ras cualde l os e ve n- rrido una captura de TM R1
tos h a ocurrido y actuar 3. No Im pl e m e ntado.
s e gún s e a e lcas o. 4. TXIF: Indicador de inte -
INTCO N. Re gis tro de rrupción de fin de trans -
Nota: e l único re gis tro q ue le ctura y e s critura q ue m is ión USART.
s e s al va e n l a PILA e s PC, cont ie ne v arios bits de s e ña- 5. RCIF: Indicador de inte -
para pre s e rvar al gún otro liz ación y h abil itación para e l rrupción de l le gada de datos
re gis tro de be s e r e l propio de s bor-dam ie nto de l TM R0, USART.
program a de ate nción a l a cam bio s obre e lpue rto RB e 6. CM IF: Indicador de inte -
inte rrupción e lq ue s e e ncar- inte rrup-ción e xte rna e n l a rrupción por cam bio de e s ta-
gue de s al var s u e s tado al pat illa RB0/ INT . do de al guna de l as s al idas
inicio de l a rutina y de de vol - de l os com paradore s .
ve rl os alfinalde lm is m o. 0. RBIF: Indicador de inte - 7. EEIF: Indicador de inte -
rrupción por cam bio de rrupción de fin de e s critura
e s tado RB4-RB7. e e prom inte rna.
1. INTF: Indicador de inte -
• O curre un e ve nto q ue rrupción e xte rna. PIE1. Re gis tro q ue
s ol icita l a inte rrupción, e lbit 2. T0IF: Indicador de inte - pos e e l os bits de h abil itación
bande ra s e activa. rrupción por de s bordam ie nto individual para l as inte rrup-
• Si e lbit l ocalde inte rrup- de Tim e r 0. cione s de pe riféricos . Elbit
cione s e s ta activado, e l bit 3. RBI E: H abil itación de inte - PEIE de l re gis tro INTCO N
GIE activado y/o PEIE acti- rrupción por cam bio de de be s e r 1 para pe rm itir l a
vado s e produce l a inte rrup- e s tado RB4-RB7. h abil itación de cual q uie r
ción. 4. INTE: H abil itación de inte - inte rrupción de pe riférico.
• Se de s activa GIE. rrupción e xte rna.
• Elval or de lPC s e guarda 5. T0IE: H abil itación de inte - 0. TM R1IE: H abil itación de
en l a PILA, y PC s e carga rrupción por de s bordam ie nto inte rrupción por de s borda-
con 0x04. de Tim e r 0. m ie nto de Tim e r 1.
• Se e je cuta l a rutina de 6. PEIE: H abil itación de inte - 1. TM R2IE: H abil itación de
ate nción de inte rrupción cre a- rrupción de pe riféricos . inte rrupción por de s borda-
da por e lus uario, guardando 7. GI E: H abil it ación ge ne ral m ie nto de Tim e r 2.
l os re gis tros ne ce s arios y de inte rrupcione s . 2. CCP1IE: H abil itación de
re al iz ando l a bifurcación co- inte rrupción de l m ódul o de
rre s pondie nte para l a ate n- PIR1. Elre gis tro PIR1 Captura/Com paración/PW M .
ción de l e ve nto por m e dio contie ne l os bits de s e ña- 3. No Im pl e m e ntado.
de lbitbande ra. liz ación indiv idual de l
as 4. TXI E: H abil itación de
• Al final iz ar e l tratam ie nto inte rrupcione s de pe riféricos . inte rrupción de fin de trans -
de le ve nto, s e de vue l ve n l os m is ión USART.
val ore s de los re gis tros 0. TM R1IF: Indicador de 5. RCIE: H abil itación de
s al vados y s e borran por inte rrupción por de s borda- inte rrupción de l le gada de
s oftw are l os bits bande ras . m ie nt o de Tim e r 1. dat os USART .
• La rutina de ate nción 1. TM R2IF: Indicador de 6. CM IE: H abil itación de
de be rá te rm inar con una inte rrupción por de s borda- inte rrupción por cam bio de
ins trucción RETFIE, l a cual m ie nto de Tim e r 2. e s tado de al guna de l as s a-
activa nue vam e nte e lbit GIE 2. CCP1IF: Indicador de lidas de l os com paradore s .
(GIE=1) y l ee l a PILA para int e rrupción de l m ódul o de 7. EEI E: H abilitación de
re s tabl e ce r PC y continuar l a Captura /Com paración. inte rrupción de fin de e s cri-
e je cución de lprogram a q ue a) M odo Com parador: Coinci- tura e e prom inte rna.
fue inte rrum pido e n l a s igui- de ncia e ntre TM R1 y CCP1.

//página 0x10
;**** Rutina de s e rvicio de Inte rrupción ****
; Guardado de re gis tro W y STATUS.-
Inicio_ ISR
Prim e ro s e de be guar- m ovw fW _ Te m p ;Copiam os W a un re gis tro
dar e lconte nido de lre gis tro ;Te m porario.-
W y STATUS. El probl ema s w apf STATUS, W ;Inve rtim os l os nibl e s de l
de m ove r W a otro re gis tro ;re gis tro STATUS.-
(h acie ndo us o de m ovf) e s m ovw fSTATUS_ Te m p ;Guardam os STATUS e n un
q ue e s ta ins trucción corrom - ;re gis tro te m poral.-
pe l a bande ra Z , m odificando ISR
e lre gis tro de STATUS. Se - ;Ate nde m os l a inte rrupción.-
gún l a h oja de datos otor- ;Re s tauram os l os val ore s de W y STATUS.-
gada por M icroch ip, e n uno Fin_ ISR
de s us apartados re com ie n- s w apf STATUS_ Te m p,W ;Inve rtim os l o nible s de
da una s e cue ncia de código ;STATUS_ Te m p.-
q ue pe rm ite guardar y m ovw fSTATUS
re s taurar l os re gis tros s in s w apf W _ Te m p, f ;Inve rtim os l os nibl es yl o
m odificarl os . ;guardam os e n e lm is m o
;re gis tro.-
s w apfW _ Te m p,W ;Inve rtim os l os nibl es
;nue vam e nte y l o
;guardam os e n W .-
Para e lcontrolde l a re tfie ;Sal im os de inte rrupción.-
inte rrupción e xte rna s e ne ce -
s ita un bit adicionalINTEDG ;Los re gis tros W _ Te m p y STATUS_ Te m p s on re gis tros
(O PTIO N_ REG<6>) q ue s e - ;alte rnativos para guardar te m porariam e nte s us val ore s
le cciona e lfl anco q ue ge ne - ;corre s pondie nte s .
rará l a inte rrupción. Si e s tá
e n 1 s e ge ne ra por fl anco q ue m ue s tre com o s e confi- ello configuram os q ue l a inte -
as ce nde nte y e n 0 por fl anco gura, e lcualalpre s ionar un rrupción de ge ne re por fl an-
de s ce nde nte . pul s ador cone ctado a RB0 co as ce nde nte . En e s ta cas o
Para m os trar s u us o cam biará e l e s tado de un vam os a re al iz ar e lguardado
h are m os un e je m plo s e ncil
lo LED cone ctado a RB1, para de l os re gis tro W y STATUS

//página 0x11
;**** Encabe z ado ****
lis t p=16f628A ;l is tdire ctive to de fine proce s s or
#incl ude <p16f628A.inc> ;proce s s or s pe cific variabl e de finitions
_ _ CO NFIG _ CP_ O FF & _ W DT_ O FF & _ BO DEN_ O N & _ PW RTE_ O N &
_ INTO SC_ O SC_ NO CLK O UT & _ DATA_ CP_ O FF & _ LVP_ O FF & _ M CLRE_ O FF
;**** De finición de variable s ****
Contador1 e q u 0x20
Contador2 e q u 0x21

Pul s ador equ 0 ;pin RB0


Le d equ 1 ;pin RB1

;**** Inicio de lM icro ****


Re s e t
org 0x00 ;Aq uí com ie nz a e lm icro.-
goto Inicio ;Sal to a inicio de m i program a.-
;**** Ve ctor de Inte rrupción ****
org 0x04 ;Atie ndo Inte rrupción.-
goto ISR
;**** Program a Principal****
;**** Configuración de pue rtos ***
org 0x05 ;O rige n de lcódigo de program a.-
Inicio
bs f STATUS,RP0 ;Pas am os de Banco 0 a Banco 1.-
m ovl w b'11111101' ;RB0 com o e ntrada y RB1 com o s al ida.-
m ovw fTRISB
bs f O PTIO N_ REG,INTEDG ;Config. Por fl anco As ce nde nte .-
bcf STATUS,RP0 ;Pas o de lBanco 1 alBanco 0
bcf PO RTB,Le d ;ElLe d com ie nz a apagado.-
m ovl w b'10010000' ;H abil itam os GIE y INTE (inte rrupción por RB0)
m ovw fINTCO N
;**** Bucl e infinito ****
Bucl e
nop ;
goto Bucl e ;
;.............................................
;**** Rutina de s e rvicio de Inte rrupción ****
;**** Inte rrupción por RB0 ****
ISR
btfs s INTCO N,INTF ;Cons ul tam os s i e s por RB0.-
re tfie ;No, Sal im os de inte rrupción.-
cal l De m ora_ 20m s ;Com prue ba s i e s re bote .-
btfs s PO RTB,Pul s ador
goto Fin_ ISR ;Es re bote , e ntonce s s alim os .-
btfs s PO RTB,Le d ;Si e s ta pre ndido, l o apagam os .-
goto Pre nde r_ Le d
bcf PO RTB,Le d ;Apagam os Le d
goto Fin_ ISR
Pre nde r_ Le d
bs f PO RTB,Le d ;Ence nde m os Le d

//página 0x12
Fin_ ISR
bcf INTCO N,INTF ;Lim piam os bande ra.-
re tfie ;Sal im os de inte rrupción.-
;..........................................
;**** De m ora ****
De m ora_ 20m s
m ovl w 0xFF ;
m ovw fContador1 ;Iniciam os contador1.-
Re pe ticion1
m ovl w 0x19 ;
m ovw fContador2 ;Iniciam os contador2
Re pe ticion2
de cfs z Contador2,1 ;De cre m e nta Contador2 y s i e s 0 s al
e .-
goto Re pe ticion2 ;Si no e s 0 re pe tim os ciclo.-
de cfs z Contador1,1 ;De cre m e nta Contador1.-
goto Re pe ticion1 ;Si no e s ce ro re pe tim os ciclo.-
re turn ;Re gre s a de la s ubrutina.-
e nd

para e je m pl
ificar e l m étodo
pe ro no e s ne ce s ario ya q ue
e lm icrocontrol ador s ol o es-
pe ra a q ue ocurra l a inte -
rrupción.

Com o e ltitul o l
o indi-
ca e s ta inte rrupción s e ge ne -
ra cuando s e pre s e nta un
cam bio de nive le n cual q uie -
ra de l os pine s RB4 a RB7
configurados com o e ntradas .
Aprove ch are m os e s ta
inte rrupción para de te ctar
cuando s e h a pre s ionado
una te cl a de un te cl ado m atri-
cial . Un te cl ado m atriciale s
un s im pl e arre glo de botone s
cone ctados e n fil as y col um -
nas , de m odo q ue s e pue de n
le e r varios botone s con e l util iz ando s olam e nte 7 l íne as de l pue rto B, RPBU
m ínim o núm e ro de pine s de un m icrocontrol ador. (O PTIO N_ REG<7>) a 0, e n-
re q ue ridos . Un te cl ado m atri- Configurare m os RB0 tonce s e n e s tado norm al(s in
cial4×3 s ol am e nte ocupa 4 a RB3 com o s al ida y l as col o- pre s ión de te clas ) e s tarán a
líne as de un pue rto para l as care m os a nive lbajo. RB4 y nive l alto. Al pre s ionar una
filas y otras 3 l íne as para las RB7 configuradas com o e n- te cl
a s e cone cta una fil a con
col um nas , de e s te m odo s e tradas y h abil itare m os l as una col um na, s e produce un
pue de n l e e r 12 te clas util i- re s is te ncias pul l-up inte rnas cam bio de nive le n al guna de

//página 0x13
las col um nas (de nive lal to a pre s e ntare m os la te cl a te cla pre s ionada.
bajo), y s e ge ne ra l a inte rrup- pre s ionada e n form a binaria
ción. Para de te ctar q ue te cl a con LEDs cone ctados al Nota: La bande ra RBIF de be
s e h a pre s ionado, s e col o- pue rto A. pone rs e a ce ro por s oftw are
can RB0 a RB3 a nive lal to, pe ro ade m ás de be re al iz ars e
y s e pas an a nive lbajo de a pre viam e nte una ope ración
una por ve z , de te ctando s i de l e ctura (o e s critura) de l
s e produce al gún cam bio e n Te ne r e n cue nta q ue Pue rto B para q ue de je de
las col um nas . Se util iz a una tam bién con l a variabl e dars e l a dis cre pancia e ntre
variabl e q ue s e incre m e nta NTe cl a (Num e ro de Te cl a e l val or actual y e l val or
con l a cue nta de l as te cl as pre s ionada) s e pue de util iz ar le ído, y no ge ne re una nue va
re vis adas , de e s te m odo al com o e ntrada a una tabl a inte rrupción.
de te ctar una pul s ación e l para codificar e n ASCK II l a
val or de l a cue nta s e rá e l
val or de l a te cla pre s ionada. m ovfw NTe cla
Si al final no s e pre s ionó call Tabl a_ TM atricial
ninguna te cl a l a variabl e se ;Codificación de Te cl a pre s ionada:
pone a ce ro y l a cue nta Tabla_ TM atricial
vue l ve a com e nz ar. addw fPCL,1
Algoritm o de de te c- DT “1”,”2”, ”3”, ”4”, ”5”, ”6”, ”7”, ”8”, ”9 ”, ”*”, ”0”, ”#”
ción de te cl a pul s ada: alocu-
rrir una inte rrupción s e pue -
de de te rm inar q ue col um na
h a cam biado de e s tado, pe ro
no l a fil
a. Entonce s para de -
te ctarl a ire m os col ocando a
nive lbajo s ol o una fil a por
ve z , y te s te are m os las col um -
nas , alde te ctar un nive lbajo
e n al guna de te rm inare m os
m e diante l a cue nta de te cl as
te s te adas e xactam e nte cual
h a s ido.
En nue s tro e je m pl o re -

//página 0x14
;**** Encabe z ado ****
lis tp=16f628A ;l is tdire ctive to de fine proce s s or
#incl ude <p16f628A.inc> ;proce s s or s pe cific variabl e de finitions
_ _ CO NFIG _ CP_ O FF & _ W DT_ O FF & _ BO DEN_ O N & _ PW RTE_ O N &
_ INTO SC_ O SC_ NO CLK O UT & _ DATA_ CP_ O FF & _ LVP_ O FF & _ M CLRE_ O N
;**** De finición de variabl e s ****
NTe cl a e q u 0x20 ;Se le ccionam os pos ición e n l
a m e m oria RAM (GPR)
para guardar Num e ro de Te cl a pre s ionada

;**** Inicio de lM icro ****


Re s e t
org 0x00 ;Aq uí com ie nz a e lm icro.-
goto Inicio ;Sal to a inicio de m i program a.-
;**** Ve ctor de Inte rrupción ****
org 0x04 ;Atie ndo Inte rrupción.-
goto ISR
;**** Program a principal****
;**** Configuración de pue rtos ****
org 0x05
Inicio
m ovl w 0x07 ;De s h abilitam os Com paradore s anal ógicos
m ovw fCM CO N
bs f STATUS,RP0 ;Pas am os de Banco 0 a Banco 1.-
clrf TRISA ;PO RTA com o Sal ida.-
m ovl w b'11110000' ;Nibl e bajo com o Sal ida y Nibl e alto com o Entrada.-
m ovw fTRISB
bcf O PTIO N_ REG,RBPU ;H abilitam os re s is te ncias Pul l
-Up.
bcf STATUS,RP0 ;Pas o de lBanco 1 alBanco 0
clrf PO RTB ;Elpue rto q ue dará 11110000.-
clrf PO RTA
bcf INTCO N,RBIF ;Borram os bande ra de Inte rrupción.-
m ovl w b'10001000' ;H abil itam os GIE y RBIE (inte rrupción RB4 a RB7)
m ovw fINTCO N
clrf NTe cl a
;**** Bucl e ****
Bucl e
nop
goto Bucl e
;**** Rutina de s e rvicio de Inte rrupción ****
;**** Inte rrupción por TM R0 ****
ISR
btfs s INTCO N,RBIF ;Cons ul tam os s i e s por RB4 a RB7.-
re tfie ;No, e ntonce s s al im os de inte rrupción.-
cal l Te cl a_ Pre s ionada ;Se de te cta q ue te cl a fue pre s ionada
m ovfw NTe cl a ;Te cla_ Pre s ionada l a de vue lve e n NTe cla.-
m ovw fPO RTA ;M os tram os e n dis pl ay te cl
a Pre s ionada.-
clrf PO RTB ;De jam os Pue rto para re cibir otra te cl a.-
bcf INTCO N,RBIF ;borram os bande ra.-
re tfie ;Sal im os de inte rrupción.-
;**** Rutinas *****

//página 0x15
;Ras tre am os Te cl a pre s ionada.-
Te cl a_ Pre s ionada
clrf NTe cl a ;Borra Num e ro de Te cl a y…
incf NTe cl a,1 ;… pre para NTe cl a para prim e r código.
m ovl w b'00001110' ;Saca 0 a l a prim e ra fil a…
m ovw fPO RTB ;… de l a Pue rta B
nop ;Para e s tabil iz ación de s e ñal .
Te s t_ Col um nas
btfs s PO RTB,4 ;Prim e ra col um na = 0?
goto Sue l ta_ te cla ;Sal e s i s e h a pul s ado te cl
a.
incf NTe cl a,1 ;No e s , incre m e nta nº te cl a.
btfs s PO RTB,5 ;Se gunda col um na = 0?
goto Sue l ta_ te cla ;Sale s i s e h a pul s ado te cla.
incf NTe cl a,1 ;No e s , incre m e nta nº te cl a.
btfs s PO RTB,6 ;Te rce ra col um na = 0?
goto Sue l ta_ te cla ;Sal e s i s e h a pul s ado te cl
a.
incf NTe cl a,1 ;No e s , incre m e nta nº te cl a.
; En e s te cas o no s e Us a te clado 3x4.-
; btfs s PO RTB,7 ;Cuarta col um na = 0
; goto Sue l ta_ te cla ;Sale s i s e h a pul s ado te cla.
; incf NTe cl a,1 ;No e s , incre m e nta nº Te cl a.

Ul
tim a_ te cl a
btfs s PO RTB,3 ;Ya s e re vis aron todas l as fil
as ?
goto Nul l_ te cl
a ;Si, Fals a al arm a, no s e h a pre s ionado ninguna.-
bs f STATUS,C ;No, s e guim os con l a s iguie nte . Pone a 1 BitC…
rlf PO RTB,1 ;… as í l
a Fil a 1 pas a a 1 con l a rotación a iz q da.
goto Te s t_ Col um nas ;Se guim os te s te ando.

Nul
l_ te cl a
clrf NTe cl
a ;Col oca variabl
e Te cl
a a 0 (Ninguna)
re turn ;re gre s a.

Sue l ta_ te cl a
;Ah ora s e e s pe ra a q ue l a te cla s e a s ol
tada para e vitar re bote s y re activacione s de te cl
a.
Es pe ra1
btfs s PO RTB,4 ;Si no s e s ue l ta l a te cl
a FILA 1…
goto Es pe ra1 ;… vue l ve a e s pe rar.
Es pe ra2
btfs s PO RTB,5 ;Si no s e s ue l ta l
a te cla FILA 2…
goto Es pe ra2 ;… vue l ve a e s pe rar.
Es pe ra3
btfs s PO RTB,6 ;Si no s e s ue l ta l
a te cla FILA 3…
goto Es pe ra3 ;… vue l ve a e s pe rar.
Es pe ra4
btfs s PO RTB,7 ;Si no s e s ue l ta l
a te cla FILA 4…
goto Es pe ra4 ;… vue l ve a e s pe rar.
re turn ;vue l
ve alprogram a q ue h iz o l allam ada.
;..........................................
e nd

//página 0x16
l
ibre ría de gráficos
para GLCD e n C
Cuando ne ce s itam os util iz ar un dis pl ay LCD gráfico (GLCD) nos e ncontram os
q ue no s ie m pre te ne m os a m ano l as funcione s ne ce s arias para dibujar form as o
te xto s obre él . Al gunos com pil adore s dis pone n de libre rias ale fe cto, pe ro m uch as
ve ce s tie ne n re s triccione s l e gale s s obre e lcódigo ge ne rado. H oy te m os tram os
com o e s cribir tus propias rutinas , y a adaptarl as a tus ne ce s idade s .
//por: Arie lPal az z e s i //
arie l
palaz z e s i@ gm ail .com

Elcom pil ador CCS pro- Es por e l l


o q ue nos h e -
porciona una l ibre ría capaz m os de cidido a e s cribir una l i-
de dibujar prim itivas s obre va- bre ría propia, q ue us are m os de
rios m ode l os de dis pl ays LCD ah ora e n m ás para nue s tros pro-
gráficos o GLCD (por Graph ic ye ctos . Las funcione s q ue po-
Liq uid Cris tal Dis pl ay). H ay s e e e s ta l
ibre ría s on l
as s iguie n-
ve rs ione s de e s ta l ibre ría pa- te s :
ra pantal las con dife re nte s
control adore s e m be bidos , co- • GLCD_ l im piar(col or)
m o e lSam s ung K S0108 o e l • GLCD_ inicial iz a(m odo)
Tos h iba T69 63. • GLCD_ punto(x, y, col or)
Pe ro a pe s ar de q ue pue - • GLCD_ l ine a(x1, y1, x2, y2,
de n dis tribuirs e l ibre m e nte l os col or)
trabajos q ue h agam os con e - • GLCD_ re ctangul o(x1, y1, x2,
llas , no pue de n com partirs e l os y2, col or)
program as q ue l as conte ngan, a • GLCD_ caja(x1, y1, x2, y2,
m e nos q ue l a pe rs ona q ue l os color)
re cibe tam bién s e a un us uario • GLCD_ circul o(x1, y1, radio,
re gis trado de CCS. Es to l im ita col
or)
m uch o s u us o con fine s e du-
cativos . De h e ch o, s i q uis iés e - Se as um e q ue las cone -
m os publ icar e n l a re vis ta xione s e ntre e lPIC y e lGLCD
uControl un program a q ue s on l
as s iguie nte s :
trafiq ue al go e n un GLCD,
e s taríam os viol ando l a l ice ncia,
ya q ue e s m uy pos ibl e q ue
m uch os de l os nue s tros l e ctore s
no h ayan com prado e lcom pil a-
dor.

//página 0x18
PIN LCD PIC //--------------------------------------------------------------------------------
1 CS1 B1 //GLCD_ inicial iz a(m odo) - Es ta función inicial iz a e lLCD.
2 CS1 B0 //--------------------------------------------------------------------------------
6 R/S B2 void GLCD_ inicial iz a(int1 m odo)
{
7 R/W B3
//Pone l os pine s de controle n e le s tado corre cto.
8 E B4
output_ h igh (GLCD_ RESET);
9 ...16 D0...D7 D0...D7 output_ l ow (GLCD_ E);
17 RESET B5 output_ l ow (GLCD_ CS1);
output_ l ow (GLCD_ CS2);
Por s upue s to, los pi- output_ l ow (GLCD_ DI); //M odo ins trucción
ne s utiliz ados pue de n cam -
biars e m odificando l as s e n- //Envio datos de inicial
iz ación -----------------------
te ncias DEFINE q ue s e e ncu- GLCD_ e nviaBYTE(GLCD_ l ado_ CS1, 0xC0);
e ntran alprincipio de l al ibre - GLCD_ e nviaBYTE(GLCD_ l ado_ CS2, 0xC0);
ría. GLCD_ e nviaBYTE(GLCD_ l ado_ CS1, 0x40);
GLCD_ e nviaBYTE(GLCD_ l ado_ CS2, 0x40);
//Pine s a us ar GLCD_ e nviaBYTE(GLCD_ l ado_ CS1, 0xB8);
#de fine GLCD_ CS1 GLCD_ e nviaBYTE(GLCD_ l ado_ CS2, 0xB8);
PIN_ E2
#de fine GLCD_ CS2 //Si m odo = 1 inicial
iz a e nce ndido. Sino, apagado.
PIN_ E1 if(m odo == 1)
#de fine GLCD_ DI { GLCD_ e nviaBYTE(GLCD_ l ado_ CS1, 0x3F);
PIN_ C3 //Encie ndo e lGLCD
#de fine GLCD_ RW GLCD_ e nviaBYTE(GLCD_ l ado_ CS2, 0x3F);}
PIN_ C2 el se {
#de fine GLCD_ E GLCD_ e nviaBYTE(GLCD_ l ado_ CS1, 0x3E);
PIN_ C1 //Apago e lGLCD
#de fine GLCD_ RESET GLCD_ e nviaBYTE(GLCD_ l ado_ CS2, 0x3E);}
PIN_ E0
//Borro la pantal l
a
Com e nce m os a anal i- GLCD_ l im piar(0);
z ar cada una de l as funcio- }
ne s im pl
e m e ntadas :
"pinta" toda l a pantal l
a con
uno u otro col or. Si re cibe co-
Es ta e s l a prim e r función de m o parám e tro un "1", l a
la l ibre ría q ue de be l lam ar pintará com pl e tam e nte de
nue s tro program a. Se e ncar- ne gro. Si re cibe un "0", l a
ga de inicial iz ar e lGLCD, y lim piará por com pl e to. Su
e lparám e tro "m odo" de te rm i- funcionam ie nto tam bién e s
na s i e s tará e nce ndido (s i m uy s e ncil lo, y s e "apoya"
re cibe un "1") o apagado (s i e n GLCD_ e nvia BYTE() para
re cibe un "0"). Es im portante e s cribir e n e lGLCD. Re corre
s abe r q ue e s ta función ade - am bas m itade s de l GLCD,
m ás de inicial iz ar e l GLCD página por página, de arriba
borra l a pantal la. h acia abajo, e s cribie ndo
"0x00" o "0xFF" s e gún s e h a-
ya e l e gido pintar o borrar.
Es ta e s l
a función q ue

//página 0x19
//---------------------------------------------------------------------------------
//GLCD_ l im piar(col or) - Lim pia e lGLCD (pinta l a pantal la) Es ta e s l a "prim itiva gráfica"
//--------------------------------------------------------------------------------- indis pe ns abl e . A partir de
void GLCD_ l im piar(int1 col or) GLCD_ punto(x, y, col or) e s -
{ cribire m os todas l as funcio-
int8 i, j; ne s re s tante s . Los parám e -
//Re corre l as 8 paginas (ve rtical ) tros q ue re cibe GLCD_ punto-
for(i = 0;i < 8;+ + i) (x, y, color) s on:
{
output_ l ow (GLCD_ DI); //M odo ins trucción x: un byte , e s l a coorde nada
"x" (h oriz ontal), con val ore s
//Com ie nz o, e n cada página, de s de l
a dire cción 0 válidos de 0 a 127 (iz q uie rda
GLCD_ e nviaBYTE(GLCD_ l ado_ CS1, 0b01000000); a de re ch a).
GLCD_ e nviaBYTE(GLCD_ l ado_ CS2, 0b01000000);
y: un byte , e s la coorde nada
//Se l
e cciono l
a dire ccion de ntro de l
a pagina "y" (ve rtical
), con val
ore s vál
i-
GLCD_ e nviaBYTE(GLCD_ l ado_ CS1, i | 0b10111000); dos de 0 a 63 (arriba a aba-
GLCD_ e nviaBYTE(GLCD_ l ado_ CS2, i | 0b10111000); jo).

output_ h igh (GLCD_ DI); //M odo datos color: un bit, "0" = apagado,
"1" = e nce ndido.
//Re corre las dos m itade s (h oriz ontal
es)
for(j= 0;j< 64;+ + j)
{ GLCD_ e nviaBYTE(GLCD_ l ado_ CS1, 0xFF * col
or);
//Encie nde /apaga píxe les
GLCD_ e nviaBYTE(GLCD_ l ado_ CS2, 0xFF * color);
//Encie nde /apaga píxe l es
}
}
}

#incl ude <16F877A.h >


#de vice *=16
#incl ude <s tdl
ib.h >
#fus e s H S,NO W DT,NO LVP

#USE DELAY (CLO CK =20000000)


#incl
ude <GLCD_ K 0108.C>

//-------Com ie nz a e lprogram a -----------------------


void m ain()
{
//Inicial
iz o e lGLCD, e nce ndido.
GLCD_ inicial iz a(1);

GLCD_ l im piar(1); //Lo pinto com pl e tam e nte


de ne gro
de l
ay_ m s (2000); //Es pe ro dos s e gundos y...
GLCD_ l im piar(0); //...l
olim pio.
}

//página 0x1A
//-----------------------------------------------------------------------
//GLCD_ punto(x, y, col or) - Dibuja un pixe l
La l ine a tam bién re s ulta in- //-----------------------------------------------------------------------
dis pe ns abl
e a l a h ora de di- void GLCD_ punto(int8 x, int8 y, int1 col or)
bujar un gráfico. Los parám e - {
tros q ue re cibe GLCD_ l ine a- BYTE dato;
(x1, y1, x2, y2, color) s on: int1 lado = GLCD_ l ado_ CS1; //Lado e n q ue voy a dibujar.

x1: un byte , e s l a coorde na- if(x > 63) //Ve o s i cae de lotro l
ado
da "x" (h oriz ontal ) de lprim e r { x -= 64;
e xtre m o de l a l ine a, con l
ado = GLCD_ l
ado_ CS2;}
val ore s vál idos de 0 a 127
(iz q uie rda a de re ch a). output_ l ow (GLCD_ DI); //M odo ins trucción
y1: un byte , e s l a coorde na- bit_ cl e ar(x,7); //Lim pio bitM SB...
da "y" (ve rtical ) de l prim e r bit_ s e t(x,6); //...y pongo e lbit6 e n 1
e xtre m o de l a l ine a, con GLCD_ e nviaBYTE(l ado, x);
val ore s válidos de 0 a 63 (a- //Envio l a dire cción de l
a coorde nada X
rriba a abajo).
x2: un byte , e s l a coorde na- //Calcul o e n q ue pagina de las 8 cae ...
da "x" (h oriz ontal ) de ls e gun- GLCD_ e nviaBYTE(l ado, (y/8 & 0xBF) | 0xB8);
do e xtre m o de l a l ine a, con output_ h igh (GLCD_ DI); //...y pas o a M odo datos
val ore s vál idos de 0 a 127
(iz q uie rda a de re ch a). //Se ne ce s itan dos le cturas para q ue de vue l
va e ldato e n l
a
y2: un byte , e s l a coorde na- //nue va dire cción
da "y" (ve rtical ) de ls e gundo GLCD_ l e e BYTE(l ado);
e xtre m o de l al ine a, con val o- dato = GLCD_ l e e BYTE(l ado);
re s vál idos de 0 a 63 (arriba
a abajo). //De acue rdo alval or de color...
col or: un bit, "0" = l ine a e n if(color == 1) bit_ s e t(dato, y% 8); //Encie ndo e lpíxe l
bl anco, "1" = l ine a e n ne gro. else bit_ cle ar(dato, y% 8); //apago e lpíxe l

Eltraz ado de l ine as s e bas a output_ low (GLCD_ DI); //M odo ins trucción
e n e lAlgoritm o de Bre s e n- GLCD_ e nviaBYTE(l ado, x); //Fijo e ll ado a e s cribir,
h am . output_ h igh (GLCD_ DI); //pongo e n M odo Datos y....
GLCD_ e nviaBYTE(l ado, dato); //dibujo e lpíxe l
}

#incl ude <16F877A.h > GLCD_ inicial iz a(1); //Inicial


iz o e l
#de vice *=16 GLCD, e nce ndido.
#incl ude <s tdl
ib.h > GLCD_ l im piar(0); //Lim pio l
a pantal
la
#fus e s H S,NO W DT,NO LVP
//Pinto puntos e n e lGLCD
#USE DELAY (CLO CK =20000000) for(i=0;i<=127;i=i+ 8){
#incl
ude <GLCD_ K 0108.C> for(j=0;j<=63;j=j+ 8){
GLCD_ punto(i,j,1);//Pinto e lpunto
//-------Com ie nz a e lprogram a ------------------- }
void m ain() }
{ }
inti,j;

//página 0x1B
//--------------------------------------------------------------------------------
//Dibuja una l ine a de s de (x1,y1) a (x2,y2) de col or (0 o 1)
Los re ctángul os de dibujan //--------------------------------------------------------------------------------
(inte rnam e nte ) m e diante cua- void GLCD_ l ine a(intx1, inty1, intx2, inty2, int1 col or)
tro l l
am adas a l a función {
GLCD_ l ine a. Los parám e - //De cl aro variabl e s -------------------
tros q ue re cibe GLCD_ re c- s igne d int x, y, incre m e nto_ x, incre m e nto_ y, dis tancia_ x,
tangul o(x1, y1, x2, y2, col or) dis tancia_ y;
s on: s igne d long P;
inti;
x1: un byte , e s l a coorde na-
da "x" (h oriz ontal ) de l a es- //Cal cul ol as dife re ncias e ntre l
as coorde nadas de orige n y
q uina s upe rior iz q uie rda de l de s tino
re ctángul o, con val ore s vál i- dis tancia_ x = abs ((s igne d int)(x2 - x1));
dos de 0 a 127 (iz q uie rda a dis tancia_ y = abs ((s igne d int)(y2 - y1));
de re ch a).
y1: un byte , e s l a coorde na- //Inicial iz o x e y con l as coorde nadas de orige n
da "y" (ve rtical ) de la e s q uina x = x1;
s upe rior iz q uie rda de lre ctán- y = y1;
gul o, con val ore s vál idos de
0 a 63 (arriba a abajo). //Cal cul o e ls e ntido de los incre m e ntos (pos itivos o
x2: un byte , e s l a coorde na- ne gativos )
da "x" (h oriz ontal ) de l a es- //e n función de l a pos ición de lorige n y e lde s tino
q uina infe rior de re ch a de l if(x1 > x2) incre m e nto_ x = -1;e l s e incre m e nto_ x = 1;
re ctángul o, con val ore s vál i- if(y1 > y2) incre m e nto_ y = -1;e l s e incre m e nto_ y = 1;
dos de 0 a 127 (iz q uie rda a
de re ch a). //Si l a dis tancia h oriz ontale s m ayor a l a ve rtical ...
y2: un byte , e s l a coorde na- if(dis tancia_ x >= dis tancia_ y)
da "y" (ve rtical ) de la e s q uina { P = 2 * dis tancia_ y - dis tancia_ x;
infe rior de re ch a de l re ctán- for(i=0;i<=dis tancia_ x;+ + i)
gul o, con val ore s vál idos de {
0 a 63 (arriba a abajo). GLCD_ punto(x, y, col or);
col or: un bit, "0" = re ctángu-
lo e n bl anco, "1" = re ctángu- if(P < 0)
lo e n ne gro. { P + = 2 * dis tancia_ y;
x + = incre m e nto_ x;}
el se
{ P + = 2*dis tancia_ y - 2*dis tancia_ x;
Las "cajas " s on re ctángul os x + = incre m e nto_ x;
pintados e n s u inte rior con e l y + = incre m e nto_ y;}
m is m o col or q ue e lborde e x- }
te rior. Tam bién s e dibujan (in- }
te rnam e nte ) m e diante l lam a-
das a l a función GLCD_ l ine - //Si l a dis tancia ve rticale s m ayor a l a h oriz ontal ...
a. Los parám e tros q ue re ci- el se
be GLCD_ caja(x1, y1, x2, { P = 2 * dis tancia_ x - dis tancia_ y;
y2, col or) s on: for(i=0;i<=dis tancia_ y;+ + i)
{ GLCD_ punto(x, y, col or);
x1: un byte , e s l a coorde na- if(P < 0)
da "x" (h oriz ontal ) de l a es- { P + = 2 * dis tancia_ x;

//página 0x1C
q uina s upe rior iz q uie rda de l y + = incre m e nto_ y;}
re ctángul o, con val ore s vál i- else
dos de 0 a 127 (iz q uie rda a { P + = 2 * dis tancia_ x - 2 * dis tancia_ y;
de re ch a). x + = incre m e nto_ x;
y1: un byte , e s l a coorde na- y + = incre m e nto_ y;}
da "y" (ve rtical ) de la e s q uina }
s upe rior iz q uie rda de lre ctán- }
gul o, con val ore s vál idos de }
0 a 63 (arriba a abajo).
x2: un byte , e s l a coorde na- //Eje m pl o de us o de GLCD_ l ine a(x1, y1, x2, y2, col
or)
da "x" (h oriz ontal ) de l a es- #incl ude <16F877A.h >
q uina infe rior de re ch a de l #de vice *=16
re ctángul o, con val ore s vál i- #incl ude <s tdlib.h >
dos de 0 a 127 (iz q uie rda a #fus e s H S,NO W DT,NO LVP
de re ch a).
y2: un byte , e s l a coorde na- #USE DELAY (CLO CK =20000000)
da "y" (ve rtical ) de la e s q uina #incl ude <GLCD_ K 0108.C>
infe rior de re ch a de lre ctángu-
lo, con val ore s vál idos de 0 a //-------Com ie nz a e lprogram a -----------------------
63 (arriba a abajo). void m ain()
col or: un bit, "0" = caja e n {
bl anco, "1" = caja e n ne gro. inti;

GLCD_ inicializ a(1); //Inicial


iz o e lGLCD, e nce ndido.
GLCD_ lim piar(0); //Lim pio la pantall
a
Es ta e s la función q ue dibuja
un circul o. Elinte rior de lcir- //Dibujo e je "X"
cul o pe rm ane ce de lcol or de l GLCD_ l ine a(0, 32, 127, 32, 1);
fondo. Es trictam e nte h abl an- for(i=0;i<=127;i=i+ 8){ GLCD_ l ine a(i,31,i,33,1);}
do, s e dibuja s ol ol
a circunfe -
re ncia. Los parám e tros q ue //Dibujo e je "Y"
re cibe GLCD_ circul o(x1, y1, GLCD_ l ine a(64, 0, 64, 64, 1);
radio, col or) s on: for(i=0;i<=63;i=i+ 8){ GLCD_ l ine a(63,i,65,i,1);}

x1: un byte , e s la coorde na- //Dibujo la "grafica"


da "x" (h oriz ontal
) de lce ntro GLCD_ l ine a(0,63,127,0,1);
de lcirculo, con val ore s vál i- }

//página 0x1D
dos de 0 a 127 (iz q uie rda a //--------------------------------------------------------------------------------
de re ch a). //Dibuja un re ctángul o de s de (x1,y1) a (x2,y2)
y1: un byte , e s l a coorde na- //de col or (0 ó 1).
da "y" (ve rtical ) de l ce ntro //-----------------------------------------------------------------------
de lcircul o, con val ore s váli- void GLCD_ re ctangul o(intx1, inty1, intx2, inty2, int1 col or)
dos de 0 a 63 (arriba a aba- {
jo). GLCD_ l ine a(x1,y1,x2,y1,col or);
radio: un byte , e s e lradio de GLCD_ l ine a(x1,y1,x1,y2,col or);
la circunfe re ncia (e n pixe - GLCD_ l ine a(x1,y2,x2,y2,col or);
le s ). GLCD_ l ine a(x2,y1,x2,y2,col or);
col or: un bit, "0" = circulo en }
bl anco, "1" = circul o e n ne -
gro. //Eje m pl
o de GLCD_ re ctangul
o(x1, y1, x2, y2, col
or)

Las circunfe re ncias s e h an #incl ude <16F877A.h >


re s ue lto m e diante e l"al gorit- #de vice *=16
m o de l punto m e dio", q ue #incl ude <s tdl
ib.h >
divide l a circunfe re ncia e n 8 #fus e s H S,NO W DT,NO LVP
parte s s im étricas , e vitando
util iz ar funcione s com o s e no, #USE DELAY (CLO CK =20000000)
cos e no o pote ncias , q ue vol - #incl
ude <GLCD_ K 0108.C>
ve rían m uy l e nta l
a tare a de l
traz ado. //-------Com ie nz a e lprogram a -----------------------
void m ain()
{
inti;

GLCD_ inicializ a(1); //Inicial


iz o e lGLCD, e nce ndido.
GLCD_ lim piar(0); //Lim pio la pantall
a

//Dibujo un re ctángulo
GLCD_ re ctangul o(10,10,117,40,1);
}

//página 0x1E
//-----------------------------------------------------------------------
//Dibuja un re ctángul o PINTADO de s de (x1,y1) a (x2,y2)
//de col or (0 o 1)
//-----------------------------------------------------------------------
void GLCD_ caja(intx1, inty1, intx2, inty2, int1 col or)
{
//De cl aro variabl e s -------------------
inti;

for(i=y1;i<=y2;i+ + ) {
GLCD_ l ine a(x1,i,x2,i,col
or);}
}

//Dibujando una caja


#incl ude <16F877A.h >
#de vice *=16
#incl ude <s tdl
ib.h >
#fus e s H S,NO W DT,NO LVP

#USE DELAY (CLO CK =20000000)


#incl
ude <GLCD_ K 0108.C>

//-------Com ie nz a e lprogram a -----------------------


void m ain()
{
inti;

GLCD_ inicializ a(1); //Inicial


iz o e lGLCD, e nce ndido.
GLCD_ lim piar(0); //Lim pio la pantall
a

//Dibujo una caja


GLCD_ caja(20,20,115,32,1);
}

//-----------------------------------------------------------------------
//Dibuja un circul o con ce ntro e n (x1,y1), radio
//y col or (0 ó 1)
//-----------------------------------------------------------------------
void GLCD_ circul o(intx1, inty1, intradio, int1 col or)
{
s igne d intd, x, y;

//Inicial
iz o l
as variabl
es.
d = 1 - radio;
x = 0;
y = radio;

//Dibujo l os cuatro píxe l


e s q ue "cae n" s obre l
os e je s
//carte s ianos .
GLCD_ punto(x1, y1 + radio, col or);

//página 0x1F
GLCD_ punto(x1, y1 - radio, col
or);
GLCD_ punto(x1 + radio, y1, color);
GLCD_ punto(x1 - radio, y1, col
or);

//Es te e s e lbucl e q ue pinta los octavos de l


a circunfe re ncia.
w h ile (x < y) {
if(d < 0) {d = d + 2 * x + 3;}
els e {d = d + 2 * (x - y ) + 5;
y = y - 1 ;}
x = x + 1;

//Pone e lpunto e n cada uno de los "octante s ".


GLCD_ punto(x1 + x, y1 + y, color);
GLCD_ punto(x1 - x, y1 + y, color);
GLCD_ punto(x1 + x, y1 - y, color);
GLCD_ punto(x1 - x, y1 - y, col
or);
GLCD_ punto(x1 + y, y1 + x, color);
GLCD_ punto(x1 - y, y1 + x, color);
GLCD_ punto(x1 + y, y1 - x, color);
GLCD_ punto(x1 - y, y1 - x, col
or);
}
}

//Dibujando un circul o
#incl ude <16F877A.h >
#de vice *=16
#incl ude <s tdl
ib.h >
#fus e s H S,NO W DT,NO LVP

#USE DELAY (CLO CK =20000000)


#incl
ude <GLCD_ K 0108.C>

//-------Com ie nz a e lprogram a -----------------------


void m ain()
{
inti;

GLCD_ inicializ a(1); //Inicial


iz o e lGLCD, e nce ndido.
GLCD_ lim piar(0); //Lim pio la pantall
a

//Dibujo varios circulos


for(i=10;i<=100;i=i+ 16){
GLCD_ circul o(i,30,i/5+ 2,1);}
}

//página 0x20
H ay dos funcione s acce s o- //-----------------------------------------------------------------------
rias e n l as q ue s e bas a e l //Es cribe un byte e n una de l as m itade s de l a pantal la
funcionam ie nto de toda l a //(l ado=0:iz q Lado=1:de r)
libre ría. Efe ctivam e nte , de //-----------------------------------------------------------------------
form a indire cta o indire cta to- void GLCD_ e nviaBYTE(int1 l ado, BYTE dato)
das l as funcione s im pl e m e n- {
tadas h ace n us o de GLCD_ - if(l
ado) output_ h igh (GLCD_ CS2); //Se l e cciono l a m itad
le e BYTE(int1 l ado) y GLCD_ - corre s pondie nte
e nviaBYTE(int1 l ado, BYTE els e output_ h igh (GLCD_ CS1);
dato) para l e e r o e s cribii by-
te s e n e ldis pl ay. A continua- output_ low (GLCD_ RW ); //M odo e s critura
ción, e lcódigo fue nte de ca- output_ d(dato); //Col oco e ldato e n e lpue rto y...
da una. de l
ay_ us (1); //...e s pe ro.
output_ h igh (GLCD_ E); //Pongo e lbitEnabl e e n al to y...
Por úl tim o pue de s de s cargar de l
ay_ us (2); //...e s pe ro.
la l ibre ria GLCD_ K 0108.C output_ low (GLCD_ E); //Pongo e lbitEnabl e e n bajo.
h acie ndo cl ick aq uí.
output_ l
ow (GLCD_ CS1); //Libe ro l
aline a CS1 y...
output_ l
ow (GLCD_ CS2); //CS2.
}

//-----------------------------------------------------------------------
//Le e un byte de una de l as dos m itade s de l a pantal l
a
//-----------------------------------------------------------------------

BYTE GLCD_ l e e BYTE(int1 l


ado)
{
BYTE dato;
s e t_ tris _ d(0xFF); //Pue rto D com o e ntrada
output_ h igh (GLCD_ RW ); //GLCD e n M odo l e ctura

//Se l
e cciono l
a m itad de ldis pl
ay a l
e e r.
if(l
ado) output_ h igh (GLCD_ CS2);
els e output_ h igh (GLCD_ CS1);

de l
ay_ us (1); //Es pe ro...
output_ h igh (GLCD_ E); //Pongo e n al to e lpin e nable y...
de l
ay_ us (2); //...e s pe ro.
dato = input_ d(); //Guardo e n "dato" e lval or de vue l
to y...
output_ low (GLCD_ E); //...pongo e n bajo e lpin e nabl e.

//Vue l
vo a pone r e n bajo l
as l
ine as CS1 y CS2.
output_ l
ow (GLCD_ CS1);
output_ l
ow (GLCD_ CS2);

re turn dato;
}

//página 0x21
l
e e r un te cl
ado m atricial
con PIC Sim ul ator IDE
Una de l as m ane ras m ás us ual e s de ingre s ar datos a un m icrocontrol ador e s a
través de un te cl ado m atricial. En e s te tutoriale xplicare m os com o re aliz ar una
rutina de l e ctura e n e ll
e nguaje Bas ic de le ntorno PIC Sim ul ator IDE para utiliz arl
a
e n nue s tros proye ctos .
//por: Lucas M artín Tre s e r //
lm tre s e r@ gm ail
.com

Un te cl ado m atricialno otra variante de ll e nguaje .


e s m ás q ue un arre gl o de pul - Lo q ue de be m os h ace r
s adore s , tanto norm al m e nte e s ve rificar e le s tado de l os pul
-
ce rrados com o abie rtos , dis - s adore s uno a uno para s abe r s i
pue s tos e n fil as y col um nas y h ubo un cam bio de e s tado. Pa-
com partie ndo al gunos de s us ra l ograrl o de be m os cone ctar
pine s , l ogrando una notabl e las cuatro col um nas de lte cl ado
re ducción de e s tos . Por e je m - a cuatro pine s de s al ida de l
pl o un te cl ado de 4 fil as y 4 PIC, y l as cuatro fil as a otros
col um nas , l lam ado ge ne ral - cuatros pine s de e ntrada de l
m e nte 4×4, pos e e s ól o 8 pi- m icrocontrol ador.
ne s de cone xión y 16 te cl as a La s e cue ncia a s e guir e s
nue s tra dis pos ición. la s iguie nte :
Ah ora bie n, a l a h ora de
im pl e m e ntar un te clado de e s te • Activar l a prim e ra col um na.
tipo e n al guno de nue s tros pro- • Ve rificar fil a a fila e n bus ca de
ye ctos de be m os re al iz ar una un uno (1) l ógico.
rutina de l e ctura pue s alcom par- • Apagar l a prim e ra colum na.
tir pine s e n s u e s tructura inte r- • Re pe tir e lproce dim ie nto con
na, e lm icrocontrol ador no pue - l
as colum nas s iguie nte s .
de dil ucidar por s i s ol o cuale s
la te cla pre s ionada.

Nue s tra rutina com o ya


dijim os e s tá e s crita e n e ll
e ngua-
je Bas ic de PIC Sim ul ator IDE,
aunq ue e s fácil m e nte portabl e a

//página 0x23
Al
lDigital 'Subrutina de l
e ctura de un te cl
ado m atricial4x4.

'Nom bro los pine s q ue ge t_ button:


'conform an las fil
as . boton = 0
Sym bolfila1 = RB0 col 1=1 'Activo l
a prim e ra col
um na.
Sym bolfila2 = RB1 Iffil
a1 = 1 Th e n boton = 1
Sym bolfila3 = RB2 Iffil
a2 = 1 Th e n boton = 5
Sym bolfila4 = RB3 Iffil
a3 = 1 Th e n boton = 9
Iffil
a4 = 1 Th e n boton = 13
'Nom bro los pine s q ue col 1=0
'conform an las col um nas . col 2=1 'Activo l
a s e gunda col
um na.
Sym bolcol 1 = RB4 Iffil
a1 = 1 Th e n boton = 2
Sym bolcol 2 = RB5 Iffil
a2 = 1 Th e n boton = 6
Sym bolcol 3 = RB6 Iffil
a3 = 1 Th e n boton = 10
Sym bolcol 4 = RB7 Iffil
a4 = 1 Th e n boton = 14
col 2=0
'De finición de pue rtos . col 3=1 'Activo l
a te rce ra col
um na.
TRISA = % 00000000 Iffil
a1 = 1 Th e n boton = 3
TRISB = % 00001111 Iffil
a2 = 1 Th e n boton = 7
Iffil
a3 = 1 Th e n boton = 11
'De finición de variabl
es. Iffil
a4 = 1 Th e n boton = 15
Dim boton As Byte col 3=0
col 4=1 'Activo l
a cuarta col
um na.
'Com ie nz a bl
oq ue principal
. Iffil
a1 = 1 Th e n boton = 4
loop: Iffil
a2 = 1 Th e n boton = 8
Gos ub ge t_ button Iffil
a3 = 1 Th e n boton = 12
PO RTA = boton Iffil
a4 = 1 Th e n boton = 16
Goto loop col 4=0
End Re turn 'Fin y re gre s o de s ubrutina

En nue s tro código de e je m -


pl o s im ple m e nte e s cane a-
m os todas l as te cl as , s i s e
e ncue ntra al guna pre s ionada
guarda un val or num érico e n
la variabl e "boton" y l ue go
tras lada e l conte nido de
dich a variabl e dire ctam e nte
alpue rto de s al ida PO RTA.
O bviam e nte l a final idad de l
código e s ve r l a m e cánica de
le ctura de un te cl ado m atri-
cial4x4 para com pre nde rl a,
m odificarla y adaptarl a a un
program a práctico s in m ayo-
re s dificul
tade s .

//página 0x24
s éptim a com pe te ncia
nacionalde robótica
ElGrupo de Robótica y Sim ul ación (GRS) pe rte ne cie nte alDe partam e nto de
Inge nie ría Eléctrica de la Unive rs idad Te cnol
ógica NacionalFacul tad Re gional
Bah ía Bl anca organiz a nue vam e nte uno de l
os e ve ntos m ás im portante s de lpaís :
la "Séptim a Com pe te ncia Nacionalde Robotica".
//por: Grupo de Robótica y Sim ul ación //
com pe te nciarobotica@ frbb.utn.e du.ar

La "Séptim a Com pe - nue s tra nue va pagina w e b cuya


te ncia Nacionalde Robótica" dire cción e s : w w w .grs bah iabl an-
s e re al iz ará e l14 de novie m - ca.com .ar.
bre de l2009 e n l a ciudad de Con re s pe cto a l os re gl a-
Bah ia Bl anca, provincia de m e ntos h e m os tratado de s im pl i-
Bue nos Aire s (Arge ntina). ficarl o alm áxim o dando l ibe rtad
En l a cate goría cas i abs ol uta a l os participante
Sum o e xis te n tre s nive l e s . Una en l a cons trucción de l os robots
es l a l lam ada pol im odale n cual y tam bién durante l a com pe te n-
participan al um nos de l nive l cia pidie ndo s ol am e nte q ue s e
m e dio o s e cundario. La otra e s cum pl a con e lpe s o y m e didas
la l l
am ada l ibre donde partici- e s tipuladas por l a norm a por l o
pan al um nos unive rs itarios , in- tanto no h abrá tol e rancia e n l os
ge nie ros o publ ico e n ge ne raly m is m os e s te año.
por ul tim o e lM ini Sum o donde La ins cripción al ce rta-
pue de n participar todas l as m e n ce rrará e ldía 6 de novie m -
e dade s s ie ndo l os robots de un bre . Aq ue l los participante s q ue
tam año m e nor alSum o Cl ás ico. te ngan dudas s obre s u partici-
Por te rce r año cons e - pación e n e le ve nto s e l e pe dirá
cutivo de s arrol l
are m os l a m oda- q ue s e ins criban igual m e nte
lidad l lam ada ve l ocis ta. La m is - ante de l a fe ch a tope porq ue de
m a cons is te e n una carre ra de otra m ane ra no podrán com pe -
dos robot s e guidore s de l ine a tir. La ins cripción s e ra a través
e n un circuito ce rrado. Elprim e r de nue s tra pagina.
robot q ue de l a cantidad de La com pe te ncia dura un
vue lta as ignada gana l a carre ra. día s ol am e nte y e laño pas ado
Los nue vos re gl am e ntos , s e pre s e ntaron 71 robots e n
fotos y víde os de l a com pe te n- todas l as cate gorías s ie ndo l a
cia e s tarán a s u dis pos ición e n dis tribución m as o m e nos l a

//página 0x26
s iguie nte :

La ins cripción no tie ne


cos to h as ta ah ora. Lo único
q ue s e pide e s pagar un bo-
no para l a ce na de cam ara-
de ría q ue s e h ace te rm inada
la com pe te ncia.
Elde s arrol l
o de lrobot
pue de s e r a través de una
ins titución o e n form a particu-
lar.
Cual q uie r inq uie tud
q ue te ngan no dude n e n e s -
cribir a l os organiz adore s , a
la s iguie nte dire cción de co-
rre o e l e ctrónico: com pe te n-
ciarobotica@ frbb.utn.e du.ar

//página 0x27
brújul
a digitalde pre cis ión
con s e ns or de e fe cto h al
l
Elfís ico Edw in H al lde s cubrió (por cas ual
idad) e le fe cto q ue l
le va s u nom bre e n e l
año1879 . De s de e ntonce s h an pas ado m uch os años y s e h an de s arrol lado
m últiple s s e ns ore s q ue aprove ch an e s te fe nóm e no. H acie ndo us o de e l l
os
podre m os cons truir una brújul a digitalde gran pre cis ión.
//por: Pabl o //
q uick bas ic@ te rra.e s

Ele fe cto H al ls e m ani- s ie ndo m uy poca cos a para


fie s ta e n l a te ns ión trans ve r- nue s tro propós ito, ya q ue e l
s alq ue apare ce e n un conduc- cam po m agnético de l a tie rra,
tor cuando e s tá s om e tido a q ue e s e lim án q ue q ue re m os
un cam po m agnético. Por e - m e dir, e s tan débilcom o apro-
je m pl o, s i te ne m os un cabl e xim adam e nte 0.5 Gaus s .
conducie ndo corrie nte y l e En nue s tro cas o util
iz are -
pone m os un vol tím e tro s e ns i- m os un s e ns or 1321 de l a
bl e e ntre dos puntos trans ve r- com pañía Al l
e gro, q ue a s u
s al e s , alace rcar un im án s e s al ida nos e ntre ga una varia-
podría m e dir una pe q ue ñís i- ción m áxim a e ntre l os pol os
m a te ns ión. Es to e s de bido a norte y s ur de tan s ólo 2.5m V.
q ue l os e le ctrone s q ue pas an
por e lcabl e s e ve rán de s pl a-
z ados h acia un l ado e n pre -
s e ncia de l im án. Entonce s Es e vide nte q ue s i q ue re -
apare ce una dife re ncia de te n- m os conve rtir l a te ns ión anal ó-
s ión e ntre e s os dos puntos gica q ue ofre ce e ls e ns or a una
de lcabl e . Als e parar e lim án, s e ñal digital h ay q ue e fe ctuar
la te ns ión trans ve rs alde s apa- un proce s o de am pl ificación.
re ce . Com o ya dijim os ante rior-
Para pode r m e dir e s ta m e nte , e ls e ns or 1321 e ntre ga
te ns ión trans ve rs ale s ne ce s ario por s u pin "O UT" 2,5V cuando
am pl ificarla, porq ue s u val or e s e s tá e n e s tado de re pos o, e s
m uy re ducido. En e l m e rcado de cir s in l a pre s e ncia de un
h ay s e ns ore s de e fe cto h al l cam po m agnético e n s us al re -
line al e s q ue inte gran un am pl ifi- de dore s . Pe ro cuando e l pol o
cador y al canz an s e ns ibil
idade s norte de un im án e s ace rcado a
de 5m V por Gaus s . Es to s igue él ,l a s alida variará proporcional -

//página 0x29
m e nte de 2,5V h acia l a
te ns ión de fue nte y s i dam os
vue l ta e lim án, e nfre ntándol o
alpol o s ur, l a s al ida bajará
de 2,5Va nive lde m as a.
Aprove ch ando e s to y
para aum e ntar l a s e ns ibil i-
dad al dobl e m ontare m os
dos s e ns ore s opue s tos , uno
e nfre ntado a otro.
Si l e ace rcam os al
m ontaje e l pol o norte de l
im án, un de l os s e ns ore s s u-
birá 1V por e ncim a de lnive l
de re pos o ( 2,5V) y e lotro
bajará 1V por de bajo de h ora de conve rtir l a s e ñalde Por e je m pl o con una re s is -
dich o nive l . Por lo tanto te ne - anal ógica a digital . Por e s o te ncia de 360 oh m s s e
m os un s e ns or q ue e ntre ga us am os e l am pl ificador de cons igue una am pl ificación
3,5V y e lotro 1,5. Si e nton- ins trum e ntación INA122, de de 560 ve ce s l a te ns ión
ce s cone ctam os un vol tím e - m uy bajo ruido y "railto rail ". e ntrante . Por l o q ue l os 5m V
tro e ntre s us dos s al idas Es te ch ip de pre cis ión s e de lcam po m agnético te rre s -
"O UT" te ndre m os una dife - s ue l e us ar para am pl ificar tre s acarían 2'8 vol tios por e l
re ncia s um ada de 2V (ve r las m ínim as te ns ione s corpo- pin "O UT" de lINA122. Con
figura 1). ral e s para e q uipos de e l e ctro- e s tas ganancias e lruido e s
Con e s te arre gl ol ogra- cardiogram as y e nce fal ogra- cons ide rabl e y h ay q ue
m os m ul tiplicar l a s e ns ibil i- m as . Es m uy fácilde m ontar filtrarlo con capacitore s para
dad por 2: ah ora 1 Gaus s ya q ue s ól o ne ce s ita una lograr al go le gible . Elorige n
s e rán 10m V. Pe ro com o e l re s is te ncia e xte rna para de - de e s te ruido captado por l os
cam po m agnético de l a Tie - cirl e q ue ganancia ne ce s ita- s e ns ore s h al l e s un te m a
rra produce 5m V, todavía m os . m uy inte re s ante , pe ro para
re s ulta ins uficie nte para ata- Si m iram os l a h oja de otra ocas ión.
car un conve rs or anal ógico / datos e ncontrare m os una for-
digital . Te ndre m os q ue am pl i- m ul a para cal cul ar l a re s is -
ficar e s ta s e ñalm uch o m ás . te ncia q ue configura l a ga-
nancia de lam pl ificador:
En un conve rs or A/D de 10
(200.000 /R) + 5 = Ganancia bits (1023 puntos de re s ol
u-

Para e s te tipo de
apl icacione s l os am pl ificado-
re s ope racional e s (tipo LM -
358) re s ul tan ine ficace s ,
introduce n de m as iado ruido
y no s on "rail to rail ", q ue
q uie re de cir q ue no e ntre gan
e n s u s al ida una te ns ión
m áxim a de 5V y m ínim a de
0, s ino q ue s u rango dinám i-
co e s bas tante m e nor, l o q ue
nos trae rá probl e m as a l a

//página 0x2A
ción) con una te ns ión de
re fe re ncia de 5V, l a s alida de
2,8V de lINA122 e q uival e a
una variación de 572 puntos .
Al girar 360º varias
ve ce s e lm ontaje s e obtie ne
una gráfica com o l a de l a
figura 3. Se trata de una
función SENO . Con un s e n-
s or s ol am e nte te ne m os una
coorde nada: l a X, o e ls e no.
Te ne m os q ue util iz ar otro
s e ns or cruz ado a 9 0 grados
para obte ne r e l e je Y, e l
cos e no (ve r figura 2).
Ah ora bie n, con dos
s e ns ore s cruz ados y s i gira-
m os e lm ontaje varias vue l -
tas com pl e tas de 360 gra-
dos , ve re m os dos s e ñal es
com o l as de l a figura 4.
El de s fas e e ntre am -
bas gráficas coincide con l os
9 0º. Inte rpol ando am bas m e -
didas X e Y, y girando e l
m ontaje 360 grados , obte n-
dre m os una bonita gráfica de
puntos com o e s ta l a de l a
figura 5. Se trata de un cír-
cul o pe rfe cto, función de l
s e no y e lcos e no ge ne rados
por e lcam po m agnético te -
rre s tre . Cabe acl arar q ue l as
im pe rfe ccione s q ue s e ve n
s on de bidas a m ovim ie ntos
inde bidos a l a h ora de l os
e ns ayos con e lcircuito re al .

Las s e ñal
e s obte nidas
por e l circuito tie ne n una
am pl itud de 572 puntos , con
e s to pode m os cal cul
ar la pre - 360 grados /179 6 puntos = 0,2 función arco-tange nte para
cis ión q ue te ndrá nue s tra grados de re s ol
ución obte ne r de e s ta gráfica cir-
brújul a as í: cular un angul o e ntre 0 y 360
grados :
572 x 3.1416 = 179 6 puntos de
circunfe re ncia totalde lcírcul
o
Ah ora unas e cuacione s con

//página 0x2B
' ------(vol
ts e s e le je X , vol
ts 1 e s e le je Y)---- Ate nción: para q ue e s to
funcione , h ay q ue ajus tar e l
Ifvol ts = 0 And vol ts 1 > 0 Th e n angul
o = 270 ce ntro de l "círcul o" e n l as
Ifvol ts = 0 And vol ts 1 < 0 Th e n angul
o=90 coorde nadas 0,0. Es to pue -
Ifvol ts > 0 And vol ts 1 > 0 Th e n angul
o = 360 - (Atn(vol ts 1 / de s h ace rlo s im ple m e nte re s -
volts ) * (180 /3.1416)) tando o s um ando e l val or
Ifvol ts > 0 And vol ts 1 < 0 Th e n angul
o = -(Atn(vol ts 1 /vol ts ) * ade cuado a X e Y e n e l
(180 /3.1416)) program a. Con e s to ya te n-
Ifvol ts < 0 Th e n angul o = 180 - (Atn(vol
ts 1 /volts ) * (180 / dre m os una bonita l e ctura
3.1416)) digital e n grados , con una
pre cis ión m ayor de 1 grado.
printangul
o Sol o re s ta arm ar al guna
inte rface atractiva e n Vis ual
'------------------------------------------------------------------ Bas ic o s im ilar para us ar con
nue s tro h ardw are .

Se ns or h al lAlle gro 1321 (4)


Circuito inte grado INA122 (2)
Re s is te ncia 47 k oh m s (4)
Re s is te ncia 360 oh m s (2)
Capacitor 4,7 uF (2)
Capacitor 100 nF (1)

//página 0x2C
¡un PIC e n tu TV!
¿Al guna ve z , com o parte de al guno de tus proye ctos , h as ne ce s itado m os trar
al guna inform ación e n l a pantal l
a de un te l e vis or? Es pos ibl
e q ue s i. Pe ro e l
h ardw are y e ls oftw are ne ce s arios para e s te tipo de proye cto no e s fácilde
de s arrol l
ar. Sin e m bargo, ah ora podrás h ace rlo. Es te artícul
o te m os trará cóm o
conve rtir un PIC18 e n un ge ne rador PAL de graficos y te xtos (e n bl anco y ne gro)
con un núm e ro m uy re ducido de com pone nte s de bajo cos to, con un m ínim o de
e s fue rz o de program ación.
//por: Bruno Gavando //
bruno.gavand@ ad-valore m .fr

¿Por q ue una bibl iote ca q ue s e h a m ape ado e n m e m o-


PAL para PICs ? Si e s tás util i- ria, s ól o un PIC con s uficie nte
z ando PICs , pos ibl e m e nte m e m oria RAM pue de util iz ar
al gun día inte ntas te cons truir e s ta l ibre ría. Es por e l l
o q ue l a
un dis pos itivo proce s ador de PIC PAL Vide o Library s ól o
víde o, ya s e a para dive rtirs e o funciona con l a fam il ia PIC18.
com o parte de un proye cto ElPIC de be funcionar a
m ás grande . Si inte ntas te ge - 32M H z , con un cris talde 8M H z ,
ne rar s e ñal e s de víde o, pos i- para pode r obte ne r l os 64µ s
bl e m e nte h ayas vis to al guna ne ce s arios para l a s incroniz a-
de e s tas páginas w e b: Ri- ción h oriz ontalde ls is te m a PAL.
ck ard Gune e s PIC PO NG y La l ibre ría ge ne ra una s e -
Eric Sm ith víde o re l oj. ñalPAL de 625 l íne as inte rl
az a-
Es tos proye ctos s on di- das , y pue de m os trar h as ta 248
ve rtidos , pe ro dificile s de util iz ar líne as ve rtical e s de 128 pixe l es.
com o un ge ne rador de vide o de Cual q uie r dis pos itivo con una
carácte r ge ne ral , q ue pe rm ita e ntrada PAL de vide o com pue s -
util iz ar un TV com o s i fue s e una to pue de e m pl e ars e para m os -
pantal la GLCD. trar l as im age ne s ge ne radas
H e te nido l a ide a de uti- por e lPIC.
liz ar una e s cal e ra de re s is tore s Dado q ue e lm ane jo de
com o una form a rápida y barata los tie m pos e s crítico, e ls oftw a-
cde cre ar un conve rtidor digital re s e h a e s crito e n C con al gu-
a anal ógico, y com e nz ado a nas rutinas e n e ns am bl ador. El
trabajar e n e ls oftw are . C util iz ado e s e lm ik roC, y pue -
de s de s cargar e lproye cto com -
pl e to (incl uido e lcódigo fue nte ).
La l ibre ría contie ne m u-
Com o l
a pantal
la de víde o ch as funcione s as i q ue e xpl ica-

//página 0x2E
re m os e lus o de cada una de
el l
as .
Prototipo: void PAL_ init(uns igne d ch ar y)
Parám e tros : y : núm e ro de l
ine as ve rtical
e s , h as ta 128.
De vue l
ve : Nada
Es ta función pre para
la l ibre ría PIC PAL. Cuanto Re q uie re : Elfich e ro PAL_ library.h de be s e r incl
uido
m ayor s e a l a cantidad de e n e lcodigo fue nte de lus uario. ElPIC18
line as ve rticale s q ue de s e e s de be funcionar a 32M H z .
m os trar e n e lTV, m e nor s e rá Eje m pl
o: PAL_ init(128);
la cantidad de m e m oria y de
re curs os q ue e l PIC te nga
para e lre s to de lprogram a.
Es ta l ibre ría tom a e lcontrol Prototipo: void PAL_ control (uns igne d ch ar s t,
de lTIM ER0 y s us inte rrupcio- uns igne d ch ar rd)
ne s as ociadas . Tam bién util i-
Parám e tros : s t: Controlde l a s incroniz ación PAL.
z a e lPO RTD.
PAL_ CNTL_ START : Com ie nz a s incroniz a-
ción PAL.
PAL_ CNTL_ STO P : De tie ne l a s incroniz a-
ción PAL(l ibe ra los re curs os de lPIC).
Es ta función control a
rd : Controlde re nde r PAL_ CNTL_ BLANK :
la ge ne ración de l a s e ñalde
Sol o s e m ue s tran l os borde s (libe ra parte
vide o. Cuando com ie nz a l a
de l os re curs os de lPIC).
s incroniz ación PAL, l a varia-
PAL_ CNTL_ RENDER : M ue s tra todo e l
bl e PAL_ fram e Ctr (uns igne d
vide o, con borde s e im age n (cons um e m ás
long gl obal ) s e incre m e nta
re curs os de lPIC).
25 ve ce s por s e gundo.
De vue l
ve : Nada
Re q uie re : La e je cución pre via de PAL_ init();
Es ta función l le na la Eje m pl
o: PAL_ control
(PAL_ CNTL_ START,
pantal l
a con un patrón de te r- PAL_ CNTL_ RENDER);
m inado. Util
iz a 0x00 para l im -
piar la pantal la y 0xFF para
pintarla com pl e tam e nte de
blanco. Prototipo: void PAL_ fil
l(uns igne d ch ar c)
Parám e tros : c : Patrón de re l
le no
De vue l
ve : Nada
Re q uie re : La e je cución pre via de PAL_ init();
Es ta función cam bia
e lcol or de lborde q ue rode a Eje m pl
o: PALL_ fil
l(0);
la im age n.

Es ta e s l
a función q ue
pe rm ite dibujar un punto e n
una pos ición de te rm inada de
l
a pantal la.

//página 0x2F
Prototipo: void PAL_ s e tBorde r(uns igne d ch ar borde r)
Es ta función dibuja u-
Parám e tros : borde r : PAL_ CO LO R_ BLACK o na l ine a de s de (x0, y0) a (x1,
PAL_ CO LO R_ W H ITE y1).
De vue l
ve : Nada
Re q uie re : La e je cución pre via de PAL_ init();
Eje m pl
o: PAL_ borde r(PAL_ CO LO R_ BLACK ); Es ta función dibuja un
circul
o con ce ntro e n (x,y) y
radio z .

Prototipo: void PAL_ s e tPixe l(ch ar x, ch ar y, uns igne d


ch ar m ode )
Parám e tros : x : colum na de lpixe l , de 0 a 127 Es ta función dibuja (y
y : Fil
a de lpixe l, de 0 a num e ro de l ine as -1 pinta) un re ctángul
o.
m ode : col or de lpixe l, PAL_ CO LO R_ BLA-
CK , PAL_ CO LO R_ W H ITE o PAL_ CO LO R_ -
REVERSE
De vue l
ve : Nada Es ta función dibuja un
Re q uie re : La e je cución pre via de PAL_ init(); re ctángulo vacío.

Eje m pl
o: PAL_ s e tPixe l
(10, 20, PAL_ CO LO R_ RE-
VERSE);

Es ta función e s cribe
un caracte r de te xto e n l
a fil
a
Prototipo: void PAL_ l ine (ch ar x0, ch ar y0, ch ar x1, y col um na de s e ada. Pue de s
ch ar y1, uns igne d ch ar m ode ) us ar PAL_ box() para e s cribir
e n vide o inve rtido.
Parám e tros : x0, y0 : Coorde nadas (fil a y col
um na) de l
com ie nz o de lal ine a.
x1, y1 : Coorde nadas (fil a y col
um na) de l
finalde l aline a.
m ode : col or de lpixe l , PAL_ CO LO R_ BLA- Es ta función e s cribe
CK , PAL_ CO LO R_ W H ITE o PAL_ CO LO R_ - una cade na de te xto a partir
REVERSE. de l
a fil
a y col
um na de s e ada.
De vue l
ve : Nada
Re q uie re : La e je cución pre via de PAL_ init();
Eje m pl
o: PAL_ line (0, 0, 127, 127, PAL_ CO LO R_ -
W H ITE);
Es ta función e s cribe
una cade na de te xto a partir
de la fil
a y col um na de s e ada.
Es iguala l a funcion ante rior,
pe ro para te xtos alm ace nad-
os e n RO M .

//página 0x30
Prototipo: void PAL_ circl e (ch ar x, ch ar y, ch ar r,
uns igne d ch ar m ode )
Dibuja una im age n
Parám e tros : x : Colum na de lce ntro de lcircul o.
(BitM ap) pre viam e nte al m a-
y : Fil
a de lce ntro de lcircul o.
ce nado e n l a RO M y apun-
r : Radio de lcircul o.
tado por bm , e n l a pos ición
m ode : col or de lpixe l, PAL_ CO LO R_ BLA-
(x, y). La im age n s e rá m ono-
CK , PAL_ CO LO R_ W H ITE o PAL_ CO LO R_ -
crom a, y pue de util iz ars e l a
REVERSE
h e rram ie nta para ge ne rar
De vue l
ve : Nada
m apas de bits para GLCD
Re q uie re : La e je cución pre via de PAL_ init(); T69 63 de m ik roEl e k tronik a
para conve rtir las im age ne s .
Eje m pl
o: PAL_ circl
e (30, 30, 5, PAL_ CO LO R_ W H I-
TE);

Es ta función no pue de
serl l am ada dire ctam e nte por
Prototipo: void PAL_ box(ch ar x0, ch ar y0, ch ar x1,
e lus uario, pe rode be s e r col o-
ch ar y1, uns igne d ch ar m ode )
cada de ntro de l a función
Parám e tros : x0, y0 :Coorde nadas de l a e s q uina s upe rior inte rrupt(). Ate nción: s i e s tán
iz q uie rda. h abil itadas , otras inte rrupcio-
x1, y1 :Coorde nadas de l a e s q uina infe rior ne s pue de ocas ionar probl e-
de re ch a. m as de s incronis m o e n e l
m ode : col or de lpixe l
, PAL_ CO LO R_ BLA- vide o.
CK , PAL_ CO LO R_ W H ITE o PAL_ CO -
LO R_ REVERSE
De vue l
ve : Nada
Re q uie re : La e je cución pre via de PAL_ init();
Eje m pl
o: PAL_ box(10, 10, 30, 30, PAL_ CO LO R_ -
W H ITE);

Prototipo: void PAL_ re ctangl e (ch ar x0, ch ar y0, ch ar


x1, ch ar y1, uns igne d ch ar m ode )
Parám e tros : x0, y0 :Coorde nadas de l a e s q uina s upe rior
iz q uie rda.
x1, y1 :Coorde nadas de l a e s q uina infe rior
de re ch a.
m ode : col or de lpixe l
, PAL_ CO LO R_ BLA-
CK , PAL_ CO LO R_ W H ITE o PAL_ CO LO R_ -
REVERSE
De vue l
ve : Nada
Re q uie re : La e je cución pre via de PAL_ init();
Eje m pl
o: PAL_ re ctangl
e (10, 10, 30, 30, PAL_ CO -
LO R_ W H ITE);

//página 0x31
Prototipo: void PAL_ ch ar(uns igne d ch ar x, uns igne d ch ar y, uns igne d ch ar c, uns igne d
ch ar s iz e )
Parám e tros : x : Col um na de lpixe ls upe rior iz q uie rdo de lcaracte r, de 0 to 127
y : Fil a de lcaracte r, de 0 a num e ro de l ine as -1
c : Código ASCII de lcaracte r.
s iz e : Elnibble alto e s e lm ultiplicador de l a al
tura, e lbajo m ultipl
ica e lanch o.
Tam años pre de finidos : PAL_ CH AR_ STANDARD, PAL_ CH AR_ DW IDTH ,
PAL_ CH AR_ DH EIGH T, PAL_ CH AR_ DSIZ E
De vue l
ve : Nada
Re q uie re : La e je cución pre via de PAL_ init();
Eje m pl
o: PAL_ ch ar(3, 5, 'A', PAL_ CH AR_ DSIZ E);

Prototipo: void PAL_ w rite (uns igne d ch ar l ig, uns igne d ch ar col , uns igne d ch ar *s ,
uns igne d ch ar s iz e )
Parám e tros : lig : Line a de lte xto
col: Col um na de lte xto
s : Punte ro a l a cade na de te xto (te rm inado e n NULL)
s iz e : Elnibble al to e s e lm ul
tiplicador de l a altura, e lbajo m ul tipl
ica e lanch o.
Tam años pre de finidos : PAL_ CH AR_ STANDARD, PAL_ CH AR_ DW IDTH ,
PAL_ CH AR_ DH EIGH T, PAL_ CH AR_ DSIZ E
De vue l
ve : Nada
Re q uie re : La e je cución pre via de PAL_ init();
Eje m pl
o: PAL_ w rite (0, 5, m yString, PAL_ CH AR_ STANDARD);

Prototipo: void PAL_ cons tW rite (uns igne d ch ar l ig, uns igne d ch ar col
, cons tuns igne d
ch ar *s , uns igne d ch ar s iz e )
Parám e tros : lig : Line a de lte xto
col: Col um na de lte xto
s : Punte ro a l a cade na de te xto (te rm inado e n NULL)
s iz e : Elnibbl e alto e s e lm ul tipl
icador de la altura, e lbajo m ul
tiplica e lanch o.
Tam años pre de finidos : PAL_ CH AR_ STANDARD, PAL_ CH AR_ DW IDTH ,
PAL_ CH AR_ DH EIGH T, PAL_ CH AR_ DSIZ E
De vue l
ve : Nada
Re q uie re : La e je cución pre via de PAL_ init();
Eje m pl
o: PAL_ w rite (0, 5, m yCons tantString, PAL_ CH AR_ STANDARD);

//página 0x32
Prototipo: void PAL_ picture (uns igne d ch ar x, uns igne d ch ar y, cons tuns igne d ch ar
*bm , uns igne d ch ar s x, uns igne d ch ar s y)
Parám e tros : x : colum na de lpixe ls upe rior iz q uie rdo de la im age n.
y : fil
a de lpixe ls upe rior iz q uie rdo de l
a im age n.
bm : Punte ro albitm ap e n RO M
s x : Anch o de la im age n.
s y : Alto de l
a im age n.
De vue l
ve : Nada
Re q uie re : La e je cución pre via de PAL_ init();
Eje m pl
o: PAL_ picture (0, 0, pict, 128, 128);

La im age n s iguie nte Prototipo: void PAL_ ISR()


m ue s tra e le s q ue m a e l
e ctri- Parám e tros :
co de lh ardw are propue s to. De vue l
ve : Nada
Elcoraz ón de lcircuito Re q uie re : La e je cución pre via de PAL_ init();
e s un PIC18F4620. C1, C3 y
C4 s on conde ns adore s de Eje m pl
o: void inte rrupt(void)
de s acopl e . El PIC funciona {
con un cris talde 8 M H z . D1 PAL_ ISR();
s e utiliz a com o un s e ns or de }
te m pe ratura cone ctado al

//página 0x33
conve rs or anal ogico digital
de lPIC. La s e ñalde vide o
s e obtie ne de l os re s is tore s
R8 y R9 . Los pul s adore s s e
e m pl e an para configurar e l
s oft.
La s e ñal de s al ida
pue de apl icars e dire ctam e n-
te a l a e ntrada de vide o
com pue s to de un aparato de
TV.

Els iguie nte program a


s irve de e je m pl o de com o
pue de s util iz ar las funcione s
incl uidas e n l a PIC PAL
Library.
En un PIC18F4620 uti-
liz a s olam e nte e l25% de l a
RO M y e l55% de l a RAM !
La prim e r pantal la de l
program a m ue s tra una im a-
ge n de 128x128 pixe l e s , con
un borde parpade ante . El
program a e s pe ra a q ue s e
pul se l a te cl a cone ctada a
RB7 para m os trar l a s e gun-
da pantal la.
La s e gunda pantal l
a
m ue s tra un re l oj-cale ndario y
la te m pe ratura. La h ora s e
m ue s tra s im ul tane am e nte e n
form a digitaly anal ógica.
RB0 cam bia l os m inu-
tos , RB1 l as h oras , RB2 e l
día, RB3 e lm e s y RB4 e l
año. RB5 pe rm ite ajus tar l a
te m pe ratura. Pre s ionando
RB7 junto a l as ante riore s op-
cione s , l os val ore s de cre - Elarch ivo z ip contie ne :
m e ntan e n l ugar de incre -
m e ntars e . PAL_ l ibrary.c, 37 K b : Código fue nte de l al ibre ria
PAL_ l ibrary.h , 2 K b : De finicione s de lal ibre ria
PALde m o.c, 15 K b : Código de le je m pl o
PALde m o.e e d, 1 K b : De finición de l a EEPRO M
Pue de s de s cargar e l PALde m o.h e x, 46 K b : Arch ivo H EX fpara e lPIC18F4620
proye cto com pl e to, incl uido PALde m o.ppc, 2 K b : m ik roC proje ct
e lcodigo fue nte de s de aq uí. picture s .h , 9 K b : bitm ap de e je m pl
o

//página 0x34
/*
* file : PALde m o.c
* proje ct : PIC PALSO FTW ARE VIDEO GENERATO R DEM O
* auth or : Bruno Gavand
* com pil e r : m ik roC V6.2
* date : January 17, 2006
*
* de s cription :
* Th is program dis pl ays a cl ock , a cale ndar and th e te m pe rature on a TVs cre e n
* and s h ow s h ow to us e th e PIC PALl ibrary.
* pre s s RB7 to s k ip th e w e lcom e s cre e n
* to adjus tclock and cal e ndar, pre s s :
* RB0 to adjus tm inute
* RB1 to adjus th our
* RB2 to adjus tday
* RB3 to adjus tm onth
* RB4 to adjus tye ar
* RB5 to adjus tte m pe rature
* pre s s RB7 atth e s am e tim e to de cre m e nt.
*
* targe tde vice :
* PIC18F4620 @ 32 M h z (8 M h z crys tal+ H S PLL)
*
* Lice nce :
* Fe e lfre e to us e th is s ource code atyour ow n ris k s .
*
* h is tory :
* cre ate d january 2007
*
* s e e m ore de tail s on h ttp://w w w .m icro-e xam pl e s .com /
*/

#incl
ude "PAL_ Library.h "
#incl
ude "picture s .h "

/*************
* DEFINITIO NS
*************/

/*
* graph ic cl
ock
*/
#de fine CLK _ CENTER_ X 9 0 //ce nte r
#de fine CLK _ CENTER_ Y 60
#de fine CLK _ RADIUS_ PSS 28 //clock radius
#de fine CLK _ RADIUS_ SS 25 //s e conds
#de fine CLK _ RADIUS_ M N 20 //m inute s
#de fine CLK _ RADIUS_ H H 15 //h ours

#de fine DEG_ NBH ISTO 16 //num be r ofte m pe rature s am pl


es

//página 0x35
/*
* num be r ofve rticalpixe l s
* from 1 to 128 incl ude d
* th e m ore pixe ls you h ave :
* - th e l
e s s RAM you h ave
* - th e l
e s s M CU tim e you h ave
*/
#de fine PAL_ Y 128

/*
* s im pl
e tim e s tructure de finition
*/
type de fs truct
{
uns igne d ch ar s s ; //s e conds
uns igne d ch ar m n ; //m inute s
uns igne d ch ar h h ; //h ours
uns igne d ch ar m d ; //day in m onth , from 1 to 31
uns igne d ch ar w d ; //day in w e e k , m onday=0, tue s day=1, .... s unday=6
uns igne d ch ar m o ; //m onth num be r, from 1 to 12
//(and notfrom 0 to 11 as w ith unix C tim e !)
uns igne d int yy ; //ye ar Y2K com pl iant, from 189 2 to 2038
}Tim e Struct;

/********************
* RO M CO NSTANTS
********************/

/*
* m onth nam e s
*/
cons tuns igne d ch ar m onth Str[13][4] =
{
"???", "Jan", "Fe b", "M ar", "Apr", "M ay", "Jun", "Jul
", "Aug", "Se p", "O ct", "Nov", "De c"
};

/*
* day ofw e e k nam e s
*/
cons tuns igne d ch ar w Days tr[7][4] =
{
"M on", "Tue ", "W e d", "Th u", "Fri", "Sat", "Sun"
};

/********************
* RAM VARIABLES
********************/

/*
* s cre e n m e m ory m ap

//página 0x36
* do notch ange th is l
ine !
*/
uns igne d ch ar PAL_ s cre e n[PAL_ X * PAL_ Y /8] ;

/*
* ge ne ralpurpos e s tring
*/
uns igne d ch ar s tr[20] ;

ch ar de gRe f; //DAC te m pe rature re fe re nce


ch ar de gH is to[DEG_ NBH ISTO ] ; //te m pe rature s am pl
e s buffe r
ch ar tIdx = 0 ; //te m pe rature s am pl e s inde x

uns igne d l
ong s e cO ffs e t= 0 ; //re fe re nce tim e s tam p
uns igne d l
ong ol dCtr = 0 ; //fram e counte r back up
Tim e Struct ts ; //tim e s truct

/*************************
* FUNCTIO NS
*************************/

/*
* adjus ttim e s tructm e m be r
*/
void adjus t(uns igne d ch ar *v, uns igne d ch ar m in, uns igne d ch ar m ax)
{
if(PO RTB.F7)
{
if(*v == m in) *v = m ax ;
el s e (*v)-- ;
}
el se
{
if(*v == m ax) *v = m in ;
el s e (*v)+ + ;
}
}

/*
* conve rtval ue v into s tring pointe d to by p, l
e ading z e ro bl
ank s ifblk is s e t
*/
void ch ar2s tr(uns igne d ch ar *p, uns igne d ch ar v, uns igne d ch ar blk)
{
*p = v /10 + '0' ;
if(blk & & (*p == '0'))
{
*p = ' ' ;
}
p+ + ;
*p = v % 10 + '0' ;

//página 0x37
p+ + ;
*p = 0 ;
}

/*
* draw s cre e n w ith de coration iffullis s e t, us ing vide o m ode m ode
*/
void draw Scre e n(uns igne d ch ar ful l
, uns igne d ch ar m ode )
{
s tatic uns igne d ch ar os x = CLK _ CENTER_ X, os y = CLK _ CENTER_ Y,
om x = CLK _ CENTER_ X, om y = CLK _ CENTER_ Y,
oh x = CLK _ CENTER_ X, oh y = CLK _ CENTER_ Y ;
uns igne d int i ;
int t;
uns igne d ch ar s s ;
uns igne d ch ar s x, s y, m x, m y, h x, h y ;

PAL_ control
(PAL_ CNTL_ START, m ode ) ;

if(ful
l) //draw ful ls cre e n w ith de coration
{
PAL_ fill
(0) ;
PAL_ cons tW rite ( 0, 0, "\xC9 \xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\
xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xBB", PAL_ CH AR_ STANDARD) ;
PAL_ cons tW rite ( 1, 0, "\xBA PALLIBRARY DEM O \xBA", PAL_ CH AR_ STANDARD) ;
PAL_ cons tW rite ( 2, 0, "\xC8\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\
xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xBC", PAL_ CH AR_ STANDARD) ;

PAL_ box(0, 0, 127, 21, PAL_ CO LO R_ REVERSE) ;

PAL_ cons tW rite ( 3, 0, "\xC9 \xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCB\xCD\xCD\


xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xBB", PAL_ CH AR_ STANDARD) ;
PAL_ cons tW rite ( 4, 0, "\xBA \xBA \xBA", PAL_ CH AR_ STANDARD) ;
PAL_ cons tW rite ( 5, 0, "\xBA \xBA \xBA", PAL_ CH AR_ STANDARD) ;
PAL_ cons tW rite ( 6, 0, "\xBA \xBA \xBA", PAL_ CH AR_ STANDARD) ;
PAL_ cons tW rite ( 7, 0, "\xBA \xBA \xBA", PAL_ CH AR_ STANDARD) ;
PAL_ cons tW rite ( 8, 0, "\xBA \xBA \xBA", PAL_ CH AR_ STANDARD) ;
PAL_ cons tW rite ( 9 , 0, "\xBA \xBA \xBA", PAL_ CH AR_ STANDARD) ;
PAL_ cons tW rite (10, 0, "\xBA \xBA \xBA", PAL_ CH AR_ STANDARD) ;
PAL_ cons tW rite (11, 0, "\xCC\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCA\xCD\xCD\
xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xB9 ", PAL_ CH AR_ STANDARD) ;
PAL_ cons tW rite (12, 0, "\xBA \xBA", PAL_ CH AR_ STANDARD) ;
PAL_ cons tW rite (13, 0, "\xBA \xBA", PAL_ CH AR_ STANDARD) ;
PAL_ cons tW rite (14, 0, "\xBA \xBA", PAL_ CH AR_ STANDARD) ;
PAL_ cons tW rite (15, 0, "\xC8\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\
xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xBC", PAL_ CH AR_ STANDARD) ;

PAL_ w rite (4, 3, "H :", PAL_ CH AR_ DH EIGH T) ;

PAL_ cons tW rite (12, 3, "TEM P. : ", 0x31) ;

//página 0x38
PAL_ cons tW rite (12, 17, "\xf8C", 0x31) ;

for(s s = 0 ;s s < 60 ;s s + + )
{
s x = CLK _ CENTER_ X - (cos E3(9 0 + 6 * s s ) * CLK _ RADIUS_ PSS) /1000 ;
s y = CLK _ CENTER_ Y - (s inE3(9 0 + 6 * s s ) * CLK _ RADIUS_ PSS) /1000 ;

PAL_ s e tPixe l
(s x, s y, PAL_ CO LO R_ W H ITE) ;

if((s s % 5) == 0)
{
PAL_ s e tPixe l
(s x + 1, s y, PAL_ CO LO R_ W H ITE) ;
PAL_ s e tPixe l
(s x - 1, s y, PAL_ CO LO R_ W H ITE) ;
PAL_ s e tPixe l
(s x, s y + 1, PAL_ CO LO R_ W H ITE) ;
PAL_ s e tPixe l
(s x, s y - 1, PAL_ CO LO R_ W H ITE) ;
}
}
}

if(PAL_ fram e Ctr > O l


dCtr) //it's tim e to update th e cl
ock & cal
e ndar
{
uns igne d ch ar h ;

ol
dCtr = PAL_ fram e Ctr + 24 ; //pre pare ol
dCtr for ne xtupdate tim e

//conve rttim e s tam p to date and tim e


Tim e _ Epoch ToDate (s e cO ffs e t+ PAL_ fram e Ctr /25, & ts ) ;

/*
* draw anal
og cl
ock
*/
s x = CLK _ CENTER_ X - (cos E3(9 0 + 6 * ts .s s ) * CLK _ RADIUS_ SS) /1000 ;
s y = CLK _ CENTER_ Y - (s inE3(9 0 + 6 * ts .s s ) * CLK _ RADIUS_ SS) /1000 ;

m x = CLK _ CENTER_ X - (cos E3(9 0 + 6 * ts .m n) * CLK _ RADIUS_ M N) /1000 ;


m y = CLK _ CENTER_ Y - (s inE3(9 0 + 6 * ts .m n) * CLK _ RADIUS_ M N) /1000 ;

h = (ts .h h % 12) * 5 + (ts .m n /8) ;


h x = CLK _ CENTER_ X - (cos E3(9 0 + 6 * h ) * CLK _ RADIUS_ H H ) /1000 ;
h y = CLK _ CENTER_ Y - (s inE3(9 0 + 6 * h ) * CLK _ RADIUS_ H H ) /1000 ;

if((h x != oh x) || (h y != oh y))
{
PAL_ l ine (CLK _ CENTER_ X, CLK _ CENTER_ Y, oh x, oh y,
PAL_ CO LO R_ BLACK ) ;
}
if((m x != om x) || (m y != om y))
{

//página 0x39
PAL_ l
ine (CLK _ CENTER_ X, CLK _ CENTER_ Y, om x, om y, PAL_ CO LO R_ BLACK ) ;
}
if((s x != os x) || (s y != os y))
{
PAL_ l ine (CLK _ CENTER_ X, CLK _ CENTER_ Y, os x, os y,
PAL_ CO LO R_ BLACK ) ;
}
PAL_ l ine (CLK _ CENTER_ X, CLK _ CENTER_ Y, h x, h y, PAL_ CO LO R_ W H ITE) ;
PAL_ l ine (CLK _ CENTER_ X, CLK _ CENTER_ Y, m x, m y, PAL_ CO LO R_ W H ITE) ;
PAL_ l ine (CLK _ CENTER_ X, CLK _ CENTER_ Y, s x, s y, PAL_ CO LO R_ W H ITE) ;

/*
* printdate and tim e
*/
ch ar2s tr(s tr, ts .s s , 0) ;
PAL_ w rite (4, 7, s tr, PAL_ CH AR_ DH EIGH T) ;

ch ar2s tr(s tr, ts .m n, 0) ;


PAL_ w rite (4, 4, s tr, PAL_ CH AR_ DH EIGH T) ;

ch ar2s tr(s tr, ts .h h , 1) ;


PAL_ w rite (4, 1, s tr, PAL_ CH AR_ DH EIGH T) ;

PAL_ cons tW rite (6, 2, w dayStr[ts .w d], PAL_ CH AR_ STANDARD) ;


PAL_ cons tW rite (7, 2, m onth Str[ts .m o], PAL_ CH AR_ DH EIGH T) ;

ch ar2s tr(s tr, ts .m d, 1) ;


PAL_ w rite (6, 5, s tr, 0x32) ;

w ordToStr(ts .yy, s tr) ;


PAL_ w rite (9 , 1, s tr + 1, PAL_ CH AR_ DSIZ E) ;

/*
* s ave old val
ue for fas tanal
og clock cl e aning atne xtupdate
*/
os x = s x ;
os y = s y ;
om x = m x ;
om y = m y ;
oh x = h x ;
oh y = h y ;
t= de gRe f- Adc_ Re ad(4) ; //re ad te m pe rature s e ns or

t*= 221 ; //te m pe rature coe fficie ntofth e s il


icon junction
t/= 102 ;
t= 25 + t; //ge tth e re s ul
tin ce l
cius

/*
* adjus tl
im its
*/

//página 0x3A
if(t< -9 9 )
{
t= -9 9 ;
}
if(t> 9 9 )
{
t= 9 9 ;
}

/*
* ave rage val ue s
*/
de gH is to[tIdx] = t;
tIdx+ + ;
if(tIdx == DEG_ NBH ISTO )
{
tIdx = 0 ;
}
t= 0 ;
for(i = 0 ;i < DEG_ NBH ISTO ;i+ + )
{
t+ = de gH is to[i] ;
}
t/= DEG_ NBH ISTO ;

/*
* printte m pe rature
*/
if(t< 0)
{
i = -t;
PAL_ cons tW rite (12, 11, "-", 0x31) ;
}
el se
{
i = t;
PAL_ cons tW rite (12, 11, " ", 0x31) ;
}
ch ar2s tr(s tr, i, 1) ;
PAL_ w rite (12, 12, s tr, 0x32) ;
}
//re s tore vide o re nde ring ifitw as s toppe d
PAL_ control (PAL_ CNTL_ START, PAL_ CNTL_ RENDER) ;
}
/*
* inte rrupts e rvice routine
*/
void inte rrupt(void)
{

//página 0x3B
/*
* do PALs tuff
*/
PAL_ ISR() ; //l
ibrary cal
l
}

/*
* m ain program
*/
void m ain(void)
{
uns igne d ch ar i ;

/*
* I/O configuration
*/
ADCO N1 = 0x0f;
TRISA = 0xff;
PO RTA = 0 ;

TRISB = 0xff;
PO RTB = 0 ;

TRISC = 0xff;
PO RTC = 0 ;

TRISD = 0 ;
PO RTD = 0 ;

TRISE = 0 ;
PO RTE = 0 ;

de gRe f= EEPRO M _ re ad(0) ; //ge tte m pe rature cal


ibration from EEPRO M

/*
* de faulttim e and date
*/
ts .s s = 0 ;
ts .m n = 0 ;
ts .h h = 12 ;
ts .m d = 1 ;
ts .m o = 1 ;
ts .yy = 2007 ;

s e cO ffs e t= Tim e _ date ToEpoch (& ts ) ;

/*
* s tartvide o and dis pl
ay firs ts cre e n
*/

//página 0x3C
PAL_ init(PAL_ Y) ; //initPALl ibrary
PAL_ fill(0) ; //cle ar s cre e n
PAL_ picture (0, 0, l
ogo_ bm p, 128, 128) ; //paintpicture
PAL_ control (PAL_ CNTL_ START, PAL_ CNTL_ RENDER) ; //s tartvide o and re nde ring

i=0;
w h il
e (PO RTB == 0) //w aitfor a k e y to be pre s s e d
{
/*
* ch ange borde r color tw o tim e s pe r s e cond
*/
if(PAL_ fram e Ctr > 12)
{
PAL_ s e tBorde r(i) ;
i = !i ;
PAL_ fram e Ctr = 0 ;
}
}
PAL_ s e tBorde r(PAL_ CO LO R_ BLACK ) ;//cl e ar borde r

draw Scre e n(1, PAL_ CNTL_ BLANK ) ;//draw ful


ls cre e n in bl
ank m ode (fas te r)

for(;;)
{
if(PO RTB & 0b1111111) //a k e y is pre s s e d
{
Tim e _ Epoch ToDate (s e cO ffs e t+ PAL_ fram e Ctr /25, & ts ) ;

/*
* cal
e ndar s e ttings
*/
if(PO RTB.F0)
{
adjus t(& ts .m n, 0, 59 ) ;
ts .s s = 0 ;
}
if(PO RTB.F1)
{
adjus t(& ts .h h , 0, 59 ) ;
ts .s s = 0 ;
}
if(PO RTB.F2)
{
adjus t(& ts .m d, 1, 31) ;
}
if(PO RTB.F3)
{
adjus t(& ts .m o, 1, 12) ;
}
if(PO RTB.F4)

//página 0x3D
{
if(PO RTB.F7) ts .yy-- ;e l
s e ts .yy+ + ;
}

s e cO ffs e t= Tim e _ date ToEpoch (& ts ) ; //ne w tim e s tam p

/*
* te m pe rature cal ibration
*/
if(PO RTB.F5)
{
if(PO RTB.F7)
{
de gRe f-- ;
EEPRO M _ w rite (0, de gre f) ;
}
else
{
de gRe f+ + ;
EEPRO M _ w rite (0, de gre f) ;
}
}

w h il
e (PO RTB & 0b1111111) ;//w aitfor th e k e y to be re l
e as e d

PAL_ fram e Ctr = 0 ; //re s e tcounte rs


oldCtr = 0 ;
}

draw Scre e n(0, PAL_ CNTL_ RENDER) ; //update s cre e n


}
}

//página 0x3E

You might also like