Sunteți pe pagina 1din 12

AO DEL CENTENARIO DE MACHU PICCHU PARA EL MUNDO

PROFESOR: CESAR QUISPE

CURSO: MICROPROCESADORES Y MICROCONTROLADORES

PROYECTO: RELOJ DIGITAL CON PIC 16F84A

ALUMNOS: SINCHE ROMERO, Jess 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 tambin podra 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, al hacer el programa para que solo funcione con el oscilador internoes ms exacto.

2.-COMPONENTES: PIC 16f84a Resistores: 10k, 220 Crystal 4 MHz Condensador 22pF Pulsadores LCD 1602b Switch 3.-DIAGRAMA DEL CIRCUITO:
LCD1
LM016L

VSS VDD VEE

RS RW E 4 5 6

C1
22pF

7 8 9 10 11 12 13 14

1 2 3

D0 D1 D2 D3 D4 D5 D6 D7

R3 X1 C2
22pF CRYSTAL

U1
16 15 4 OSC1/CLKIN OSC2/CLKOUT MCLR RA0 RA1 RA2 RA3 RA4/T0CKI RB0/INT RB1 RB2 RB3 RB4 RB5 RB6 RB7 PIC16F84A 17 18 1 2 3 6 7 8 9 10 11 12 13

220

R1
10k

R2
10k

4.-DIAGRAMA DE FLUJO:

EXP - MINUTO_INC

HORA_INC

MINUTO_INC

5.-CODIGO EMPLEADO:
List P=16f84a INCLUDE "P16F84A.INC" __CONFIG _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF #DEFINE BANCO0 BCF STATUS,RP0 #DEFINE BANCO1 BSF STATUS,RP0 #DEFINE LCD_CTRL PORTA #DEFINE LCD_DATA PORTB RUTINAS SEGUNDO1 SEGUNDO2 MINUTO1 MINUTO2 HORA1 HORA2 TIEMPO CAMBIOHORA LCD_LM EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU 0x0C 0x0F 0x10 0x11 0x12 0x13 0x14 0x15 0X16 0X17

incf movlw xorwf btfss goto clrf incf movlw xorwf btfss goto clrf incf movlw xorwf btfss goto clrf incf movlw xorwf btfss goto clrf

SEGUNDO1,F .10 SEGUNDO1,W STATUS,Z REP SEGUNDO1 SEGUNDO2,F .6 SEGUNDO2,W STATUS,Z REP SEGUNDO2 MINUTO1,F .10 MINUTO1,W STATUS,Z REP MINUTO1 MINUTO2,F .6 MINUTO2,W STATUS,Z REP MINUTO2

ORG 0X00 INICIO BANCO1 bsf TRISA,3 bsf TRISA,4 BANCO0 clrf PORTA clrf PORTB clrf SEGUNDO1 clrf SEGUNDO2 clrf MINUTO1 clrf MINUTO2 clrf HORA1 clrf HORA2 CALL LCD_UP CALL LCD_INI movlw 0x05 call LCD_SETDDADDRESS MOVLW 'P' CALL LCD_WRITEDATO MOVLW 'I' CALL LCD_WRITEDATO MOVLW 'C' CALL LCD_WRITEDATO MOVLW ':' CALL LCD_WRITEDATO REP call

movlw xorwf btfsc goto goto X incf movlw xorwf btfss goto clrf goto XX incf movlw xorwf btfss goto clrf

.2 HORA2,W STATUS,Z X;;;;;;v XX;;;;;;f HORA1,F .4 HORA1,W STATUS,Z REP HORA1 XXX

EXP

HORA1,F .10 HORA1,W STATUS,Z REP HORA1

goto XXX incf movlw xorwf btfss goto clrf goto

XXX HORA2,F .3 HORA2,W STATUS,Z REP HORA2 REP

call CALL

LCD_TABNUM LCD_WRITEDATO return

HORA_INC btfss GOTO

PORTA,3 $-.1

EXP MOVLW .250 MOVWF TIEMPO EXP2 movlw call btfss GOTO btfss GOTO decfsz goto EXP3 movlw call movf call CALL movf call CALL movlw CALL movf call CALL 0x45 LCD_SETDDADDRESS HORA2,W LCD_TABNUM LCD_WRITEDATO HORA1,W LCD_TABNUM LCD_WRITEDATO ':' LCD_WRITEDATO MINUTO2,W LCD_TABNUM LCD_WRITEDATO XX2 .4 RUTINA_C PORTA,3 HORA_INC PORTA,4 MINUTO_INC TIEMPO,F EXP2 X1

movlw xorwf btfsc goto goto incf movlw xorwf btfss GOTO clrf goto

.2 HORA2,W STATUS,Z X1;;;;;;v XX2;;;;;;f HORA1,F .4 HORA1,W STATUS,Z EXP3 HORA1 XXX3

incf movlw xorwf btfss GOTO clrf goto XXX3 incf movlw xorwf btfss GOTO clrf

HORA1,F .10 HORA1,W STATUS,Z EXP3 HORA1 XXX3 HORA2,F .3 HORA2,W STATUS,Z EXP3 HORA2

CALL call CALL

movf MINUTO1,W call LCD_TABNUM CALL LCD_WRITEDATO movlw ':' LCD_WRITEDATO movf SEGUNDO2,W LCD_TABNUM LCD_WRITEDATO movf SEGUNDO1,W

GOTO MINUTO_INC btfss GOTO incf movlw xorwf btfss GOTO

EXP3

PORTA,4 $-.1 MINUTO1,F .10 MINUTO1,W STATUS,Z EXP3

clrf incf movlw xorwf btfss GOTO clrf GOTO

MINUTO1 MINUTO2,F .6 MINUTO2,W STATUS,Z EXP3 MINUTO2 EXP3

#define ENABLE bsf LCD_CTRL,2 ;Activa E #define DISABLE bcf LCD_CTRL,2 ;Desactiva #define LEER bsf LCD_CTRL,1 ;Pone LCD en Modo RD #define ESCRIBIR bcf LCD_CTRL,1 ;Pone LCD en Modo WR #define DATO bsf LCD_CTRL,0 ;Desactiva RS (modo comando) #define COMANDO bcf LCD_CTRL,0 ;Activa RS (modo dato) cblock LCD_TEMP1 tabla LCD_TEMP2 caracter ASCII LCD_LM ;Registro temporal de posicion de la ;Registro Endc SUBRUTINAS DEL LCD LCD_UP BANCO1 clrf LCD_DATA ;RB <0-7> salidas digitales movlw B'11111000' andwf LCD_CTRL,F ;RA0=RS RA1=R/W RA2=E salidas digitales BANCO0 bcf INTCON,GIE ;Desactivar interrupciones COMANDO ;RS=0 ESCRIBIR ;R/W=0 DISABLE ;E=0 return LCD_INI call RUTINA_C ms de 15ms movlw B'00111000' caracteres de 5x7 call LCD_COMAND movlw 0x05 movlw 0x0F ;Espera un poco temporal del

call RUTINA_C ;5ms > 4.1ms.(Especificacion de Fabricante) movlw B'00111000' ;Datos de 8 bits, 2 lineas y caracteres de 5x8 call LCD_COMAND movlw .110 call RUTINA_A ;110us > 100us.(Especificacion de Fabricante) movlw B'00111000' ;Datos de 8 bits, 2 lineas y caracteres de 5x8 call LCD_COMAND movlw B'00001000' ;b3 y b2 puedn ser cambiados para otra configuracin call LCD_FUNCIONSET ;despus de este punto no podran ser cambiados N ni F movlw B'00000100' ;Cursor apagado y Display prendido goto LCD_DISPCURSCONT

LCD_MENSAJE movwf LCD_TEMP1 ;Salvaposicion de la tabla M_E_N_S movf LCD_TEMP1,0 ;Recupera posicion de la tabla call LCD_TABLA ;Busca caracter de salida movwf LCD_TEMP2 ;Guarda el caracter movf LCD_TEMP2,1 btfsc STATUS,Z ;Hay ms caracteres? Return call LCD_WRITEDATO ;Visualiza en el LCD el caracter incf LCD_TEMP1,1 ;Siguiente caracter goto M_E_N_S ;Repite con siguiente caracter LCD_TABLA movwf PCL ;Desplazamiento sobre la tabla LCD_CLEAR movlw B'00000001' ;Borra LCD y cursor a Home goto LCD_COMAND LCD_HOME movlw ;Cursor a Home goto LCD_COMAND B'00000010'

;Datos de 8 bits, 2 lineas y

LCD_ENTRYMODE andlw 0x03 ;Nos quedamos con b1-b0 iorlw 0x04 ;Incorporamos el bit de funcin goto LCD_COMAND ------------------------------------------------------------------------LCD_DISPCURSCONT andlw 0x07 ;Nos quedamos con b2-b1-b0 iorlw 0x08 ;Incorporamos el bit de funcin goto LCD_COMAND ------------------------------------------------------------------------LCD_DISPCURSSHIFT andlw 0x0C ;Nos quedamos con b3-b2 iorlw 0x10 ;Incorporamos el bit de funcin goto LCD_COMAND ------------------------------------------------------------------------LCD_SETCGADDRESS andlw 0x3F ;Nos quedamos con b5-b4-b3-b2-b1-b0 iorlw 0x40 ;Incorporamos el bit de funcin goto LCD_COMAND ------------------------------------------------------------------------LCD_SETDDADDRESS iorlw 0x80 ;Incorporamos el bit de funcin goto LCD_COMAND ------------------------------------------------------------------------LCD_READAC call LCD_BUSY LEER BANCO1 comf LCD_DATA,1 ;Puerto B como entrada BANCO0 ENABLE nop movf LCD_DATA,0 andlw 0x7F ;Valor de la direccin de la DDRAM o CGRAM DISABLE BANCO1 clrf LCD_DATA BANCO0 ESCRIBIR return

