;ESTE PROGRAMA MUESTRA LOS CARACTERES PRESIONADOS EN UNA MATRIZ DE 7X5 MEDIANTE UNA COMUNICACION SERIAL ENTRE EL MICROCONTROLADOR Y LA PC.
;--------------------------------------------------------------------------------------------------
list p=16f877A;
#include <p16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _XT_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF;
;--------------------------------------------------------------------------------------------------
pushw equ 0x20;
pushs equ 0x21;
pspclath equ 0x22;
puhfsr equ 0x23;
milis equ 0x24;
ent_milis equ 0x25;
n_x_milis equ 0x26;
con_milis equ 0x27;
con_seg equ 0x28;
Dato_rx equ 0x29;
Dato_tx equ 0x2a;
var_car equ 0x2b;
banderas_int equ 0x2c;
Contador1 equ 0x2d;Variable a utili. en la subrutina de perdida de tiempo.
Contador2 equ 0x2e;
Contador3 equ 0x2f;
apuntador equ 0x30;
contador equ 0x31;
contador1 equ 0x32;
Contador4 equ 0x33;
Contador5 equ 0x34;
Contador6 equ 0x35;
Contador7 equ 0x36;
;---------------------------------------------------------------------------------------------------
;Def. de constantes a utilizar.
O equ .10
U equ .5
Q equ .22;
num_itera equ .5;
decenas equ 0x37;
;---------------------------------------------------------------------------------------------
;
;Def. de Ptos. I/0.
;Puerto A.
Sin_UsoRA0 equ .0; // Sin Uso RA0.
Sin_UsoRA1 equ .1; // Sin Uso RA1.
Sin_UsoRA2 equ .2; // Sin Uso RA2.
Sin_UsoRA3 equ .3; // Sin Uso RA3.
Sin_UsoRA4 equ .4; // Sin Uso RA3.
Sin_UsoRA5 equ .5; // Sin Uso RA5.
proga equ B'111111';Def. la encua
;Puerto B.
Dec_Sega equ .0; // Salida para controlar el segmento a del digito decenas.
Dec_Segb equ .1; // Salida para controlar el segmento b del digito decenas.
Dec_Segc equ .2; // Salida para controlar el segmento c del digito decenas.
Dec_Segd equ .3; // Salida para controlar el segmento d del digito decenas.
Dec_Sege equ .4; // Salida para controlar el segmento e del digito decenas.
Dec_Segf equ .5; // Salida para controlar el segmento f del digito decenas.
Dec_Segg equ .6; // Salida para controlar el segmento g del digito decenas.
Dec_Segdp equ .7; // Salida para controlar el segmento dp del digito decenas.
progb equ b'00000000'; // Programaciòn inicial del puerto B.
;Puerto C.
Sin_UsoRC0 equ .0; // Sin Uso RC0.
Sin_UsoRC1 equ .1; // Sin Uso RC1.
Sin_UsoRC2 equ .2; // Sin Uso RC2.
Sin_UsoRC3 equ .3; // Sin Uso RC3.
Sin_UsoRC4 equ .4; // Sin Uso RC4.
Sin_UsoRC5 equ .5; // Sin Uso RC5.
TX_dataBit equ .6; // Salida para transmitir datos.
RX_dataBit equ .7; // Entrada para recibir datos.
progc equ B'10111111';Def. la encua
;Puerto D.
Uni_Sega equ .0; // Salida para controlar el segmento a del digito unidades.
Uni_Segb equ .1; // Salida para controlar el segmento b del digito unidades.
Uni_Segc equ .2; // Salida para controlar el segmento c del digito unidades.
Uni_Segd equ .3; // Salida para controlar el segmento d del digito unidades.
Uni_Sege equ .4; // Salida para controlar el segmento e del digito unidades.
Uni_Segf equ .5; // Salida para controlar el segmento f del digito unidades.
Uni_Segg equ .6; // Salida para controlar el segmento g del digito unidades.
Uni_Segdp equ .7; // Salida para controlar el segmento dp del digito unidades.
progd equ b'00000000'; // Programaciòn inicial del puerto B.
;Puerto E.
Sin_UsoRE0 equ .0; // Sin Uso RE0.
Sin_UsoRE1 equ .1; // Sin Uso RE1.
Sin_UsoRE2 equ .1; // Sin Uso RE2.
proge equ b'111'; // Programaciòn inicial del puerto E.
;-------------------------------------------------------------------------------------------------
;Bits de banderas de los registros.
;Banderas del registro banderas_int.
tim_0 equ .0;
tim_1 equ .1;
tim_2 equ .2;
tim_3 equ .3;
tim_4 equ .4;
tim_5 equ .5;
tim_6 equ .6;
tim_7 equ .7;
;---------------------------------------------------------------------------------------------------
;===================
;== Vector Reset ==
;===================
org 0000h;
vec_reset goto prog_prin;
;-------------------------------------------------------------------------------------------------
;==================================
;== Subrutina de Interrupciones ==
;==================================
org 0004h;
vec_int movwf pushw;
movf STATUS,W;
movwf pushs;
clrf STATUS;
movf PCLATH,W;
movwf pspclath;
movf FSR,w;
movwf puhfsr;
btfsc INTCON,T0IF;
call opera_led;
movlw .6;
movwf TMR0;
movf puhfsr,w;
movwf FSR;
movf pspclath,w;
movwf PCLATH;
movf pushs,w;
movwf STATUS;
movf pushw,w;
retfie;
;--------------------------------------------------------------------------------------------------
;===================================
;== Subrutina de control de led ==
;===================================
opera_led incf milis,f;
movlw .1;
subwf milis,w;
btfsc STATUS,Z;
goto sig_int;
goto saled;
sig_int clrf milis;
incf ent_milis,f;
movlw .1;
subwf ent_milis,w;
btfss STATUS,Z;
goto saled;
clrf milis;
clrf ent_milis;
incf con_milis,f;
bsf banderas_int,tim_0;
saled bcf INTCON,T0IF;
return;
;--------------------------------------------------------------------------------------------------
;========================================
;== Subrutina de Ini. de Reg. del Pic ==
;========================================
prog_ini bsf STATUS,RP0; Ponte en el banco 1 de ram.
movlw 0x81;
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.
clrf STATUS;
clrf PORTC;
bsf PORTC,TX_dataBit;
clrf ent_milis;
movlw .5;
movwf n_x_milis;
movlw .6;
movwf TMR0;
movlw 0xa0;
movwf INTCON;
return;
;--------------------------------------------------------------------------------------------------
;=========================
;== Programa principal ==
;=========================
prog_prin call prog_ini;
loop_prin nop;
call RX_Data;
;call retardo_2;
movf Dato_rx,w;
movwf Dato_tx;
movwf var_car;
;call TX_Data;
call conv_Asciimatriz;
goto loop_prin;
;--------------------------------------------------------------------------------------------------
;===============================
;== Subrutina de RX de Datos ==
;===============================
RX_Data nop;
btfsc PORTC,RX_dataBit;
goto RX_Data;
call retardo_2;
bcf INTCON,GIE;
movlw .8;
movwf Contador3;
sig_RxDato btfss PORTC,RX_dataBit;
goto bit_enCero;
bsf STATUS,C;
goto rota_dato;
bit_enCero bcf STATUS,C;
rota_dato rrf Dato_rx,f;
call retardo;
decfsz Contador3,f;
goto sig_RxDato;
bsf INTCON,GIE;
call retardo;
return;
;--------------------------------------------------------------------------------------------------
;===============================================
;== Subrutina que conv. Ascii a 7 segmentos ==
;===============================================
conv_Asciimatriz movlw 'A';
subwf var_car,w;
btfsc STATUS,Z;
goto fue_A;
movlw 'B';
subwf var_car,w;
btfsc STATUS,Z;
goto fue_B;
movlw 'C';
subwf var_car,w;
btfsc STATUS,Z;
goto fue_C;
movlw 'D';
subwf var_car,w;
btfsc STATUS,Z;
goto fue_D;
movlw 'E';
subwf var_car,w;
btfsc STATUS,Z;
goto fue_E;
movlw 'F';
subwf var_car,w;
btfsc STATUS,Z;
goto fue_F;
movlw 'G';
subwf var_car,w;
btfsc STATUS,Z;
goto fue_G;
movlw 'H';
subwf var_car,w;
btfsc STATUS,Z;
goto fue_H;
movlw 'I';
subwf var_car,w;
btfsc STATUS,Z;
goto fue_I;
movlw 'J';
subwf var_car,w;
btfsc STATUS,Z;
goto fue_J;
movlw 'K';
subwf var_car,w;
btfsc STATUS,Z;
goto fue_K;
movlw 'L';
subwf var_car,w;
btfsc STATUS,Z;
goto fue_L;
return;
;===================================================================
;============= MUESTRA EL CARACTER EN UNA MATRIZ DE 7X5 ========
;===================================================================
fue_A movlw d'30';
movwf contador1;
loopA1 clrf apuntador;
clrf contador;
loopA movlw 0x08;
movwf PCLATH;
call tabla_carA;
bcf PCLATH, 3;
movwf PORTD;
incf apuntador,f;
movlw 0x08;
movwf PCLATH;
call tabla_carA;
bcf PCLATH, 3;
movwf PORTB;
call delay_4ms;
clrf PORTB;
incf apuntador,f;
incf contador,f;
movlw .5;
subwf contador,w;
btfss STATUS,Z;
goto loopA;
decfsz contador1,f;
goto loopA1
return;
goto salte_conv;
fue_B movlw d'30';
movwf contador1;
loopB1 clrf apuntador;
clrf contador;
loopB movlw 0x08;
movwf PCLATH;
call tabla_carB;
bcf PCLATH, 3;
movwf PORTD;
incf apuntador,f;
movlw 0x08;
movwf PCLATH;
call tabla_carB;
bcf PCLATH, 3;
movwf PORTB;
call delay_4ms;
clrf PORTB;
incf apuntador,f;
incf contador,f;
movlw .5;
subwf contador,w;
btfss STATUS,Z;
goto loopB;
decfsz contador1,f;
goto loopB1
return;
goto salte_conv;
fue_C movlw d'30';
movwf contador1;
loopC1 clrf apuntador;
clrf contador;
loopC movlw 0x08;
movwf PCLATH;
call tabla_carC;
bcf PCLATH, 3;
movwf PORTD;
incf apuntador,f;
movlw 0x08;
movwf PCLATH;
call tabla_carC;
bcf PCLATH, 3;
movwf PORTB;
call delay_4ms;
clrf PORTB;
incf apuntador,f;
incf contador,f;
movlw .5;
subwf contador,w;
btfss STATUS,Z;
goto loopC;
decfsz contador1,f;
goto loopC1
return;
goto salte_conv;
fue_D movlw d'30';
movwf contador1;
loopD1 clrf apuntador;
clrf contador;
loopD movlw 0x08;
movwf PCLATH;
call tabla_carD;
bcf PCLATH, 3;
movwf PORTD;
incf apuntador,f;
movlw 0x08;
movwf PCLATH;
call tabla_carD;
bcf PCLATH, 3;
movwf PORTB;
call delay_4ms;
clrf PORTB;
incf apuntador,f;
incf contador,f;
movlw .5;
subwf contador,w;
btfss STATUS,Z;
goto loopD;
decfsz contador1,f;
goto loopD1
return;
goto salte_conv;
fue_E movlw d'30';
movwf contador1;
loopE1 clrf apuntador;
clrf contador;
loopE movlw 0x08;
movwf PCLATH;
call tabla_carE;
bcf PCLATH, 3;
movwf PORTD;
incf apuntador,f;
movlw 0x08;
movwf PCLATH;
call tabla_carE;
bcf PCLATH, 3;
movwf PORTB;
call delay_4ms;
clrf PORTB;
incf apuntador,f;
incf contador,f;
movlw .5;
subwf contador,w;
btfss STATUS,Z;
goto loopE;
decfsz contador1,f;
goto loopE1
return;
goto salte_conv;
fue_F movlw d'30';
movwf contador1;
loopF1 clrf apuntador;
clrf contador;
loopF nop;
pageselw tabla_carF
pagesel tabla_carF
call tabla_carF;
bcf PCLATH, 3;
movwf PORTD;
incf apuntador,f;
pageselw tabla_carF
pagesel tabla_carF
call tabla_carF;
bcf PCLATH, 3;
movwf PORTB;
call delay_4ms;
clrf PORTB;
incf apuntador,f;
incf contador,f;
movlw .5;
subwf contador,w;
btfss STATUS,Z;
goto loopF;
decfsz contador1,f;
goto loopF1
return;
goto salte_conv;
fue_G movlw d'30';
movwf contador1;
loopG1 clrf apuntador;
clrf contador;
loopG nop;
pageselw tabla_carG
pagesel tabla_carG
call tabla_carG;
bcf PCLATH, 3;
movwf PORTD;
incf apuntador,f;
pageselw tabla_carG
pagesel tabla_carG
call tabla_carG;
bcf PCLATH, 3;
movwf PORTB;
call delay_4ms;
clrf PORTB;
incf apuntador,f;
incf contador,f;
movlw .5;
subwf contador,w;
btfss STATUS,Z;
goto loopG;
decfsz contador1,f;
goto loopG1
return;
goto salte_conv;
fue_H movlw d'30';
movwf contador1;
loopH1 clrf apuntador;
clrf contador;
loopH nop;
pageselw tabla_carH
pagesel tabla_carH
call tabla_carH;
bcf PCLATH, 3;
movwf PORTD;
incf apuntador,f;
pageselw tabla_carH
pagesel tabla_carH
call tabla_carH;
bcf PCLATH, 3;
movwf PORTB;
call delay_4ms;
clrf PORTB;
incf apuntador,f;
incf contador,f;
movlw .5;
subwf contador,w;
btfss STATUS,Z;
goto loopH;
decfsz contador1,f;
goto loopH1
return;
goto salte_conv;
fue_I movlw d'30';
movwf contador1;
loopI1 clrf apuntador;
clrf contador;
loopI nop;
pageselw tabla_carI
pagesel tabla_carI
call tabla_carI;
bcf PCLATH, 3;
movwf PORTD;
incf apuntador,f;
pageselw tabla_carI
pagesel tabla_carI
call tabla_carI;
bcf PCLATH, 3;
movwf PORTB;
call delay_4ms;
clrf PORTB;
incf apuntador,f;
incf contador,f;
movlw .5;
subwf contador,w;
btfss STATUS,Z;
goto loopI;
decfsz contador1,f;
goto loopI1
return;
goto salte_conv;
fue_J movlw d'30';
movwf contador1;
loopJ1 clrf apuntador;
clrf contador;
loopJ nop;
pageselw tabla_carJ
pagesel tabla_carJ
call tabla_carJ;
bcf PCLATH, 3;
movwf PORTD;
incf apuntador,f;
pageselw tabla_carJ
pagesel tabla_carJ
call tabla_carJ;
bcf PCLATH, 3;
movwf PORTB;
call delay_4ms;
clrf PORTB;
incf apuntador,f;
incf contador,f;
movlw .5;
subwf contador,w;
btfss STATUS,Z;
goto loopJ;
decfsz contador1,f;
goto loopJ1
return;
goto salte_conv;
fue_K movlw d'30';
movwf contador1;
loopK1 clrf apuntador;
clrf contador;
loopK nop;
pageselw tabla_carK
pagesel tabla_carK
call tabla_carK;
bcf PCLATH, 3;
movwf PORTD;
incf apuntador,f;
pageselw tabla_carK
pagesel tabla_carK
call tabla_carK;
bcf PCLATH, 3;
movwf PORTB;
call delay_4ms;
clrf PORTB;
incf apuntador,f;
incf contador,f;
movlw .5;
subwf contador,w;
btfss STATUS,Z;
goto loopK;
decfsz contador1,f;
goto loopK1
return;
goto salte_conv;
fue_L movlw d'30';
movwf contador1;
loopL1 clrf apuntador;
clrf contador;
loopL nop;
bsf PCLATH, 3;
call tabla_carL;
bcf PCLATH, 3;
movwf PORTD;
incf apuntador,f;
bsf PCLATH, 3;
call tabla_carL;
bcf PCLATH, 3;
movwf PORTB;
call delay_4ms;
clrf PORTB;
incf apuntador,f;
incf contador,f;
movlw .5;
subwf contador,w;
btfss STATUS,Z;
goto loopL;
decfsz contador1,f;
goto loopL1
return;
goto salte_conv;
salte_conv return;
;--------------------------------------------------------------------------------------------------
;====================================================================
;== Subrutina de retardo de 416.6 useg. para un baud rate de 2400 ==
;====================================================================
retardo movlw .137; 137 ts. ts = (1/fo)4 = (1/4000000)4 = 1 us.
movwf Contador1; ts. tr = ts + ts + (ts + 2ts)M + 2ts
loop1 decfsz Contador1,f; ts o 2ts. tr = 4ts + 3Mts
goto loop1; 2ts. tr = (4 + 3M)ts M = 137
; tr = 415 us.
return;
;--------------------------------------------------------------------------------------------------
;=========================================================
;== Subrutina de retardo de bit y medio de 624.9 useg. ==
;=========================================================
retardo_2 movlw .206; ts. ts = (1/fo)4 = (1/4000000)4 = 1 us.
movwf Contador1; ts. tr = ts + ts + (ts + 2ts)M + 2ts
loop11 decfsz Contador1,f; ts o 2ts. tr = 4ts + 3Mts
goto loop11; 2ts. tr = (4 + 3M)ts M = 206
return;
;--------------------------------------------------------------------------------------------------
;=====================================
;== Subrutina de retardo de 40ms ====
;=====================================
retardo_milis clrf con_milis;
movlw .40; Carga valor en milisegundos
esp_milis subwf con_milis,w;
btfss STATUS,Z;
goto esp_milis;
;=====================================
;== Subrutina de retardo de 4ms ====
;=====================================
delay_4ms movlw Q;
movwf Contador6;
Loop6 movlw U;
movwf Contador5;
Loop5 movlw O;
movwf Contador4;
Loop4 decfsz Contador4, f;
goto Loop4;
decfsz Contador5, f;
goto Loop5;
decfsz Contador6, f;
goto Loop6;
return;
;==============================================================
;===================== PAGINA 2 ========================
;==============================================================
org 0x800
tabla_carA movf apuntador, w;
addwf PCL,f;
dt .3,.1,.233,.2,.236,.4,.233,.8,.3,.16;
tabla_carB movf apuntador, w;
addwf PCL,f;
dt .0,.1,.54,.2,.54,.4,.54,.8,.73,.16;
tabla_carC movf apuntador, w;
addwf PCL,f;
dt .0,.1,.62,.2,.62,.4,.62,.8,.93,.16;
tabla_carD movf apuntador, w;
addwf PCL,f;
dt .0,.1,.62,.2,.62,.4,.62,.8,.65,.16;
tabla_carE movf apuntador, w;
addwf PCL,f;
dt .0,.1,.54,.2,.54,.4,.62,.8,.62,.16;
tabla_carF movf apuntador, w;
addwf PCL,f;
dt .0,.1,0XF6,.2,0XF6,.4,0XF6,.8,0XF6,.16;
tabla_carG movf apuntador, w;
addwf PCL,f;
dt .3,.1,0XBD,.2,0XAE,.4,0XAE,.8,0X8E,.16;
tabla_carH movf apuntador, w;
addwf PCL,f;
dt .0,.1,.119,.2,.119,.4,.119,.8,.0,.16;
tabla_carI movf apuntador, w;
addwf PCL,f;
dt .255,.1,.62,.2,.0,.4,.62,.8,.255,.16;
tabla_carJ movf apuntador, w;
addwf PCL,f;
dt 0X0F,.1,0X3F,.2,0X3F,.4,0X3F,.8,0X00,.16;
tabla_carK movf apuntador, w;
addwf PCL,f;
dt .0,.1,.119,.2,.107,.4,.28,.8,.255,.16;
tabla_carL movf apuntador, w;
addwf PCL,f;
dt .0,.1,.191,.2,.191,.4,.191,.8,.191,.16;
end;