Despues de mucho tiempo sin haber tocado el tema por motivo de estudios y trabajo, lo que viene siendo falta de tiempo, me puesto manos a la obra con mi letrero haciendo un contador, para mas adelante empezar con el reloj y esto es lo que me ha quedado.
Como podeis ver, dispone de todo lo necesario para la matriz de leds y una memoria para almacenar datos. Aqui es donde guardo numeros y mas adelante desde frases hasta fechas. La informacion la envio por columnas y la activacion de los leds es mediante ceros.
El codigo es el siguiente.
Device 16F877A
All_Digital TRUE
Xtal 20
TRISA = %00000000
TRISD = %00000000
TRISB = %11111111
OPTION_REG = %01000111
INTCON = %00010000
Declare SCL_Pin PORTC.3
Declare SDA_Pin PORTC.4
Dim dira As Word
Dim dirb As Word
Dim mostrar[32] As Byte
Dim dig1[5] As Byte
Dim dig2[5] As Byte
Dim dig3[5] As Byte
Dim dig4[5] As Byte
Dim puntos[2] As Byte
Dim digito1 As Byte
Dim digito2 As Byte
Dim digito3 As Byte
Dim digito4 As Byte
Dim cont As Byte
Dim i As Bit
PORTA = %00001110 'configura los bits de desplazamiento
PORTD = 0
'Grabar numeros en la eeprom
BStart
BusOut %10100000,[$00,$00,$83,$5D,$6D,$75,$83,$FF,$FF,$FF] 'numero 0
DelayMS 50
BusOut %10100000,[$00,$08,$7F,$7B,$01,$7F,$7F,$FF,$FF,$FF] 'numero 1
DelayMS 50
BusOut %10100000,[$00,$10,$7B,$3D,$5D,$6D,$73,$FF,$FF,$FF] 'numero 2
DelayMS 50
BusOut %10100000,[$00,$18,$BB,$7D,$7D,$6D,$93,$FF,$FF,$FF] 'numero 3
DelayMS 50
BusOut %10100000,[$00,$20,$E1,$EF,$EF,$EF,$01,$FF,$FF,$FF] 'numero 4
DelayMS 50
BusOut %10100000,[$00,$28,$A1,$6D,$6D,$6D,$9D,$FF,$FF,$FF] 'numero 5
DelayMS 50
BusOut %10100000,[$00,$30,$87,$6B,$6D,$6D,$9F,$FF,$FF,$FF] 'numero 6
DelayMS 50
BusOut %10100000,[$00,$38,$FD,$1D,$ED,$F5,$F9,$FF,$FF,$FF] 'numero 7
DelayMS 50
BusOut %10100000,[$00,$40,$93,$6D,$6D,$6D,$93,$FF,$FF,$FF] 'numero 8
DelayMS 50
BusOut %10100000,[$00,$48,$F3,$6D,$6D,$AD,$C3,$FF,$FF,$FF] 'numero 9
DelayMS 50
BStop
For cont = 0 To 31 'para que aparezcan todos los leds apagados
mostrar[cont]= $FF
Next
dira = 0 'Pone a cero las variables que vamos a usar
dirb = 0
digito1 = 0
digito2 = 0
digito3 = 0
digito4 = 0
dirb = 8*digito1 'Se multiplica por 8 por que en la memoria los numeros van de 8 en 8 bytes
BStart
BusOut %10100000
BusOut dira
BusOut dirb
BReStart
BusOut %10100001
BusIn Str dig1
BStop
DelayMS 10
For cont = 0 To 4
mostrar[cont+3] = dig1[cont] 'digito 1
Next
dirb = 8*digito2
BStart
BusOut %10100000
BusOut dira
BusOut dirb
BReStart
BusOut %10100001
BusIn Str dig2
BStop
DelayMS 10
For cont = 0 To 4
mostrar[cont+9] = dig2[cont] 'digito 2
Next
dirb = 8*digito3
BStart
BusOut %10100000
BusOut dira
BusOut dirb
BReStart
BusOut %10100001
BusIn Str dig3
BStop
DelayMS 10
For cont = 0 To 4
mostrar[cont+18] = dig3[cont] 'digito 3
Next
dirb = 8*digito4
BStart
BusOut %10100000
BusOut dira
BusOut dirb
BReStart
BusOut %10100001
BusIn Str dig4
BStop
DelayMS 10
For cont = 0 To 4
mostrar[cont+24] = dig4[cont] 'digito 4
Next
On Interrupt GoTo Incrementa
'inicio del programa
Inicio:
For cont = 0 To 31
If cont = 0 Then
PORTA.0 = 1
Else
PORTA.0 = 0
EndIf
PORTD = mostrar[cont]
PulsOut PORTA.1,1,High
DelayUS 500
PORTD = $FF
Next
GoTo Inicio
'cuando ocurre una interrucion...
Disable
Incrementa:
If digito4 = 9 Then
If digito3 = 9 Then
If digito2 = 9 Then
If digito1 = 9 Then
digito1 = 0
Else
Inc digito1
EndIf
dirb = 8*digito1 'Se multiplica por 8 por que en la memoria los numeros van de 8 en 8 bytes
BStart
BusOut %10100000
BusOut dira
BusOut dirb
BReStart
BusOut %10100001
BusIn Str dig1
BStop
DelayMS 10
For cont = 0 To 4
mostrar[cont+3] = dig1[cont] 'digito 1
Next
digito2 = 0
DelayMS 10
Else
Inc digito2
EndIf
dirb = 8*digito2
BStart
BusOut %10100000
BusOut dira
BusOut dirb
BReStart
BusOut %10100001
BusIn Str dig2
BStop
DelayMS 10
For cont = 0 To 4
mostrar[cont+9] = dig2[cont] 'digito 2
Next
digito3 = 0
DelayMS 10
Else
Inc digito3
EndIf
dirb = 8*digito3
BStart
BusOut %10100000
BusOut dira
BusOut dirb
BReStart
BusOut %10100001
BusIn Str dig3
BStop
DelayMS 10
For cont = 0 To 4
mostrar[cont+18] = dig3[cont] 'digito 3
Next
digito4 = 0
DelayMS 10
Else
Inc digito4
EndIf
dirb = 8*digito4
BStart
BusOut %10100000
BusOut dira
BusOut dirb
BReStart
BusOut %10100001
BusIn Str dig4
BStop
DelayMS 10
For cont = 0 To 4
mostrar[cont+24] = dig4[cont] 'digito 4
Next
OPTION_REG = %01000111
INTCON = %00010000
Resume
Enable
End
Os adjunto la simulacion a ver que os parece y acepto sugerencias sobre posibles mejoras tanto de esquema como de codigo.
Un saludo!