Opdracht:
Ontwerp van een klok met de aanduiding van uren en minuten. De tijdbasis wordt gevormd door timer0 die als 8-bit auto-reload timer geconfigureerd wordt, en die om de 200µs een interrupt genereert.
Elke seconde wordt de tijdsaanduiding in de vorm "uu:mm:ss" ook via de seriële poort naar de PC verstuurd. Baudrate=4800 baud.
Terwijl de tijd wordt weergegeven moet op poort0 (=ledbar) een lichteffect zichtbaar zijn. Tijdens de even minuten moet het een linkslopend looplicht zijn, terwijl het tijdens de oneven minuten een rechtslopend looplicht moet zijn.
Opmerkingen:
1) de klok werkt
2) looplicht werkt
3) het sturen van de seriele poort gaat, maar ik krijg steeds als laatste een 01 in mijn SBUF T.
Bv bij seconde 3: R1 = 03 is de laatste waarde in SBUF T = 01
4) ik heb niet direct gebruik gemaakt van interrupts. De taak moet vanavond ingediend moeten worden, dus dat wordt te moeilijk om nog inorde te krijgen. Graag zou ik toch weten hoe ik het met interrupts had kunnen doen.
code:
ORG 0h
LJMP start
ORG 30h
Start: MOV SCON,#40h ;serieel kanaal van mode1 8-bit UART variabele baudrate instellen
MOV TMOD,#22h ;instellen timer1 als 8-bit auto reload voor baudrategenerator
ORL PCON,#80h ;baudrate verdubbelaar activeren
MOV TH1,#243 ;4800 baudrate
MOV TL1,#243 ;4800 baudrate
SETB TR1 ;baudrategenerator activeren
MOV TH0,#037h ;startwaarde voor 200µs( 65535 - 200 = 65335 = FF37) FF bij de hoogste waarde
MOV TL0,#037h ;startwaarde voor 200µs( 65535 - 200 = 65335 = FF37) 37 bij de laagste waarde
SETB TR0 ;timer0 starten
MOV R1,#000H ;seconden op 0
MOV P1,#0
MOV R2,#000H ;minuten op 0
MOV P2,#0
MOV R3,#000H ;uren op 0
MOV P3,#0
MOV R4,#000H ; register voor maxwaarde teller om seconde te bekomen (=100)
MOV R5,#000H ; register voor maxwoorde teller om seconde te bekomen (=50)
MOV P0,#00000001B ;P0 op 1 zetten, Po wordt gebruikt voor het looplicht
MAIN: CALL KLOK
CALL optellen
CALL looplicht
LJMP MAIN
KLOK: JNB TF0,klok ;als TF0=0, spring naar klok
CLR TF0
RET
LOOPLICHT: MOV A,R2
ANL A,#00000001B
JNZ ONEVEN ;bit 0=1; spring naar ONEVEN
EVEN: MOV A,P0
RL A
MOV P0,A
RET
ONEVEN: MOV A,P0
RR A
MOV P0,A
RET
optellen: INC R4
CJNE R4,#100,optel_ret
MOV R4, #0
INC R5
CJNE R5,#50,optel_ret
MOV R5, #0
inc R1
MOV A, R1
DA A ;Decimal adjust
MOV R1, A
CJNE R1,#60h,weergave ;max.waarde = 59 seconden
MOV R1,#0
INC R2 ;verhogen van de minuten
MOV A, R2
DA A ;Decimal adjust
MOV R2, A
CJNE R2,#60h,weergave ;max.waarde = 59 minuten
MOV R2,#0
INC R3 ;verhogen van de uren
MOV A, R3
DA A ;Decimal adjust
MOV R3, A
CJNE R3,#24h,weergave ;maximumwaarde = 23 uren
MOV R3,#0
optel_ret: RET
weergave:;- - - - - - uren
MOV A, R3 ;uren laden
SWAP A ;nibbles omruilen
ANL A, #0Fh ;msn eraf
ADD A, #30h ;30 hex optellen voor ascii
MOV SBUF, A ;versturen (tientallen)
txwait: JNB TI, txwait ;wachten tot versturen klaar is
CLR TI ;flag clearen
MOV A, R3 ;uren laden
ANL A, #0Fh ;msn eraf
ADD A, #30h ;30 hex optellen voor ascii
MOV SBUF, A ;versturen (eenheden)
txwait2: JNB TI, txwait2 ;wachten tot versturen klaar is
CLR TI ;flag clearen
;- - - - - - dubbelpunt
MOV A, #03Ah ;dubbelpunt laden
MOV SBUF, A ;versturen (tientallen)
txwait3: JNB TI, txwait3 ;wachten tot versturen klaar is
CLR TI ;flag clearen
;- - - - - - minuten
MOV A, R2 ;minuten laden
SWAP A ;nibbles omruilen
ANL A, #0Fh ;msn eraf
ADD A, #30h ;30 hex optellen voor ascii
MOV SBUF, A ;versturen (tientallen)
txwait4: JNB TI, txwait4 ;wachten tot versturen klaar is
CLR TI ;flag clearen
MOV A, R2 ;minuten laden
ANL A, #0Fh ;msn eraf
ADD A, #30h ;30 hex optellen voor ascii
MOV SBUF, A ;versturen (eenheden)
txwait5: JNB TI, txwait5 ;wachten tot versturen klaar is
CLR TI ;flag clearen
;- - - - - - dubbelpunt
MOV A, #03Ah ;dubbelpunt laden
MOV SBUF, A ;versturen (tientallen)
txwait6: JNB TI, txwait6 ;wachten tot versturen klaar is
CLR TI ;flag clearen
;- - - - - - seconden
MOV A, R1 ;seconden laden
SWAP A ;nibbles omruilen
ANL A, #0Fh ;msn eraf
ADD A, #30h ;30 hex optellen voor ascii
MOV SBUF, A ;versturen (tientallen)
txwait7: JNB TI, txwait7 ;wachten tot versturen klaar is
CLR TI ;flag clearen
MOV A, R1 ;seconden laden
ANL A, #0Fh ;msn eraf
ADD A, #30h ;30 hex optellen voor ascii
MOV SBUF, A ;versturen (eenheden)
txwait8: JNB TI, txwait8 ;wachten tot versturen klaar is
CLR TI ;flag clearen
MOV P1,R1 ;seconden worden weergegeven op poort0
MOV P2,R2 ;minuten worden weergegeven op poort1
MOV P3,R3 ;uren worden weergegeven op poort2
RET