Está en la página 1de 18

; INSTITUTO POLITECNICO NACIONAL.

; CECYT 9 JUAN DE DIOS BATIZ.


;
; PRACTICA 0'.
; MANEJO DE UN LED OSCILANDO A 1 Hz.
;
; EQUIPO:DREAM TEAM GRUPO: 6IM1.
;
; INTEGRANTES:
; 1.-MENDOZA CASILLAS.
; 2.-MORA OLVERA.
; 3.-VILLEGAS GONZALEZ.
; 4.-VIVEROS ARENAS.
;
; FECHA DE ENTREGA DEL REPORTE.
;
;ESTE PROGRAMA CONTROLA UNA LCD DE 16 CARACTERES POR UNA LINEA MOSTRANDO UN RELOJ
DE TIEMPO REAL DE
;FORMA CENTRADA, ADEMAS POR MEDIO DE UN TECLADO MATRICIAL ;SE PUEDE ACTUALIZAR EL
TIEMPO DEL RELOJ,
;DICHO TECLADO TIENE UNA TECLA PARA PARAR EL TIEMPO, NUMEROS PARA ACTUALIZARLO Y
PARA CONTINUAR
;
;----------------------------------------------------------------------------------
----------------
list p=16f877A; Indico que microcontrolador voy a utilizar

#include "C:\Program Files (x86)\Microchip\MPASM Suite\P16F877A.INC"; Incluyo la


libreria del microcontrolador a utilizar

;Bits de configuracion.
__config _XT_OSC & _WDT_OFF & _PWRTE_ON & _BODEN_OFF & _LVP_OFF & _CP_OFF; ALL

;----------------------------------------------------------------------------------
----------------
;
;fosc=4 MHz.
;Ciclo de trabajo del PIC = (1/fosc)*4 = 1 µs.
;t int:= (256 - R) * (P) * ((1/3579545)*4) = 1s // Tiempo de interrupcion
; R =131, P = 8
;Frec int = 1 / t int = 1 Hz.

;----------------------------------------------------------------------------------
-----------------
;Definicion de las variables del programa en RAM.
resp_w equ 0x20;
resp_status equ 0x21;
res_pclath equ 0x22;
res_fsr equ 0x23;
presc_1 equ 0x24; .001 100 10
presc_2 equ 0x25; t int = t intb * presc_1 *
presc_2 banderas equ 0x26;
cont_milis equ 0x27;
select_time equ 0x28;
uniseg equ 0x29;
decseg equ 0x30;
unimin equ 0x31;
decmin equ 0x32;
unihor equ 0x33;
dechor equ 0x34;
var_teclado equ 0x35; Variable que almacena los codigos de los
distintos caracteres al barrer el teclado.
var_push equ 0x36; Variable utilizada para guardar la tecla presionada.
carga_dmos equ 0x37; Varible para cargar a las decenas de minuto o de
segundo cuando se esta actualizando el tiempo.
carga_umos equ 0x38; Varible para cargar a las unidades de minuto o
de segundo cuando se esta actualizando el tiempo

;----------------------------------------------------------------------------------
------------------
;Constantes
no_push equ 0xF0;
Tec_1 equ 0xE0;
Tec_2 equ 0xD0;
Tec_3 equ 0xB0;
Tec_A equ 0x70;
Tec_4 equ 0xE0;
Tec_5 equ 0xD0;
Tec_6 equ 0xB0;
Tec_B equ 0x70;
Tec_7 equ 0xE0;
Tec_8 equ 0xD0;
Tec_9 equ 0xB0;
Tec_C equ 0x70;
Tec_aster equ 0xE0;
Tec_0 equ 0xD0;
Tec_gato equ 0xB0;
Tec_D equ 0x70;

Act_Ren1 equ 0x0E;


Act_Ren2 equ 0x0D;
Act_Ren3 equ 0x0B;
Act_Ren4 equ 0x07;

;----------------------------------------------------------------------------------
--------------------
;Banderas del registro banderas

ban_int equ .0; El valor .0 es asignado a bandera int, bandera utilizada para
comunicar la subrutina de interrupcion con el programa principal
sin_bd1 equ .1;
sin_bd2 equ .2;
sin_bd3 equ .3;
sin_bd4 equ .4;
sin_bd5 equ .5;
sin_bd6 equ .6;
sin_bd7 equ .7;

;----------------------------------------------------------------------------------
---------------------------
;Asignacion de los bits de los puertos I/O.
;Puerto A
RS_LCD equ .0; // Señal de control Comando o Dato de la LCD
Enable_LCD equ .1; // Señal de ingreso de información Comando o Dato
a la LCD

Sin_UsoRA2 equ .2; // Sin uso la terminal 2 del puerto A


Sin_UsoRA3 equ .3; // Sin uso la terminal 3 del puerto A
Sin_UsoRA4 equ .4; // Sin uso la terminal 4 del puerto A
Sin_UsoRA5 equ .5; // Sin uso la terminal 5 del puerto A
proga equ b'111100'; // Programacion inicial del puerto A.

;Puerto B
Act_Ren_1 equ .0; // Pin de salida para activar el renglon 1 del
teclado.
Act_Ren_2 equ .1; // Pin de salida para activar el renglon 2 del
teclado.
Act_Ren_3 equ .2; // Pin de salida para activar el renglon 3 del
teclado.
Act_Ren_4 equ .3; // Pin de salida para activar el renglon 4 del
teclado.
Cod_1 equ .4; // Pin de entrada para leer el codigo del teclado.
Cod_2 equ .5; // Pin de entrada para leer el codigo del teclado.
Cod_3 equ .6; // Pin de entrada para leer el codigo del teclado.
Cod_4 equ .7; // Pin de entrada para leer el codigo del teclado.
progb equ b'11110000'; // Programacion inicial del puerto B.

;Puerto C
D0_LCD equ .0; // Bit D0 de la LCD
D1_LCD equ .1; // Bit D1 de la LCD
D2_LCD equ .2; // Bit D2 de la LCD
D3_LCD equ .3; // Bit D3 de la LCD
D4_LCD equ .4; // Bit D4 de la LCD
D5_LCD equ .5; // Bit D5 de la LCD
D6_LCD equ .6; // Bit D6 de la LCD.
D7_LCD equ .7; // Bit D7 de la LCD
progc equ b'00000000'; // Programación inicial del puerto C como entrada.

;Puerto D
Sin_UsoRD0 equ .0; // Sin uso la terminal 0 del puerto D
Sin_UsoRD1 equ .1; // Sin uso la terminal 1 del puerto D
Sin_UsoRD2 equ .2; // Sin uso la terminal 2 del puerto D
Sin_UsoRD3 equ .3; // Sin uso la terminal 3 del puerto D
Sin_UsoRD4 equ .4; // Sin uso la terminal 4 del puerto D
Sin_UsoRD5 equ .5; // Sin uso la terminal 5 del puerto D
Sin_UsoRD6 equ .6; // Sin uso la terminal 6 del puerto D
Sin_UsoRD7 equ .7; // Sin uso la terminal 7 del puerto D
progd equ b'11111111'; // Programacion inicial del puerto D.

;Puerto E
Sin_UsoRE0 equ .0; // Sin uso la terminal 0 del puerto E
Sin_UsoRE1 equ .1; // Sin uso la terminal 1 del puerto E
Sin_UsoRE2 equ .2; // Sin uso la terminal 2 del puerto E
proge equ b'111'; // Programacion inicial del puerto
E. ;-------------------------------------------------------------------------------
------------------------------------------------------------------------
;====================
;== Vector Reset ==
;====================
org 0x0000;
vec_reset clrf pclath; Borra el contenido del registro pclath.
goto prog_prin; Salto incondicional a la etiqueta prog_prin.

;----------------------------------------------------------------------------------
---------------------------------------------------------------------
;=================================
;== Vector de Interrupcion ==
;=================================
org 0x0004;
vec_int movwf resp_w; Respalda el estado del registro w.
movf status,w;
movwf resp_status; Respalda banderas de la alu.
clrf status;
movf pclath,w;
movwf res_pclath;
clrf pclath;
movf fsr,w;
movwf res_fsr;

