picasm:
ERROR_STOP:
bcf tmp10,1 ; de bit die weergeeft dat de motor gestopt is
bcf PORTB,5 ; de uitgangn van de motor stoppen
; deze kan je voor alle errors gebruiken, deze instructies worden iedere loop gecontroleerd
; de verwijzing naar deze call kan je dan doen door de error-byte te controleren of deze
; groter is dan '0', want dan is er een error
incf tmp6,f ; teller aantal fouten
return
;................................................................................................................
; de instructies/ acties van de drukknoppen en sensoren
;................................................................................................................
KNOP2: ; Deze drukknop bepaald de datateller en zo de waarde van de gekozen munt
movfw beeld
sublw .3
btfss STATUS,Z
goto $+4 ; als je niet in beeld 4 bent, ga je verder bij AAA
call lijn2_14
movlw 0xDB ; vierkantje, deze wordt geprint als je deze knop drukt en als je in beeld 4 bent
call prntLCD ; Als je niet in beeld 4 bent, wordt enkel onderstaande uitgevoerd
;AAA: ;movlw .1
;addwf datateller,f
incf datateller,f
movlw .6
subwf datateller,w
btfss STATUS,Z
return
clrf datateller
return
;................................................................................................................
shiftL: ;DEZE WORDT VOORLOPIG NIET GEBRUIKT
movlw d'20'
movwf shiftmerker
bcf PORTB,6 ;instuktie mode
shftlp1: movlw b'00011000'
call prntLCD
decfsz shiftmerker,f
goto shftlp1
bsf PORTB,6 ; data mode
return
;................................................................................................................
shiftR:
movlw d'20' ; laad getal 20 in shiftmerker
movwf shiftmerker ; daarna ga je naar instruktie mode
bcf PORTB,6 ;
shftlp2: movlw b'00011100' ; roep intruktie op, 'display shift', naar rechts
call prntLCD ;
decfsz shiftmerker,f ; tel 1 af en herhaal de loop tot deze 20x afgelopen is
goto shftlp2 ; daarna ga je terug naar datamode en verder in het programma
bsf PORTB,6 ; (data mode)
; bsf tmp10,0 ; set deze bit, dus, bit hoog is 2e deel van het beeld
; deze bit moet je resetten als je de beeldteller laat veranderen
movfw tmp10 ; EN EEN TOGGLE FUNCTIE OMDAT JE OOK IN HETZELFDE BEELD 2X KUNT WISSLEEN
xorlw b'00000001' ; toggle enkel bit 0
movwf tmp10
return
;................................................................................................................
shift_up_down: ; herschrijf het volledige LCD tijdens deze loop, maar met inhoud van het volgende beeld
movlw .1
addwf beeld,f
movlw .4
subwf beeld,w
btfss STATUS,Z
goto VVV
clrf beeld
VVV:
;eerste het scherm clearen voor aleer je het herschrijft
bcf PORTB,6 ;ga naar instructie mode
movlw b'00000001'
call prntLCD ; clear het display
call Delay2
bsf PORTB,6 ; ga naar data mode
bcf tmp10,0 ; deze bit geeft weer in welk deel van het beeld je zit, 0 is het eerste deel
call schrijfLCD ; HERSCHRIJF HET VOLLEDIGE LCD DISPLAY
retlw 0x00
;................................................................................................................
ENTER:
movfw beeld
sublw .3
btfss STATUS,Z
goto ENTER_beeld2
;return ; ga terug zonder actie als je niet in beeld 4 bent
; OF ZET EEN GOTO OM EEN RESET IN EEN ANDER SCHERM ERBIJ TE PROGRAMMEREN
; data voor herschrijven
btfsc tmp10,0 ; 0 indien eerste deel van beeld, 1 indien 2e deel van beeld
goto skipRST_5 ; als je in het 2e deel van beeld 4 bent ga je naar deze label
movfw datateller
sublw .0 ; schrijf "alle waarden?" resetten
btfss STATUS,Z
goto skipRST_0
; wanneer "ALLE WAARDEN?" op het scherm staat
; dan hier de voorwaarde van de actie
; druk ENTER, dus moet deze code is dat sub-mapje staan
call bufGETAL
call bufAANTAL
return
skipRST_0: movfw datateller
sublw .1 ; schrijf "aantallen?" resetten
btfss STATUS,Z
goto skipRST_1
; wanneer "AANTALLEN?" op het scherm staat.
call bufAANTAL
return
skipRST_1: movfw datateller
sublw .2 ; schrijf "aantallen?" resetten
btfss STATUS,Z
goto skipRST_2
; wanneer "BEDRAGEN?" op het scherm staat.
call bufGETAL
return
skipRST_2: movfw datateller
sublw .3 ; idem reset ALLE WAARDEN
btfss STATUS,Z
goto skipRST_3
call bufGETAL
call bufAANTAL
return
skipRST_3: movfw datateller
sublw .4 ; idem reset AANTALLEN
btfss STATUS,Z
goto skipRST_4
call bufAANTAL
return
skipRST_4: movfw datateller
sublw .5 ; idem reset GETALLEN
btfss STATUS,Z
return
call bufGETAL
return
bufGETAL: clrf getal2EURL
clrf getal2EURH
clrf getal1EURL
clrf getal1EURH
clrf getal0EUR50L
clrf getal0EUR50H
clrf getal0EUR20L
clrf getal0EUR20H
clrf getal0EUR10L
clrf getal0EUR10H
clrf getal0EUR05L
clrf getal0EUR05H
clrf komma0EUR50
clrf komma0EUR20
clrf komma0EUR10
clrf komma0EUR05
bcf PORTB,6 ; |
movlw b'11001110' ; ga naar lijn2, karakter 14 |
call prntLCD ; |
bsf PORTB,6 ; |
movlw 0x06 ; afgevinkt vakje
call prntLCD
return
bufAANTAL: clrf aantal2EURL
clrf aantal2EURH
clrf aantal1EURL
clrf aantal1EURH
clrf aantal0EUR50L
clrf aantal0EUR50H
clrf aantal0EUR20L
clrf aantal0EUR20H
clrf aantal0EUR10L
clrf aantal0EUR10H
clrf aantal0EUR05L
clrf aantal0EUR05H
bcf PORTB,6 ; |
movlw b'11001110' ; ga naar lijn2, karakter 14 |
call prntLCD ; |
bsf PORTB,6 ; |
movlw 0x06 ; afgevinkt vakje
call prntLCD
return
skipRST_5:
bcf PORTB,6 ; |
movlw b'11100010' ; ga naar lijn2, karakter 34 |
call prntLCD ; |
bsf PORTB,6 ; |
movlw 0x06 ; afgevinkt vakje
call prntLCD
call Delay255
call Delay255
movlw b'00000010' ; toggle tmp10,1, deze bepaald of woord 'starten' of 'stoppen' geschreven wordt
xorwf tmp10,f
movlw b'00100000' ;toggle PORTB,5
xorwf PORTB,f ; uitgang motor starten / stoppen
call shift_up_down
return
;................................................................................................................
ENTER_beeld2:
movfw beeld
sublw .2
btfss STATUS,Z
return ; ga terug zonder actie als je niet in beeld 3 bent
; OF ZET EEN GOTO OM EEN RESET IN EEN ANDER SCHERM ERBIJ TE PROGRAMMEREN
btfss tmp10,0 ; kijk of je in het eerste of 2e deel van het beeld bent
return ; ga terug als je niet in het 2e deel van het beeld bent
btfsc tmp9,0
goto ERR_0
btfsc tmp9,1
goto ERR_1
btfsc tmp9,2
goto ERR_2
btfsc tmp9,3
goto ERR_3
btfsc tmp9,4
goto ERR_4
btfsc tmp9,5
goto ERR_5
btfsc tmp9,6
goto ERR_6
btfsc tmp9,7
goto ERR_7
return
ERR_0:
bcf PORTB,6 ; |
movlw b'11100010' ; ga naar lijn2, karakter 34 |
call prntLCD ; |
bsf PORTB,6 ; |
movlw 0x06 ; afgevinkt vakje
call prntLCD
bcf tmp9,0 ; reset de fout max bedrag bereikt
decf tmp6,f ; tel 1 error af van de teller
return
ERR_1:
bcf PORTB,6 ; |
movlw b'11100010' ; ga naar lijn2, karakter 34 |
call prntLCD ; |
bsf PORTB,6 ; |
movlw 0x06 ; afgevinkt vakje
call prntLCD
bcf tmp9,1 ; reset de fout max aantal bereikt
decf tmp6,f ; tel 1 error af van de teller
return
ERR_2:
bcf PORTB,6 ; |
movlw b'11100010' ; ga naar lijn2, karakter 34 |
call prntLCD ; |
bsf PORTB,6 ; |
movlw 0x06 ; afgevinkt vakje
call prntLCD
bcf tmp9,2 ; reset de fout van 2€ sensor
decf tmp6,f ; tel 1 error af van de teller
return
ERR_3:
bcf PORTB,6 ; |
movlw b'11100010' ; ga naar lijn2, karakter 34 |
call prntLCD ; |
bsf PORTB,6 ; |
movlw 0x06 ; afgevinkt vakje
call prntLCD
bcf tmp9,3 ; reset de fout van 1€ sensor
decf tmp6,f ; tel 1 error af van de teller
return
ERR_4:
bcf PORTB,6 ; |
movlw b'11100010' ; ga naar lijn2, karakter 34 |
call prntLCD ; |
bsf PORTB,6 ; |
movlw 0x06 ; afgevinkt vakje
call prntLCD
bcf tmp9,4 ; reset de fout van 0,50€ sensor
decf tmp6,f ; tel 1 error af van de teller
return
ERR_5:
bcf PORTB,6 ; |
movlw b'11100010' ; ga naar lijn2, karakter 34 |
call prntLCD ; |
bsf PORTB,6 ; |
movlw 0x06 ; afgevinkt vakje
call prntLCD
bcf tmp9,5 ; reset de fout van 0,20€ sensor
decf tmp6,f ; tel 1 error af van de teller
return
ERR_6:
bcf PORTB,6 ; |
movlw b'11100010' ; ga naar lijn2, karakter 34 |
call prntLCD ; |
bsf PORTB,6 ; |
movlw 0x06 ; afgevinkt vakje
call prntLCD
bcf tmp9,6 ; reset de fout van 0,10€ sensor
decf tmp6,f ; tel 1 error af van de teller
return
ERR_7:
bcf PORTB,6 ; |
movlw b'11100010' ; ga naar lijn2, karakter 34 |
call prntLCD ; |
bsf PORTB,6 ; |
movlw 0x06 ; afgevinkt vakje
call prntLCD
bcf tmp9,7 ; reset de fout van 0,05€ sensor
decf tmp6,f ; tel 1 error af van de teller
return
;................................................................................................................
;.....................Akties van de sensoren.....................................................................
;.....................hier zitten geen 'beeld'-voorwaarde aan, dus werken deze in alle schermen..................
;................................................................................................................
tweeEURO:
movlw .2 ; verhogen van de 16 bit teller "getal"
addwf getal2EURL,f ; hier wordt de getelde waarde onthouden
btfss STATUS,C
goto byte10
clrf getal2EURL
incf getal2EURH,f
byte10:
movlw .1 ; verhogen van de 16 bit teller "aantal"
addwf aantal2EURL,f ; hier wordt de getelde aantal ontouden
btfss STATUS,C
goto byte11
clrf aantal2EURL
incf aantal2EURH,f
byte11:
retlw 0x00
;................................................................................................................
eenEURO:
movlw .1 ; verhogen van de 16 bit teller "getal"
addwf getal1EURL,f ; hier wordt de getelde waarde onthouden
btfss STATUS,C
goto byte12
clrf getal1EURL
incf getal1EURH,f
byte12:
movlw .1 ; verhogen van de 16 bit teller "aantal"
addwf aantal1EURL,f ; hier wordt de getelde aantal ontouden
btfss STATUS,C
goto byte13
clrf aantal1EURL
incf aantal1EURH,f
byte13:
retlw 0x00
;................................................................................................................
halveEURO:
;nieuwe code voor kommagetallen weer te geven
movlw .50
addwf komma0EUR50,f
movfw komma0EUR50
addlw .156 ; carry out is 100 eenheden verwijdert als je 156 opteld bij W
btfss STATUS,C ; indien getal 100 of meer is, ga je verder, anders 'goto byte15'
goto byte14 ; maak sprong om aantal munten 1 bij te tellen
clrf komma0EUR50
movlw .1
addwf getal0EUR50L,f
btfss STATUS,C
goto byte14
clrf getal0EUR50L
incf getal0EUR50H,f
byte14:
movlw .1
addwf aantal0EUR50L,f
btfss STATUS,C
goto byte15
clrf aantal0EUR50L
incf aantal0EUR50H,f
byte15:
retlw 0x00
;................................................................................................................
twintigEUROcent:
movlw .20
addwf komma0EUR20,f
movfw komma0EUR20
addlw .156 ; carry out is 100 eenheden verwijdert als je 156 opteld bij W
btfss STATUS,C ; indien getal 100 of meer is, ga je verder, anders 'goto byte15'
goto byte16 ; maak sprong om aantal munten 1 bij te tellen
clrf komma0EUR20
movlw .1
addwf getal0EUR20L,f
btfss STATUS,C
goto byte16
clrf getal0EUR20L
incf getal0EUR20H,f
byte16:
movlw .1
addwf aantal0EUR20L,f
btfss STATUS,C
goto byte17
clrf aantal0EUR20L
incf aantal0EUR20H,f
byte17:
retlw 0x00
;................................................................................................................
tienEUROcent:
movlw .10
addwf komma0EUR10,f
movfw komma0EUR10
addlw .156 ; carry out is 100 eenheden verwijdert als je 156 opteld bij W
btfss STATUS,C ; indien getal 100 of meer is, ga je verder, anders 'goto byte15'
goto byte18 ; maak sprong om aantal munten 1 bij te tellen
clrf komma0EUR10
movlw .1
addwf getal0EUR10L,f
btfss STATUS,C
goto byte18
clrf getal0EUR10L
incf getal0EUR10H,f
byte18:
movlw .1
addwf aantal0EUR10L,f
btfss STATUS,C
goto byte19
clrf aantal0EUR10L
incf aantal0EUR10H,f
byte19:
retlw 0x00
;................................................................................................................
vijfEUROcent:
movlw .5
addwf komma0EUR05,f
movfw komma0EUR05
addlw .156 ; carry out is 100 eenheden verwijdert als je 156 opteld bij W
btfss STATUS,C ; indien getal 100 of meer is, ga je verder, anders 'goto byte15'
goto byte20 ; maak sprong om aantal munten 1 bij te tellen
clrf komma0EUR05
movlw .1
addwf getal0EUR05L,f
btfss STATUS,C
goto byte20
clrf getal0EUR05L
incf getal0EUR05H,f
byte20:
movlw .1
addwf aantal0EUR05L,f
btfss STATUS,C
goto byte21
clrf aantal0EUR05L
incf aantal0EUR05H,f
byte21:
retlw 0x00
;................................................................................................................
; ALLE AKTIES APART PROGRAMMEREN? DIT HOUDT ALLES WAT DUIDELIJKER
;................................................................................................................
;=================================================================================================================
; Herschrijf het scherm, enkel op de plaatsen waar data veranderd moet worden.
; om de cyclus zo snel mogelijk te houden word niet elke cyclus herschreven, maar om bepaalde tijdsintervallen.
;=================================================================================================================
herschrijf:
;--------------------------------------------------------------------
; herschrijf enkel de karater(s) die je wil aanpassen |
;--------------------------------------------------------------------
bcf PORTB,4 ;indicatie LED om te zien hoelang het schrijven duurt
;------------------------------
;*****************************************************************************************************************
; hier wordt de code geschreven waar de data herschreven wordt bij het eerste beeld
; deze zou er als volgt moeten uitzien:
;
; ***LCD-DISPLAY*******karakters*buiten*beeld****
; * Totaal:.........|....|Aantal munten:..|.... *
; * ...........0,00€|....|.............0..|.... *
; ***********************************************
;
; in beeld 0 worden data herschreven op de 2e lijn, als eerste de conversie van 16 bit getal "totaal_L + _H
;*****************************************************************************************************************
movfw beeld
sublw .0
btfss STATUS,Z
goto skip100 ; Als beeld 0 niet 0 is
; Als beeld 0 aangeroepen is
; hier gaan wel alle aantallen en getallen optellen
; en dan weer converteren om op het scherm te printen
clrf totaal_komma
clrf totaal_L
clrf totaal_H
clrf aantal_L
clrf aantal_H
; eerst de komma getallen bij elkaar optellen
movfw komma0EUR50 ;------------------------------------------------------
addwf totaal_komma,f ; tel de 4 getallen samen
movfw komma0EUR20 ; er hoeft maar 1x naar de carry out gekeken te worden
addwf totaal_komma,f ; omdat het getal ervoor nooit hoger kan zijn
movfw komma0EUR10 ; de max. zijn: 0,50€ --> 50
addwf totaal_komma,f ; 0,20€ --> 80
movfw komma0EUR05 ; 0,10€ --> 90
addwf totaal_komma,f ; 0,05€ --> 95
btfss STATUS,C ; totaal: -->315
goto skipA0 ; Daarna de conversie maken om de C-out om te
incf totaal_L,f ; rekenen naar een 100-tal
;-----------------------------------------------------
movfw totaal_komma ; |
addlw .212 ;C wordt 1 indien add's KOMMA,f
btfss STATUS,C ;totaal_komma >=44 |
goto skipB0 ; *****************
movlw .44 ; | STATUS,C |
subwf totaal_komma,f ; *****************
movlw .2 ;3 carry's bijtellen bij totaal_L, 1| 0|
addwf totaal_L,f ;maar er is er al eetje geteld | ---------|-----------------|
goto skipC0 ; ************* ************* |
skipB0: ; als het getal is <44 | incf | | KOMMA,w | |
movlw .56 ; max getal kan | totaal_L | | +156 | |
addwf totaal_komma,f ; hier 99 zijn! (43+56) ************* ************* |
incf totaal_L,f ; 2 carry's optellen, maar 1 | | |
goto skipC0 ;is al gebeurt in het eerste deel ************* ************* |
skipA0: ; indien er geen carry is geweest | KOMMA,w | | STATUS,C | |
movlw .156 ; | +212 | ************* |
addwf totaal_komma,w ; ************* 0| 1| |
btfss STATUS,C ; | | ************* |
goto skipC0 ; ************* | | KOMMA,f | |
movlw .100 ; | STATUS,C | | | -100 | |
subwf totaal_komma,f ; ************* | ************* |
incf totaal_L,f ; 0| 1| | | |
goto skipA0 ; |---- ----| | ************* |
skipC0: ; indien totaal_komma is <100 ************* ************* | | incf | |
movfw totaal_komma ; | KOMMA,f | | KOMMA,f | | | totaal_L | |
movwf tempkomma ; | +56 | | -44 | | ************* |
call converterKOMMA ; ************* ************* | |-----------|
; nu gaan we verder met de eenheden op te tellen | | |
movfw getal2EURL ; ************* ************* |
addwf totaal_L,f ; | incf | | totaal_L | |
movfw getal1EURL ; | totaal_L | | +2 | |
addwf totaal_L,f ; ************* ************* |
btfss STATUS,C ; |---------------|---------|
goto skipD0 ; |
incf totaal_H,f ; *************
skipD0: ; | KOMMA,w |
movfw getal0EUR50L ; *************
addwf totaal_L,f ; |
btfss STATUS,C ; | *************
goto skipE0 ; 'lage byte' |tempkomma,f|
incf totaal_H,f ; ************* ************* *************
skipE0: ; |totaal_H | |getal 2 € | |
movfw getal0EUR20L ; ************* ************* converter Komma
addwf totaal_L,f ; + | |
btfss STATUS,C ; ************* *************
goto skipF0 ; | +1 | |getal 1 € |
incf totaal_H,f ; ************* *************
skipF0: ; |_____________|STATUS,C
movfw getal0EUR10L ; ************* *************
addwf totaal_L,f ; | +1 | |getal 0,50€|
btfss STATUS,C ; ************* *************
goto skipG0 ; |_____________|STATUS,C
incf totaal_H,f ; ************* *************
skipG0: ; | +1 | |getal 0,20€|
movfw getal0EUR05L ; ************* *************
addwf totaal_L,f ; |_____________|STATUS,C
btfss STATUS,C ; ************* *************
goto skipH0 ; | +1 | |getal 0,10€|
incf totaal_H,f ; ************* *************
skipH0: ; |_____________|STATUS,C
; de hoge bytes optellen ; ************* *************
movfw getal2EURH ; | +1 | |getal 0,05€|
addwf totaal_H,f ; ************* *************
btfss STATUS,C ; |_____________|STATUS,C
goto skipI0 ; |
bsf tmp9,0 ;errorbit (max bereikt) 'hoge byte'
skipI0: ; *************
movfw getal1EURH ; |getal 2€ |
addwf totaal_H,f ; *************
btfss STATUS,C ; STAUS,C |__________set error
goto skipJ0 ; + |
bsf tmp9,0 ;errorbit (max bereikt) *************
skipJ0: ; |getal 1€ |
movfw getal0EUR50H ; *************
addwf totaal_H,f ; STAUS,C |__________set error
btfss STATUS,C ; + |
goto skipK0 ; *************
bsf tmp9,0 ;errorbit (max bereikt) |getal 0,50€|
skipK0: ; *************
movfw getal0EUR20H ; STAUS,C |__________set error
addwf totaal_H,f ; + |
btfss STATUS,C ; *************
goto skipL0 ; |getal 0,20€|
bsf tmp9,0 ;errorbit (max bereikt) *************
skipL0: ; STAUS,C |__________set error
movfw getal0EUR10H ; + |
addwf totaal_H,f ; *************
btfss STATUS,C ; |getal 0,10€|
goto skipM0 ; *************
bsf tmp9,0 ;errorbit (max bereikt) STAUS,C |__________set error
skipM0: ; + |
movfw getal0EUR05H ; *************
addwf totaal_H,f ; |getal 0,05€|
btfss STATUS,C ; *************
goto skipN0 ; STAUS,C |__________set error
bsf tmp9,0 ;errorbit (max bereikt) |
skipN0: ; converter 16-bit
call lijn2_7 ; |
movfw totaal_L ;
movwf tempgetalL ; ***LCD-DISPLAY*******karakters*buiten*beeld****
movfw totaal_H ; * ................|....|................|.... *
movwf tempgetalH ; * .......X........|....|................|.... *
call converter ; ***********************************************
;.......................................................
; idem om de 2 byte's samen te tellen voor de aantallen
movfw aantal2EURL
addwf aantal_L,f
movfw aantal1EURL
addwf aantal_L,f
btfss STATUS,C
goto skipA1
incf aantal_H,f
skipA1:
movfw aantal0EUR50L
addwf aantal_L,f
btfss STATUS,C
goto skipB1
incf aantal_H,f
skipB1:
movfw aantal0EUR20L
addwf aantal_L,f
btfss STATUS,C
goto skipC1
incf aantal_H,f
skipC1:
movfw aantal0EUR10L
addwf aantal_L,f
btfss STATUS,C
goto skipD1
incf aantal_H,f
skipD1:
movfw aantal0EUR05L
addwf aantal_L,f
btfss STATUS,C
goto skipE1
incf aantal_H,f
skipE1: ; nu zijn de lage aantal-bytes opgeteld en de Carry(s) zijn overgedragen
; naar de hoge aantal-byte
; hier gaan we verder de hoge aantal-bytes op te tellen
; wanneer er een carry out ontstaat, moet er gestopt worden omdat het max bereikt is
movfw aantal2EURH
addwf aantal_H,f
btfss STATUS,C
goto skipF1
bsf tmp9,1 ;errorbit (max bereikt)
skipF1:
movfw aantal1EURH
addwf aantal_H,f
btfss STATUS,C
goto skipG1
bsf tmp9,1 ;errorbit (max bereikt)
skipG1:
movfw aantal0EUR50H
addwf aantal_H,f
btfss STATUS,C
goto skipH1
bsf tmp9,1 ;errorbit (max bereikt)
skipH1:
movfw aantal0EUR20H
addwf aantal_H,f
btfss STATUS,C
goto skipI1
bsf tmp9,1 ;errorbit (max bereikt)
skipI1:
movfw aantal0EUR10H
addwf aantal_H,f
btfss STATUS,C
goto skipJ1
bsf tmp9,1 ;errorbit (max bereikt)
skipJ1:
movfw aantal0EUR05H
addwf aantal_H,f
btfss STATUS,C
goto skipK1
bsf tmp9,1 ;errorbit (max bereikt)
skipK1:
call lijn2_29 ; ***LCD-DISPLAY*******karakters*buiten*beeld****
movfw aantal_L ; * ................|....|................|.... *
movwf tempgetalL ; * ................|....|..........X.....|.... *
movfw aantal_H ; ***********************************************
movwf tempgetalH
call converter
return
;*****************************************************************************************************************
; hier staat de code waar de data herschreven wordt bij het 2e beeld
; deze zou er als volgt moeten uitzien:
;
; ***LCD-DISPLAY*******karakters*buiten*beeld****
; * Munt:.....2,00€.|....|Munt:.....2,00€.|.... *
; * Subtot.:......0€|....|Aantal:......0..|.... *
; ***********************************************
;
; in beeld 1 worden data herschreven op de 1e lijn, als eerste via 'datateller' om de muntwaarde te selecteren
; daarna wordt de data op de 2e lijn aangepast, dit is de conversie van 16 bit getal "totaal_L + _H
;*****************************************************************************************************************
skip100: movfw beeld
sublw .1
btfss STATUS,Z
goto skip101 ; Als beeld 1 niet 0 is
call BEELD1_2 ; deze schrijft op de eerste regel het getal, afgeleid uit datamunt
; de waarde van de munt wordt elke herschrijving bekeken en desnoods aangepast
movfw datateller
sublw .0 ; schrijf 2,00€, aantal en bedrag
btfss STATUS,Z
goto skip10
call lijn2_7 ; ***LCD-DISPLAY*******karakters*buiten*beeld****
movfw getal2EURL ; * Munt:.....#,##€.|....|Munt:.....#,##€.|.... *
movwf tempgetalL ; * Subtot.xxxXXXXX€|....|Aantal:.........|.... *
movfw getal2EURH ; ***********************************************
movwf tempgetalH
movlw ':' ; print deze 3 karakters voor de conversie, dit omdat de getallen met
call prntLCD ; komma 3 plaatsen meer naar links geschreven worden, en als je dan
movlw ' ' ; terug naar gehele getallen gaat, blijven anders de 3 hoogste cijfers
call prntLCD ; op het LCD staan, wat kan leiden tot fout afleesbare bedragen
movlw ' '
call prntLCD
call converter ; deze schrijft op de 2e regel het geconverteerd getal
call lijn2_29 ; ***LCD-DISPLAY*******karakters*buiten*beeld****
movfw aantal2EURL ; * Munt:.....#,##€.|....|Munt:.....#,##€.|.... *
movwf tempgetalL ; * Subtot.:........|....|Aantal:..XXXXXX.|.... *
movfw aantal2EURH ; ***********************************************
movwf tempgetalH
call converter
return
skip10:
movfw datateller
sublw .1 ; schrijf 1,00€, aantal en bedrag
btfss STATUS,Z
goto skip11
call lijn2_10
movfw getal1EURL
movwf tempgetalL
movfw getal1EURH
movwf tempgetalH
call converter
call lijn2_29
movfw aantal1EURL
movwf tempgetalL
movfw aantal1EURH
movwf tempgetalH
call converter
return
skip11:
movfw datateller
sublw .2 ; schrijf 0,50€, aantal en bedrag
btfss STATUS,Z
goto skip12
call lijn2_7
movfw getal0EUR50L
movwf tempgetalL
movfw getal0EUR50H
movwf tempgetalH
call converter
movfw komma0EUR50
movwf tempkomma
call converterKOMMA
call lijn2_29
movfw aantal0EUR50L
movwf tempgetalL
movfw aantal0EUR50H
movwf tempgetalH
call converter
return
skip12:
movfw datateller
sublw .3 ; schrijf 0,20€, aantal en bedrag
btfss STATUS,Z
goto skip13
call lijn2_7
movfw getal0EUR20L
movwf tempgetalL
movfw getal0EUR20H
movwf tempgetalH
call converter
movfw komma0EUR20
movwf tempkomma
call converterKOMMA
call lijn2_29
movfw aantal0EUR20L
movwf tempgetalL
movfw aantal0EUR20H
movwf tempgetalH
call converter
return
skip13:
movfw datateller
sublw .4 ; schrijf 0,10€, aantal en bedrag
btfss STATUS,Z
goto skip14
call lijn2_7
movfw getal0EUR10L
movwf tempgetalL
movfw getal0EUR10H
movwf tempgetalH
call converter
movfw komma0EUR10
movwf tempkomma
call converterKOMMA
call lijn2_29
movfw aantal0EUR10L
movwf tempgetalL
movfw aantal0EUR10H
movwf tempgetalH
call converter
return
skip14:
call lijn2_7 ; schrijf 0,05€, aantal en bedrag
movfw getal0EUR05L
movwf tempgetalL
movfw getal0EUR05H
movwf tempgetalH
call converter
movfw komma0EUR05
movwf tempkomma
call converterKOMMA
call lijn2_29
movfw aantal0EUR05L
movwf tempgetalL
movfw aantal0EUR05H
movwf tempgetalH
call converter
return
;=================================================================================================================
BEELD1_2:
bcf PORTB,6 ; **********LCD-DISPLAY*******************alle*andere*karakters*buiten*beeld*********
movlw b'10001010' ; * . . . . . . . . . ._x , x x € .|. . . .|. . . . . . . . . . . . . . . .|. . . . *
call prntLCD ; * . . . . . . . . . . . . . . . .|. . . .|. . . . . . . . . . . . . . . .|. . . . *
bsf PORTB,6 ; ***********************************************************************************
call SUBROTINE_1
bcf PORTB,6 ; **********LCD-DISPLAY*******************alle*andere*karakters*buiten*beeld*********
movlw b'10011110' ; * . . . . . . . . . . . . . . . .|. . . .|. . . . . . . . . . _x , x x €.|. . . . *
call prntLCD ; * . . . . . . . . . . . . . . . .|. . . .|. . . . . . . . . . . . . . . .|. . . . *
bsf PORTB,6 ; ***********************************************************************************
call SUBROTINE_1
return
SUBROTINE_1:
call datamunt1 ; maak de conversie welke muntwaarde weergegeven moet worden
call prntLCD ; zet variabele cijfer op het scherm
movlw ',' ;
call prntLCD ; zet vaste komma op het scherm
call datamunt2 ;
call prntLCD ;
call datamunt3 ;
call prntLCD ;
movlw 0x00 ; € teken
call prntLCD ;
return ;
;=================================================================================================================
;*****************************************************************************************************************
; hier staat de code waar de data herschreven wordt bij het 3e beeld
; deze zou er als volgt moeten uitzien:
;
; ***LCD-DISPLAY*******karakters*buiten*beeld****
; * Errors:..00.....|....|[Geen.meldingen]|.... *
; * ................|....|..............#.|.... *
; ***********************************************
;
; ***LCD-DISPLAY*******karakters*buiten*beeld****
; * Errors:..1......|....|fout sensor 2,00|.... *
; * .Bekijk.&.reset>|....|Accept. & wis.#.|.... *
; ***********************************************
;
;*****************************************************************************************************************
skip101: movfw beeld
sublw .2
btfss STATUS,Z
goto skip102 ; Als beeld 2 niet 0 is
; data voor herschrijven
;schrijf eerst het aantal fouten achter "errors"
bcf PORTB,6 ; |
movlw b'10001001' ; ga naar lijn1, karakter 9 |
call prntLCD ; |
bsf PORTB,6 ; |
movlw 0x30 ; om ASCII getallen te maken plaats je 0x30
movwf temp0X ; in de merkers. Dit komt overeen met ASCII = 0
movwf temp00X ; 0X = tiendes, 00X = honderste
skip_C_2: ;
movfw tmp6 ; aantal fouten - byte
addlw .246 ; tel 246 op, indien het kommagetal >=10, zal de uitkomst in W >256 zijn
btfss STATUS,C ; wanneer de uitkomst in W >=256 is, zal C hoog zijn
goto skip_C_1 ;
movlw .10 ;
subwf tmp6,f ; F=f-w :laad getal 10 in W, verminder het kommagetal met 10 en sla op
incf temp0X,f ; tel 1 op bij de 'tiendes'
goto skip_C_2 ; en herhaal deze loop.
skip_C_1: ;
movf tmp6,w ; wanneer tempkomma <10 is geworden, laad je het overgebleven getal in W
addwf temp00X,f ; en tel deze op bij 'honderste' (dit is al ASCII compatible
; clrf tmp6
movfw temp0X
call prntLCD
movfw temp00X
call prntLCD
;------------------------
;scan alle mogelijke fouten en ga naar het subprogrammatje
btfsc tmp9,0
goto err_00
btfsc tmp9,1
goto err_01
btfsc tmp9,2
goto err_02
btfsc tmp9,3
goto err_03
btfsc tmp9,4
goto err_04
btfsc tmp9,5
goto err_05
btfsc tmp9,6
goto err_06
btfsc tmp9,7
goto err_07
call lijn1_20
movlw '['
call prntLCD
movlw 'G' ;
call prntLCD
movlw 'e'
call prntLCD
movlw 'e'
call prntLCD
movlw 'n'
call prntLCD
movlw ' '
call prntLCD
movlw 'm
call prntLCD
movlw 'e'
call prntLCD
movlw 'l'
call prntLCD
movlw 'd' ;
call prntLCD
;movlw 'i'
;call prntLCD
;movlw 'n'
;call prntLCD
;movlw 'g'
;call prntLCD
;movlw 'e' ;
;call prntLCD
;movlw 'n'
;call prntLCD
;movlw ']'
;call prntLCD
; call text_2
; call text_4
return ; ga terug als er geen error is
err_00: call lijn1_20
movlw 'M'
call prntLCD
movlw 'a' ;
call prntLCD
movlw 'x'
call prntLCD
movlw '.'
call prntLCD
movlw '"'
call prntLCD
movlw 0x00 ;€ teken
call prntLCD
movlw '"'
call prntLCD
movlw ' '
call prntLCD
movlw 'b'
call prntLCD
movlw 'e' ;
call prntLCD
movlw 'r'
call prntLCD
movlw 'e'
call prntLCD
movlw 'i'
call prntLCD
movlw 'k' ;
call prntLCD
movlw 't'
call prntLCD
movlw ' '
call prntLCD
goto err_verder
err_01: call lijn1_20
movlw 'M'
call prntLCD
movlw 'a' ;
call prntLCD
movlw 'x'
call prntLCD
movlw '.'
call prntLCD
movlw 'a'
call prntLCD
movlw 'a' ;
call prntLCD
movlw 'n'
call prntLCD
movlw 't'
call prntLCD
movlw 'a'
call prntLCD
movlw 'l' ;
call prntLCD
movlw ' '
call prntLCD
movlw 'g'
call prntLCD
movlw 'e'
call prntLCD
movlw 't' ;
call prntLCD
movlw 'e'
call prntLCD
movlw 'l'
call prntLCD
goto err_verder
err_02: call F_SENS
movlw '2'
call prntLCD
movlw 0x00 ; €-teken
call prntLCD
movlw '0'
call prntLCD
movlw '0'
call prntLCD
goto err_verder
err_03: call F_SENS
movlw '1'
call prntLCD
movlw 0x00 ; €-teken
call prntLCD
movlw '0'
call prntLCD
movlw '0'
call prntLCD
goto err_verder
err_04: call F_SENS
movlw '0'
call prntLCD
movlw 0x00 ; €-teken
call prntLCD
movlw '5'
call prntLCD
movlw '0'
call prntLCD
goto err_verder
err_05: call F_SENS
movlw '0'
call prntLCD
movlw 0x00 ; €-teken
call prntLCD
movlw '2'
call prntLCD
movlw '0'
call prntLCD
goto err_verder
err_06: call F_SENS
movlw '0'
call prntLCD
movlw 0x00 ; €-teken
call prntLCD
movlw '1'
call prntLCD
movlw '0'
call prntLCD
goto err_verder
err_07: call F_SENS
movlw '0'
call prntLCD
movlw 0x00 ; €-teken
call prntLCD
movlw '0'
call prntLCD
movlw '5'
call prntLCD
err_verder:
;--------------------------------
call lijn2_1
movlw ' ' ; schrijf "Bekijk & reset" op het LCD
call prntLCD
movlw 'B'
call prntLCD
movlw 'e'
call prntLCD
movlw 'k'
call prntLCD
movlw 'i'
call prntLCD
movlw 'j'
call prntLCD
movlw 'k'
call prntLCD
movlw ' '
call prntLCD
movlw '&'
call prntLCD
movlw ' '
call prntLCD
movlw 'r'
call prntLCD
movlw 'e'
call prntLCD
movlw 's'
call prntLCD
movlw 'e'
call prntLCD
movlw 't'
call prntLCD
movlw 0x7E ;pijltje rechts
call prntLCD
call lijn2_20
movlw 'A' ; schrijf "Accept. & wis #" op het LCD
call prntLCD
movlw 'c'
call prntLCD
movlw 'c'
call prntLCD
movlw 'e'
call prntLCD
movlw 'p'
call prntLCD
movlw 't'
call prntLCD
movlw '.'
call prntLCD
movlw ' '
call prntLCD
movlw '&'
call prntLCD
movlw ' '
call prntLCD
movlw 'w'
call prntLCD
movlw 'i'
call prntLCD
movlw 's'
call prntLCD
movlw ' '
call prntLCD
movlw 0xDB ; vierkantje
call prntLCD
return
F_SENS: call lijn1_20
movlw 'F' ; schrijf "Fout sensor 2,00" op het LCD
call prntLCD
movlw 'o'
call prntLCD
movlw 'u'
call prntLCD
movlw 't'
call prntLCD
movlw ' '
call prntLCD
movlw 's'
call prntLCD
movlw 'e'
call prntLCD
movlw 'n'
call prntLCD
movlw 's'
call prntLCD
movlw 'o'
call prntLCD
movlw 'r'
call prntLCD
movlw ' '
call prntLCD
return
;*****************************************************************************************************************
; hier staat de code waar de data herschreven wordt bij het 4e beeld
; deze zou er als volgt moeten uitzien:
;
; ***LCD-DISPLAY*******karakters*buiten*beeld****
; * Reset:..........|....|Sorteerschijf:..|.... *
; * Alle waarden?.#.|....|..Starten?....#.|.... *
; ***********************************************
;
; in beeld 1 worden data herschreven op de 1e lijn, als eerste via 'datateller' om de muntwaarde te selecteren
; daarna wordt de data op de 2e lijn aangepast, dit is de conversie van 16 bit getal "totaal_L + _H
;*****************************************************************************************************************
skip102:
movfw beeld
sublw .3
btfss STATUS,Z
return ; ga terug zonder herschrijven als beeldteller niet klopt
; data voor herschrijven in beeld 4
movfw datateller
sublw .0 ; schrijf "alle waarden?" resetten
btfss STATUS,Z
goto skipBLD4_0
BLD4_0: call lijn2_1
movlw 'a' ; schrijf "alle waarden?" op het LCD
call prntLCD
movlw 'l'
call prntLCD
movlw 'l'
call prntLCD
movlw 'e'
call prntLCD
movlw ' '
call prntLCD
movlw 'w'
call prntLCD
movlw 'a'
call prntLCD
movlw 'a'
call prntLCD
movlw 'r'
call prntLCD
movlw 'd'
call prntLCD
movlw 'e'
call prntLCD
movlw 'n'
call prntLCD
movlw '?'
call prntLCD
; movlw ' '
; call prntLCD
; movlw 0xDB ;vierkant vakje
; call prntLCD
return
skipBLD4_0:
movfw datateller
sublw .1 ; schrijf "aantallen?" resetten
btfss STATUS,Z
goto skipBLD4_1
BLD4_1: call lijn2_1
movlw 'a' ; schrijf "aantallen?" op het LCD
call prntLCD
movlw 'a'
call prntLCD
movlw 'n'
call prntLCD
movlw 't'
call prntLCD
movlw 'a'
call prntLCD
movlw 'l'
call prntLCD
movlw 'l'
call prntLCD
movlw 'e'
call prntLCD
movlw 'n'
call prntLCD
movlw '?'
call prntLCD
movlw ' '
call prntLCD
movlw ' '
call prntLCD
movlw ' '
call prntLCD
movlw ' '
call prntLCD
; movlw 0xDB ;vierkant vakje
; call prntLCD
return
skipBLD4_1:
movfw datateller
sublw .2 ; schrijf "bedragen?" resetten
btfss STATUS,Z
goto skipBLD4_2
BLD4_2: call lijn2_1
movlw 'b' ; schrijf "bedragen?" op het LCD
call prntLCD
movlw 'e'
call prntLCD
movlw 'd'
call prntLCD
movlw 'r'
call prntLCD
movlw 'a'
call prntLCD
movlw 'g'
call prntLCD
movlw 'e'
call prntLCD
movlw 'n'
call prntLCD
movlw '?'
call prntLCD
movlw ' '
call prntLCD
movlw ' '
call prntLCD
movlw ' '
call prntLCD
movlw ' '
call prntLCD
; movlw ' '
; call prntLCD
; movlw 0xDB ;vierkant vakje
; call prntLCD
return
skipBLD4_2:
movfw datateller
sublw .3 ; schrijf "alle waarden?" resetten
btfss STATUS,Z
goto skipBLD4_3
goto BLD4_0
skipBLD4_3:
movfw datateller
sublw .4 ; schrijf "aantallen?" resetten
btfss STATUS,Z
goto skipBLD4_4
goto BLD4_1
skipBLD4_4:
movfw datateller
sublw .5 ; schrijf "bedragen?" resetten
btfss STATUS,Z
return
goto BLD4_2
return
;................................................................................................................
;=================================================================================================================
;................................................................................................................
;..................................................................................................
; 2 byte getal (16 bits) omzetten naar decimalen
; code afkomstig van internet, getest en werkt op 3 apr 2021
;..................................................................................................
converter:
swapf tempgetalH,w ;w = A2*16+A3
andlw 0x0F ;w = A3 *** PERSONALLY, I'D REPLACE THESE 2
addlw 0xF0 ;w = A3-16 *** LINES WITH "IORLW b'11110000B' " -AW
movwf temp1d ;B3 = A3-16
addwf temp1d,f ;B3 = 2*(A3-16) = 2A3 - 32
addlw d'226' ;w = A3-16 - 30 = A3-46
movwf temp100 ;B2 = A3-46
addlw .50 ;w = A3-46 + 50 = A3+4
movwf temp1 ;B0 = A3+4
movf tempgetalH,w ;w = A3*16+A2
andlw 0x0F ;w = A2
addwf temp100,f ;B2 = A3-46 + A2 = A3+A2-46
addwf temp100,f ;B2 = A3+A2-46 + A2 = A3+2A2-46
addwf temp1,f ;B0 = A3+4 + A2 = A3+A2+4
addlw .233 ;w = A2 - 23
movwf temp10 ;B1 = A2-23
addwf temp10,f ;B1 = 2*(A2-23)
addwf temp10,f ;B1 = 3*(A2-23) = 3A2-69 (Doh! thanks NG)
swapf tempgetalL,w ;w = A0*16+A1
andlw 0x0F ;w = A1
addwf temp10,f ;B1 = 3A2-69 + A1 = 3A2+A1-69 range -69...-9
addwf temp1,f ;B0 = A3+A2+4 + A1 = A3+A2+A1+4 and Carry = 0 (thanks NG)
rlf temp10,f ;B1 = 2*(3A2+A1-69) + C = 6A2+2A1-138 and Carry is now 1 as tens register had to be negitive
rlf temp1,f ;B0 = 2*(A3+A2+A1+4) + C = 2A3+2A2+2A1+9 (+9 not +8 due to the carry from prev line, Thanks NG)
comf temp1,f ;B0 = ~(2A3+2A2+2A1+9) = -2A3-2A2-2A1-10 (ones complement plus 1 is twos complement. Thanks SD)
rlf temp1,f ;B0 = 2*(-2A3-2A2-2A1-10) = -4A3-4A2-4A1-20
movf tempgetalL,w ;w = A1*16+A0
andlw 0x0F ;w = A0
addwf temp1,f ;B0 = -4A3-4A2-4A1-20 + A0 = A0-4(A3+A2+A1)-20 range -215...-5 Carry=0
rlf temp1d,f ;B3 = 2*(2A3 - 32) = 4A3 - 64
movlw 0x07 ;w = 7
movwf temp10d ;B4 = 7
movlw .10 ;w = 10
Lb1:
addwf temp1,f ; B0 += 10
decf temp10,f ; B1 -= 1
btfss STATUS,C
goto Lb1 ; while B0 < 0
Lb2:
addwf temp10,f ; B1 += 10
decf temp100,f ; B2 -= 1
btfss STATUS,C
goto Lb2 ; while B1 < 0
Lb3:
addwf temp100,f ; B2 += 10
decf temp1d,f ; B3 -= 1
btfss STATUS,C
goto Lb3 ; while B2 < 0
Lb4:
addwf temp1d,f ; B3 += 10
decf temp10d,f ; B4 -= 1
btfss STATUS,C
goto Lb4 ; while B3 < 0
movlw 0x00 ; in dit stukje code
addwf temp10d,f ; verberg je de 0'en
btfss STATUS,Z ; voor het getal
goto jp1 ; dit zorgt voor een
movlw ' ' ; duidelijkere weergave
call prntLCD ; bij bv.: 12€ zou je
; anders 00012€ tezien
movlw 0x00 ; krijgen, nu zie je 12€
addwf temp1d,f
btfss STATUS,Z
goto jp2
movlw ' '
call prntLCD
movlw 0x00
addwf temp100,f
btfss STATUS,Z
goto jp3
movlw ' '
call prntLCD
movlw 0x00
addwf temp10,f
btfss STATUS,Z
goto jp4
movlw ' '
call prntLCD
goto jp5
jp1: movf temp10d,w ; zorg dat in de temp-
addlw 0x30 ; getallen 0x30
call prntLCD ; bijgeteld wordt, dit
jp2: movf temp1d,w ; om een overeenkomstig
addlw 0x30 ; getal in ASCII-code
call prntLCD ; weer te geven.
jp3: movf temp100,w
addlw 0x30
call prntLCD
jp4: movf temp10,w
addlw 0x30
call prntLCD
jp5: movf temp1,w
addlw 0x30
call prntLCD
return
;=================================================================================================================
; ; start hier de converter voor kommagetallen
;=================================================================================================================
converterKOMMA:
movlw 0x30 ; om ASCII getallen te maken plaats je 0x30
movwf temp0X ; in de merkers. Dit komt overeen met ASCII = 0
movwf temp00X ; 0X = tiendes, 00X = honderste
skip_K_2: ;
movfw tempkomma ; hier staat de waarde van het kommagetal
addlw .246 ; tel 246 op, indien het kommagetal >=10, zal de uitkomst in W >256 zijn
btfss STATUS,C ; wanneer de uitkomst in W >=256 is, zal C hoog zijn
goto skip_K_1 ;
movlw .10 ;
subwf tempkomma,f ; F=f-w :laad getal 10 in W, verminder het kommagetal met 10 en sla op
incf temp0X,f ; tel 1 op bij de 'tiendes'
goto skip_K_2 ; en herhaal deze loop.
skip_K_1: ;
movf tempkomma,w ; wanneer tempkomma <10 is geworden, laad je het overgebleven getal in W
addwf temp00X,f ; en tel deze op bij 'honderste' (dit is al ASCII compatible
;-----------------------------------;
bcf PORTB,6 ; Ga naar lijn2, karakter 12
movlw b'11001100' ;
call prntLCD ; Deze moet je opnieuw aanroepen omdat in de converter
bsf PORTB,6 ; ook terug naar lijn 1 gesprongen wordt.
movlw ','
call prntLCD ; **********LCD-DISPLAY*******************alle*andere*karakters*buiten*beeld*********
movfw temp0X ; * . . . . . . . . . . . . . . . .|. . . .|. . . . . . . . . . . . . . . .|. . . . *
call prntLCD ; * . . . . . . . . . . . . ¦,x x €|. . . .|. . . . . . . . . . . . . . . .|. . . . *
movfw temp00X ; ***********************************************************************************
call prntLCD
return
;=================================================================================================================
;-----------------------------------------
;data van MUNT aanpassen
;-----------------------------------------
datamunt1:
movfw datateller
sublw .0 ; W=k-w # subwf: W=f-w of F=f-w
btfss STATUS,Z ; doe de aktie enkel als datateller =0
goto skip1
movlw '2'
return
skip1:
movfw datateller
sublw .1
btfss STATUS,Z
goto skip2
movlw '1'
return
skip2:
movlw '0'
return
;................................................................................................................
datamunt2:
movfw datateller
sublw .2
btfss STATUS,Z
goto skip3
movlw '5'
return
skip3:
movfw datateller
sublw .3
btfss STATUS,Z
goto skip4
movlw '2'
return
skip4:
movfw datateller
sublw .4
btfss STATUS,Z
goto skip5
movlw '1'
return
skip5:
movlw '0'
return
;................................................................................................................
datamunt3:
movfw datateller
sublw .5
btfss STATUS,Z
goto skip6
movlw '5'
return
skip6:
movlw '0'
return
;=================================================================================================================
; -------------------------------------------------------------------------------------
; 8 bits omvormen naar 2 x 4 bit commando's, en zo het W-reg naar het LCD te schrijven.
; -------------------------------------------------------------------------------------
;=================================================================================================================
prntLCD: movwf tempLCD ; als vb.: 0010 1000
swapf tempLCD,w ; resultaat wordt dan 1000 0010 in W
andlw 0x0F ; resultaat wordt dan 0000 0010 in W
movwf PORTC ; plaats resultaat op poort C
call Delay2
call pulse_e ;----------------------------
; hier begint het 2e deel |
movf tempLCD,w ; vb.: 0010 1000
andlw 0x0F ; vb.: 0000 1000
movwf PORTC ; zet de volgende 4 bits op poort C
call Delay2
call pulse_e
return
;=================================================================================================================
; vertragingen instellen
;=================================================================================================================
Delay255 movlw 0xff ;delay 255 mS
goto d0
Delay5 movlw 0x05 ; delay 5ms
goto d0
Delay2 movlw 0x02 ;delay 2.000 ms (4 MHz clock)
d0 movwf count1
d1 movlw 0x58 ;delay 1mS = 0xC7 (d199= originele waarde) --- delay 500µS = 0x63 (d99)???
movwf counta ; d1 was 0x55
movlw 0x01
movwf countb
Delay_0
decfsz counta, f
goto $+2
decfsz countb, f
goto Delay_0
decfsz count1 ,f
goto d1
return
; retlw 0x00
;=================================================================================================================
; Pulse geven op enable pin van LCD (E = pin 6)
;=================================================================================================================
pulse_e bcf PORTB, LCD_E
nop
bsf PORTB, LCD_E
return
;=================================================================================================================
; Call fuctie om cursor op een karakterpositie te zetten
;=================================================================================================================
lijn2_10: bcf PORTB,6 ; |
movlw b'11001010' ; ga naar lijn2, karakter 10 |
call prntLCD ; |
bsf PORTB,6 ; |
return
;=================================================================================================================
lijn2_14: bcf PORTB,6 ; |
movlw b'11001110' ; ga naar lijn2, karakter 14 |
call prntLCD ; |
bsf PORTB,6 ; |
return
;=================================================================================================================
lijn2_29: bcf PORTB,6 ; |
movlw b'11011101' ; ga naar lijn2, karakter 29 |
call prntLCD ; |
bsf PORTB,6 ; |
return
;=================================================================================================================
lijn2_7: bcf PORTB,6 ; |
movlw b'11000111' ; ga naar lijn2, karakter 7 |
call prntLCD ; |
bsf PORTB,6 ; |
return
;=================================================================================================================
lijn2_1: bcf PORTB,6 ; |
movlw b'11000000' ; ga naar lijn2, karakter 1 |
call prntLCD ; |
bsf PORTB,6 ; |
return
;=================================================================================================================
lijn2_20: bcf PORTB,6 ; |
movlw b'11010100' ; ga naar lijn2, karakter 20 |
call prntLCD ; |
bsf PORTB,6 ; |
return
;=================================================================================================================
lijn1_20: bcf PORTB,6 ; |
movlw b'10010100' ; ga naar lijn1, karakter 20 |
call prntLCD ; |
bsf PORTB,6 ; |
return
;=================================================================================================================
;####################################################################
; de tekst die hier geschreven wordt, word niet herschreven !!!
; dus hier mag je geen voorwaarden of wisselende teksten plaatsen.
;###################################################################
text_1: ; hier laad je enkel de tekst die op het 1e deel van het display moet komen
; **********LCD-DISPLAY*******************alle*andere*karakters*buiten*beeld*********
; * X X X X X X X X X X X X X X X X|. . . .|. . . . . . . . . . . . . . . .|. . . . *
; * . . . . . . . . . . . . . . . .|. . . .|. . . . . . . . . . . . . . . .|. . . . *
; ***********************************************************************************
movfw beeld
sublw .0
btfss STATUS,Z
goto skipbeeld00
movf count,w
call textTotaal
movwf buf1
return
skipbeeld00:
movfw beeld
sublw .1
btfss STATUS,Z
goto skipbeeld01
movf count,w
call textMunt
movwf buf1
return
skipbeeld01:
movfw beeld
sublw .2
btfss STATUS,Z
goto skipbeeld02
movf count,w
call textError
movwf buf1
return
skipbeeld02:
movfw beeld
sublw .3
btfss STATUS,Z
goto skipbeeld03
movf count,w
call textReset
movwf buf1
return
skipbeeld03:
retlw 0xFF
;--------------------------------------
text_2: ; hier laad je enkel de tekst die op het 2e deel van het display moet komen
; **********LCD-DISPLAY*******************alle*andere*karakters*buiten*beeld*********
; * . . . . . . . . . . . . . . . .|. . . .|X X X X X X X X X X X X X X X X|. . . . *
; * . . . . . . . . . . . . . . . .|. . . .|. . . . . . . . . . . . . . . .|. . . . *
; ***********************************************************************************
movfw beeld ; in beeld 1 schrijf je "Aantal munten:"
sublw .0
btfss STATUS,Z
goto skipbeeld10
movf count,w
call textAantalMunt
movwf buf1
return
skipbeeld10:
movfw beeld ; in beeld 2 schrijf je "Munt:"
sublw .1
btfss STATUS,Z
goto skipbeeld11
movf count,w
call textMunt
movwf buf1
return
skipbeeld11:
movfw beeld ; in beeld 3 schrijf je "[geen meldingen]"
sublw .2
btfss STATUS,Z
goto skipbeeld12
retlw 0xff
;movf count,w
;call textVaria1
;movwf buf1
;return
skipbeeld12:
movfw beeld
sublw .3
btfss STATUS,Z
goto skipbeeld13
movf count,w
call textVaria2
movwf buf1
return
skipbeeld13:
retlw 0xFF
;--------------------------------------
text_3: ; hier laad je enkel de tekst die op het 3e deel van het display moet komen
; **********LCD-DISPLAY*******************alle*andere*karakters*buiten*beeld*********
; * . . . . . . . . . . . . . . . .|. . . .|. . . . . . . . . . . . . . . .|. . . . *
; * X X X X X X X X X X X X X X X X|. . . .|. . . . . . . . . . . . . . . .|. . . . *
; ***********************************************************************************
movfw beeld
sublw .0
btfss STATUS,Z
goto skipbeeld20
EUROteken: bcf PORTB,6 ; **********LCD-DISPLAY*******************alle*andere*karakters*buiten*beeld*********
movlw b'11001111' ; * . . . . . . . . . . . . . . . .|. . . .|. . . . . . . . . . . . . . . .|. . . . *
call prntLCD ; * . . . . . . . . . . . . . . . X|. . . .|. . . . . . . . . . . . . . . .|. . . . *
bsf PORTB,6 ; ***********************************************************************************
movlw 0x00 ; €-teken laden
call prntLCD
retlw 0xFF
skipbeeld20:
movfw beeld
sublw .1
btfss STATUS,Z
goto skipbeeld21
movf count,w ; **********LCD-DISPLAY*******************alle*andere*karakters*buiten*beeld*********
call textSubtot ; * . . . . . . . . . . . . . . . .|. . . .|. . . . . . . . . . . . . . . .|. . . . *
movwf buf1 ; * S u b t o t . : . . . . . . . €|. . . .|. . . . . . . . . . . . . . . .|. . . . *
xorlw 0xFF ; ***********************************************************************************
btfsc STATUS,Z
goto EUROteken
return
skipbeeld21:
movfw beeld
sublw .2
btfss STATUS,Z
goto skipbeeld22
retlw 0xFF ; blanco
skipbeeld22:
movfw beeld
sublw .3
btfss STATUS,Z
retlw 0xFF ; ga terug als beeldteller hoger zou zijn als "3"
bcf PORTB,6 ; **********LCD-DISPLAY*******************alle*andere*karakters*buiten*beeld*********
movlw b'11001110' ; * . . . . . . . . . . . . . . . .|. . . .|. . . . . . . . . . . . . . . .|. . . . *
call prntLCD ; * . . . . . . . . . . . . . . X .|. . . .|. . . . . . . . . . . . . . . .|. . . . *
bsf PORTB,6 ; ***********************************************************************************
movlw 0xDB ; ASCII vierkantje
call prntLCD
retlw 0xFF
;-------------------------------------------
text_4: ; hier laad je enkel de tekst die op het 4e deel van het display moet komen
; **********LCD-DISPLAY*******************alle*andere*karakters*buiten*beeld*********
; * . . . . . . . . . . . . . . . .|. . . .|. . . . . . . . . . . . . . . .|. . . . *
; * . . . . . . . . . . . . . . . .|. . . .|X X X X X X X X X X X X X X X X|. . . . *
; ***********************************************************************************
movfw beeld ; in beeld 1 is dit blanco
sublw .0
btfss STATUS,Z
goto skipbeeld30 ;blanco
retlw 0xFF
skipbeeld30:
movfw beeld ; in beeld 2 is dit 'Aantal:'
sublw .1
btfss STATUS,Z
goto skipbeeld31
movf count,w ; **********LCD-DISPLAY*******************alle*andere*karakters*buiten*beeld*********
call textAantal ; * . . . . . . . . . . . . . . . .|. . . .|. . . . . . . . . . . . . . . .|. . . . *
movwf buf1 ; * . . . . . . . . . . . . . . . .|. . . .|A a n t a l : . . . . . . . . .|. . . . *
return ; ***********************************************************************************
skipbeeld31:
movfw beeld
sublw .2
btfss STATUS,Z
goto skipbeeld32
bcf PORTB,6 ; **********LCD-DISPLAY*******************alle*andere*karakters*buiten*beeld*********
movlw b'11100010' ; * . . . . . . . . . . . . . . . .|. . . .|. . . . . . . . . . . . . . . .|. . . . *
call prntLCD ; * . . . . . . . . . . . . . . . .|. . . .|. . . . . . . . . . . . . . X .|. . . . *
bsf PORTB,6 ; ***********************************************************************************
movlw 0xDB ; vierkantje laden
call prntLCD
retlw 0xFF
skipbeeld32:
movfw beeld
sublw .3
btfss STATUS,Z
goto skipbeeld33
bcf PORTB,6 ; **********LCD-DISPLAY*******************alle*andere*karakters*buiten*beeld*********
movlw b'11010110' ; * . . . . . . . . . . . . . . . .|. . . .|. . . . . . . . . . . . . . . .|. . . . *
call prntLCD ; * . . . . . . . . . . . . . . . .|. . . .|. . S t a r t e n ? . . . . . .|. . . . *
bsf PORTB,6 ; ***********************************************************************************
btfsc tmp10,1
goto skipbeeld34
movlw 'S' ; laad woord "starten:"
call prntLCD
movlw 't' ; ?-teken laden
call prntLCD
movlw 'a' ; ?-teken laden
call prntLCD
movlw 'r' ; ?-teken laden
call prntLCD
movlw 't' ; ?-teken laden
call prntLCD
movlw 'e' ; ?-teken laden
call prntLCD
movlw 'n' ; ?-teken laden
call prntLCD
movlw '?' ; ?-teken laden
call prntLCD
movlw ' ' ; ?-teken laden
call prntLCD
movlw ' ' ; ?-teken laden
call prntLCD
movlw ' ' ; ?-teken laden
call prntLCD
movlw ' ' ; ?-teken laden
call prntLCD
movlw 0xDB ; ?-teken laden
call prntLCD
retlw 0xFF
skipbeeld34:
movlw 'S' ; laad woord "stoppen:"
call prntLCD
movlw 't' ; ?-teken laden
call prntLCD
movlw 'o' ; ?-teken laden
call prntLCD
movlw 'p' ; ?-teken laden
call prntLCD
movlw 'p' ; ?-teken laden
call prntLCD
movlw 'e' ; ?-teken laden
call prntLCD
movlw 'n' ; ?-teken laden
call prntLCD
movlw '?' ; ?-teken laden
call prntLCD
movlw ' ' ; ?-teken laden
call prntLCD
movlw ' ' ; ?-teken laden
call prntLCD
movlw ' ' ; ?-teken laden
call prntLCD
movlw ' ' ; ?-teken laden
call prntLCD
movlw 0xDB ; ?-teken laden
call prntLCD
retlw 0xFF
skipbeeld33:
retlw 0xFF
;######################################
;=======================================================================
; schrijf het LCD in 4 beelden, 2 op de eerste lijn en 2 op de 2e lijn
;=======================================================================
schrijfLCD:
; **********LCD-DISPLAY*******************alle*andere*karakters*buiten*beeld*********
; * X . . . . . . . . . . . . . . .|. . . .|. . . . . . . . . . . . . . . .|. . . . *
; * . . . . . . . . . . . . . . . .|. . . .|. . . . . . . . . . . . . . . .|. . . . *
; ***********************************************************************************
bcf PORTB,6 ;ga naar instructie mode
movlw b'00000010'
call prntLCD ; zet cursor naar home
call Delay2
bsf PORTB,6 ; ga naar data mode
clrf count ;****************************************
loop_1: ; movf count,w ;haal data op uit het 'PCL' en 'retlw' *
call text_1 ;register om TEXT te schrijven op *
; movwf buf1 ;het LCD display. *
xorlw 0xFF ;****************************************
btfsc STATUS,Z
goto next_1
movf buf1,w
call prntLCD
incf count,f
goto loop_1
next_1:
call lijn1_20
;bcf PORTB,6 ; **********LCD-DISPLAY*******************alle*andere*karakters*buiten*beeld*********
;movlw b'10010100' ; * . . . . . . . . . . . . . . . .|. . . .|X . . . . . . . . . . . . . . .|. . . . *
;call prntLCD ; * . . . . . . . . . . . . . . . .|. . . .|. . . . . . . . . . . . . . . .|. . . . *
;bsf PORTB,6 ; ***********************************************************************************
clrf count
loop_2: ; movf count,w
call text_2
; movwf buf1
xorlw 0xFF
btfsc STATUS,Z
goto next_2
movf buf1,w
call prntLCD
incf count,f
goto loop_2
next_2:
bcf PORTB,6 ; **********LCD-DISPLAY*******************alle*andere*karakters*buiten*beeld*********
movlw b'11000000' ; * . . . . . . . . . . . . . . . .|. . . .|. . . . . . . . . . . . . . . .|. . . . *
call prntLCD ; * X . . . . . . . . . . . . . . .|. . . .|. . . . . . . . . . . . . . . .|. . . . *
bsf PORTB,6 ; ***********************************************************************************
clrf count
loop_3: ; movf count,w
call text_3
; movwf buf1
xorlw 0xFF
btfsc STATUS,Z
goto next_3
movf buf1,w
call prntLCD
incf count,f
goto loop_3
next_3: call lijn2_20
;bcf PORTB,6 ; **********LCD-DISPLAY*******************alle*andere*karakters*buiten*beeld*********
;movlw b'11010100' ; * . . . . . . . . . . . . . . . .|. . . .|. . . . . . . . . . . . . . . .|. . . . *
;call prntLCD ; * . . . . . . . . . . . . . . . .|. . . .|X . . . . . . . . . . . . . . .|. . . . *
;bsf PORTB,6 ; ***********************************************************************************
clrf count
loop_4: ; movf count,w
call text_4
; movwf buf1
xorlw 0xFF
btfsc STATUS,Z
goto next_4
movf buf1,w
call prntLCD
incf count,f
goto loop_4
next_4:
return
end