1 ; vim: set filetype=asm51 :
3 ; Fragmento del proyecto que lee la matriz de 8x8 y la muestra a intervalos
8 LEDS = p0 ; el led de arriba es el más significativo
9 MAT_LEN = 0x30 ; tamaño de la matriz (en columnas)
10 MAT_COL = 0x31 ; columna mostrándose actualmente
11 MATRIZ = 0x32 ; primera columna de la matriz
12 INTERVAL= 0 ; 65535 useg = 65 mseg = 0.06 seg ~= 15 fps
15 ; Área de inicio (boot)
19 ; Vector de interrupción de Timer2
21 clr tf2 ; Limpia flag de interrupción
22 ljmp timer2handler ; Salta al manejador de interrupción
25 ; Área de datos por default
27 MAT_LEN_D: ; tamaño de la matriz por default
28 .db #8 ; 8x8 por default
29 MAT_D: ; matriz por default
31 .db #0b01000000 ; columna 0
32 .db #0b00100000 ; columna 1
33 .db #0b00010000 ; columna 2
34 .db #0b00001000 ; columna 3
35 .db #0b00000100 ; columna 4
36 .db #0b00000010 ; columna 5
37 .db #0b00000100 ; columna 6
38 .db #0b00001000 ; columna 7
52 ; dirección de barrido
55 ; Área del hilo principal del programa
58 ;al gas mov LEDS, #0 ; Apaga todos los leds
59 ; Carga tamaño de la matriz default en la memoria
65 ; Carga la matriz default en la memoria
66 mov dptr, #MAT_D ; Dirección de última columna default
67 mov MAT_COL, MAT_LEN ; Uso MAT_COL temporalmente como counter
69 djnz MAT_COL, columna0$
70 mov a, MAT_COL ; Índice de la matriz default
71 movc a, @a + dptr ; Obtengo columna
72 mov r2, a ; Pongo columna en registro temporal
73 mov a, MAT_COL ; Índice de la matriz en memoria
74 add a, #MATRIZ ; Dirección de memoria de la columna
75 mov r0, a ; Uso r0 de puntero
76 mov a, r2 ; Pongo columna a cargar en acumulador
77 mov @r0, a ; *r0 = columna de la matriz default
78 sjmp loop$ ; Volvemos a empezar
80 clr a ; Falta posición 0
81 movc a, @a + dptr ; Obtengo columna 0
82 mov MATRIZ, a ; La pongo en la matriz en memoria
83 mov MAT_COL, MAT_LEN ; Cargo columna actual
85 ; Setup del timer e interrupciones
86 mov rcap2l, #<INTERVAL ; low byte del intervalo
87 mov rcap2h, #>INTERVAL ; high byte del intervalo
88 mov ie, #0b10100000 ; Habilita interrupción timer 2
89 mov t2con, #0b00000100 ; Setup Timer 2 (auto-reload y start)
90 sjmp #. ; Paveamos forever
93 ; Área del handler del timer2 (dibuja columna actual)
96 push ar0 ; Guardo r0 que voy a usar
98 jnz sigue$ ; if (MAT_COL == 0)
99 mov MAT_COL, MAT_LEN ; MAT_COL = MAT_LEN;
101 dec MAT_COL ; MAT_COL--;
102 mov a, MAT_COL ; r0 = MATRIZ + MAT_COL;
105 mov LEDS, @r0 ; LEDS = *r0;
106 pop ar0 ; Devuelvo r0