You are on page 1of 3

::PICParteIVCaptulo8

Volvamos a lo nuestro, y analicemos el programa por partes o en mdulos, luego veremos si es necesario un
diagramadeflujo...
Primero el encabezado con nuestro archivo .inc para hablar en trminos de C, Z, W, F, etc. y la definicin de
variables...
Encabezado

LIST P=16F84
#include <P16F84luis.INC>

Variablesautilizar
ret1 equ
ret2 equ
rota equ
disp1equ
disp2equ
disp3equ
disp4equ

0x0d
0x0e
0x0f
0x10
0x11
0x12
0x13

registrospararetardos
reg.pararotacin(cambiodedisplay)
primerdatoamostrar
segundodatoamostrar
tercerdatoamostrar
cuartodatoamostrar

Recuerdaqueloqueharemosseraunasecuenciadedisplays,porloqueesnecesariounarutinaderetardo,y
sermuypequea,algocomoesto...
RETARDO
retardo
MOVLW
0x03

MOVWF
ret1
dos MOVLW
0x6E

MOVWF
ret2
uno NOP

NOP

NOP

NOP

NOP

NOP

DECFSZ ret2,F

GOTO
uno

DECFSZ ret1,F

GOTO
dos

RETLW
0x00

Nomevoyagastarexplicandoelretardo(temavistoanteriormente),slolopuseparatenerloencuenta,loque
srescatodeaqu,eselusodelainstruccinNOP,quesignificanohacernada(aunqueloqueestamoslogrando
eshacertiempo).Unacosams,losregistrosreg1yreg2sonvariablesdefinidasanteriormente.
Laconfiguracindepuertostambinsersencillayaqueambospuertosserndesalidaunomanejalosdatos,y
elotroseleccionacadadisplay,entonces...
Configuracindepuertos
resetORG 0x00

GOTO
inicio

ORG 0x05
inicioBSF STATUS,RP0

CLRFTRISA

CLRFTRISB

BCF STATUS,RP0

configurandopuertos
portAessalida
portBessalida

Habrsnotadoqueenladefinicindevariablesseincluyeron4registrosllamadosdisp1, disp2, disp3y disp4.


EstosregistroslosvamosautilizarparaguardarelvalorquesesumaralPCLenlatabla,detalmodoquetome

eldatoquequeremosenviaraldisplay,ycomoson4displays,puesutilizamos4registrosylecargamosconla
direccindeesos4datos,as...
cargandodirecc.dedatosdelatabla

MOVLW
MOVWF
MOVLW
MOVWF
MOVLW
MOVWF
MOVLW
MOVWF

0x01
disp1
0x02
disp2
0x03
disp3
0x04
disp4

Yahoralatabla,sermuypequea,yaquesloquieromostrarminombreo))
TABLA
tablaADDWF

display

NOP

RETLW

RETLW

RETLW

RETLW

PCL,F
seincrementaelcontadordeprograma
.gfedcba
segmentosdelosledsdeldisplay
B'00111000'
B'00111110'
B'00000110'
B'01101101'

cdigoparalaL
cdigoparalaU
cdigoparalaI
cdigoparalaS

AqutambinincluunNOP,parapasarporencima,cuandoelprogramavengaabuscarelprimerdato,yasno
empezamosdesdecero.
Ahoravienelomsimportante,elcdigoprincipaldelprograma.PrimeroborramoselPuerto_Aparadesactivar
todoslostransistores(apagarlosdisplays)yluegocontinuamosconelcdigo.
Hayporall,unregistrollamado"rota",quelovamosautilizarenelsiguientecdigoparaactivarlostransistores
queestnconectadosaPORTA,detalmododeseleccionareldisplayquevamosaencender,puestoqueson4,lo
vamos a cargar con "00001000" 0x08 para seleccionar uno de los displays, y luego lo haremos rotar, para
seleccionarlostresrestantes.Enlasiguientelnea,hacemosqueelFSRapuntealprimerregistrodisp1, y nos
preparamosparaenviardatosalDisplay,todoestoenlasprimeras4lneas...
apagatransistores

CLRFPORTA

PROG.PPAL
ini

MOVLW
MOVWF

0x08
rota

rota='00001000'

MOVLW
MOVWF

disp1
FSR

CARGAFSRCONLADIRECC.DEdisp1

display
MOVLW
0x00

MOVWF
PORTB

PORTB=00000000

MOVF
MOVWF

PORTA=00001000

MOVF
INDF,W

leedatoalqueapuntaFSR(oseadisp1)
CALLtabla
llamaalatabla
MOVWF
PORTB

pasaeldatoalpuertoB

rota,W
PORTA

CALLretardo

BTFSC
rota,0
GOTO
ini

llamaminiretardo

rota=00000000???
siesas,seviotodo,reinicia

BCF STATUS,C
RRF rota,F

INCF FSR,F

GOTO
display

carry=0(paranoafectarrotaciones)
rotadisplay
apuntaalsiguientedisp_X

Enlasdosprimeraslneasdelaetiquetadisplayenviamos00000000aPORTB(puestoquelosdisplay'ssonde
ctodo comn, los 4 estarn apagados), y luego seleccionamos el transistor del display de la izquierda, esto lo
hacemosponiendo00001000enPORTA.
RecuerdaqueelFSRapuntabaadisp1,ycomoyasabemos,INDFtambin,ycuandoleamosINDF,estaremos
leyendo disp1, luego lo pasamos a W, para seguidamente llamar a la tabla, tomar el dato y mostrarlo en el
display seleccionado. Como disp1=1 estaremos tomando el cdigo para la letra L de la tabla, y lo estaremos
enviandoaldisplaydelaizquierda.
Bien, ahora hacemos un miniretardo, y al regresar, preguntamos si se termin de rotar, como recin
comenzamos...,anfalta...,Ahorabien,porunacuestindeprecaucinborramoselCarrydelregistroSTATUS,
as no se afecta la rotacin, de lo contario cuando terminemos de rotar apareceran cosas raras como un uno
dems, asi que lo borramos y hacemos la rotacin a la derecha del registro rota, luego incrementamos el FSR
(paraqueapuntealregistrodisp2)yregresamosadisplay
veamos como estan las cosas, rota=00000100, FSR=disp2=INDF, ok, eso significa que ahora, con rota
seleccionamoselsiguientedisplay,cuandotomemoseldatodeINDF,estaremostomandoeldatodedisp2,yde
la tabla tomaremos el cdigo para la letra U, haremos un retardo, verificamos la rotacin y si no termin,
seguiremosrotando,incrementamoselFSRparairporelsiguientedato,yrepetimoselciclo.
Estavez rota=00000010, FSR=disp3=INDF, es decir que esta vez mostraremos laI, y seguiremos as hasta
mostrarlaS,cuandoestoocurra,ylleguemosalapreguntadesiterminlarotacin,nosdaremosconqueS,y
entoncessaltaremosaini,pararepetirlasecuenciadedisplays.
Wowwww...!!!,terminamooooos...!!!,parecaqueseramsextenso,perono,claroqueesteprogramita,escon
laintensindemostrarusosyaplicacionesdelmicro,cadaunosabrlautilidadqueledar,yparaquelopongan
aprueba,lesdejoelprogramacompleto...

You might also like