Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[atmega16][bascom] Wyświetlacz 14-sto segmentowy.

pier 06 Mar 2010 17:14 2092 3
  • #1
    pier
    Level 23  
    Witam
    Zakupiłem ostatnio listwę z 14-stoma wyświetlaczami 14-sto segmentowymi (w zasadzie 16-sto segmentowymi ale ja używam 14). Chciałbym zbudować na niej jakieś urządzenie typu zegar z kalendarzem. Podłączyłem już wszystko do atmegi16 na płytce stykowej. Jako drivery do poszczególnych wyświetlaczy użyłem uln2804 a segmentami steruję z pomocą zatrzasku 74hct573 (bez niego prawie wszystkie porty były by zajęte). Opanowałem już sterowanie tym wszystkim co widać w załączonym programie. Nie wiem tylko jak w zjadliwy sposób ładnie wyświetlać tekst i wartości zmiennych tak abym nie musiał wpisywać za każdym razem wartość liczbowych dla poszczególnych wyświetlaczy. Może dopisze ktoś kawałek kodu co i jak?

    Code:

    '-------------Zegar Kalendarz 14-segment LED-"

    'opis złącza ISP
    'czerwony - "+"
    'zielony - RESET
    'biały - MISO
    'niebieski - SCK
    'brązowy - MOSI
    'czarny  - "-"

    '------------dyrektywy dla kompilatora--------"
    $regfile = "m16def.dat"
    $crystal = 8000000

    '------------konfiguracja timera--------------"
    Config Timer2 = Timer , Prescale = 8 : Enable Interrupts : Enable Timer2
    On Timer2 Co4ms


    '------------zmienne--------------------------"
    Dim Ktorywysw As Byte
    Dim W1 As Byte
    Dim W2 As Byte
    Dim W3 As Byte
    Dim W4 As Byte
    Dim W5 As Byte
    Dim W6 As Byte
    Dim W7 As Byte
    Dim W8 As Byte
    Dim W9 As Byte
    Dim W10 As Byte
    Dim W11 As Byte
    Dim W12 As Byte
    Dim W13 As Byte
    Dim W14 As Byte

    '------------konfiguracja portów--------------"

    Config Portb = &B11111111
     Portb = &B00000000

    Config Portd = &B1111111
     Portb = &B11111111

    Config Porta = &B11111111
     Porta = &B11111111

    Config Pinc.0 = Output
     Portc.0 = 0






    '-----------program główny--------------------"
    Do
    W1 = 3
    W2 = 6
    W3 = 36
    W4 = 12
    W5 = 35
    W6 = 35
    W7 = 35
    W8 = 35
    W9 = 35
    W10 = 35
    W11 = 35
    W12 = 35
    W13 = 35
    W14 = 35
    Loop
    End











    '-----------obsługa wyświetlacza------"
    Co4ms:
    Portd = &B00000000
    Portb = &B00000000
    Incr Ktorywysw : If Ktorywysw = 14 Then Ktorywysw = 0
    Select Case Ktorywysw
    Case 0:
       Portc.0 = 1
       Porta = Lookup(w1 , Tabela1)
       Portc.0 = 0
       Porta = Lookup(w1 , Tabela2) : Portd.0 = 1
    Case 1:
       Portc.0 = 1
       Porta = Lookup(w2 , Tabela1)
       Portc.0 = 0
       Porta = Lookup(w2 , Tabela2) : Portd.1 = 1
    Case 2:
       Portc.0 = 1
       Porta = Lookup(w3 , Tabela1)
       Portc.0 = 0
       Porta = Lookup(w3 , Tabela2) : Portd.2 = 1
    Case 3:
       Portc.0 = 1
       Porta = Lookup(w4 , Tabela1)
       Portc.0 = 0
       Porta = Lookup(w4 , Tabela2) : Portd.3 = 1
    Case 4:
       Portc.0 = 1
       Porta = Lookup(w5 , Tabela1)
       Portc.0 = 0
       Porta = Lookup(w5 , Tabela2) : Portd.4 = 1
    Case 5:
       Portc.0 = 1
       Porta = Lookup(w6 , Tabela1)
       Portc.0 = 0
       Porta = Lookup(w6 , Tabela2) : Portd.5 = 1
    Case 6:
       Portc.0 = 1
       Porta = Lookup(w7 , Tabela1)
       Portc.0 = 0
       Porta = Lookup(w7 , Tabela2) : Portd.6 = 1
    Case 7:
       Portc.0 = 1
       Porta = Lookup(w8 , Tabela1)
       Portc.0 = 0
       Porta = Lookup(w8 , Tabela2) : Portb.7 = 1
    Case 8:
       Portc.0 = 1
       Porta = Lookup(w9 , Tabela1)
       Portc.0 = 0
       Porta = Lookup(w9 , Tabela2) : Portb.0 = 1
    Case 9:
       Portc.0 = 1
       Porta = Lookup(w10 , Tabela1)
       Portc.0 = 0
       Porta = Lookup(w10 , Tabela2) : Portb.1 = 1
    Case 10:
       Portc.0 = 1
       Porta = Lookup(w11 , Tabela1)
       Portc.0 = 0
       Porta = Lookup(w11 , Tabela2) : Portb.2 = 1
    Case 11:
       Portc.0 = 1
       Porta = Lookup(w12 , Tabela1)
       Portc.0 = 0
       Porta = Lookup(w12 , Tabela2)  : Portb.3 = 1
    Case 12:
       Portc.0 = 1
       Porta = Lookup(w13 , Tabela1)
       Portc.0 = 0
       Porta = Lookup(w13 , Tabela2)  : Portb.4 = 1
    Case 13:
       Portc.0 = 1
       Porta = Lookup(w14 , Tabela1)
       Portc.0 = 0
       Porta = Lookup(w14 , Tabela2)  : Portb.5 = 1
    End Select
    Return





    Tabela1:                                                    'TABELA DLA PORTU A
    Data 63 , 6 , 219 , 207 , 230 , 237 , 253 , 7 , 255 , 239 , 247 , 143 , 57 , 15 , 249 , 241 , 189 , 246 , 0 , 30 , 112 , 56 , 54 , 54 , 63 , 243 , 243 , 237 , 1 , 62 , 54 , 0 , 0 , 9 , 0 , 0 , 227 , 192

    Tabela2:                                                    'TABELA DLA PORTU A-dodatkowe segmenty
    Data 12 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 18 , 0 , 18 , 0 , 0 , 0 , 0 , 18 , 0 , 36 , 0 , 5 , 33 , 0 , 0 , 32 , 0 , 18 , 0 , 40 , 45 , 21 , 12 , 8 , 0 , 0 , 0
  • #2
    jony15
    Level 23  
    Co do tekstu to nie wiem, ale co do zmiennych to np w jakimś rejestrze masz zmienna niech będzie to "x" i jeśli chcesz wyświetlić na wyświetlaczach to ja robie to tak: jeśli interesuje cie wartość od 0 do 99 to po prostu dzielisz x przez 10 i na pierwszy wyświetlacz ( x/10 ) później reszta z dzielenia i na drugi ( x%10 ), a jeśli chcesz na trzy wyświetlacze to sprawdzasz czy x jest większy lub równy 100 i reszta podobnie x/100; (( x%100 )/10); ((x%100)%10). Hm możesz pokazać schemat? co do tekstu hm może stworzyć tablice "intów" ( word w bascomie jeśli się nie mylę ) każdej cyfrze i literce przyporządkowana jedna zmienna, coś na wzór tablicy asci. tylko ze to trochę pamięciożerne. pozdrawiam
  • #3
    nenpa8lo
    Level 17  
    Wydaje mi się, że nie masz za bardzo wyboru, jak po prostu wklepać do flasha procesora tablicę ze znakami ASCII i odpowiadające każdemu znakowi segmenty do zaświecenia. To była by funkcja w stylu putc(). Następnie piszesz sobie printf_led() do którego podajesz wskaźnik do łańcucha a wewnątrz tej funkcji wołasz putc().
    Ja bym zrobił całe API: putc(), print_led(), goto(), clrscr() itd.
  • #4
    pier
    Level 23  
    Kolego jony15 to o czy piszesz to ja wiem ale chodzi mi o to jak wyświetlać tekst tak aby nie pisać wartości liczbowej dla każdego wyświetlacza osobno.
    nenpa8lo napisał:
    Quote:
    Wydaje mi się, że nie masz za bardzo wyboru, jak po prostu wklepać do flasha procesora tablicę ze znakami ASCII i odpowiadające każdemu znakowi segmenty do zaświecenia. To była by funkcja w stylu putc(). Następnie piszesz sobie printf_led() do którego podajesz wskaźnik do łańcucha a wewnątrz tej funkcji wołasz putc().
    Ja bym zrobił całe API: putc(), print_led(), goto(), clrscr() itd.


    Przecież ja mam dwie tablice ze znakami do zaświecenia. A to o czym Piszesz dalej to nic nie łapię to na pewno nie do bascoma.