AÑO DEL CENTENARIO DE MACHU PICCHU PARA EL MUNDO
PROFESOR:
CESAR QUISPE
CURSO:
MICROPROCESADORES Y MICROCONTROLADORES
PROYECTO:
RELOJ DIGITAL CON PIC 16F84A
ALUMNOS:
SINCHE ROMERO, Jesús Miguel VASQUEZ QUINTANA
2011
INFORME DE RELOJ DIGITAL CON PIC 16f84a 1.- DESCRIPCION.El circuito es un sencillo reloj digital el cual utiliza muy pocos componentes. Es bien sabido que existen muchas formas de llegar a algo en concreto, en este proyecto se ha utilizado un
oscilador externo un cristal de 4MHz el cual fija la frecuencia base y entrega los pulsos de reloj, pero también podría haber utilizado el oscilador interno del pic (modificando el programa) para evitar utilizar este componente. El pulsador se utiliza para ajustar la hora y poner el circuito en marcha, a l hacer el programa para que solo
funcione con el oscilador internoes más exacto.
2.-COMPONENTES:
PIC 16f84a Resistores: 10k, 220 Crystal 4 MHz Condensador 22pF Pulsadores LCD 1602b Switch 3.-DIAGRAMA DEL CIRCUITO:
LCD1 LM016L
S D E S D E V V V 1 2 3
C1
S W R R E 4 5 6
0 1 2 3 4 5 6 7 D D D D D D D D 7 8 9 0 1 2 3 4 1 1 1 1 1
R3 22pF
X1 C2
CRYSTAL
4 22pF
220
U1 16 15
OSC1/CLKIN OSC2/CLKOUT MCLR
RA0 RA1 RA2 RA3 RA4/T0CKI RB0/INT RB1 RB2 RB3 RB4 RB5 RB6 RB7
1
PIC16F84A
17 18 1 2 3 6 7 8 9 10 11 12 13
R1 10k
R2 10k
4.-DIAGRAMA DE FLUJO:
EXP - MINUTO_INC
HORA_INC
MINUTO_INC
incf
SEGUNDO1,F
List P=16f84a
movlw xorwf
.10 SEGUNDO1,W
INCLUDE "P16F84A.INC"
btfss
STATUS,Z
goto clrf
REP SEGUNDO1 SEGUNDO2,F .6
5.-CODIGO
EMPLEADO:
__CONFIG _XT_OSC & _CP_OFF & _PWRTE _ON & _WDT_OFF #DEFINE #DEFINE
BANCO0 BCF BANCO1 BSF
STATUS,RP0 STATUS,RP0
#DEFINE
LCD_CTRL
PORTA
incf movlw
#DEFINE
LCD_DATA
PORTB
xorwf
SEGUNDO2,W
btfss goto
STATUS,Z REP
RUTINAS
EQ U
0x0C
SEGUNDO1 SEGUNDO2 MINUTO1
EQ U
0x0F 0x10 0x11
clrf
SEGUNDO2
incf
MINUTO1,F
MINUTO2 HORA1
EQ U EQ U
0x12 0x13
movlw xorwf
.10 MINUTO1,W
HORA2
EQ U
0x14
btfss
STATUS,Z
TIEMPO CAMBIOHORA LCD_LM
EQ U
0x15 0X16 0X17
goto clrf
REP MINUTO1
incf movlw
MINUTO2,F .6
xorwf
MINUTO2,W STATUS,Z REP
EQ U EQ U
EQ U EQ U
ORG 0X00 INICIO BANCO1 bsf
TRISA,3
btfss goto
bsf
TRISA,4
clrf
MINUTO2
BANCO0 clrf
PORTA
clrf clrf
PORTB SEGUNDO1
movlw xorwf
.2 HORA2,W
clrf
SEGUNDO2
clrf clrf
MINUTO1 MINUTO2
btfsc goto
STATUS,Z X;;;;;;v
clrf clrf
HORA1 HORA2
goto
XX;;;;;;f
CALL
LCD_UP LCD_INI
HORA1,F .4
movlw
CALL 0x05
incf movlw
call
LCD_SETDDADDRESS
xorwf btfss
HORA1,W STATUS,Z
goto
REP
CALL
MOVLW 'P' LCD_WRITEDATO
clrf goto
HORA1 XXX
X
MOVLW 'I' CALL
LCD_WRITEDATO MOVLW 'C'
XX
CALL
LCD_WRITEDATO
incf
HORA1,F
CALL
MOVLW ':' LCD_WRITEDATO
movlw xorwf
.10 HORA1,W
btfss
STATUS,Z
goto clrf
REP HORA1
REP call
EXP
goto
XXX
XXX incf
HORA2,F
movlw
.3
xorwf btfss
HORA2,W STATUS,Z
goto
REP
clrf goto
HORA2 REP
call
LCD_TABNUM
CALL
LCD_WRITEDATO return
HORA_INC btfss
EXP
MOVLW .250
PORTA,3
GOTO
$-.1
movlw
.2
xorwf btfsc
HORA2,W STATUS,Z
goto
X1;;;;;;v
goto
XX2;;;;;;f
incf
HORA1,F
MOVWF TIEMPO EXP2
movlw call
.4 RUTINA_C
X1
btfss
PORTA,3
movlw
.4
GOTO btfss
HORA_INC PORTA,4
xorwf btfss
HORA1,W STATUS,Z
GOTO
MINUTO_INC
GOTO
EXP3
decfsz goto
TIEMPO,F EXP2
clrf goto
HORA1 XXX3
movlw call
0x45 LCD_SETDDADDRESS
incf
HORA1,F
movf
HORA2,W
movlw
.10
call CALL
LCD_TABNUM LCD_WRITEDATO
xorwf btfss
HORA1,W STATUS,Z
movf
HORA1,W
GOTO clrf
EXP3 HORA1
call CALL
LCD_TABNUM LCD_WRITEDATO
goto
XXX3
incf
HORA2,F
EXP3
XX2
XXX3
movlw
':'
movlw
.3
CALL
LCD_WRITEDATO
movf
MINUTO2,W
xorwf btfss GOTO
HORA2,W STATUS,Z EXP3
call CALL
LCD_TABNUM LCD_WRITEDATO
clrf
HORA2
movf call CALL movlw
MINUTO1,W LCD_TABNUM LCD_WRITEDATO ':'
GOTO
EXP3
MINUTO_INC btfss
PORTA,4
CALL
LCD_WRITEDATO
GOTO
$-.1
call
movf SEGUNDO2,W LCD_TABNUM
incf movlw
MINUTO1,F .10
CALL
LCD_WRITEDATO
xorwf
MINUTO1,W
movf
btfss GOTO
STATUS,Z EXP3
SEGUNDO1,W
clrf
MINUTO1
call
incf movlw
MINUTO2,F .6
4.1ms.(Especificacion de Fabricante) movlw B'00111000' ;Datos de 8 bits, 2 lineas y
xorwf
MINUTO2,W
caracteres de 5x8
btfss GOTO
STATUS,Z EXP3
call
LCD_COMAND movlw
.110
clrf
MINUTO2
call
RUTINA_A
;110us
GOTO
EXP3
100us.(Especificacion de Fabricante) movlw B'00111000' ;Datos de 8 bits, 2 lineas y
#define ENABLE
bsf
;Activa E #define DISABLE
bcf
RUTINA_C
LCD_CTRL,2
caracteres de 5x8
LCD_CTRL,2
call movlw
;Desactiva
LCD_COMAND B'00001000'
;5ms
;b3
y
>
>
b2
puedn
ser
cambiados para otra configuración
#define LEER bsf ;Pone LCD en Modo RD
LCD_CTRL,1
#define ESCRIBIR bcf LCD en Modo WR
LCD_CTRL,1
#define DATO
bsf
call LCD_FUNCIONSET ;después de este punto no podran ser cambiados N ni F
;Pone
LCD_CTRL,0
movlw B'00000100' prendido goto
;Cursor apagado y Display
LCD_DISPCURSCONT
;Desactiva RS (modo comando) #define COMANDO bcf LCD_CTRL,0
;Activa RS (modo dato)
LCD_MENSAJE
cblock
LCD_LM
LCD_TEMP1
;Registro temporal de posicion de la
tabla LCD_TEMP2
M_E
;Registro
temporal
del
movwf
btfsc caracteres?
LCD_UP BANCO1 clrf LCD_DATA digitales
STATUS,Z
;¿Hay
call
LCD_WRITEDATO ;Visualiza en el LCD el
caracter ;RA0=RS RA1=R/W RA2=E
bcf INTCON,GIE COMANDO
;Desactivar interrupciones ;RS=0
incf
LCD_TEMP1,1
goto
M_E
;Siguiente
caracter
;R/W=0
con siguiente caracter LCD_TABLA
_N_S movwf
PCL
;Desplazamiento sobre la tabla ;E=0
LCD_INI
movlw RUTINA_C
más de 15ms movlw B'00111000' caracteres de 5x7 LCD_COMAND 0x05
más
;RB <0-7> salidas
andwf LCD_CTRL,F salidas digitales BANCO0
call movlw
LCD_TEMP2
Return
B'11111000'
DISABLE return
;Busca caracter
;Guarda el caracter movf LCD_TEMP2,1
SUBRUTINAS DEL LCD
call
;Salvaposicion de la tabla _N_S movf LCD_T MP1,0 E
call LCD_TABLA de salida
Endc
ESCRIBIR
LCD_TEMP1
;Recupera posicion de la tabla
caracter ASCII
movlw
movwf
0x0F
LCD_CLEAR movlw B'00000001' ;Borra LCD y cursor a Home goto LCD_COMAND
;Espera un poco ;Datos de 8 bits, 2 lineas y
LCD_HOME ;Cursor a Home goto
movlw
LCD_COMAND
B'00000010'
;Repite
LCD_ENTRYMODE andlw quedamos con b1-b0 iorlw 0x04
0x03
;Nos
------------------------------------------------------------------------LCD_WRITEDATO
;Incorporamos el bit de
función
movwf LCD_DATA ;Valor a escribir en la DDRAM o
CGRAM goto
LCD_COMAND
call
LCD_BUSY
goto
LCD_E
DATO ------------------------------------------------------------------------LCD_DISPCURSCONT andlw 0x07 ;Nos quedamos con b2-b1-b0
;Genera pulso de E -------------------------------------------------------------------------
iorlw
LCD_READDATO
0x08
;Incorporamos el bit de
función goto
call
LCD_BUSY
DATO LEER
LCD_COMAND
BANCO1 ------------------------------------------------------------------------LCD_DISPCURSSHIFT andlw 0x0C ;Nos quedamos con b3-b2 iorlw 0x10
comf LCD_DATA,1 ;Puerto B como entrada BANCO0 ENABLE
;Incorporamos
el bit de función goto
nop LCD_COMAND
movf LCD_DATA,0 leido de la DDRAM o CGRAM
-------------------------------------------------------------------------
DISABLE
LCD_SETCGADDRESS andlw 0x3F ;Nos quedamos con b5-b4-b3-b2-b1-b0
BANCO1 clrf LCD_DATA
iorlw el bit de función goto
0x40
;Incorporamos
;Valor
BANCO0 ESCRIBIR
LCD_COMAND
COMANDO return
------------------------------------------------------------------------LCD_SETDDADDRESS iorlw 0x80
------------------------------------------------------------------------LCD_TABNUM addwf PCL,1
;Incorporamos el bit de función goto LCD_COMAND
dt
"0123456789ABCDEF"
SUBRUTINAS INTERNAS DEL LCD ------------------------------------------------------------------------LCD_READAC call LCD_BUSY LEER BANCO1 comf LCD_DATA,1
LCD_BUSY:
Lectura del FlagBusy y la direccion.
LCD_BUSY
;Puerto B como
entrada
LEER
BANCO1 comf LCD_DATA,1 ;Puerto B como entrada
BANCO0
BANCO0 ENABLE
ENABLE
nop
nop movf LCD_DATA,0 andlw 0x7F de la dirección de la DDRAM o CGRAM DISABLE BANCO1 clrf LCD_DATA
;Valor
btfsc LCD_DATA,7 ;Chequea bit de Busy goto $-1 DISABLE BANCO1 clrf LCD_DATA ;Puerto B como salida
BANCO0
BANCO0
ESCRIBIR
ESCRIBIR
return
return
-------------------------------------------------------------------------
decfsz
RUTINA_1,F
;LCD_E: LCD_E
goto return
RUTINA_B
Pulso de Enable ENABLE nop DISABLE ;Desactiva E
RUTINA_C
movwf RUTINA_1 BANCO1
COMANDO
movf
OPTION_REG,W
Return
movwf movlw
TEMPORIZACION B'11010001'
-------------------------------------------------------------------------
movwf
OPTION_REG
;LCD_COMAND: Escritura de comandos del LCD W = Codigo de comando para el LCD
BANCO0 clrwdt
RUTINA_D
W ==> LCD_DATA LCD_COMAND de comando. call goto
movwf
LCD_DATA
Codigo RUTINA_E
LCD_BUSY LCD_E
;Genera pulso de E
clrf
TMR0
bcf btfss
INTCON,T0IF INTCON,T0IF
goto decfsz
RUTINA_E RUTINA_1,F
goto
RUTINA_D
------------------------------------------------------------------------;LCD_FUNCIONSET: Configura ela fuente del
BANCO1 movf TEMPORIZACION,W
caracter y número de lineas. No se cambia DL
movwf
; El modo de control deseado deberá cargarse en los 2 bits terceros de W:
BANCO0 return
;
OPTION_REG
x xxx b3 b2 x x
;
b2 : 0 = caracter de 5x7 1 = de 5x10
;
b3 :
;
1 = de 2 lineas b0,1,4-7 : sin importancia
0 = display de 1 linea
LCD_FUNCIONSET andlw 0x0C quedamos con b3-b2 (DL no se cambia) iorlw 0x30 función y 8 bits goto LCD_COMAND
RUTINA_F
movwf
RUTINA_1
BANCO1
;Nos
;Incorporamos el bit de RUTINA_G RUTINA_H
movf movwf
OPTION_REG,W RUTINA_C
movlw movwf
B'11010011' OPTION_REG
BANCO0 clrf RUTINA_2 clrwdt bcf
; BLOQ UE DE ETIQ UETAS
INTCON,T0IF
clrf btfss goto
TMR0 INTCON,T0IF RUTINA_I
decfsz goto
RUTINA_2,F RUTINA_H
RUTINA_2
decfsz
RUTINA_1,F
TEMPORIZACION ENDC
goto RUTINA_G BANCO1 movf TEMPORIZACION,W movwf OPTION_REG
RUTINA_I CBLOCK
RUTINAS ;Inicio de las variables. La
primera dirección libre disponible RUTINA_1
RUTINA_A
RUTINA_B
movwf
RUTINA_1
BANCO0
bcf rrf
STATUS,C RUTINA_1,1
return
bcf
STATUS,C
END
rrf
RUTINA_1,1 nop
6.-FUNTE DE INFORMACION:
http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programaspic16f84a-y-pic16f628a/15/ www.mmt elec.com/.../ CA1602B-Dat asheet-16x2-Charact er -LCD-module.pdf
http://rolandopalermo.blogspot.com/2010/04/re loj-digital-con-displays-de-7.htm l http://members.fortunecity.es/electronico/reloj.html elect ronicat ux t la.com/ Dow nload02.ph p
http://perso.wanadoo.es/pictob/ensamblador.htm