btfsc intcon,tmr0if;
call rutina_int;

sal_int movlw .131;


movwf tmr0;

movf res_fsr,w;
movwf fsr;
movf res_pclath,w;
movwf pclath;
movf resp_status,w;
movwf status;
nop;

retfie;
;----------------------------------------------------------------------------------
---------------------------
;=============================
;== Subrutina de Interrupciones ==
;=============================
rutina_int incf cont_milis,f
incf presc_1,f;

movlw .100;
xorfw presc_1,w;
btfsc status,z;
goto sig_int;
goto sal_rutint;

sig_int clrf presc_1;


incf presc_2,f;
movlw .10;
xorwf presc_2,w;
btfss status,z;
goto sal_rutint;
clrf presc_1;
clrf presc_2;

sal_rutext bsf banderas,ban_int;

sal_rutint bcf intcon,t0if;

return;
;----------------------------------------------------------------------------------
----------------
;================================
;== Subrutina de Ini. de Reg. del Pic ==
;================================
prog_ini bsf status,rp0; Ponte en el banco 1 de ram.
movwf option_reg ^0x80;
movlw proga;
movwf trisa ^0x80;
movlw progb;
movwf trisb ^0x80;
movlw progc;
movwf trisc ^0x80;
movlw progd;
movwf trisd ^0x80;
movlw proge;
movwf trise ^0x80;
movlw 0x06;
movwf adcon1 ^0x80;
bcf status,rp0; Ponte en el banco 0 de ram.

movlw 0xa0;
movwf intcon;

movlw .131;
movwf tmr0;

clrf banderas;

clrf portc;
movlw 0x03;
movwf porta;
movwf 0x0F;

movwf portb;

clrf resp_w;
clrf resp_status;
clrf res_pclath;
clrf res_fsr;
clrf presc_1;
clrf presc_2;
clrf banderas;
clrf cont_milis;

clrf uniseg;
clrf decseg;
clrf unimin;
clrf decmin;
clrf unihor;
clrf dechor;
clrf select_time;
clrf carga_dmos;
clrf carga_umos

return;
;----------------------------------------------------------------------------------
----------------
;=======================
;== Programa principal==
;=======================

prog_prin call prog_ini;


call ini_lcd;

loop_prin movlw .2;


subwf dechor,w;
btfsc status,Z; Compara si ya se llego a 2 en las decenas de hora.
goto part2;
call show_time;
call rev_tecA;
call count_time1;
goto loop_prin;
part2 call show_time;
call rev_tecA;
call count_time2;
goto loop_prin;

;----------------------------------------------------------------------------------
--------------
;==============================================================================
;===============Subrutina que revisa si esta presionada la tecla A=============
;==============================================================================

rev_tecA bsf portb,Act_Ren_2; Desactiva renglon 2.


