logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Zegar a multiplexowy 7 segmentowy wyświetlacz LED

shadowman83 23 Lut 2010 23:26 2964 2
REKLAMA
  • #1 7741646
    shadowman83
    Poziom 11  
    Witam, dopiero zaczyna zabawę z mikro-kontrolerami i mam problem

    O tyle o ile nie mam problemu z napisaniem programu zegaru opartego o wysw. LCD czy to na Timerach czy też opartego o kwarc zegarkowy.

    To Z wyświetlaczem 7seg LED mam problem nie do rozgryzienia

    Widziałem, ściągnąłem i próbowałem stworzyć coś z projektów na elektrodzie ale
    nic mi nie wychodzi zresztą nawet jak się poszuka za pomocą opcji szukaj to i tak
    wyskakuje raptem parę tylko tematów.

    Ale do rzeczy...

    Proszę kolegów o pomoc i wyrozumiałość

    Czy ktoś ma napisany prosty program (BASCOM), do obsługi prostego zegarka led 7seg cztery cyfry bez sekundnika i innych udziwnień jak daty itd. najlepiej na Atmege16 ale inne też biorę pod uwagę

    Sam zegarek

    Jeśli ktoś zechce się podzielić swoim projektem i pomóc mnie i ewentualnie innym to z góry dziękuję
  • REKLAMA
  • #2 7741849
    marco47
    Poziom 41  
    Chyba ciężko będzie znaleźć gotowy kod dla zegara na LED'ach .
    Zresztą to nie jest takie trudne , jeżeli miałeś już styczność ( napisałeś kod ) z zegarem na LCD .
    Jest naprawdę dużo literatury na ten temat , nie tylko na elektrodzie .
  • #3 7742776
    shadowman83
    Poziom 11  
    Mam Taki zegarek na LCD oparty o Timer1:

    $regfile = "m16def.dat"
    $crystal = 16000000
    
    Config Portb = Output
    Config Lcdbus = 4
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Pb.2 , Db5 = Pb.3 , Db6 = Pb.4 , Db7 = Pb.5 , E = Pb.1 , Rs = Pb.0
    Cursor Off
    Cls
    
    Config Timer1 = Timer , Prescale = 256
    Declare Sub Wysw_czas
    
    
    On Timer1 Odmierz_1s
    
    Dim S As Byte : Dim M As Byte : Dim G As Byte
    Dim Nowa_w As Bit
    Dim Wart_bcd As Byte
    
    'Dim X As Byte
    
    'Dim Wart As Byte
    
    S1 Alias Pind.6
    S2 Alias Pind.7
    
    Enable Interrupts
    
    
    Enable Timer1
    Counter1 = 3036
    
    Set Nowa_w
    
    Set Portd.6
    Set Portd.7
    
    
    Do
    
    Call Wysw_czas
       If S1 = 0 Then
       Waitms 25
    
       If S1 = 0 Then
       Incr M
       S = 0
       If M = 60 Then
       M = 0
       End If
       Set Nowa_w
    
       Call Wysw_czas
       Waitms 200
    
       End If
    End If
    
       If S2 = 0 Then
       Waitms 25
    
       If S2 = 0 Then
       Incr G
       If G = 24 Then
       G = 0
       End If
       Set Nowa_w
    
       Call Wysw_czas
       Waitms 200
    
       End If
    End If
    
    Loop
    
    End
    
    Sub Wysw_czas
    
       If Nowa_w = 1 Then
    
       Wart_bcd = Makebcd(g)
       Locate 1 , 1
       Lcd Bcd(wart_bcd) ; ":"
    
       Wart_bcd = Makebcd(m)
       Locate 1 , 4
       Lcd Bcd(wart_bcd) ; ":"
                                                          'end program
       Wart_bcd = Makebcd(s)
       Locate 1 , 7
       Lcd Bcd(wart_bcd) ;
    
       Reset Nowa_w
       End If
    
    End Sub
    
    
    
    Odmierz_1s:
    
    Counter1 = Counter1 + 3036
    
    Incr S
    
    Set Nowa_w
    
       If S = 60 Then
       S = 0
    
       Incr M
       If M = 60 Then
       M = 0
    
       Incr G
       If G = 24 Then
       G = 0
    
       End If
       End If
    End If
    
    
    Return


    Oraz program sterujący wyświetlaczami

    $regfile = "m16def.dat"
    $crystal = 16000000
    
    Config Portc = Output
    Config Pina.1 = Output
    Config Pina.2 = Output
    Config Pina.3 = Output
    Config Pina.4 = Output
    Config Timer0 = Timer , Prescale = 256
    Declare Sub Pobr_znaku(cyfra As Byte)
    
    
    On Timer0 Mult_wysw
    
    Dim A As Byte
    Dim B As Byte
    Dim C As Byte
    Dim D As Byte
    
    'Dim X As Byte
    
    'Dim Wart As Byte
    Dim Nr_wysw As Byte
    
    W1 Alias Porta.4
    W2 Alias Porta.3
    W3 Alias Porta.2
    W4 Alias Porta.1
    
    
    Enable Interrupts
    
    Enable Timer0
    Load Timer0 , 125
    
    A = 1
    B = 9
    C = 8
    D = 3
    
    Do
    
    
    Loop
    
    End
    
    
    
    
    Sub Pobr_znaku(cyfra As Byte)
    Portc = Lookup(cyfra , Kody7seg)
    End Sub
    
    
    Mult_wysw:
    
    Load Timer0 , 150
    Set W1
    Set W2
    Set W3
    Set W4
    
    
    Select Case Nr_wysw
    
    Case 0:
    Call Pobr_znaku(a)
    Reset W1
    
    
    Case 1:
    Call Pobr_znaku(b)
    Reset W2
    
    Case 2:
    Call Pobr_znaku(c)
    Reset W3
    
    
    Case 3:
    Call Pobr_znaku(d)
    Reset W4
    
    End Select
    
    Incr Nr_wysw
    If Nr_wysw = 4 Then
    Nr_wysw = 0
    End If
    Return
    
    Kody7seg:
    Data &B00000011 , &B10011111 , &B00100101 , &B00001101 , &B10011001 ,
    Data &B01001001 , &B01000001 , &B00011111 , &B00000001 , &B00001001 ,


    Są to dwa oddzielne programy teraz jak te dwa programy zmieszać razem i zrobić z tego jeden.

    Trzeba jeszcze zmodyfikować program zegarka tak aby podstawiał odpowiednie liczby pod zmienne A,B,C,D.

    W programie do obsługi wys led zmienne A,B,C,D są teraz stałe tymczasowo.

    Dodano po 1 [godziny] 17 [minuty]:

    Udało mi się prubowałem zrobić tak żeby jednocześnie wyświetlał na LCD i na LED o tyle o ile na LED już działa o co mi chodziło to o tyle na LCD po zmieszaniu tych obu programów jest jeden błąd.

    Mianowicie na LCD wyświetla jest godzina np. 05:10:45 po czym wskakuje na 2 sek. 00:00:00
    i nastepnie pokazuje 05:10:48 czym jest spowodowany ten błąd i jak go naprawić?

    $regfile = "m16def.dat"
    $crystal = 16000000
    
    Config Portb = Output
    Config Lcdbus = 4
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Pb.2 , Db5 = Pb.3 , Db6 = Pb.4 , Db7 = Pb.5 , E = Pb.1 , Rs = Pb.0
    Cursor Off
    Cls
    
    Config Portc = Output
    Config Pina.1 = Output
    Config Pina.2 = Output
    Config Pina.3 = Output
    Config Pina.4 = Output
    Config Timer0 = Timer , Prescale = 256
    Declare Sub Pobr_znaku(cyfra As Byte)
    Config Timer1 = Timer , Prescale = 256
    Declare Sub Wysw_czas
    
    
    On Timer0 Mult_wysw
    On Timer1 Odmierz_1s
    
    Dim S As Byte : Dim M As Byte : Dim G As Byte
    Dim Nowa_w As Bit
    Dim Wart_bcd As Byte
    
    Dim A As Byte
    Dim B As Byte
    Dim C As Byte
    Dim D As Byte
    
    'Dim X As Byte
    
    'Dim Wart As Byte
    Dim Nr_wysw As Byte
    
    W1 Alias Porta.4
    W2 Alias Porta.3
    W3 Alias Porta.2
    W4 Alias Porta.1
    S1 Alias Pind.6
    S2 Alias Pind.7
    
    
    Enable Interrupts
    Enable Timer0
    Load Timer0 , 125
    
    Enable Timer1
    Counter1 = 3036
    
    Set Nowa_w
    
    Set Portd.6
    Set Portd.7
    
    
    Do
    Call Wysw_czas
       If S1 = 0 Then
       Waitms 25
    
       If S1 = 0 Then
       Incr M
       S = 0
       If M = 60 Then
       M = 0
       End If
       Set Nowa_w
    
       Call Wysw_czas
       Waitms 200
    
       End If
    End If
    
       If S2 = 0 Then
       Waitms 25
    
       If S2 = 0 Then
       Incr G
       If G = 24 Then
       G = 0
       End If
       Set Nowa_w
    
       Call Wysw_czas
       Waitms 200
    
       End If
    End If
    
    A = G / 10
    B = G Mod 10
    C = M / 10
    D = M Mod 10
    
    
    Loop
    
    End
    
    Sub Wysw_czas
    
       If Nowa_w = 1 Then
    
       Wart_bcd = Makebcd(g)
       Locate 1 , 1
       Lcd Bcd(wart_bcd) ; ":"
    
       Wart_bcd = Makebcd(m)
       Locate 1 , 4
       Lcd Bcd(wart_bcd) ; ":"
                                                          'end program
       Wart_bcd = Makebcd(s)
       Locate 1 , 7
       Lcd Bcd(wart_bcd) ;
    
       Reset Nowa_w
       End If
    
    End Sub
    
    
    
    Odmierz_1s:
    
    Counter1 = Counter1 + 3036
    
    Incr S
    
    Set Nowa_w
    
       If S = 60 Then
       S = 0
    
       Incr M
       If M = 60 Then
       M = 0
    
       Incr G
       If G = 24 Then
       G = 0
    
       End If
       End If
    End If
    Return
    
    
    
    Sub Pobr_znaku(cyfra As Byte)
    Portc = Lookup(cyfra , Kody7seg)
    End Sub
    
    
    Mult_wysw:
    
    Load Timer0 , 150
    Set W1
    Set W2
    Set W3
    Set W4
    
    
    Select Case Nr_wysw
    
    Case 0:
    Call Pobr_znaku(a)
    Reset W1
    
    
    Case 1:
    Call Pobr_znaku(b)
    Reset W2
    
    Case 2:
    Call Pobr_znaku(c)
    Reset W3
    
    
    Case 3:
    Call Pobr_znaku(d)
    Reset W4
    
    End Select
    
    Incr Nr_wysw
    If Nr_wysw = 4 Then
    Nr_wysw = 0
    End If
    Return
    
    Kody7seg:
    Data &B00000011 , &B10011111 , &B00100101 , &B00001101 , &B10011001 ,
    Data &B01001001 , &B01000001 , &B00011111 , &B00000001 , &B00001001 ,


    Za pomoc z góry dzięki
REKLAMA