------------------------------------------------------------------------LCD_WRITEDATO movwf LCD_DATA ;Valor a escribir en la DDRAM o CGRAM call LCD_BUSY DATO goto LCD_E ;Genera pulso de E ------------------------------------------------------------------------LCD_READDATO call LCD_BUSY DATO LEER BANCO1 comf LCD_DATA,1 ;Puerto B como entrada BANCO0 ENABLE nop movf LCD_DATA,0 ;Valor leido de la DDRAM o CGRAM DISABLE BANCO1 clrf LCD_DATA BANCO0 ESCRIBIR COMANDO return ------------------------------------------------------------------------LCD_TABNUM addwf PCL,1 dt "0123456789ABCDEF" SUBRUTINAS INTERNAS DEL LCD LCD_BUSY: LCD_BUSY Lectura del FlagBusy y la direccion. LEER BANCO1 comf LCD_DATA,1 ;Puerto B como entrada BANCO0 ENABLE nop btfsc LCD_DATA,7 ;Chequea bit de Busy goto $-1 DISABLE BANCO1 clrf LCD_DATA ;Puerto B como salida BANCO0 ESCRIBIR return

------------------------------------------------------------------------;LCD_E: Pulso de Enable LCD_E ENABLE nop DISABLE ;Desactiva E COMANDO Return ------------------------------------------------------------------------;LCD_COMAND: Escritura de comandos del LCD W = Codigo de comando para el LCD W ==> LCD_DATA LCD_COMAND movwf LCD_DATA Codigo de comando. call LCD_BUSY goto LCD_E ;Genera pulso de E ------------------------------------------------------------------------;LCD_FUNCIONSET: Configura ela fuente del caracter y nmero de lineas. No se cambia DL ; El modo de control deseado deber cargarse en los 2 bits terceros de W: ; x xxx b3 b2 x x ; b2 : 0 = caracter de 5x7 1 = de 5x10 ; b3 : 0 = display de 1 linea 1 = de 2 lineas ; b0,1,4-7 : sin importancia LCD_FUNCIONSET andlw 0x0C ;Nos quedamos con b3-b2 (DL no se cambia) iorlw 0x30 ;Incorporamos el bit de funcin y 8 bits goto LCD_COMAND ; BLOQUE DE ETIQUETAS

decfsz goto return RUTINA_C

RUTINA_1,F RUTINA_B

RUTINA_D

RUTINA_E

movwf BANCO1 movf movwf movlw movwf BANCO0 clrwdt clrf bcf btfss goto decfsz goto BANCO1 movf movwf BANCO0 return

RUTINA_1 OPTION_REG,W TEMPORIZACION B'11010001' OPTION_REG

TMR0 INTCON,T0IF INTCON,T0IF RUTINA_E RUTINA_1,F RUTINA_D TEMPORIZACION,W OPTION_REG

RUTINA_F

RUTINA_G RUTINA_H

RUTINA_I CBLOCK RUTINAS ;Inicio de las variables. La primera direccin libre disponible RUTINA_1 RUTINA_2 TEMPORIZACION ENDC

RUTINA_A

movwf bcf rrf bcf rrf

RUTINA_B

RUTINA_1 STATUS,C RUTINA_1,1 STATUS,C RUTINA_1,1 nop

movwf BANCO1 movf movwf movlw movwf BANCO0 clrf clrwdt bcf clrf btfss goto decfsz goto decfsz goto BANCO1 movf movwf BANCO0 return END

RUTINA_1 OPTION_REG,W RUTINA_C B'11010011' OPTION_REG RUTINA_2 INTCON,T0IF TMR0 INTCON,T0IF RUTINA_I RUTINA_2,F RUTINA_H RUTINA_1,F RUTINA_G TEMPORIZACION,W OPTION_REG

6.-FUNTE DE INFORMACION:

http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programaspic16f84a-y-pic16f628a/15/ www.mmtelec.com/.../CA1602B-Datasheet-16x2-Character-LCD-module.pdf http://rolandopalermo.blogspot.com/2010/04/reloj-digital-con-displays-de-7.html http://members.fortunecity.es/electronico/reloj.html electronicatuxtla.com/Download02.php http://perso.wanadoo.es/pictob/ensamblador.htm