Rutina en Ensamblador para 8086 para multiplexar por software 8 displays bcd-7 segmentos.
pila segment stack 'stack'
db 128 dup(?)
pila ends
DATOS SEGMENT
encendido db 80h,40h,20h,10h,08h,04h,02h,01h
tdatos dw 1,2,3,4,5,6,7,8
diccionario db 3fh,........,00
turno dw 0
guarda_ip dw (?)
guarda_cs dw (?)
DATOS ENDS
INTER SEGMENT AT 0
org 4*8 ;interrupción del temporizador (8)
vector_ip dw (?)
vector_cs dw (?)
INTER ENDS
CODIGO SEGMENT
assume cs:codigo,ds:datos,ss:pila,es:inter
ppal proc far
push ds
xor ax,ax
push ax
mov ax,datos
mov ds,ax
mov ax,inter
mov es,ax
call cambia_vectores ;activa nuestra rutina
bucle:jmp bucle ;bucle infinito
call restituye ;restituye los vectores a la situacion original
retf
ppal endp
cambia_vectores proc
cli
mov ax,vector_cs
mov guarda_cs,ax
mov ax,vector_ip
mov guarda_ip,ax
mov vector_ip,offset rutina
mov vector_cs,seg rutina
sti
ret
cambia_vectores endp
restituye proc
cli
mov ax,guarda_cs
mov vector_cs,ax
mov ax,guarda_ip
mov vector_ip,ax
sti
ret
restituye endp
rutina proc far
cli
push ax
push bx
push dx
mov bx,turno
;apago todos los displays
mov dx,300h
xor ax,ax
out dx,al
;ahora recupero el numero a mostrar
shl bx,1 ;multiplicamos x dos porque el tamaño de la tabla datos es de 16 bits
mov ax,tdatos[bx]
;tengo que traducir el dato
mov bx,ax
mov al,diccionario[bx]
mov dx,301h
out dx,al ;ya tenemos el dato fuera
;ahora encendemos el que corresponda
mov bx,turno
mov al,encendido[bx]
mov dx,300h
out dx,al ;ya tenemos encendido
;ahora tenemos que incrementar el contador
inc bx
cmp bx,8
jne fin
xor bx,bx
fin:mov turno,bx
pop dx
pop bx
pop ax
;eoi
mov al,20h
out 20h,al
sti
iret
rutina endp
;rutina_de_usuario proc
;cli
;push's
;instrucciones
;pop's
;sti
;ret n
;rutina_de_usuario endp
;la rutina de usuario es un procedimiento y será llamado desde
;el procedimiento ppal. Tambien podremos pasarle parámetros por la pila
;;cosa que a la rutina no le podemos pasar. MUY IMPORTANTE.
CODIGO ENDS
END ppal