Orologio a 4 display pilotato da microprocessore

Sviluppo software :
Definizione variabili:
BD1 = 30h ;1 Buffer display n.ro 1
BD2 = 31h ;2 Buffer display n.ro 2
BD3 = 32h ;3 Buffer display n.ro 3
BD4 = 33h ;4 Buffer display n.ro 4
Tabella delle corrispondenze bit dei buffers al segmento dei display
| Cella di memoria |
D1 (30H) |
D2 (31H) |
D3(32H) |
D4(32H) |
| Display |
DY1 |
DY2 |
DY3 |
DY4 |
bits
segmenti |
| 7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
| a |
b |
c |
d |
e |
f |
g |
dp |
|
| 7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
| a |
b |
c |
d |
e |
f |
g |
dp |
|
| 7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
| a |
b |
c |
d |
e |
f |
g |
dp |
|
| 7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
| a |
b |
c |
d |
e |
f |
g |
dp |
|

Subroutine spegnimento display
;############### spegnimento display ###############
;Registri utilizzati: r0
;----------Prima fase (scaricamento buffer)--------------
SpDisp mov r0,#36
clr p1.0
clr p1.1
lsdis setb p1.1 ;impulso di clock su P1.1
clr p1.1
djnz r0,lsdis
;----------Seconda fase (Azzeramento uscite buffer)--------------
setb p1.0
setb p1.1 ; bit di start
clr p1.1
clr p1.0
mov r0,#35
lsdis1 setb p1.1
clr p1.1
djnz r0,lsdis1
ret
Subroutine trasferimento buffer display alle uscite del 5450
;--------Carica M5450---------------
;Registri utilizzati: r0,r1,r2
cr5450 setb p1.0 ;Invia Bit di Start
setb p1.1
clr p1.1
mov r2,#4 ;carica il registo conteggio n.display
mov r1,#BD1 ;carica nel registro puntatore l'indirizzo di partenza
lcr1 mov a,@r1 ;buffer display
call Tr8Bit ;chiama la subroutine che trasferisce gli 8 bit del buffer
inc r1 ;selezionato
djnz r2,lcr1
mov r0,#3 ;Spedisce i due bit inutilizzati +
lcr2 setb p1.1 ;il bit di "DataEnable"
clr p1.1
djnz r0,lcr2
ret
;------Trasferisce il contenuto del buffer al 5450----------------
Tr8Bit mov r0,#8
linv jb acc.7,uno
clr p1.0
jmp zero
uno setb p1.0
zero setb p1.1
clr p1.1
rl a
djnz r0,linv
ret
Subroutine di conversione da digit decimale a configurazione a
7 segmenti
;########### Routine decimale a codice a 7 segmenti ############
;In ingresso l'accumulatore deve contenere il valore da convertire
;in uscita l'accumulatore conterrą il codice a 7 segmenti corrispondente
conv mov dptr,#table_n
movc a,@a+dptr
ret
table_n db 00000011b ;0
db 10011111b ;1
db 00100101b ;2
db 00001101b ;3
db 10011001b ;4
db 01001001b ;5
db 01000001b ;6
db 00011111b ;7
db 00000001b ;8
db 00001001b ;9
table db 11111100b ;0
db 01100000b ;1
db 11011010b ;2
db 11110010b ;3
db 01100110b ;4
db 10110110b ;5
db 10111110b ;6
db 11100000b ;7
db 11111110b ;8
db 11110110b ;9
Subroutine di visualizzazione minuti e secondi su display
;########### Visualizza Minuti Secondi ###########
secondi = 35h
minuti = 36h
;Registri utilizzati: a,b
vminsec mov a,secondi
mov b,#10
div ab
call conv
mov BD3,a
mov a,b
call conv
mov BD4,a
mov a,minuti
mov b,#10
div ab
call conv
mov BD1,a
mov a,b
call conv
mov BD2,a
call cr5450
ret