nop;
bcf portb,Act_Ren_1; Activa renglon 1.
movf portb,w;
movwf var_teclado;
movlw 0xF0;
andwf var_teclado,f; Enmascara el nibble alto.
movlw no_push;
subwf var_teclado,w;
btfsc status,Z;
goto exit_rev;
movlw tec_A;
subwf var_teclado,w;
btfsc status,Z;
goto ini_barrido;
goto exit_rev;
ini_barrido call barre_tecdh;
call show_time;
nop;
nop;
call barre_tecuh;
call show_time;
nop;
nop;
call barre_tecdms;
call show_time;
nop;
call barre_tecums;
call show_time;
nop;
nop;
call barre_tecdms;
call show_time;
nop;
call barre_tecums;
call show_time;
nop;
call rev_tecB;
exit_rev return;
;----------------------------------------------------------------------------------
--------------
;===========================================================================
;===============Subrutina que barre el teclado decenas de hora==============
;===========================================================================
barre_tecdh bsf portb,Act_Ren_4; Desactiva renglon 4.
nop;
bcf portb,Act_Ren_1; Activa renglon 1.
movf portb,w;
movwf var_teclado;
movlw 0xF0; Enmascara el nibble alto.
andwf var_teclado,f;
movlw no_push;
subwf var_teclado,w;
btfsc status,Z;
goto sig_ren4dh;
movlw tec_1;
subwf var_teclado,w;
btfsc status,Z;
goto fue_tec1dh;
movlw tec_2;
subwf var_teclado,w;
btfsc status,Z;
goto fue_tec2dh;
movlw tec_3;
subwf var_teclado,w;
btfsc status,Z;
goto barre_tecdh;
movlw tec_A;
subwf var_teclado,w;
btfsc status,Z;
goto barre_tecdh;
sig_ren4dh bsf portb,Act_Ren_1; Desactiva renglon 1.
nop;
bcf portb,Act_Ren_4; Activa renglon 4.
movf portb,w;
movwf var_teclado;
movlw 0xF0; Enmascara el nibble alto.
andwf var_teclado,f;
movlw no_push;
subwf var_teclado,w;
btfsc status,Z;
goto barre_tecdh;
movlw tec_aster;
subwf var_teclado,w;
btfsc status,Z;
goto barre_tecdh;
movlw tec_0;
subwf var_teclado,w;
btfsc status,Z;
goto fue_tec0dh;
movlw tec_gato;
subwf var_teclado,w;
btfsc status,Z;
goto barre_tecdh;
movlw tec_D;
subwf var_teclado,w;
btfsc status,Z;
goto barre_tecdh;
fue_tec0dh movlw .0;
movwf dechor;
goto sal_barrdh;
fue_tec1dh movlw .1;
movwf dechor;
goto sal_barrdh;
fue_tec2dh movlw .2;
movwf dechor;
goto sal_barrdh;
sal_barrdh return;
goto sal_barrdh;
fue_tec1dh movlw .1;
movwf dechor;
goto sal_barrdh;
fue_tec2dh movlw .2;
movwf dechor;
goto sal_barrdh;
sal_barrdh return;
;----------------------------------------------------------------------------------
--------------
;==============================================================================
;=============== Subrutina que barre el teclado unidades de hora ==============
;==============================================================================
barre_tecuh movlw .2;
subwf dechor,w;
btfsc status,Z;
goto barre_tecuh2;
bsf portb,Act_Ren_4; Desactiva renglon 4.
nop;
bcf portb,Act_Ren_1; Activa renglon 1.
movf portb,w;
movwf var_teclado;
movlw 0xF0; Enmascara el nibble alto.
andwf var_teclado,f;
movlw no_push;
subwf var_teclado,w;
btfsc status,Z;
goto sig_ren2uh;
movlw tec_1;
subwf var_teclado,w;
btfsc status,Z;
goto fue_tec1uh;
movlw tec_2;
subwf var_teclado,w;
btfsc status,Z;
goto fue_tec2uh;
movlw tec_3;
subwf var_teclado,w;
btfsc status,Z;
goto fue_tec3uh;
movlw tec_A;
subwf var_teclado,w;
btfsc status,Z;
goto barre_tecuh;
sig_ren2uh bsf portb,Act_Ren_1; Desactiva renglon 1.
nop;
bcf portb,Act_Ren_2; Activa renglon 2.
movf portb,w;
movwf var_teclado;
movlw 0xF0; Enmascara el nibble alto.
andwf var_teclado,f;
movlw no_push;
subwf var_teclado,w;
btfsc status,Z;
goto sig_ren3uh;
movlw tec_4;
subwf var_teclado,w;
btfsc status,Z;
goto fue_tec4uh;
movlw tec_5;
subwf var_teclado,w;
btfsc status,Z;
goto fue_tec5uh;
movlw tec_6;
subwf var_teclado,w;
btfsc status,Z;
goto fue_tec6uh;
movlw tec_B;
subwf var_teclado,w;
btfsc status,Z;
goto barre_tecuh;
sig_ren3uh bsf portb,Act_Ren_2; Desactiva renglon 2.
nop;
bcf portb,Act_Ren_3; Activa renglon 3.
movf portb,w;
movwf var_teclado;
movlw 0xF0; Enmascara el nibble alto.
andwf var_teclado,f;
movlw no_push;
subwf var_teclado,w;
btfsc status,Z;
goto sig_ren4uh;
movlw tec_7;
subwf var_teclado,w;
btfsc status,Z;
goto fue_tec7uh;
movlw tec_8;
subwf var_teclado,w;
btfsc status,Z;
goto fue_tec8uh;
movlw tec_9;
subwf var_teclado,w;
btfsc status,Z;
goto fue_tec9uh;
movlw tec_C;
subwf var_teclado,w;
btfsc status,Z;
goto barre_tecuh;
sig_ren4uh bsf portb,Act_Ren_3; Desactiva renglon 3.
nop;
bcf portb,Act_Ren_4; Activa renglon 4.
movf portb,w;
movwf var_teclado;
movlw 0xF0; Enmascara el nibble alto.
andwf var_teclado,f;
movlw no_push;
subwf var_teclado,w;
btfsc status,Z;
goto barre_tecuh;
movlw tec_aster;
subwf var_teclado,w;
btfsc status,Z;
goto barre_tecuh;
movlw tec_0;
subwf var_teclado,w;
btfsc status,Z;
goto fue_tec0uh;
movlw tec_gato;
subwf var_teclado,w;
btfsc status,Z;
goto barre_tecuh;
movlw tec_D;
subwf var_teclado,w;
btfsc status,Z;
goto barre_tecuh;

