Aquí está el programa que realize en Mikrobasic, pero no se por que razon al mostrar los numeros parpadea mostrando todos los display encendidos a medias.
Abajo está el archivo adjunto del circuito que utilizo.
program clockpicpro2
'----------SYMBOL--------------
Symbol CLOCK = PORTB.1
Symbol dato = PORTB.2
symbol STB1 = PORTB.4
symbol STB2 = PORTB.5
symbol STB3 = PORTB.6
symbol STB4 = PORTB.7
'-----------DIM-----------------
Dim v,i,n,u,p As Byte
Dim aux As byte
'----Rutinas, funciones y procedues-------------
sub function writedata (dim x as byte) as byte
'Si DATO es 0, segmento encendido.
if x = 0 then
dato = 1
else
dato = 0
end if
delay_Us(2)
clock = 0
delay_Us(2)
clock = 1
delay_Us(2)
result = x
end sub
'Imprime un digito del 0 al 9
sub function writedigit (dim x as byte) as byte
select case x
case 1
aux = writedata(1)
aux = writedata(0)
aux = writedata(0)
aux = writedata(1)
aux = writedata(1)
aux = writedata(1)
aux = writedata(1)
aux = writedata(1)
case 2
aux = writedata(0)
aux = writedata(1)
aux = writedata(0)
aux = writedata(0)
aux = writedata(0)
aux = writedata(1)
aux = writedata(0)
aux = writedata(1)
case 3
aux = writedata(0)
aux = writedata(0)
aux = writedata(0)
aux = writedata(0)
aux = writedata(1)
aux = writedata(1)
aux = writedata(0)
aux = writedata(1)
case 4
aux = writedata(1)
aux = writedata(0)
aux = writedata(0)
aux = writedata(1)
aux = writedata(1)
aux = writedata(0)
aux = writedata(0)
aux = writedata(1)
case 5
aux = writedata(0)
aux = writedata(0)
aux = writedata(1)
aux = writedata(0)
aux = writedata(1)
aux = writedata(0)
aux = writedata(0)
aux = writedata(0)
case 6
aux = writedata(0)
aux = writedata(0)
aux = writedata(1)
aux = writedata(0)
aux = writedata(0)
aux = writedata(0)
aux = writedata(0)
aux = writedata(1)
case 7
aux = writedata(1)
aux = writedata(0)
aux = writedata(0)
aux = writedata(0)
aux = writedata(1)
aux = writedata(1)
aux = writedata(1)
aux = writedata(1)
case 8
aux = writedata(0)
aux = writedata(0)
aux = writedata(0)
aux = writedata(0)
aux = writedata(0)
aux = writedata(0)
aux = writedata(0)
aux = writedata(0)
case 9
aux = writedata(0)
aux = writedata(0)
aux = writedata(0)
aux = writedata(0)
aux = writedata(1)
aux = writedata(0)
aux = writedata(0)
aux = writedata(0)
case 0
aux = writedata(0)
aux = writedata(0)
aux = writedata(0)
aux = writedata(0)
aux = writedata(0)
aux = writedata(0)
aux = writedata(1)
aux = writedata(0)
case 10
aux = writedata(0)
aux = writedata(0)
aux = writedata(0)
aux = writedata(0)
aux = writedata(0)
aux = writedata(0)
aux = writedata(1)
aux = writedata(0)
end select
result = 1
end sub
sub procedure interrupt
delay_ms(10)
v = v+1
INTCON.intf=0
end sub
'---Programa principal------------
main:
OPTION_REG=%10000000 'Resistencias de weak pull-up desabilitadas
INTCON=%10010000 'Interrupciones Generales Habilitadas
'Configuro el portA:
TRISA.0 = 0 'Salida
TRISA.1 = 1 'Entrada
TRISA.2 = 1 'Entrada
TRISA.3 = 1 'Entrada
TRISA.4 = 1 'Entrada
'Configuro el portB:
TRISB.0 = 1 'Salida (INT)
TRISB.1 = 0 'Salida (CLOCK)
TRISB.2 = 0 'Salida (DATA)
TRISB.3 = 1 'Salida
TRISB.4 = 0 'salida
TRISB.5 = 0 'Salida
TRISB.6 = 0 'Salida
TRISB.7 = 0 'Salida
'---------PROGRAMA PRINCIPAL------------
v = 0
i = 0
n = 0
u = 0
p = 0
STB1 = 1
STB2 = 1
STB3 = 1
STB4 = 1
aux = writedigit(0)
loop:
'------------botones----------
if porta.2 = 1 then
delay_ms(100)
n = n + 1
end if
if porta.3 = 1 then
delay_ms(100)
p = p + 1
end if
'---------rutina segmentos--------
STB1 = 1
aux = writedigit(n)
STB1 = 0
STB2 = 1
aux = writedigit(u)
STB2 = 0
STB3 = 1
aux = writedigit(p)
STB3 = 0
STB4 = 1
aux = writedigit(i)
STB4 = 0
if v = 60 then
n = n+1
v = 0
end if
if n = 10 then
n = 0
u=u+1
end if
if u = 6 then
u = 0
p = p + 1
end if
if p = 10 then
p = 0
i = i + 1
end if
if p = 4 then
if i = 2 then
p = 0
i = 0
end if
end if
Goto loop
End.