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

[bascom] zegar ciemniowy i wyswielacz led7segmentowy-problem

chrobot 08 Mar 2010 15:24 1368 2
  • #1 7800876
    chrobot
    Poziom 16  
    problem mój polega na nieprawidłowym wyswietlaniu cyfr . o ile w zakresie 0-99 wszystko jest ok., to powyżej 100 ma same zera :
    wyswietlacz ma 3 cyfry led-7-segmentowe i w założeniach ma liczyć czas od 0 do 999 sek

    pełny kod:
    
    '$sim
    $regfile = "m8def.dat"                                      'informuje kompilator o pliku
    $crystal = 8000000                                          'informuje kompilator o
    Config Portd = Output                                       'port D jako wyjściowy
    Config Pinc.5 = Output                                      'linia PB1 jako wyjściowa
    Config Pinc.4 = Output                                      'linia PB2 jako wyjściowa
    Config Pinc.3 = Output                                      'linia PB3 jako wyjściowa
    Config Pinc.2 = Output                                      'linia led jako wyjściowa
    Config Pinb.0 = Output                                      'linia pu jako wyjściowa
    Config Pinb.1 = Output
    Config Pinb.2 = Output
    Config Pinb.3 = Output
    
    Config Timer0 = Timer , Prescale = 256                      'konfiguracja Timer0 jako
    Declare Sub Pobr_znaku(cyfra As Byte)                       'deklaracja procedury
    On Timer0 Mult_wysw                                         'przerwanie od przepełnienia
    
    Dim A As Byte , B As Byte , C As Byte , Z As Byte           'definicje zmiennych A, B, C,
    Dim Nr_wysw As Byte                                         'zmienna określająca numer
    Dim D As Byte
    Dim E As Byte
    
    Config Timer1 = Timer , Prescale = 256
    On Timer1 Odmierz_1s                                        'przerwanie od przepełnienia
    
    Dim Sekundy As Integer
    Dim U As Integer
    Dim Dana As Integer
    
    W1 Alias Portc.3                                            'przypisanie linii PB0 nazwy W1
    W2 Alias Portc.4                                            'przypisanie linii PB1 nazwy W2
    W3 Alias Portc.5                                            'przypisanie linii PB2 nazwy W3
    
    Pu Alias Pinb.0                                             'wyjscie na Pu
    Plus Alias Pinb.1                                           'dodaj warosc
    Minus Alias Pinb.2                                          'odejmnij wartosc
    Go Alias Pinb.3                                             'przycisk startu
    Leda Alias Pinc.2                                           'sygnalizacja
     Portb.1 = 1
     Portb.2 = 1
     Portb.3 = 1
     Portc.2 = 1                                                'zgas led
     Portb.0 = 1                                                'wylacz pu
    
    Portd = &B11111111                                          'wygas wyswietlacz
    Waitms 1
    
    Enable Interrupts                                           'odblokowanie globalnego
    Enable Timer0                                               'odblokowanie przerwania od
    Load Timer0 , 125                                           '125                                           'załadowanie do licznika
            'wartości początkowej 131, bo
            '256 - 125 = 131
    Enable Timer1
    Counter1 = 34286
    Stop Timer1
    Start Timer0
    
    'A = 3
    'B = 2
    'C = 1
    '123 sposób wyświetlania
    
    A = 0
    B = 0
    C = 0
    U = 0
    Dana = 95
    
    D = 5                                                       'czekaj
    E = 25                                                      'czekaj2
    
    'A = 0
    'B = 0
    'C = 0
    Sekundy = 0
    
    
    Do                                                          'początek nieskończonej pętli
     'Portc.2 = 1                                                'zgas led
    
    If Plus = 0 And Minus = 1 Then
     Gosub Czekaj2
       If Plus = 0 And Minus = 1 Then
        Gosub Czekaj
        Incr U
         Incr Dana
            If Dana > 999 Then Dana = 999
        Gosub Czekaj
         Gosub Wyswietl
    
     Bitwait Plus , Set
        End If : End If
    
    
     If Minus = 0 And Plus = 1 Then
        Gosub Czekaj2
       If Minus = 0 And Plus = 1 Then
       Gosub Czekaj
       Decr U
       Decr Dana
       if dana<0 then dana=0
       Gosub Czekaj
       Gosub Wyswietl
     Bitwait Minus , Set
        End If : End If
    
    
    If Go = 0 Then
     Gosub Czekaj2
     If Go = 0 Then
    Bitwait Go , Set
        Gosub Start_stop
    End If : End If
    
    Loop                                                        'koniec pętli nieskończonej
    End
    
    '==========
    'tu mi cos nie działa
    Wyswietl:
    
    Dana = Dana Mod 100
    C = Dana / 100
    'Dana = Dana Mod 10
    'B = Dana Mod 10
    B = Dana / 10
    A = Dana Mod 10
    
    Return
    
    Start_stop:
    Enable Timer1
    Counter1 = 34286
    Start Timer1
    Portc.2 = 0                                                 'zapal led
    Portb.0 = 0                                                 'wyl pu
    
    Return
                                                            'koniec programu
    Czekaj:
    Waitms D
    Return
    
    Czekaj2:
    Waitms E
    Return
    
    
    Sub Pobr_znaku(cyfra As Byte)                               'definicja procedury
            'Pobr_znaku
     If Cyfra < 10 Then                                         'jeżeli wartość otrzymanej do
            'wyświetlenia cyfry < od 10,
      Portd = Lookup(cyfra , Kody7seg )                         'to wpisanie do portu D
            'wartość kodu z tablicy
            'stałych Kody7seg
     Else                                                       'w przeciwnym razie
      Portd = 0                                                 'wpisanie do portu D wartości
            '0 która wygasza wyświetlacz
     End If                                                     'koniec warunku If...Then
    End Sub                                                     'koniec procedury
    
    Mult_wysw:                                                  'podprogramu obsługi
            'przerwania od przepełnienia
            'Timer0 w którym odbywa się
            'multipleksowanie
     Load Timer0 , 125                                          'załadowanie do licznika
            'wartości początkowej
     Set W1                                                     'wygaszenie wyświetlacza 1
     Set W2                                                     'wygaszenie wyświetlacza 2
     Set W3                                                     'wygaszenie wyświetlacza 3
     Select Case Nr_wysw                                        'w zależności od wartości
            'Nr_wysw, wykonaj:
      Case 0:                                                   'gdy Nr_wysw = 0, to
       Call Pobr_znaku(a)                                       'wywołanie procedury
            'pobierającej z tablicy kod
            'znaku dla wartości A
    
       Reset W1                                                 'włączenie wyświetlacza 1
      Case 1:                                                   'gdy Nr_wysw = 1, to
       Call Pobr_znaku(b)                                       'wywołanie procedury
            'pobierającej z tablicy kod
            'znaku dla wartości B
    
       Reset W2                                                 'włączenie wyświetlacza 2
      Case 2:                                                   'gdy Nr_wysw = 2, to
       Call Pobr_znaku(c)                                       'wywołanie procedury
            'pobierającej z tablicy kod
            'znaku dla wartości C
            '
       Reset W3                                                 'włączenie wyświetlacza 3
     End Select                                                 'koniec instrukcji wyboru
     Incr Nr_wysw                                               'zwiększenie o jeden wartości
            'Nr_wysw
     If Nr_wysw = 3 Then                                        'jeśli wartość Nr_wysw
            'osiągnie 3, to
      Nr_wysw = 0                                               'zeruj wartość Nr_wysw
     End If
    Return                                                      'powrót z podprogramu
            'przerwania
    
    
    Odmierz_1s:                                                 'podprogramu obsługi przerwania
          'przepełnienia od Timer1
     Counter1 = Counter1 + 34286                                'wpisanie wartości początkowej
          'licznika
     Incr Sekundy                                               'zwiększenie o 1 wartości
          'Sekundy
    
     If Sekundy = U Then
     Portb.0 = 1
     Portc.2 = 1                                                'zgasled
    
    Stop Timer1
    Disable Timer1
    
    End If
    Return
    
    
    
    Kody7seg:                                                   'tablica stałych Kody7seg
            'przechowująca kody
            'wyświetlanych cyfr
    'Kody cyfr
    
    Data &B10000010 , &B10111011 , &B10000101 , &B10010001 , &B10111000
    Data &B11010000 , &B11000000 , &B10011011 , &B10000000 , &B10010000
    


    problem tkwi w tym podprogramie :

    
    
    '==========
    'tu mi cos nie działa
    Wyswietl:
    
    Dana = Dana Mod 100
    C = Dana / 100
    'Dana = Dana Mod 10
    'B = Dana Mod 10
    B = Dana / 10
    A = Dana Mod 10
    
    Return
    


    proszę o jakieś sugestie ....
  • Pomocny post
    #2 7801319
    Krauser
    Poziom 26  
    
    C = Dana \ 100
    Dana = Dana Mod 100
    B = Dana \ 10
    A = Dana Mod 10 

    Takie przekształcenia można łatwo sprawdzić w symulacji. PS. Używasz zmiennych typu integer, czy na pewno potrzebujesz zmiennych ze znakiem.
  • #3 7801885
    chrobot
    Poziom 16  
    miałeś racje zmenna
REKLAMA