' {$PBASIC 2.5}
' Versie van het stuurprogramma van de boom "Westinghouse" Xmas voor de 16 licht-snarige boom.
' Dit is een eerbetoon aan de oorspronkelijke boom gebruikt bij de Westinghouse R & D center in Churchill, PA.
' Loopt 2 modules van 8 110V outlet controllers, 1 voor 8 bovenste strijkers, 1 voor 8 lagere strijkers
' Elke module gedreven door TTL 74-573 serie octaal sloten. Gegevens uit de lagere IO-byte
' geschreven/gehouden door laag-hoog-laag overgangen op control bits vanaf de bovenste IO-byte.
' Module 1 (bovenste licht) vergrendeld door 8 havenstaatcontrole bit, module 2 (lager) door port 9 bits.
' De 2 modules zoals hier gebruikt zijn uitbreidbaar tot 8 modules voor een totaal van 64 gecontroleerde verkooppunten
' Deze versie minimaliseert geheugengebruik door het elimineren van de gerandomiseerde variabelen
' en ook het gestructureerde ontwerp van het hebben van een hoofdlus die verlichting roept
' routines als subroutines. Nu zijn alle routines in de hoofdlus zelf.
' Ja, slecht voor het feit dat minder structuur maar bespaart veel bytes. Verschillende van de
' eerdere routines werden ook herschreven voor het gebruik van meer lussen, aangezien ze innemen
' veel minder ruimte dan gewoon doorlopen lamp waardenlijsten. Beroep
' meer op lussen heeft downside van het beperken van de patronen een beetje, maar
' maakt de programmering meer ingewikkelde en interessant.
' Voor het downloaden van programma - verbinden met COM1 seriële kabel powered-up board
' Druk op de knop afspelen op de werkbalk
' Voor het testen van afzonderlijke routines plakken routine "xmaslites2-geminimaliseerd-testfile.bs2"
' Vergeet niet om de update van het testbestand als variabele definities of subroutines wijzigen
'----------------------------------------------------------------------------
' definiëren en instellen van variabelen
CTR1 VAR Nib ' teller indices voor de belangrijkste routine lussen
ctr2 VAR Nib
CTR3 VAR Nib
subctr1 VAR Nib ' teller index voor subroutine lussen
subpause VAR Word ' variabele voor het pauze tijd doorgeven aan subroutines
shiftcount VAR Nib ' teller voor het aantal verschuivingen
lpctr1 VAR Nib ' teller lengtes voor de belangrijkste routine lussen
lpctr2 VAR Nib
delay1 VAR Word ' min of meer constanten voor pauzes in routines
delay2 VAR Word
lowerlamps VAR Byte ' houdt lamp Statusbits voor lagere 8 snaren
upperlamps VAR Byte ' houdt lamp Statusbits voor bovenste 8 snaren
holdvar1 VAR Byte ' temp waarde lamphouder
holdvar2 VAR Byte ' temp waarde lamphouder
shiftee VAR Byte ' tijdelijke variabele voor het verschuiven van routines
OUTL % 00000000 = ' alle data lijnen laag ingesteld
Uidelijke = % 00000000 "alle opdrachtregels laag ingesteld
DIRS = % 1111111111111111 ' ingesteld van alle I/O pinnen op de uitvoermodus
' Stel waarden in voor de constanten die het algehele uiterlijk en de snelheid van de boom
delay1 = 500 ' half-tweede vertraging
delay2 = 800
lpctr1 = 3
lpctr2 = 6
' hoofdlus - in deze versie van het minimale geheugen, de lamp-routines worden niet genoemd als subroutines
DOEN
' MMM AllFlash MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
VOOR ctr1 = 1 tot en met 4
OUTL % 11111111 = "alle verlichting aan
GOSUB Drivemodule12
PAUZE delay2
OUTL = % 00000000 "alle lichten uit
GOSUB Drivemodule12
PAUZE delay2
VOLGENDE
' NNN volgorde en opvulling NNNNNNNNNNNNNNNNNNNNNNNN
"Deze routine circuleert een verlichte tekenreeks rond, weggaand achter
' een extra verlicht tekenreeks telkens totdat alle snaren zijn aangestoken.
' Begint met de onderste cirkel van tekenreeksen.
holdvar1 = % 00000000 "deze variabele accumuleert de snaren links aangestoken op
' het einde van de MSB van de set - beginnen met de tekenreeks MSB
' vervolgens voortgezet door toevoeging van MSB-1, MSB-2, enz. De
' MSB string string -H is - op de lichte tekenreeks etiketten
CTR3 = 8 ' dit prestatiemeteritem is verlaagd als het aantal stadia nodig
"om te duwen van een verlichte tekenreeks op de geaccumuleerde stapel daalt
' met elk toegevoegd tekenreeks
VOOR ctr1 = 1 tot en met 8
shiftee = % 00000001 ' lichte tekenreeks control bits begint bij LSB
FOR ctr2 = 1 TO ctr3
PAUZE 150-(ctr2*15)
lowerlamps = % 00000111 ' lowerlamps variabele die is gebruikt voor de onderste en bovenste samen
subpause = 150-(ctr2*15)
shiftcount = 9
GOSUB ShiftLeftBoth
VOLGENDE ' eindigt met alle lichten uit
' AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
' PPP GirlsGirlsGirls plaatsvervanger Sparkly Subroutine PPPPPPPPPP
' knippert tussen aangrenzende strings, bovenste en onderste afwisselend
' Sparkling treedt op als tekenreeks op tijd kort, ongeveer 100 is
' GirlsGirlsGirls:
FOR ctr2 = 0 tot en met 16
OUTL = % 01010101
GOSUB Drivemodule1
OUTL = % 10101010
GOSUB Drivemodule2
PAUZE 100
OUTL = % 10101010
GOSUB Drivemodule1
OUTL = % 01010101
GOSUB Drivemodule2
PAUZE 100
VOLGENDE ' eindigt met verlichting in de laatste positie
' PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
' DDD RotatePairs Subroutine DDDDDDDDDDDDDDDDDDD
' roterende paren van tekenreeksen tegenover elkaar
' RotatePairs:
OUTL % 00000000 = ' Schakel alle verlichting uitgeschakeld
FOR ctr2 = 0 TO lpctr2
VOOR ctr1 = 0 tot en met 3
HOGE ctr1
HOGE ctr1 + 4
GOSUB Drivemodule12
PAUZE delay1
LAGE ctr1
LAGE ctr1 + 4
GOSUB Drivemodule12
VOLGENDE
VOLGENDE ' eindigt met verlichting in de laatste positie
' DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
' EEE CounterRotate EEEEEEEEEEEEEEEEEEEEEEEEEEE
' counterrotating paren
' CounterRotate:
FOR ctr2 = 0 TO lpctr1
OUTL = % 10000000
GOSUB Drivemodule12
PAUZE delay1
OUTL = % 01000001
GOSUB Drivemodule12
PAUZE delay1
OUTL = % 00100010
GOSUB Drivemodule12
PAUZE delay1
OUTL = % 00010100
GOSUB Drivemodule12
PAUZE delay1
OUTL % 00001000 =
GOSUB Drivemodule12
PAUZE delay1
OUTL = % 00010100
GOSUB Drivemodule12
PAUZE delay1
OUTL = % 00100010
GOSUB Drivemodule12
PAUZE delay1
OUTL = % 01000001
GOSUB Drivemodule12
PAUZE delay1
VOLGENDE ' eindigt met verlichting in de laatste positie
' EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
OUTL = % 00000000 "alle lichten uit
GOSUB Drivemodule12
PAUZE delay1
' FFF Star Sparkle Subroutine FFFFFFFFFFFFFFFFFFFFFFF
' sterpatroon A-F-C-H-E-B-G-D, bodem loopt boven door 1 cyclus
' Sparkles als gevolg van de korte op tijd pauze van 100
' Oude versie van de ster had een vertraging die gewijzigd met elke lus
' met deze formule - delay1-(ctr2*(delay1-100)/lpctr1)
' Star:
FOR ctr2 = 0 TO lpctr2
OUTL = % 00000001
GOSUB Drivemodule1
PAUZE 100
OUTL % 00100000 =
GOSUB Drivemodule1
PAUZE 100
OUTL = % 00000001
GOSUB Drivemodule2
PAUZE 100
OUTL % 00000100 =
GOSUB Drivemodule1
PAUZE 100
OUTL % 00100000 =
GOSUB Drivemodule2
PAUZE 100
OUTL = % 10000000
GOSUB Drivemodule1
PAUZE 100
OUTL % 00000100 =
GOSUB Drivemodule2
PAUZE 100
OUTL % 00010000 =
GOSUB Drivemodule1
PAUZE 100
OUTL = % 10000000
GOSUB Drivemodule2
PAUZE 100
OUTL = % 00000010
GOSUB Drivemodule1
PAUZE 100
OUTL % 00010000 =
GOSUB Drivemodule2
PAUZE 100
OUTL % 01000000 =
GOSUB Drivemodule1
PAUZE 100
OUTL = % 00000010
GOSUB Drivemodule2
PAUZE 100
OUTL % 00001000 =
GOSUB Drivemodule1
PAUZE 100
OUTL % 01000000 =
GOSUB Drivemodule2
PAUZE 100
OUTL = % 00000000
GOSUB Drivemodule1
PAUZE 100
OUTL % 00001000 =
GOSUB Drivemodule2
PAUZE 100
OUTL = % 00000000
GOSUB Drivemodule2
PAUZE 100
VOLGENDE ' eindigt met licht af
PAUZE 1500
' FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
' BBB Circulate2 Subroutine BBBBBBBBBBBBBBBBBBBBBBBBB
' 3 verlicht chase van de snaren rond, verhoging van de snelheid van elke herhaling
' circuleert 4 keer, lpctr1 keer
' boven- en onderkant zijn 90 graden uit fase
' herinnering - module1 is bovenste lampen, module 2 lagere
' Circulate2:
FOR ctr2 = 0 TO lpctr1
OUTL % 00000001 = ' licht 2 snaren top & bot alvorens chasing lus
GOSUB Drivemodule1
PAUZE 150-(ctr2*15)
OUTL % 00000011 =
GOSUB Drivemodule1
PAUZE 150-(ctr2*15)
OUTL = % 00000111
GOSUB Drivemodule1
OUTL = % 00000001
GOSUB Drivemodule2
PAUZE 150-(ctr2*15)
OUTL = % 00001110
GOSUB Drivemodule1
OUTL % 00000011 =
GOSUB Drivemodule2
PAUZE 150-(ctr2*15)
OUTL = % 00011100
GOSUB Drivemodule1
OUTL = % 00000111
GOSUB Drivemodule2
PAUZE 150-(ctr2*15)
upperlamps = % 00011100
lowerlamps = % 00000111
VOOR ctr1 = 1 tot en met 8 ' shift 3 verlicht snaren ongeveer 1 volledige revolutie totdat alle uitschakelen
upperlamps = upperlamps << 1
lowerlamps = lowerlamps << 1
OUTL = upperlamps
GOSUB Drivemodule1
OUTL = lowerlamps
GOSUB Drivemodule2
PAUZE 150-(ctr2*15)
VOLGENDE
VOLGENDE ' eindigt met alle lichten uit
' BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
' GGG GirlsGirlsGirls plaatsvervanger Subroutine GGGGGGGGGGGGGGGG
' knippert tussen aangrenzende strings, bovenste en onderste afwisselend
' GirlsGirlsGirls:
FOR ctr2 = 0 TO lpctr2
OUTL = % 01010101
GOSUB Drivemodule1
OUTL = % 10101010
GOSUB Drivemodule2
PAUZE delay1
OUTL = % 10101010
GOSUB Drivemodule1
OUTL = % 01010101
GOSUB Drivemodule2
PAUZE delay1
VOLGENDE ' eindigt met verlichting in de laatste positie
' GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
OUTL = % 00000000 "alle lichten uit
GOSUB Drivemodule12
PAUZE delay1
' MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
' Subroutine IIIIIIIIIIIIIIIIIIII ChasePair III
' Een paar gescheiden door 1 lege roterende CCW
' ChasePair:
FOR ctr2 = 0 TO lpctr2
lowerlamps = % 10100000
shiftcount = 6
subpause = delay2-(ctr2*(delay1-100)/lpctr1)
GOSUB ShiftRightBoth ' subroutine naar het patroon van de verschuiving naar uiterst rechts te gebruiken
OUTL = % 10000010 ' handmatig doen deze lichte positie
GOSUB Drivemodule12 ' omdat verschuiving wordt gevuld met nullen
PAUZE delay2-(ctr2*(delay1-100)/lpctr1)
lowerlamps = % 01000001
shiftcount = 1
GOSUB ShiftRightBoth
VOLGENDE ' eindigt met verlichting in de laatste positie
' IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
' KKK FlashQtrs Subroutine KKKKKKKKKKKKKKKKKKKKK
' knippert Qtrs van boom: rood / groen- en wit-blauw
' FlashQtrs:
FOR ctr2 = 0 TO lpctr2
OUTL = % 00110011
GOSUB Drivemodule12
PAUZE delay2
OUTL = % 11001100
GOSUB Drivemodule12
PAUZE delay2
VOLGENDE ' eindigt met verlichting in de laatste positie
' KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
' LLL GirlsGirlsGirls Subroutine LLLLLLLLLLLLLLL
' knippert tussen aangrenzende strings
' GirlsGirlsGirls:
FOR ctr2 = 0 TO lpctr2
OUTL = % 01010101
GOSUB Drivemodule12
PAUZE delay1
OUTL = % 10101010
GOSUB Drivemodule12
PAUZE delay1
VOLGENDE ' eindigt met verlichting in de laatste positie
' LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
LUS ' onderin hoofdlus
'---Subroutines---
' De Drivemodule-subroutine schrijft de gegevens byte verschijnen op poorten 0-7
' naar de module adres of adresbereik riep in de naam van de subroutine.
' Voor de 74LS573 zakken daardoor rijden de lijnen van het geselecteerde besturingselement
' van laag naar hoog dan rijden alle controle-lijnen naar laag weer.
' De bits besturingselement zullen allen laag bij het binnenvaren en het verlaten van deze routine.
' Poort 8 controle module 1, haven 9 besturingselementen module 2, etc, dus deze stijl
' van module aanpak kan worden uitgebreid tot 64 individuele lichte tekenreeksen.
' controle byte voor module 1 - % 00000001
' controle byte voor module 2 - % 00000010
' controle modules 1 en 2 - % 00000011-byte
' Module 1 bepaalt de bovenste 8 lichte strijkers, module 2 lagere degene
' Opmerking dat meerdere modules kunnen worden aangepakt op hetzelfde moment, hoewel
' elke module krijgt dezelfde licht controle bits van poorten 0-7 op die manier.
' Toekomst ontwikkeling opmerking - de huidige programmering stijl met behulp van afzonderlijke
' subroutines voor elke combinatie van modules gebruikt veel minder ruimte dan
' variabele voor een besturingselement definiëren en aanroepen van een enkele routine, maar deze stijl
' kan krijgen omslachtig voor 3 of meer modules en combinaties daarvan.
Drivemodule1:
UIDELIJKE = % 00000001
UIDELIJKE = % 00000000
TERUGKEER
Drivemodule2:
UIDELIJKE = % 00000010
UIDELIJKE = % 00000000
TERUGKEER
Drivemodule12:
UIDELIJKE = % 00000011
UIDELIJKE = % 00000000
TERUGKEER
' De ShftX8X subroutines nemen in een byte van de lamp waarden, geeft ze vervolgens weer
' verschuift, doen dit keer < shiftcount >.
' De eerste vier subroutines omgaan met linker- en verschuiving van de bovenste en onderste lampen.
' De laatste twee verschuiving van zowel de bovenste en de onderste 8 bits, met behulp van de lowerlamps-variabele.
' Pas in de variabelen Subctr1, shiftcount, subpause, en lager- of upperlamps;
' waarde van OUTL en lager- of upperlamps wordt gewijzigd.
' Opmerking: de twee - shiftlower-routines hebben nog niet gebruikt
' Als met de module rijden routine, het nog duurt tot minder geheugen hebben
' persoonlijke routines voor elke mogelijke overstap operaties in plaats van met behulp van
' een meer universele verzameling van routines Whne ther is een besturingsvariabele ontworpen
' voor de module rijden routine, vervolgens met behulp van die routine zal elimineren
' de behoefte aan duplicaat verschuiven van routines.
ShiftLeftUpper:
FOR subctr1 = 1 TO shiftcount
OUTL = upperlamps
GOSUB Drivemodule1
PAUZE subpause
upperlamps = upperlamps << 1
VOLGENDE
TERUGKEER
' ShiftLeftLower:
' Voor subctr1 = 1 TO shiftcount
' OUTL = lowerlamps
' GOSUB Drivemodule2
' Pauze subpause
' lowerlamps = lowerlamps << 1
' VOLGENDE
' TERUG
ShiftRightUpper:
FOR subctr1 = 1 TO shiftcount
OUTL = upperlamps
GOSUB Drivemodule1
PAUZE subpause
upperlamps = upperlamps >> 1
VOLGENDE
TERUGKEER
' ShiftRightLower:
' Voor subctr1 = 1 TO shiftcount
' OUTL = lowerlamps
' GOSUB Drivemodule2
' Pauze subpause
' lowerlamps = lowerlamps >> 1
' VOLGENDE
' TERUG
ShiftLeftBoth:
FOR subctr1 = 1 TO shiftcount
OUTL = lowerlamps
GOSUB Drivemodule12
PAUZE subpause
lowerlamps = lowerlamps << 1
VOLGENDE
TERUGKEER
ShiftRightBoth:
FOR subctr1 = 1 TO shiftcount
OUTL = lowerlamps
GOSUB Drivemodule12
PAUZE subpause
lowerlamps = lowerlamps >> 1
VOLGENDE
KEREN