Skip to content

Instantly share code, notes, and snippets.

@rafalw
Created June 19, 2013 15:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rafalw/5815484 to your computer and use it in GitHub Desktop.
Save rafalw/5815484 to your computer and use it in GitHub Desktop.
Bardziej rozbudowane demo dla wyświetlacza 3D.
' 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