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

Program do wyświeltania numeru

Mato3 03 Sty 2010 12:28 1200 13
REKLAMA
  • #1 7477154
    Mato3
    Poziom 14  
    Witam wszystkich forumowiczów. Napisałem ostatnio program w Bascomie, do wyświetlania numeru na wyświetlaczu led (7seg), i można je zmieniać za pomocą dwóch przycisków. Chciałbym, aby ktoś mi to sprawdził:

    $regfile = "m8def.dat"
    $crystal = 8000000

    Config Portd = Output 'podłaczony wyświetlacz
    Config Pinb.0 = Output ' anoda 1
    Config Pinb.1 = Output 'anoda 2
    Config Pinb.2 = Input 'przycisk 1
    Config Pinb.3 = Input przycisk 2

    Config Timer0 = Timer , Prescale = 256

    Declare Sub Pobr_znaku(cyfra As Byte)

    On Timer0 Mult_wysw

    Dim A As Byte , B As Byte 'zmienne do wyswietlenia
    Dim Nr_wysw As Byte 'Numer anody
    Dim Wart As Byte 'liczba do wyswietlenia

    W1 Alias Portb.0
    W2 Alias Portb.1
    P1 Alias Portb.2
    P2 Alias Portb.3

    Enable Interrupts
    Enable Timer0

    Load Timer0 , 125

    Do


    Wart = 11
    Wart = Makebcd(wart)
    A = Wart And &B00001111
    Shift Wart , Right , 4
    B = Wart
    Wait 5


    If P1 = 1 Then 'obsługa przycisku pierwszego
    Waitms 25
    If P1 = 1 Then
    Incr Wart
    End If
    End If

    If P2 = 1 Then 'obsługa przycisku drugiego
    Waitms 25
    If P2 = 1 Then
    Decr Wart
    End If
    End If

    If P1 = 1 And P2 = 1 Then 'zerowanie numerka
    Wait 1
    If P1 = 1 And P2 = 1 Then
    Wart = 0
    End If
    End If

    Wart = Makebcd(wart)

    A = Wart And &B00001111
    Shift Wart , Right , 4

    B = Wart
    Loop
    End

    Sub Pobr_znaku(cyfra As Byte)

    If Cyfra < 10 Then
    Portd = Lookup(cyfra , Kody7seg)
    Else
    Portd = 0
    End If
    End Sub

    Mult_wysw:

    Load Timer0 , 125

    Set W1
    Set W2

    Select Case Nr_wysw

    Case 0:
    Call Pobr_znaku(a)
    Reset W1

    Case 1:
    Call Pobr_znaku(b)
    Reset W2
    End Select

    Incr Nr_wysw
    If Nr_wysw = 2 Then
    Nr_wysw = 0

    End If

    Return

    Kody7seg:

    Data &B0011111 , &B00000110 , &B01011011 , &B01001111 , &B01100110,
    Data &B01101101 , &B01111101 , &B00000111 , &B01111111 , &B01101111
  • REKLAMA
  • Pomocny post
    #2 7477950
    ElektroTME
    Poziom 14  
    Widzę, że chyba przesiadłeś się z asemblera na bascoma, postaram się pomóc, napisz tylko do czego Ci ten program, co ma robić poza zliczaniem w dół i w górę.
    A ja już zbuduję układ na stykówce :P

    Edit:
    Rozumiem że wyś7seg masz ze wspólną Anodą?
  • #3 7478115
    Mato3
    Poziom 14  
    tak wyswietlacze są dwa ze wspólną anodą. Układ ma tylko zliczac i wyswietlac nic po za tym, numer bd zmieniany raz dziennie;]
  • Pomocny post
    #4 7478139
    ElektroTME
    Poziom 14  
    ok, już pracuję nad kodem, dużo błędów, chyba zaczynasz :P
    pewnie szybciej by było jakbym napisał to od nowa, ale niewiele się nauczysz w taki sposób :P
  • REKLAMA
  • #5 7478140
    Mato3
    Poziom 14  
    Wyświetlacze są duże nie wiem ile cali ale obudowa ma jakieś 20 cm wysokości

    Dodano po 28 [sekundy]:

    Mozesz napisać od nowa, ja potrzebuje mieć to zrobione na jutro
  • REKLAMA
  • Pomocny post
    #6 7478154
    ElektroTME
    Poziom 14  
    przyciski podłączone do masy czy do Vcc?
  • #7 7478159
    Mato3
    Poziom 14  
    tutaj byly do vcc, jak wynika z kodu

    Dodano po 2 [minuty]:

    ale możesz to zrobic po swojemu tylko mi schemat pokaż ja zrobie od nowa układ bo ten coś nie chce działać i nie wiem czy to program czy układ
  • Pomocny post
    #8 7478217
    ElektroTME
    Poziom 14  
    to program, zrobię Ci guziczki pod Gnd, są bardziej niezawodne i bardziej odporne na zakłucenia ;p
    rozumiem że chcesz odliczać od 0 do 99 czy może 0d 1 do 99?
  • #9 7478232
    Mato3
    Poziom 14  
    od 1 do 99
  • Pomocny post
    #10 7478272
    ElektroTME
    Poziom 14  
    jak od 1 do 99 to nawet lepiej :P

    mogę dołożyć jeszcze efekt coraz szybszego przewijania się cyferek, tak jak w zegarkach elektronicznych przy ustawianiu godziny
  • REKLAMA
  • #11 7478283
    Mato3
    Poziom 14  
    jakbyś był tak dobry:)
  • Pomocny post
    #12 7478305
    ElektroTME
    Poziom 14  
    kod już działa, dołożę tylko efekt i będzie ok, schemat podłączeń mam ci narysować, czy dasz sobie radę na podstawie programu i noty ewentualnie?
  • #13 7478317
    Mato3
    Poziom 14  
    na wszelki wypadek narysuj, jak mozesz
  • Pomocny post
    #14 7478331
    ElektroTME
    Poziom 14  
    ok, tylko najpierw uporam się z przyciskami i nastawami :P

    Dodano po 28 [minuty]:

    
    $regfile = "m8def.dat"
    $crystal = 8000000
    
    Config Portd = Output                                       'podłaczony wyświetlacz
    'Config Pinb.0 = Output ' anoda 1  źle! nazwa pin służy do odczytu wartości
    'Config Pinb.1 = Output 'anoda 2   źle! aby ustawić należy się posłużyć nazwą Portb.x
    'Config Pinb.2 = Input 'przycisk 1 źle!
    'Config Pinb.3 = Input 'przycisk 2 źle!
    'mniej kodu:
    Config Portb = Output
    Config Portb.2 = Input
    Config Portb.3 = Input
    
    Portb.2 = 1                                                 ' zapomniałeś o ustawieniu domyślnego stanu portu (tak na wszeli wypadek)
    Portb.3 = 1
    
    
    'Podłączenie wyświetlacza:
    'portd.0 - A
    'portd.1 - B
    'portd.2 - C
    'portd.3 - D
    'portd.4 - E
    'portd.5 - F
    'portd.6 - G
    'portd.7 - H - tutaj nieużywane
    
    'portb.0 - anoda wyświetlacza dziesiątek
    'portb.1 - anoda wyświetlacza jednostek
    
    'Podłączenie przycisków
    'portb.2 - przycisk dodawania
    'portb.3 - przycisk odejmowania
    'obydwa przyciski łączą port mikrokontrolera z masą
    
    
    Config Timer0 = Timer , Prescale = 256
    
    'Declare Sub Pobr_znaku(cyfra As Byte)
    
    On Timer0 Mult_wysw
    
    Dim A As Byte , B As Byte 'zmienne do wyswietlenia
    Dim Nr_wysw As Byte 'Numer anody
    Dim Wart As Byte                                            'liczba do wyswietlenia
    
    Dim Maxi As Byte , Licznik As Byte
    
    
    W1 Alias Portb.0
    W2 Alias Portb.1
    'P1 Alias Portb.2 ' źle! tutaj dopiero pinb.2
    'P2 Alias Portb.3 ' źle! i pinb.3
    
    P1 Alias Pinb.2
    P2 Alias Pinb.3
    
    
    Enable Interrupts
    Enable Timer0
    
    'Load Timer0 , 125
    
    
    Wart = 1
    Maxi = 100 : Licznik = 0
    Do
    
    'Wart = 11 wywalamy z pętli ^
    
    'Wart = Makebcd(wart)      'tu aż mi trąci asemblerowym myśleniem :P
    'A = Wart And &B00001111   'po co 2 razy ten sam kod?
    'Shift Wart , Right , 4    'wystarczy raz , do tego wrzucimy do pętli timera
    'B = Wart
    'Wait 5    'bez opuźnienia, niewiem po co one?
    
    
    Decr Licznik
    If P1 = 0 Or P2 = 0 Then
       If Licznik = 0 Then
          Licznik = Maxi
          If P1 = 0 Then
             Incr Wart
          End If
          If P2 = 0 Then
             Decr Wart
          End If
          Maxi = Maxi - 3                                       'coraz szybciej
          If Maxi < 30 Then
             Maxi = 30
          End If
       End If
    Else
       If Licznik = 0 Then
          Licznik = 6
          Maxi = 100
       End If
    End If
    
    
    
    If P1 = 0 And P2 = 0 Then
    Wait 1
    If P1 = 0 And P2 = 0 Then
    Wart = 1
    End If
    End If
    
    Waitus 1300
    
    'Wart = Makebcd(wart)
    'A = Wart And &B00001111
    'Shift Wart , Right , 4
    'B = Wart
    
    Loop
    End
    
    'Sub Pobr_znaku(cyfra As Byte) 'dużo nam to kodu niezje, a bdzie lepiej działało jak przeniosę to do pętli timera
    
    'If Cyfra < 10 Then
    'Portd = Lookup(cyfra , Kody7seg)
    'Else
    'Portd = 0
    'End If
    'End Sub
    
    Mult_wysw:
    'przyda się jeszcze zabezpieczenie przed wyświetlaniem tego czego nie wyświetlisz na 2 wyśw, czyli liczb >99
    If Wart = 100 Then
    Wart = 1
    End If
    If Wart = 0 Then
    Wart = 99
    End If
    
    'Load Timer0 , 125
    'ja to zrobię tak:
    A = Wart / 10                                               'do a wpisujemy wynik dzielenia wart przez 10, część ułamkowa zostaje ucięta
    B = Wart Mod 10                                             'do b wpisujemy resztę z dzielenia wart przez 10
    Set W1
    Set W2
    Select Case Nr_wysw
    Case 0:
    Portd = Lookup(b , Kody7seg)
    Reset W1
    
    Case 1:
    Portd = Lookup(a , Kody7seg)
    Reset W2
    End Select
    
    Incr Nr_wysw
    If Nr_wysw = 2 Then
    Nr_wysw = 0
    End If
    Return
    
    Kody7seg:
    Data &B11000000 , &B11111001 , &B10100100 , &B10110000 , &B10011001,
    Data &B10010010 , &B10000010 , &B11111000 , &B10000000 , &B10010000
    


    Gotowy kod
    mam nadzieję że pomogłem :P
    mam nadzieję że segmenty podłączysz pod jakieś tranzystory, a nie bezpośrednio.
    Jak skompilujesz, zaprogramujesz i sprawdzisz jak działa to daj znać :P
    Możesz też kliknąć przy każdym poście "pomógł" - źródło punktów :D

    Jeszcze powiedz mi gdzie to wykorzystasz?

    Dodano po 37 [minuty]:

    Gdyby wydawało Ci się że wyświetlacze migają możesz odkomętować te dwie linijki:

    
    (...)
    
    Enable Interrupts
    Enable Timer0
    
    'Load Timer0 , 125    <---- TĄ
    
    
    Wart = 1
    Maxi = 100 : Licznik = 0
    Do
    
    (...)
    
    If Wart = 0 Then
    Wart = 99
    End If
    
    'Load Timer0 , 125          <--- i TĄ
    'ja to zrobię tak:
    A = Wart / 10                                               'do a wpisujemy wynik dzielenia wart przez 10, część ułamkowa zostaje ucięta
    B = Wart Mod 10                                             'do b wpisujemy resztę z dzielenia wart przez 10
    Set W1
    
    (...)
    

    Pozdrawiam
REKLAMA