barre_tecuh2 bsf portb,Act_Ren_4; Desactiva renglon 4.


nop;
bcf portb,Act_Ren_1; Activa renglon 1.
movf portb,w;
movwf var_teclado;
movlw 0xF0; Enmascara el nibble alto.
andwf var_teclado,f;
movlw no_push;
subwf var_teclado,w;
btfsc status,Z;
goto sig_ren4uh2;
movlw tec_1;
subwf var_teclado,w;
btfsc status,Z;
goto fue_tec1uh;
movlw tec_2;
subwf var_teclado,w;
btfsc status,Z;
goto fue_tec2uh;
movlw tec_3;
subwf var_teclado,w;
btfsc status,Z;
goto fue_tec3uh;
movlw tec_A;
subwf var_teclado,w;
btfsc status,Z;
goto barre_tecuh2;
sig_ren4uh2 bsf portb,Act_Ren_1;
Desactiva renglon 1.
nop;
bcf portb,Act_Ren_4; Activa renglon 4.
movf portb,w;
movwf var_teclado;
movlw 0xF0; Enmascara el nibble alto.
andwf var_teclado,f;
movlw no_push;
subwf var_teclado,w;
btfsc status,Z;
goto barre_tecuh2;
movlw tec_aster;
subwf var_teclado,w;
btfsc status,Z;
goto barre_tecdh;
movlw tec_0;
subwf var_teclado,w;
btfsc status,Z;
goto fue_tec0uh;
movlw tec_gato;
subwf var_teclado,w;
btfsc status,Z;
goto barre_tecuh2;
movlw tec_D;
subwf var_teclado,w;
btfsc status,Z;
goto barre_tecuh2;
fue_tec0uh movlw .0;
movwf unihor;
goto sal_barruh;
fue_tec1uh movlw .1;
movwf unihor;
goto sal_barruh;
fue_tec2uh movlw .2;
movwf unihor;
goto sal_barruh;
fue_tec3uh movlw .3;
movwf unihor;
goto sal_barruh;
fue_tec4uh movlw .4;
movwf unihor;
goto sal_barruh;
fue_tec5uh movlw .5;
movwf unihor;
goto sal_barruh;
fue_tec6uh movlw .6;
movwf unihor;
goto sal_barruh;
fue_tec7uh movlw .7;
movwf unihor;
goto sal_barruh;
fue_tec8uh movlw .8;
movwf unihor;
goto sal_barruh;
fue_tec9uh movlw .9;
movwf unihor;
goto sal_barruh;
sal_barruh return;
;----------------------------------------------------------------------------------
--------------

