Documentos de Académico
Documentos de Profesional
Documentos de Cultura
;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;
;----------------------------------------------------------------------------------
--------------------
;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
;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;
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;
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==
;=======================
;----------------------------------------------------------------------------------
--------------
;==============================================================================
;===============Subrutina que revisa si esta presionada la tecla A=============
;==============================================================================
;==============================================================================
;===============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