Billiga & lätt opto-isolerade TTL till 110V ljus kontrollmodul (32 / 32 steg)
"{$PBASIC 2.5}
"Version av"Westinghouse"Xmas tree drivrutinen för 16 ljus-string trädet.
"Detta är en hyllning till det ursprungliga trädet används vid Westinghouse R & D center i Churchill, PA.
"Kör 2 moduler av 8 110V uttag styrenheter, 1 för 8 övre strängar, 1 för 8 lägre strängar
"Varje modul drivs av TTL 74-573 serien oktalt spärrarna. Data från den lägre IO byten är
"skriven/innehas av låg-hög-låg övergångar på kontroll bitar från den övre IO byten.
"Modul 1 (övre tänder) hakade av port 8 kontroll lite, modul 2 (lägre) av port 9 lite.
"De 2 modulerna som används här är utbyggbar till 8 moduler för totalt 64 kontrollerade butiker
"Denna version minimerar minnesanvändning genom att eliminera de randomiserade variablerna
"och också strukturerad utformning av att ha en huvudloop som kräver belysning
"rutiner som subrutiner. Nu är alla rutiner i huvudloop själv.
"Ja, dåligt för att ha mindre struktur men sparar många byte. Flera av de
"tidigare rutiner var också skrivas om för att använda mer slingor eftersom de tar upp
"mycket mindre utrymme än bara stega igenom värdelistor i lampan. Att förlita sig
"mer på loopar har nackdelen med begränsande mönster lite, men
"gör planeringen mer intrikata och intressant.
"Ladda ner program - Anslut COM1 seriell kabel till påslagen styrelse
' Tryck på Play-knappen på verktygsfältet för
"För att testa enskilda rutiner klistra in rutin i"xmaslites2-minimerad-testfile.bs2"
"Kom ihåg att uppdatera testfil om varierande definitioner eller subrutiner ändrar
'----------------------------------------------------------------------------
' definiera och ange variabler
ctr1 VAR Nib "motverka indexen för huvudsakliga rutinmässiga loopar
ctr2 VAR Nib
ctr3 VAR Nib
subctr1 VAR Nib "counter index för subrutin loopar
subpause VAR ordet "variabel att passera paus tid till subrutiner
shiftcount VAR Nib "counter för antalet SKIFT
lpctr1 VAR Nib "motverka längder för huvudsakliga rutinmässiga loopar
lpctr2 VAR Nib
delay1 VAR ordet "mer eller mindre konstanter för pauser i rutiner
delay2 VAR ordet
lowerlamps VAR Byte "innehar lampa staten bitar för lägre 8 strängar
upperlamps VAR Byte "innehar lampa staten bitar för övre 8 strängar
holdvar1 VAR Byte "temp lampa värde innehavaren
holdvar2 VAR Byte "temp lampa värde innehavaren
Shiftee VAR Byte "temp variabel för skiftande rutiner
OUTL = % 00000000 ' lågt satt alla data linjer
ÖDRA = % 00000000 ' lågt satt alla kommandorader
DIRS = % 1111111111111111 ' ange alla I/O stift till utmatningsläge
' Ange värden för de konstanter som anger den övergripande utseende och hastigheten på trädet
delay1 = 500 "halv-sekunders fördröjning
delay2 = 800
lpctr1 = 3
lpctr2 = 6
"huvudloop - i denna minimala minne version, lampa rutiner är inte kallas subrutiner
GÖRA
"MMM AllFlash MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
FÖR ctr1 = 1-4
OUTL = % 11111111 "alla lampor på
GOSUB Drivemodule12
Pausa delay2
OUTL = % 00000000 ' alla lampor av
GOSUB Drivemodule12
Pausa delay2
NÄSTA
"NNN sekvens och fyll NNNNNNNNNNNNNNNNNNNNNNNN
"Denna rutin cirkulerar ett upplyst snöre runt, lämnar bakom
"ett extra lit sträng varje gång tills alla strängar är tända.
"Börjar med botten cirkel av strängar.
holdvar1 = % 00000000 ' denna variabel ackumuleras strängarna vänster tänds på
' MSB slutet av set - börjar med strängen MSB
"sedan fortsätter genom att lägga till MSB-1, MSB-2, etc. Den
' MSB strängen är sträng -H - på ljus sträng etiketterna
ctr3 = 8 ' räknaren minskas som antalet överfarter behövs
"att driva en upplyst sträng på ackumulerade högen minskar
"med varje lagt till sträng
FÖR ctr1 = 1 till 8
Shiftee = % 00000001 ' ljus sträng kontroll bit börjar på LSB
FÖR ctr2 = 1 till ctr3
lowerlamps = holdvar1 | Shiftee "redan lit strängar ORd med skiftande strängen
OUTL = lowerlamps ' resultat av eller skickas till kontrollmodulen
GOSUB Drivemodule2
Pausa delay1
Shiftee = shiftee << 1 ' flytta den upplysta strängen till vänster 1 plats
NÄSTA
holdvar1 = lowerlamps ' kom ihåg sista upplysta sträng positioner som varje inre loop
"lägger till en mer upplyst sträng på MSB slutet
ctr3 = ctr3-1
NÄSTA
holdvar1 = % 00000000 ' samma rutin som ovan, fylla i de övre strängarna
ctr3 = 8 "medan de lägre strängarna allt förblir tänd
FÖR ctr1 = 1 till 8
Shiftee = % 00000001
FÖR ctr2 = 1 till ctr3
upperlamps = holdvar1 | Shiftee
OUTL = upperlamps
GOSUB Drivemodule1
Pausa delay1
Shiftee = shiftee << 1
NÄSTA
holdvar1 = upperlamps
ctr3 = ctr3-1
Nästa "alla lampor kvar på
"NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
"QQQQ över den översta QQQQQQQQQQQQQQQQQQQQQQQQQQQ
"Liknande sekvens och fylla, framför, utom ljusen cirkulera över toppen
"av träd på par av motsatta strängar (samma färg strängar), lämnar bakom
"ett extra lit sträng varje gång tills alla strängar i paret är tända.
holdvar1 = % 00000000 ' denna variabel ackumuleras lägre strängar kvar lit
holdvar2 = % 00000000 ' denna variabel ackumuleras övre strängar kvar lit
"OBS: denna rutin är inte färdig ännu
"QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
"VVVVV dränera runt VVVVVVVVVVVVVVVVVVVV
"Tänd alla lampor sedan stänga sekventiellt topp/bot
"en gång runt trädet tills alla strängar är avstängda
"Observera att OUTL innehar det aktuella läget i trädet
OUTL = % 11111111 "börja med alla lampor på
GOSUB Drivemodule12
Pausa delay2
FÖR ctr2 = 1 till 8
OUTL = OUTL >> 1 ' höger Skift, förändringar i nollor
GOSUB Drivemodule1 "stänga av övre strängen
Pausa delay2
GOSUB Drivemodule2 "stänga av lägre sträng
Pausa delay2
NÄSTA
"VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
"WWWWWW toppen botten blixt WWWWWWWWWWWWWWWWWWWW
"flash alla botten och toppen strängar och tillbaka
FÖR ctr2 = 0 till lpctr2
OUTL = % 11111111
GOSUB Drivemodule1 "alla top strängar på
OUTL = % 00000000
GOSUB Drivemodule2 "alla botten strängar av
Pausa delay1 ' vänta
OUTL = % 11111111
GOSUB Drivemodule2 "alla botten strängar på
OUTL = % 00000000
GOSUB Drivemodule1 "alla toppa strängar
Pausa delay1 ' vänta
NÄSTA
GOSUB Drivemodule12 "slutar med alla lampor
"WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
"CCC SeqOnOff subrutin CCCCCCCCCCCCCCCCCCCCCC
"Ljus alla strängar sekventiellt, sedan av sekventiellt
"med ökande/minskande pausar
"toppen och bot kontrolleras tillsammans
OUTL = % 00000000 ' starta genom att ställa in alla lampor av
GOSUB Drivemodule12
Pausa delay2
FÖR ctr2 = 0 till lpctr1
"lampor på sekventiellt CW en topp/bot sträng i taget
FÖR ctr1 = 0-7
HÖG ctr1
GOSUB Drivemodule12
Pausa delay2-(ctr2*(delay1-100)/2)
NÄSTA
"lights off sekventiellt CW topp/bot sträng i taget
FÖR ctr1 = 0-7
LÅG ctr1
GOSUB Drivemodule12
Pausa 100+(ctr2*(delay1-100)/2)
NÄSTA
Nästa "slutar med alla lampor
"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
"JJJ Cylon JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
"främre 5 strängar - studsa upplysta snöre fram och tillbaka snabbt
"top strängen bara... för nu
"Måste startas med alla lampor
upperlamps = % 00000010
subpause = 200
shiftcount = 4
FÖR ctr1 = 0 till lpctr2
GOSUB ShiftLeftUpper
GOSUB ShiftRightUpper
NÄSTA
OUTL = % 00000000 ' alla lampor av
GOSUB Drivemodule12
"JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
"HHH SeqOnOff motsatser subrutin HHHHHHHHHHHHH
"Ljus alla strängar sekventiellt, sedan av sekventiellt
"med ökande/minskande pausar
"toppen och bot i motsatta riktningar
"Denna rutin inte skriftligt ännu, fortfarande IDENTISK med SeqOnOff ovan
"För ctr2 = 0 till lpctr1
"lampor på CW sekventiellt en sträng i taget
"För ctr1 = 0-7
"Hög ctr1
"GOSUB Drivemodule12
"Paus delay2-(ctr2*(delay1-100)/2)
"NÄSTA
"lights off sekventiellt CW en sträng i taget
"För ctr1 = 0-7
"Låg ctr1
"GOSUB Drivemodule12
"Paus 100+(ctr2*(delay1-100)/2)
"NÄSTA
"Nästa" slutar med alla lampor
"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
"AAA Circulate1 subrutin AAAAAAAAAAAAAAAAAAAAAAA
' 3 lit strängar chase runt, ökande hastighet varje upprepning
"cirkulerar 4 gånger, upprepar slumpmässiga lpctr2 gånger
"topp och botten är i fas
"Circulate1:
FÖR ctr2 = 0 till lpctr2
OUTL = % 00000001 ' ljus 1,2,3 strängar topp & bot innan jagar loop
GOSUB Drivemodule12
Pausa 150-(ctr2*15)
OUTL = % 00000011
GOSUB Drivemodule12
Pausa 150-(ctr2*15)
lowerlamps = % 00000111 ' lowerlamps variabel som används för undre och övre tillsammans
subpause = 150-(ctr2*15)
shiftcount = 9
GOSUB ShiftLeftBoth
Nästa "slutar med alla lampor
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
"PPP GirlsGirlsGirls suppleant glittrig subrutin PPPPPPPPPP
"blinkar mellan intilliggande strängar, övre och nedre omväxlande
"Mousserande uppstår när strängen på tid är kort, runt 100
"GirlsGirlsGirls:
FÖR ctr2 = 0 till 16
OUTL = % 01010101
GOSUB Drivemodule1
OUTL = % 10101010
GOSUB Drivemodule2
PAUSA 100
OUTL = % 10101010
GOSUB Drivemodule1
OUTL = % 01010101
GOSUB Drivemodule2
PAUSA 100
Nästa "slutar med lampor i sista positionen
"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
"DDD RotatePairs subrutin DDDDDDDDDDDDDDDDDDD
"roterande par strängar mittemot varandra
"RotatePairs:
OUTL = % 00000000 ' Rensa alla lampor till off
FÖR ctr2 = 0 till lpctr2
FÖR ctr1 = 0 till 3
HÖG ctr1
HÖG ctr1 + 4
GOSUB Drivemodule12
Pausa delay1
LÅG ctr1
LÅG ctr1 + 4
GOSUB Drivemodule12
NÄSTA
Nästa "slutar med lampor i sista positionen
"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
"EEE CounterRotate EEEEEEEEEEEEEEEEEEEEEEEEEEE
' counterrotating par
"CounterRotate:
FÖR ctr2 = 0 till lpctr1
OUTL = % 10000000
GOSUB Drivemodule12
Pausa delay1
OUTL = % 01000001
GOSUB Drivemodule12
Pausa delay1
OUTL = % 00100010
GOSUB Drivemodule12
Pausa delay1
OUTL = % 00010100
GOSUB Drivemodule12
Pausa delay1
OUTL = % 00001000
GOSUB Drivemodule12
Pausa delay1
OUTL = % 00010100
GOSUB Drivemodule12
Pausa delay1
OUTL = % 00100010
GOSUB Drivemodule12
Pausa delay1
OUTL = % 01000001
GOSUB Drivemodule12
Pausa delay1
Nästa "slutar med lampor i sista positionen
"EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
OUTL = % 00000000 ' alla lampor av
GOSUB Drivemodule12
Pausa delay1
"FFF Star Sparkle subrutin FFFFFFFFFFFFFFFFFFFFFFF
"stjärna mönster A-F-C-H-E-B-G-D, botten släpar toppen av 1 cykel
"Gnistrar på grund av kort på tid paus på 100
"Gammal version av Star hade en fördröjning som ändrats med varje slinga
"med denna formel - delay1-(ctr2*(delay1-100)/lpctr1)
' Star:
FÖR ctr2 = 0 till lpctr2
OUTL = % 00000001
GOSUB Drivemodule1
PAUSA 100
OUTL = % 00100000
GOSUB Drivemodule1
PAUSA 100
OUTL = % 00000001
GOSUB Drivemodule2
PAUSA 100
OUTL = % 00000100
GOSUB Drivemodule1
PAUSA 100
OUTL = % 00100000
GOSUB Drivemodule2
PAUSA 100
OUTL = % 10000000
GOSUB Drivemodule1
PAUSA 100
OUTL = % 00000100
GOSUB Drivemodule2
PAUSA 100
OUTL = % 00010000
GOSUB Drivemodule1
PAUSA 100
OUTL = % 10000000
GOSUB Drivemodule2
PAUSA 100
OUTL = % 00000010
GOSUB Drivemodule1
PAUSA 100
OUTL = % 00010000
GOSUB Drivemodule2
PAUSA 100
OUTL = % 01000000
GOSUB Drivemodule1
PAUSA 100
OUTL = % 00000010
GOSUB Drivemodule2
PAUSA 100
OUTL = % 00001000
GOSUB Drivemodule1
PAUSA 100
OUTL = % 01000000
GOSUB Drivemodule2
PAUSA 100
OUTL = % 00000000
GOSUB Drivemodule1
PAUSA 100
OUTL = % 00001000
GOSUB Drivemodule2
PAUSA 100
OUTL = % 00000000
GOSUB Drivemodule2
PAUSA 100
Nästa "slutar med ljus
PAUSA 1500
"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
"BBB Circulate2 subrutin BBBBBBBBBBBBBBBBBBBBBBBBB
' 3 lit strängar chase runt, ökande hastighet varje upprepning
"cirkulerar 4 gånger, lpctr1 gånger
"topp och botten är 90 grader ur fas
"påminnelse - module1 är övre lampor, modul 2 är lägre
"Circulate2:
FÖR ctr2 = 0 till lpctr1
OUTL = % 00000001 ' ljus 2 strängar topp & bot innan jagar loop
GOSUB Drivemodule1
Pausa 150-(ctr2*15)
OUTL = % 00000011
GOSUB Drivemodule1
Pausa 150-(ctr2*15)
OUTL = % 00000111
GOSUB Drivemodule1
OUTL = % 00000001
GOSUB Drivemodule2
Pausa 150-(ctr2*15)
OUTL = % 00001110
GOSUB Drivemodule1
OUTL = % 00000011
GOSUB Drivemodule2
Pausa 150-(ctr2*15)
OUTL = % 00011100
GOSUB Drivemodule1
OUTL = % 00000111
GOSUB Drivemodule2
Pausa 150-(ctr2*15)
upperlamps = % 00011100
lowerlamps = % 00000111
FÖR ctr1 = 1 till 8 ' skift 3 lit strängar cirka 1 full rotation tills alla
upperlamps = upperlamps << 1
lowerlamps = lowerlamps << 1
OUTL = upperlamps
GOSUB Drivemodule1
OUTL = lowerlamps
GOSUB Drivemodule2
Pausa 150-(ctr2*15)
NÄSTA
Nästa "slutar med alla lampor
"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
"GGG GirlsGirlsGirls suppleant subrutin GGGGGGGGGGGGGGGG
"blinkar mellan intilliggande strängar, övre och nedre omväxlande
"GirlsGirlsGirls:
FÖR ctr2 = 0 till lpctr2
OUTL = % 01010101
GOSUB Drivemodule1
OUTL = % 10101010
GOSUB Drivemodule2
Pausa delay1
OUTL = % 10101010
GOSUB Drivemodule1
OUTL = % 01010101
GOSUB Drivemodule2
Pausa delay1
Nästa "slutar med lampor i sista positionen
"GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
OUTL = % 00000000 ' alla lampor av
GOSUB Drivemodule12
Pausa delay1
"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
"III ChasePair subrutin IIIIIIIIIIIIIIIIIIII
"Ett par separerade med 1 tom roterande CCW
"ChasePair:
FÖR ctr2 = 0 till lpctr2
lowerlamps = % 10100000
shiftcount = 6
subpause = delay2-(ctr2*(delay1-100)/lpctr1)
GOSUB ShiftRightBoth ' använda subrutin till SKIFT mönster till längst till höger
OUTL = % 10000010 ' manuellt göra ställningstagandet ljus
GOSUB Drivemodule12 "eftersom SKIFT fylls med nollor
Pausa delay2-(ctr2*(delay1-100)/lpctr1)
lowerlamps = % 01000001
shiftcount = 1
GOSUB ShiftRightBoth
Nästa "slutar med lampor i sista positionen
"IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
"KKK FlashQtrs subrutin KKKKKKKKKKKKKKKKKKKKK
"blinkar Qtrs av träd: röd-grön och vit-blå
"FlashQtrs:
FÖR ctr2 = 0 till lpctr2
OUTL = % 00110011
GOSUB Drivemodule12
Pausa delay2
OUTL = % 11001100
GOSUB Drivemodule12
Pausa delay2
Nästa "slutar med lampor i sista positionen
"KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
"LLL GirlsGirlsGirls subrutin LLLLLLLLLLLLLLL
"blinkar mellan intilliggande strängar
"GirlsGirlsGirls:
FÖR ctr2 = 0 till lpctr2
OUTL = % 01010101
GOSUB Drivemodule12
Pausa delay1
OUTL = % 10101010
GOSUB Drivemodule12
Pausa delay1
Nästa "slutar med lampor i sista positionen
"LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
LOOP "botten av huvudloop
"---Subrutiner---
"Drivemodule subrutinen skriver data byte som förekommer på portarna 0-7
"till modulen adresser kallas i subrutinen namn.
"För 74LS573 spärrarna innebär körning valda kontroll linjer
"från låg till hög sedan köra alla kontroll linjer till låga igen.
"Kontroll bitarna kommer att vara allt låg vid in- och lämnar denna rutin.
"Port 8 styr modul 1, port 9 kontroller modul 2, etc, så denna stil
"modul adressering kan utökas till 64 enskilda light strängar.
"styra byten för modul 1 - % 00000001
"styra byten för modul 2 - % 00000010
"styra byten för modulerna 1 och 2 - % 00000011
"Modul 1 styr de övre 8 lätta stråkarna, modul 2 lägre de
"Notera att flera moduler kan behandlas samtidigt, även om
"varje modul kommer att få samma ljus kontroll bitar från hamnar 0-7 på det sättet.
"Framtidens utveckling OBS - den nuvarande planering stil med separat
"subrutiner för varje kombination av moduler använder mycket mindre utrymme än
"definiera en kontrollvariabeln och en enda rutin, men denna stil
"kan bli betungande för 3 eller fler moduler och kombinationer av dessa.
Drivemodule1:
ÖDRA = % 00000001
ÖDRA = % 00000000
RETURNERA
Drivemodule2:
ÖDRA = % 00000010
ÖDRA = % 00000000
RETURNERA
Drivemodule12:
ÖDRA = % 00000011
ÖDRA = % 00000000
RETURNERA
"Den ShftX8X subrutiner ta i en byte av lampa värden, visar dem sedan
"skiftar dem, gör denna < shiftcount > gånger.
"De fyra första subrutiner hantera vänster och höger Skift av övre och nedre lampor.
"Två sista SKIFT både övre och nedre 8 bitar, med variabeln lowerlamps.
"Passera i variablerna Subctr1, shiftcount, subpause, och lägre- eller upperlamps;
"ändrar värdet av OUTL och lägre- eller upperlamps.
"OBS - två - shiftlower-rutinerna inte har använt ännu
"Som med modulen kör rutin, det fortfarande tar upp mindre minne att ha
"individuella rutiner för varje möjligt SKIFT verksamhet istället för att använda
"en mer universell uppsättning rutiner Whne ther är en kontrollvariabeln utformade
"för modulen kör rutin, sedan använda denna rutin kommer att eliminera
"behovet av dubblett skiftande rutiner.
ShiftLeftUpper:
FÖR subctr1 = 1 till shiftcount
OUTL = upperlamps
GOSUB Drivemodule1
Pausa subpause
upperlamps = upperlamps << 1
NÄSTA
RETURNERA
"ShiftLeftLower:
"För subctr1 = 1 till shiftcount
"OUTL = lowerlamps
"GOSUB Drivemodule2
"Paus subpause
' lowerlamps = lowerlamps << 1
"NÄSTA
"RETURNERA
ShiftRightUpper:
FÖR subctr1 = 1 till shiftcount
OUTL = upperlamps
GOSUB Drivemodule1
Pausa subpause
upperlamps = upperlamps >> 1
NÄSTA
RETURNERA
"ShiftRightLower:
"För subctr1 = 1 till shiftcount
"OUTL = lowerlamps
"GOSUB Drivemodule2
"Paus subpause
' lowerlamps = lowerlamps >> 1
"NÄSTA
"RETURNERA
ShiftLeftBoth:
FÖR subctr1 = 1 till shiftcount
OUTL = lowerlamps
GOSUB Drivemodule12
Pausa subpause
lowerlamps = lowerlamps << 1
NÄSTA
RETURNERA
ShiftRightBoth:
FÖR subctr1 = 1 till shiftcount
OUTL = lowerlamps
GOSUB Drivemodule12
Pausa subpause
lowerlamps = lowerlamps >> 1
NÄSTA
ÅTERGÅ