;==============================================================================
;===============Subrutina que barre el teclado decenas de min y seg============
;==============================================================================
barre_tecdms bsf portb, Act_Ren_4; Desactiva renglon 4.
nop;
bcf portb,Act_Ren_1; Activa renglon 1.
movf portb,w;
movwf var_teclado;
movlw 0xF0; Enmascara el nibble alto.
andwf var_teclado,f;
movlw no_push;
subwf var_teclado,w;
btfsc status,Z;
goto sig_ren2dms;
movlw tec_1;
subwf var_teclado,w;
btfsc status,Z;
goto fue_tec1dms;
movlw tec_2;
subwf var_teclado,w;
btfsc status,Z;
goto fue_tec2dms;
movlw tec_3;
subwf var_teclado,w;
btfsc status,Z;
goto fue_tec3dms;
movlw tec_A;
subwf var_teclado,w;
btfsc status,Z;
goto barre_tecdms;
sig_ren2dms bsf portb,Act_Ren_1; Desactiva renglon 1.
nop;
bcf portb,Act_Ren_2; Activa renglon 2.
movf portb,w;
movwf var_teclado;
movlw 0xF0; Enmascara el nibble alto.
andwf var_teclado,f;
movlw no_push;
subwf var_teclado,w;
btfsc status,Z;
goto sig_ren4dms;
movlw tec_4;
subwf var_teclado,w;
btfsc status,Z;
goto fue_tec4dms;
movlw tec_5;
subwf var_teclado,w;
btfsc status,Z;
goto fue_tec5dms;
movlw tec_6;
subwf var_teclado,w;
btfsc status,Z;
goto barre_tecdms;
movlw tec_B
btfsc status,Z;
goto barre_tecdms;
movlw tec_D;
subwf var_teclado,w;
btfsc status,Z;
goto barre_tecdms;
fue_tec0dms movlw .0;
btfsc carga_dmos,.0;
goto car_0ds;
movwf decmin;
movlw .1;
movwf carga_dmos;
goto sal_barrdms; car_0ds
movwf decseg;
clrf carga_dmos;
goto sal_barrdms;
fue_tec1dms movlw .1;
btfsc carga_dmos,.0;
goto car_1ds;
movwf decmin;
movlw .1;
movwf carga_dmos;
goto sal_barrdms; car_1ds
movwf decseg;
clrf carga_dmos;
goto sal_barrdms;
car_4ds movwf decseg;
clrf carga_dmos;
goto sal_barrdms;
fue_tec5dms movlw .5;
btfsc carga_dmos,.0;
goto car_5ds;
movwf decmin;
movlw .1;
movwf carga_dmos;
goto sal_barrdms;
car_5ds movwf decseg;
clrf carga_dmos;
goto sal_barrdms;
sal_barrdms
return;
;----------------------------------------------------------------------------------
--------------
;==============================================================================
;===============Subrutina que barre el teclado unidades de min y seg============
;==============================================================================
barre_tecums bsf portb,Act_Ren_4; Desactiva renglon 4.
nop;
bcf portb,Act_Ren_1; Activa renglon 1.
movf portb,w;
movwf var_teclado;
movlw 0xF0; Enmascara el nibble alto.
movwf var_teclado;
movlw 0xF0; Enmascara el nibble alto.
andwf var_teclado,f;
movlw no_push;
subwf var_teclado,w;
btfsc status,Z;
goto sig_ren3ums;
movlw tec_4;
subwf var_teclado,w;
btfsc status,Z;
goto fue_tec4ums;
movlw tec_5;
subwf var_teclado,w;
btfsc status,Z;
goto fue_tec5ums;
movlw tec_6;
subwf var_teclado,w;
btfsc status,Z;
goto fue_tec6ums;
movlw tec_B;
subwf var_teclado,w;
btfsc status,Z;
goto barre_tecums;
sig_ren3ums bsf portb,Act_Ren_2; Desactiva renglon 2.
goto barre_tecums;
sig_ren4ums bsf portb,Act_Ren_3; Desactiva renglon 3.
nop;
bcf portb,Act_Ren_4; Activa renglon 4.
movf portb,w;
movwf var_teclado;
movlw 0xF0; Enmascara el nibble alto.
andwf var_teclado,f;
movlw no_push;
subwf var_teclado,w;
btfsc status,Z;
goto barre_tecums;
movlw tec_aster;
subwf var_teclado,w;
btfsc status,Z;
goto barre_tecums;
movlw tec_0;
subwf var_teclado,w;
btfsc status,Z;
goto fue_tec0ums;
movlw tec_gato;
subwf var_teclado,w;
btfsc status,Z;
goto barre_tecums;
goto car_2us;
movwf unimin;
movlw .1;
movwf carga_umos;
goto sal_barrums; car_2us
movwf uniseg;
clrf carga_umos;
goto sal_barrums;
fue_tec3ums movlw .3;
btfsc carga_umos,.0;
goto car_3us;
movwf unimin;
movlw .1;
movwf carga_umos;
goto sal_barrums; car_3us
movwf uniseg;
clrf carga_umos;
goto sal_barrums;
fue_tec4ums movlw .4;
btfsc carga_umos,.0;
goto car_4us;
movwf unimin;
movlw .1;
movwf carga_umos;
goto sal_barrums;
movwf uniseg;
clrf carga_umos;
goto sal_barrums; car_7us
movwf uniseg;
clrf carga_umos;
goto sal_barrums;
fue_tec8ums movlw .8;
btfsc carga_umos,.0;
goto car_8us;
movwf unimin;
movlw .1;
movwf carga_umos;
goto sal_barrums;
car_8us movwf uniseg;
clrf carga_umos;
goto sal_barrums;
fue_tec9ums movlw .9;
btfsc carga_umos,.0;
goto car_9us;
movwf unimin;
movlw .1;
movwf carga_umos;
goto sal_barrums; car_9us
movwf uniseg;
clrf carga_umos;
goto sal_barrums;
sal_barrums return;
;----------------------------------------------------------------------------------
--------------
;==============================================================================
;===============Subrutina que revisa si esta presionada la tecla B=============
;==============================================================================
rev_tecB bsf portb,Act_Ren_4; Desactiva renglon 4.
nop;
bcf portb,Act_Ren_2; Activa el renglon 2.
movf portb,w;
movwf var_teclado;
movlw 0xF0;
andwf var_teclado,f; Enmascara el nibble alto.
movlw no_push;
subwf var_teclado,w;
btfsc status,Z;
goto rev_tecB;
movlw tec_B;
subwf var_teclado,w;
btfsc status,Z;
goto rev_tecB;
return;
;----------------------------------------------------------------------------------
--------------
;==============================================================================
;===============Subrutina que muestra el tiempo================================
;==============================================================================
show_time call esp_int;
call pulso_enable;
movlw '-';
movwf portc;
call pulso_enable;
movlw 0x30;
addwf decmin,w;
movwf portc;
call pulso_enable;
movlw 0x30;
addwf unimin,w;
movwf portc;
call pulso_enable;
movlw '-';
movwf portc;
call pulso_enable;
movlw 0x30;
addwf decseg,w;
movwf portc;
call pulso_enable;
movlw 0x30;
addwf uniseg,w;
movwf portc;
call pulso_enable;
movlw ' ';
movwf portc;
call pulso_enable;
movlw ' ';
movwf portc;
call pulso_enable;
movlw ' ';
movwf portc;
call pulso_enable;
movlw ' ';
movwf portc;
call pulso_enable;
return;
bcf porta,RS_LCD;
;movlw 0x8B;
;movwf portc;
;call pulso_enable;
;bsf porta,RS_LCD;
;movlw .9;
;movwf uni_seg;
;movlw 0x30;
;addwf uni_seg,w;
;movwf portc;
;call pulso_enable;
;----------------------------------------------------------------------------------
--------------
;===============================================
;== Subrutina de espera de int. de 1 segundo ==
;===============================================
esp_int nop;
btfss banderas,ban_int;
goto esp_int;
bcf banderas,ban_int;
return;
;----------------------------------------------------------------------------------
--------------
;==============================================================================
;===Subrutina que cuenta el tiempo desde 00-00-00 hasta 20-00-00==============
;==============================================================================
count_time1 incf uniseg,f; Incrementa en 1 la cuenta de las unidades de
segundo.
movlw .10;
subwf uniseg,w;
btfss status,Z; Compara si es que ya se llego al numero maximo de las
uni. de seg. que es 9.
goto exit_count1; Regresa al programa principal si es que aun no se
llega a 9.
clrf uniseg; Si se paso a XX-XX-X9 reinicia la cuenta desde 0.
incf decseg,f;
movlw .6;
subwf decseg,w;
btfss status,Z; Compara si es que ya se llego al numero maximo de las
dec. de seg. que es 5.
goto exit_count1; Regresa al programa principal si es que aun no se
llega a 5.
clrf uniseg;
clrf decseg; Si se paso a XX-XX-59 reinicia la cuenta desde 0.
clrf unihor; Si se paso a X9-59-59 reinicia la cuenta desde 0.
incf dechor,f;
movlw .2;
subwf dechor,w;
btfss status,Z; Compara si es que ya se llego al numero maximo de las
dec. de hor. que es mas de 1.
goto exit_count1; Regresa al programa principal si es que aun no se
pasa a 1.
clrf uniseg;
clrf decseg;
clrf unimin;
clrf decmin;
clrf unihor; Si se paso a 19-59-59 lleva la cuenta a 20-00-00.
exit_count1 return;
;----------------------------------------------------------------------------------
--------------
;==============================================================================
;===Subrutina que cuenta el tiempo desde 20-00-00 hasta 23-59-59==============
;==============================================================================
count_time2 incf uniseg,f; Incrementa en 1 la cuenta de las unidades de
segundo.
movlw .10;
subwf uniseg,w;
btfss status,Z; Compara si es que ya se llego al numero maximo de las
uni. de seg. que es 9.
goto exit_count2; Regresa al programa principal si es que aun no se
llega a 9.
clrf uniseg; Si se paso a 2X-XX-X9 reinicia la cuenta desde 0.
movlw .4;
subwf unihor,w;
btfss status,Z; Compara si es que ya se llego al numero maximo de las
uni. de hor. que es 3.
goto exit_count2; Regresa al programa principal si es que aun no se
llega a 3.
clrf uniseg;
clrf decseg;
clrf unimin;
clrf decmin;
clrf unihor;
clrf dechor; Si se paso a 23-59-59 reinicia la cuenta desde 0.
exit_count2 return;
;----------------------------------------------------------------------------------
--------------
;================================================
;== Subrutina de inicialización de la LCD ====
;================================================
ini_lcd bcf porta,RS_LCD; coloca la lcd en formato comandos
movlw 0x38; Carga con 38 el registro w
movwf portc; Mueve el 38 al bus de datos que está en el puerto c
call pulso_enable; Genera pulso eneable para que capture y ejecute el
dato
movlw 0x01;
movwf portc;
call pulso_enable;
movlw 0x06; Borra todos los caracteres de la LCD y posiciona el cursor
en el digito 1
movwf portc;
call pulso_enable;
movlw 0x0c;
movwf portc;
call pulso_enable;
movlw 0x80; Direccion del digito 1 en la LCD
movwf portc;
call pulso_enable;
bsf porta,RS_LCD; coloca el LCD en modo datos
return;
;----------------------------------------------------------------------------------
-------
;================================================
;== Subrutina de Retardo de medio segundo ====
;================================================
pulso_enable bcf porta,Enable_LCD;
call retardo_1ms;
bsf porta,Enable_LCD;
call ret_40ms;
return;
;----------------------------------------------------------------------------------
-------
;=================================================
;== Subrutina de Retardo de 1 milisegundos ====
;=================================================
retardo_1ms clrf cont_milis;
esp_int1ms movlw .1;
subwf cont_milis,w;
btfss status,Z;
goto esp_int1ms;
return;
;----------------------------------------------------------------------------------
-------
;================================================
;== Subrutina de Retardo de 40 milisegundos ====
;================================================
ret_40ms clrf cont_milis;
esp_int40ms movlw .40;
subwf cont_milis,w;
btfss status,Z;
goto esp_int40ms;
return;
;----------------------------------------------------------------------------------
---------------------------
end

También podría gustarte