Created
June 19, 2013 15:59
-
-
Save rafalw/5815484 to your computer and use it in GitHub Desktop.
Bardziej rozbudowane demo dla wyświetlacza 3D.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
' LED Cube 4^3: Efekty specjalne - demonstracja | |
' Kostka składa się z czterech poziomych warstw diod LED. Każda wartwa | |
' posiada wspólną katodę, a diody w obrębie warstwy załączane są poprzez | |
' podanie napięcia na anodę (tym razem pojedynczej diody; innymi słowy kolumny | |
' kostki mają wspólne anody). | |
' Schemat podłączenia diod LED do portów B i D dla każdej warstwy: | |
' | |
' D0--D1--D2--D3 | |
' | | | | | |
' D4--D5--D6--D7 | |
' | | | | | |
' B0--B1--B2--B3 | |
' | | | | | |
' B4--B5--B6--B7 | |
' | |
$regfile = "m48pdef.dat" | |
$crystal = 8000000 | |
$hwstack = 40 | |
$swstack = 16 | |
$framesize = 32 | |
' Odstęp czasowy pomiędzy efektami - w milisekundach | |
Const Delay_t = 300 | |
' Pierwsza połowa warstwy | |
Config Portb = Output | |
Portb = &H00 | |
' Druga połowa warstwy | |
Config Portd = Output | |
Portd = &H00 | |
' Młodsza połowa portu C pracuje jako licznik pierścieniowy, wybierający warstwę | |
' (jedną z czterech), czyli realizuje miltipleksowanie warstw. | |
Config Portc = Output | |
Portc = &H00 | |
' Podprogram obsługi przerwania Timera 0 wyświetla warstwę | |
' - jedna warstawa wyświetlana jest przez 2,048ms, czyli dla pojedynczej klatki | |
' wychodzi 4 * 2,048ms = 8,192ms (zdanie prawdziwe dla częstotliwości taktowania 8MHz) | |
Config Timer0 = Timer , Prescale = 64 | |
On Timer0 Select_layer | |
Enable Timer0 | |
Enable Interrupts | |
' Zmienna przechowująca wybór aktywnej warstwy | |
Dim Layer As Byte | |
' Tablica na mapę bitową warstwy | |
Dim Layer_table(8) As Byte | |
' Licznik klatek | |
Dim Framecount As Byte | |
' Liczniki pętli | |
Dim I As Byte | |
Dim J As Byte | |
Dim T As Byte | |
' Renderowanie efektu 6 i 7 - zmienna pomocnicza | |
Dim Tmp As Byte | |
' Procedura, której zadaniem jest generowanie efektu (przygotowanie kolejnych klatek efektu) | |
Declare Sub Animation_data(byval Frames As Byte , Byval Wait_t As Byte) | |
' Podprogram realizujący czyszczenie tablicy danych dla warstw oraz wprowadzający | |
' opóźnienie czasowe - wywoływany pomiędzy poszczególnymi efektami. | |
Declare Sub Table_clear_and_delay(byval Wait_t As Word) | |
' Renderowanie efektu wypełniania matrycy | |
Declare Sub Fill_layer_and_wait(byval P As Byte) | |
' Renderowanie efektu wyczyszczenia matrycy | |
Declare Sub Clear_layer_and_wait(byval P As Byte) | |
' Renderowanie efektu "Reset ekranu" | |
Declare Sub Reset_of_the_screen(byval Up As Byte) | |
' Podprogram pomocniczy dla efektu "Jump" - 1 | |
Declare Sub Jump_up(byval To_val As Byte , Byval Wait_t As Byte) | |
' Podprogram pomocniczy dla efektu "Jump" - 2 | |
Declare Sub Jump_down(byval From_val As Byte , Byval Wait_t As Byte) | |
Layer = 1 | |
Framecount = 1 | |
Do | |
' Efekt 1: "Pulsar" | |
' - sterowanie programowe, choć bez obliczeń | |
For J = 1 To 4 | |
For I = 1 To 8 | |
Layer_table(i) = 0 | |
Next I | |
Waitms 160 | |
Layer_table(3) = 6 | |
Layer_table(4) = 96 | |
Layer_table(5) = 6 | |
Layer_table(6) = 96 | |
Waitms 320 | |
For I = 1 To 8 | |
Layer_table(i) = &HFF | |
Next I | |
Waitms 320 | |
Next J | |
Table_clear_and_delay Delay_t | |
' Efekty bitmapowe: | |
' - Efekt 2: "Przekątna" | |
For I = 1 To 4 | |
Restore Przekatna | |
Animation_data 8 , 128 | |
Next I | |
Table_clear_and_delay Delay_t | |
' - Efekt 2: "Płaszczyzna obrotowa - w poziomie" | |
For I = 1 To 5 | |
Restore Obrotowa_poziom | |
Animation_data 4 , 96 | |
Next I | |
Table_clear_and_delay Delay_t | |
' - Efekt 3: "Płaszczyzna obrotowa - w pionie" | |
For I = 1 To 5 | |
Restore Obrotowa_pion | |
Animation_data 4 , 96 | |
Next I | |
Table_clear_and_delay Delay_t | |
' - Efekt 3: "Skalowany szkielet sześcianu" | |
Restore Szescian | |
Animation_data 14 , 192 | |
Table_clear_and_delay Delay_t | |
' - Efekt 4: "Spadający sufit" | |
Restore Sufit | |
Animation_data 30 , 64 | |
Table_clear_and_delay Delay_t | |
' - Efekt 3: "Skalowany szkielet sześcianu" | |
Restore Szescian | |
Animation_data 14 , 192 | |
Table_clear_and_delay Delay_t | |
' - Efekt 4: "Spadający sufit" | |
Restore Sufit | |
Animation_data 30 , 64 | |
Table_clear_and_delay Delay_t | |
' - Efekt 5: "rysujący się" sześcian | |
Restore Rysuj_szescian | |
Animation_data 40 , 128 | |
Table_clear_and_delay Delay_t | |
' - Efekt 6: Zapełnienie | |
For I = 1 To 8 | |
Tmp = I Mod 2 | |
If Tmp = 0 Then | |
Tmp = I - 1 | |
Else | |
Tmp = I + 1 | |
End If | |
Fill_layer_and_wait Tmp | |
Next I | |
' - Efekt 7: Wyczyszczenie | |
For I = 1 To 8 | |
Tmp = I Mod 2 | |
If Tmp = 0 Then | |
Tmp = I - 1 | |
Else | |
Tmp = I + 1 | |
End If | |
Clear_layer_and_wait Tmp | |
Next I | |
Table_clear_and_delay Delay_t | |
' - Efekt 8: "Jump" | |
Gosub Jump_effect | |
' - Efekt 9: "Reset ekranu" | |
For I = 1 To 8 | |
Tmp = I Mod 2 | |
If Tmp = 1 Then | |
Reset_of_the_screen 0 | |
Else | |
Reset_of_the_screen 1 | |
End If | |
Next I | |
Table_clear_and_delay Delay_t | |
Loop | |
End | |
' Podprogram realizujący wyświetlanie danych warstwami | |
' (definicje danych dla wartsw zawiera tablica Layer_table, parami po dwa bajty na warstwę | |
' licząc od góry - według schematycznego rysunku na początku tego pliku) | |
Select_layer: | |
' Przygotowanie danych warstwy | |
Select Case Layer | |
Case &B0001 : | |
Portb = Layer_table(1) | |
Portd = Layer_table(2) | |
Case &B0010 : | |
Portb = Layer_table(3) | |
Portd = Layer_table(4) | |
Case &B0100 : | |
Portb = Layer_table(5) | |
Portd = Layer_table(6) | |
Case &B1000 : | |
Portb = Layer_table(7) | |
Portd = Layer_table(8) | |
End Select | |
' Aktywacja warstwy | |
Portc = Layer | |
' Przejście do następnej warstwy (na zasadzie licznika pierścieniowego) | |
Shift Layer , Left | |
If Layer > &B1000 Then Layer = &B0001 | |
Return | |
' Podprogram pomocniczy dla efektu "Jump" - 1 | |
Sub Jump_up(byval To_val As Byte , Byval Wait_t As Byte) | |
For J = 4 To To_val Step -1 | |
For T = 1 To 8 | |
Layer_table(t) = 0 | |
Next T | |
Tmp = J * 2 | |
Layer_table(tmp) = 255 | |
Tmp = Tmp - 1 | |
Layer_table(tmp) = 255 | |
Waitms Wait_t | |
Next J | |
End Sub | |
' Podprogram pomocniczy dla efektu "Jump" - 2 | |
Sub Jump_down(byval From_val As Byte , Byval Wait_t As Byte) | |
For J = From_val To 4 | |
For T = 1 To 8 | |
Layer_table(t) = 0 | |
Next T | |
Tmp = J * 2 | |
Layer_table(tmp) = 255 | |
Tmp = Tmp - 1 | |
Layer_table(tmp) = 255 | |
Waitms Wait_t | |
Next J | |
End Sub | |
' Renderowanie efektu "Jump" | |
Jump_effect: | |
Jump_down 1 , 64 | |
Jump_up 2 , 64 | |
Jump_down 2 , 48 | |
Jump_up 3 , 48 | |
Jump_down 3 , 48 | |
Waitms 512 | |
Return | |
' Podprogram realizujący czyszczenie tablicy danych dla warstw oraz wprowadzający | |
' opóźnienie czasowe - wywoływany pomiędzy poszczególnymi efektami. | |
Sub Table_clear_and_delay(byval Wait_t As Word) | |
For I = 1 To 8 | |
Layer_table(i) = 0 | |
Next I | |
Waitms Wait_t | |
End Sub | |
' Procedura, której zadaniem jest generowanie efektu (przygotowanie kolejnych klatek efektu) | |
Sub Animation_data(byval Frames As Byte , Byval Wait_t As Byte) | |
For J = 1 To Frames | |
For T = 1 To 8 | |
Read Layer_table(t) | |
Next T | |
Waitms Wait_t | |
Next J | |
End Sub | |
' Renderowanie efektu wypełniania matrycy | |
Sub Fill_layer_and_wait(byval P As Byte) | |
Tmp = 0 | |
For J = 1 To 8 | |
Shift Tmp , Left | |
Tmp = Tmp + 1 | |
Layer_table(p) = Tmp | |
Waitms 64 | |
Next J | |
End Sub | |
' Renderowanie efektu wyczyszczenia matrycy | |
Sub Clear_layer_and_wait(byval P As Byte) | |
Tmp = 255 | |
For J = 1 To 8 | |
Shift Tmp , Left | |
Layer_table(p) = Tmp | |
Waitms 64 | |
Next J | |
End Sub | |
' Renderowanie efektu "Reset ekranu" | |
Sub Reset_of_the_screen(byval Up As Byte) | |
For J = 1 To 4 | |
For T = 1 To 8 | |
Layer_table(t) = 0 | |
Next T | |
If Up = 1 Then | |
Tmp = 5 - J | |
Tmp = Tmp * 2 | |
Layer_table(tmp) = 255 | |
Tmp = Tmp - 1 | |
Layer_table(tmp) = 255 | |
Else | |
Tmp = J * 2 | |
Layer_table(tmp) = 255 | |
Tmp = Tmp - 1 | |
Layer_table(tmp) = 255 | |
End If | |
Waitms 24 | |
Next J | |
End Sub | |
' Mapy bitowe efektów specjalnych | |
' - Animowany sześcian (14 klatek) | |
Szescian: | |
Data 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 | |
Data 0 , 51 , 0 , 51 , 0 , 0 , 0 , 0 | |
Data 7 , 87 , 5 , 5 , 7 , 87 , 0 , 0 | |
Data 249 , 159 , 144 , 9 , 144 , 9 , 249 , 159 | |
Data 0 , 0 , 14 , 174 , 10 , 10 , 14 , 174 | |
Data 0 , 0 , 0 , 0 , 0 , 204 , 0 , 204 | |
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 8 | |
Data 16 , 0 , 0 , 0 , 0 , 0 , 0 , 0 | |
Data 51 , 0 , 51 , 0 , 0 , 0 , 0 , 0 | |
Data 117 , 112 , 80 , 80 , 117 , 112 , 0 , 0 | |
Data 249 , 159 , 144 , 9 , 144 , 9 , 249 , 159 | |
Data 0 , 0 , 234 , 224 , 160 , 160 , 234 , 224 | |
Data 0 , 0 , 0 , 0 , 204 , 0 , 204 , 0 | |
Data 0 , 0 , 0 , 0 , 0 , 0 , 128 , 0 | |
' - Spadający sufit (30 klatek) | |
Sufit: | |
Data 255 , 255 , 0 , 0 , 0 , 0 , 0 , 0 | |
Data 255 , 254 , 0 , 1 , 0 , 0 , 0 , 0 | |
Data 255 , 252 , 0 , 2 , 0 , 1 , 0 , 0 | |
Data 255 , 248 , 0 , 4 , 0 , 2 , 0 , 1 | |
Data 255 , 240 , 0 , 8 , 0 , 4 , 0 , 3 | |
Data 255 , 224 , 0 , 16 , 0 , 8 , 0 , 7 | |
Data 255 , 192 , 0 , 32 , 0 , 16 , 0 , 15 | |
Data 255 , 128 , 0 , 64 , 0 , 32 , 0 , 31 | |
Data 255 , 0 , 0 , 128 , 0 , 64 , 0 , 63 | |
Data 254 , 0 , 1 , 0 , 0 , 128 , 0 , 127 | |
Data 252 , 0 , 2 , 0 , 1 , 0 , 0 , 255 | |
Data 248 , 0 , 4 , 0 , 2 , 0 , 1 , 255 | |
Data 240 , 0 , 8 , 0 , 4 , 0 , 3 , 255 | |
Data 224 , 0 , 16 , 0 , 8 , 0 , 7 , 255 | |
Data 192 , 0 , 32 , 0 , 16 , 0 , 15 , 255 | |
Data 128 , 0 , 64 , 0 , 32 , 0 , 31 , 255 | |
Data 0 , 0 , 128 , 0 , 64 , 0 , 63 , 255 | |
Data 0 , 0 , 0 , 0 , 128 , 0 , 127 , 255 | |
Data 0 , 0 , 0 , 0 , 0 , 0 , 255 , 255 | |
Data 0 , 0 , 0 , 0 , 0 , 0 , 255 , 255 | |
Data 0 , 0 , 0 , 0 , 255 , 255 , 0 , 0 | |
Data 0 , 0 , 255 , 255 , 0 , 0 , 0 , 0 | |
Data 255 , 255 , 0 , 0 , 0 , 0 , 0 , 0 | |
Data 255 , 255 , 0 , 0 , 0 , 0 , 0 , 0 | |
Data 255 , 255 , 0 , 0 , 0 , 0 , 0 , 0 | |
Data 255 , 255 , 0 , 0 , 0 , 0 , 0 , 0 | |
Data 255 , 255 , 0 , 0 , 0 , 0 , 0 , 0 | |
Data 255 , 255 , 0 , 0 , 0 , 0 , 0 , 0 | |
Data 255 , 255 , 0 , 0 , 0 , 0 , 0 , 0 | |
Data 255 , 255 , 0 , 0 , 0 , 0 , 0 , 0 | |
' - Obracająca się płaszczyzna pionowa (4 klatki) | |
Obrotowa_pion: | |
Data 0 , 240 , 0 , 240 , 0 , 240 , 0 , 240 | |
Data 132 , 33 , 132 , 33 , 132 , 33 , 132 , 33 | |
Data 34 , 34 , 34 , 34 , 34 , 34 , 34 , 34 | |
Data 1 , 36 , 1 , 36 , 1 , 36 , 1 , 36 | |
' - Obracająca się płaszczyzna pozioma (4 klatki) | |
Obrotowa_poziom: | |
Data 0 , 240 , 0 , 240 , 0 , 240 , 0 , 240 | |
Data 0 , 15 , 0 , 240 , 15 , 0 , 240 , 0 | |
Data 0 , 0 , 255 , 255 , 0 , 0 , 0 , 0 | |
Data 15 , 0 , 0 , 240 , 0 , 15 , 0 , 0 | |
' - Opadająca "przekątna" (8 klatek) | |
Przekatna: | |
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 | |
Data 0 , 15 , 0 , 0 , 0 , 0 , 0 , 0 | |
Data 0 , 240 , 0 , 15 , 0 , 0 , 0 , 0 | |
Data 15 , 0 , 0 , 240 , 0 , 15 , 0 , 0 | |
Data 240 , 0 , 15 , 0 , 0 , 240 , 0 , 15 | |
Data 0 , 0 , 240 , 0 , 15 , 0 , 0 , 240 | |
Data 0 , 0 , 0 , 0 , 240 , 0 , 15 , 0 | |
Data 0 , 0 , 0 , 0 , 0 , 0 , 240 , 0 | |
' - "Rysujący się" sześcian (40 klatek) | |
Rysuj_szescian: | |
Data 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 | |
Data 0 , 3 , 0 , 0 , 0 , 0 , 0 , 0 | |
Data 0 , 7 , 0 , 0 , 0 , 0 , 0 , 0 | |
Data 0 , 15 , 0 , 0 , 0 , 0 , 0 , 0 | |
Data 0 , 143 , 0 , 0 , 0 , 0 , 0 , 0 | |
Data 8 , 143 , 0 , 0 , 0 , 0 , 0 , 0 | |
Data 136 , 143 , 0 , 0 , 0 , 0 , 0 , 0 | |
Data 200 , 143 , 0 , 0 , 0 , 0 , 0 , 0 | |
Data 232 , 143 , 0 , 0 , 0 , 0 , 0 , 0 | |
Data 248 , 143 , 0 , 0 , 0 , 0 , 0 , 0 | |
Data 249 , 143 , 0 , 0 , 0 , 0 , 0 , 0 | |
Data 249 , 159 , 0 , 0 , 0 , 0 , 0 , 0 | |
Data 249 , 159 , 0 , 1 , 0 , 0 , 0 , 0 | |
Data 249 , 159 , 0 , 1 , 0 , 1 , 0 , 0 | |
Data 249 , 159 , 0 , 1 , 0 , 1 , 0 , 1 | |
Data 249 , 159 , 0 , 9 , 0 , 1 , 0 , 1 | |
Data 249 , 159 , 0 , 9 , 0 , 9 , 0 , 1 | |
Data 249 , 159 , 0 , 9 , 0 , 9 , 0 , 9 | |
Data 249 , 159 , 128 , 9 , 0 , 9 , 0 , 9 | |
Data 249 , 159 , 128 , 9 , 128 , 9 , 0 , 9 | |
Data 249 , 159 , 128 , 9 , 128 , 9 , 128 , 9 | |
Data 249 , 159 , 144 , 9 , 128 , 9 , 128 , 9 | |
Data 249 , 159 , 144 , 9 , 144 , 9 , 128 , 9 | |
Data 249 , 159 , 144 , 9 , 144 , 9 , 144 , 9 | |
Data 249 , 159 , 144 , 9 , 144 , 9 , 144 , 11 | |
Data 249 , 159 , 144 , 9 , 144 , 9 , 144 , 15 | |
Data 249 , 159 , 144 , 9 , 144 , 9 , 144 , 143 | |
Data 249 , 159 , 144 , 9 , 144 , 9 , 152 , 143 | |
Data 249 , 159 , 144 , 9 , 144 , 9 , 216 , 143 | |
Data 249 , 159 , 144 , 9 , 144 , 9 , 248 , 143 | |
Data 249 , 159 , 144 , 9 , 144 , 9 , 249 , 143 | |
Data 249 , 159 , 144 , 9 , 144 , 9 , 249 , 159 | |
Data 249 , 159 , 144 , 9 , 144 , 9 , 249 , 159 | |
Data 249 , 159 , 144 , 9 , 144 , 9 , 249 , 159 | |
Data 249 , 159 , 144 , 9 , 144 , 9 , 249 , 159 | |
Data 249 , 159 , 144 , 9 , 144 , 9 , 249 , 159 | |
Data 249 , 159 , 144 , 9 , 144 , 9 , 249 , 159 | |
Data 249 , 159 , 144 , 9 , 144 , 9 , 249 , 159 | |
Data 249 , 159 , 144 , 9 , 144 , 9 , 249 , 159 | |
Data 249 , 159 , 144 , 9 , 144 , 9 , 249 , 159 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment