#fuses INTRC_I!"C#R // scilador interno! "C#R acti$o #fuses N%&T!N'R(N&T // )in 'ro*nout reset ni %o*er up timer #use fast_io+all, // #a confi-uraci.n de los puertos solo se hace al principio. #use dela/+cloc018", // 2elocidad del oscilador interno 8 "34 #define #oad %IN_'5 // #oad +)TC% am6os inte-rados, '5 #define Cl0 %IN_'1 // Cloc0 +)3C% am6os inte-rados, '1 #define dClm %IN_'7 // 8ata para las columnas +8) inte-rado 1, 'C7 #define d#in %IN_'9 // 8ata para las lineas +8) inte-rado 7, '9 char "emoria:;6<= // ;6 '/tes para la memoria +5 > ;?, char 2isor:8<= // 8 para el $isor +8 columnas, int1 fla-= // @la-s de control int1 fla-7= int indA= // Indice donde almacenarB las nue$as columnas. int line= // #inea Cue a mostrar. int time= // 2aria6les para el control de int ptime= // la $elocidad de despla4amiento. int t= // 2aria6le auAiliar. $oid Car-a"em+char Dscii,= $oid EuardaClm+char c,= #int_rtcc $oid isr+,F int "ul1178= // Cada $e4 Cue ocurre la interrupcion if+GGline>H,#ine15= // selecciona la si-uiente linea! si se pasa de H $uel$e a 5.
if+GGptime>?,F // )uma 1 a ptime. )i se pasa de 75 ptime15= // lo pone en 5 / suma 1 a time. if+GGtime>755,F // )i se pasa de 755 time15= // lo pone en 5 @la-1true= // / acti$a el fla-. I I
for+t15=t<8=tGG,F // 'ucle 5 > H +#ineas,
output_6it+d#in!JJ+2isor:#ine<K"ul,,= // d#in es seteado con el $alor // del 6it de la fila actual. if +#ine11t,output_hi-h+dClm,= // )i #ine es i-ual a t // acti$a el 6it correspondiente else output_lo*+dClm,= // a la columna! sino lo desacti$a.
output_lo*+Cl0,= // output_hi-h+Cl0,= // Rota el contenido interno del HL3C?;?.
"ul>>11= // 8i$ide la mascara Cue compara con 2isor:< +178!6L!97..., I output_lo*+#oad,= output_hi-h+#oad,=// Ml contenido interno del inte-rado pasa a las salidas.
I $oid main+,F int 0= set_tris_a+5A55,= set_tris_6+5A55,= for +015=0<8=0GG,F 2isor:0<15= I for +015=0<;6=0GG,F "emoria:0<15= I // #impia la memoria / el $isor
fla-1true= // Dcti$o el fla- para Cue car-ue la memoria
setup_timer_5+RTCC_INTMRND#NRTCC_8I2_1,= // Confi-uraci.n del Timer5 ena6le_interrupts+int_rtcc,= // Interrupcion por Timer5 ena6le_interrupts+-lo6al,= // Interrupciones -lo6ales
doF if +@la-,F // )i el fla- estB acti$ado fla-71true= // Dcti$a el fla-7
for +015=0<8=0GG,F // %asa el contenido de las primeras 8 $isor:0<1"emoria:0<= // columnas en memoria al $isor I
for +015=0<;?=0GG,F // Rota el contenido de toda la memoria "emoria:0<1"emoria:0G1<=// a la i4Cuierda 111G1! 717G1! n1nG1...
if +"emoria:0<J15,F@la-71false=I // )i ha/ al-una columna Cue no // estO $acPa desacti$a el fla-7 I "emoria:;?<15= // #impia la ultima columna de la memoria
if +@la-7,F // )i fla-7 estB acti$o indA1H= // a partir de la columna H Car-a"em+Q%ICR'TQ,= // escri6e %ICR'T I @la-1false= // 8esacti$a el fla-
I I*hile +true,= // 'ucle infinito I $oid EuardaClm+char c,F if +indA<;L,F "emoria:indA<1c= // Euarda la columna en la u6icaci.n actual de memoria indAGG= // / aumenta el indice I I $oid Car-a"em+char ascii,F // Car-a la memoria con el caracter deseado s*itch +ascii,F
case+RTR,S EuardaClm+5655555511,= EuardaClm+5655555551,= EuardaClm+5651111111,= EuardaClm+5651111111,= EuardaClm+5655555551,= EuardaClm+5655555511,= 6rea0= I EuardaClm+5655555555,= OTRA #fuses 3)! 3L! N(8T! N%RTMCT! N#2% #use dela/+cloc01L8", static int1 smille:H<:15<1F +1!1!1!1!1!1!1!1!1!1,! +1!1!5!5!1!1!5!5!1!1,! +1!1!5!5!1!1!5!5!1!1,! +1!1!1!1!1!1!1!1!1!1,! +1!5!1!1!1!1!1!1!5!1,! +1!1!5!5!5!5!5!5!1!1,! +1!1!1!1!1!1!1!1!1!1, I= int -etCol%icture+int1 picture:H<:15<! int col,= $oid main+$oid, F int t= setup_oscillator+)C_6L"3T,= dela/_ms+155,= t1-etCol%icture+smille!5,= I int -etCol%icture+int1 picture:H<:15<! int col, F int i= int col_data15= int1 6it_pict= //int 6it_pict= for+i15=i<H=iGG, F 6it_pict1picture:i<:col<= I return col_data=//No le ha-ais caso I