]> git.llucax.com Git - z.facultad/66.09/etherled.git/blob - pruebas/asx8051/gnuine/gnuine.asm
Bye Bye Timer!
[z.facultad/66.09/etherled.git] / pruebas / asx8051 / gnuine / gnuine.asm
1 ; vim: set filetype=asx8051 :
2
3 ; Fragmento del proyecto que lee la matriz de 8x8 y la muestra a intervalos
4 ; columna por columna.
5
6
7         ; Constantes
8         LEDS    = p1    ; 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
13
14
15         ; Área de inicio (boot)
16         .area   BOOT (ABS)
17         .org    0x0000
18         ljmp    init
19         ; Vector de interrupción de Timer2
20         .org    0x002B
21         clr     tf2                     ; Limpia flag de interrupción
22         ljmp    timer2handler           ; Salta al manejador de interrupción
23
24
25         ; Área de datos por default
26         .area   DEFAULTS
27 MAT_LEN_D: ; tamaño de la matriz por default
28         .db     8               ; 8x8 por default
29 MAT_D: ; matriz por default
30         ;   bit  76543210
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
39         ;
40         ; bit     columna
41         ;     7 6 5 4 3 2 1 0
42         ;  7  . . . . . . . .
43         ;  6  . . . . . . . o
44         ;  5  . . . . . . o .
45         ;  4  . . . . . o . .
46         ;  3  o . . . o . . .
47         ;  2  . o . o . . . .
48         ;  1  . . o . . . . .
49         ;  0  . . . . . . . .
50         ;
51         ;     --------------->
52         ;   dirección de barrido
53
54
55         ; Área del hilo principal del programa
56         .area   MAIN
57 init:
58 ;al gas mov     LEDS, #0                ; Apaga todos los leds
59         ; Carga tamaño de la matriz default en la memoria
60         mov     dptr, #MAT_LEN_D
61 ;al gas clr     a
62         movc    a, @a + dptr
63         mov     MAT_LEN, a
64
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
68 loop$:
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
79 columna0$:
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
84
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
91
92
93         ; Área del handler del timer2 (dibuja columna actual)
94         .area   T2ISR
95 timer2handler:
96         push    ar0                     ; Guardo r0 que voy a usar
97         mov     a, MAT_COL
98         jnz     sigue$                  ; if (MAT_COL == 0)
99         mov     MAT_COL, MAT_LEN        ;       MAT_COL = MAT_LEN;
100 sigue$:
101         dec     MAT_COL                 ; MAT_COL--;
102         mov     a, MAT_COL              ; r0 = MATRIZ + MAT_COL;
103         add     a, #MATRIZ              
104         mov     r0, a                   
105         mov     LEDS, @r0               ; LEDS = *r0;
106         pop     ar0                     ; Devuelvo r0
107         reti
108
109