Witam!
Mam problem z wyświetlaniem liczb na 5 wyświetlaczach LED.
Docelowo ma to być wyświetlacz sterowany poprzez RS232 i wyświetlający liczby z zakresu -999 do +29999. Na razie jednak zatrzymałem się na etapie samego wyświetlania.
Problem polega na tym, że co jakiś czas pojawiają się "śmieci" na wygaszonych segmentach , czasami także zapalona cyfra potrafi na chwilę przygasnąć. Zauważyłem, że duży wpływ na to ma wartość opóźnienia w pętli głównej programu - czym mniejsze tym gorzej. Gdzie popełniam błąd?
Przypisanie zmiennym A-E konkretnych wartości, bez rozbierania liczby na poszczególne cyfry powoduje prawidłowe wyświetlanie.
Atmega8, kwarc zewnętrzny 8MHz, sterowanie katodami przez ULN2803, sterowanie anodami przez pary tranzystorów BC847/BD140
Kod programu:
Mam problem z wyświetlaniem liczb na 5 wyświetlaczach LED.
Docelowo ma to być wyświetlacz sterowany poprzez RS232 i wyświetlający liczby z zakresu -999 do +29999. Na razie jednak zatrzymałem się na etapie samego wyświetlania.
Problem polega na tym, że co jakiś czas pojawiają się "śmieci" na wygaszonych segmentach , czasami także zapalona cyfra potrafi na chwilę przygasnąć. Zauważyłem, że duży wpływ na to ma wartość opóźnienia w pętli głównej programu - czym mniejsze tym gorzej. Gdzie popełniam błąd?
Przypisanie zmiennym A-E konkretnych wartości, bez rozbierania liczby na poszczególne cyfry powoduje prawidłowe wyświetlanie.
Atmega8, kwarc zewnętrzny 8MHz, sterowanie katodami przez ULN2803, sterowanie anodami przez pary tranzystorów BC847/BD140
Kod programu:
$regfile = "m8def.dat"
$crystal = 800000
'Portc.0 = segment a
'Portc.1 = segment b
'Portc.2 = segment c
'Portc.3 = segment d
'Portc.4 = segment e
'Portc.5 = segment f
'Portb.4 = segment g
'Portd.6 = anoda wyświetlacz 1
'Portd.7 = anoda wyświetlacz 2
'Portb.0 = anoda wyświetlacz 3
'Portb.1 = anoda wyświetlacz 4
'Portb.2 = anoda wyświetlacz 5
Config Portc = Output
Config Portb = &B00101000
Config Timer0 = Timer , Prescale = 256
Declare Sub Pobr_znaku(cyfra As Integer)
On Timer0 Mult_wysw
Dim A As Integer , B As Integer , C As Integer , D As Integer , E As Integer
Dim Nr_wysw As Byte
Dim Wart As Integer
W1 Alias Portd.6
W2 Alias Portd.7
W3 Alias Portb.0
W4 Alias Portb.1
W5 Alias Portb.2
G Alias Portb.4
Enable Interrupts
Enable Timer0
Load Timer0 , 90
Wart = 23145 'tymczasowo do testów
Do
'---rozbicie liczby na poszczególne cyfry------
A = Wart \ 10000
B = Wart Mod 10000
B = B \ 1000
C = Wart Mod 1000
C = C \ 100
D = Wart Mod 100
D = D \ 10
E = Wart Mod 10
'---wygaszanie niepotrzbnych zer--------------
If A = 0 Then
A = 10
If B = 0 Then
B = 10
If C = 0 Then
C = 10
If D = 0 Then
D = 10
If E = 0 Then
E = 10
End If
End If
End If
End If
End If
Wait 1
Incr Wart 'tymczasowo do testów
Loop
End
Sub Pobr_znaku(cyfra As Integer)
If Cyfra < 10 Then
If Cyfra = 0 Or Cyfra = 1 Or Cyfra = 7 Then 'zapalanie i gaszenie segmentu g
Reset G
Else
Set G
End If
Portc = Lookup(cyfra , Kody7seg)
Else
Portc = Portc And &B01000000 'wygaszenie segmentów a,b,c,d,e,f
Reset G 'wygaszenie segmentu g
End If
End Sub
'---wyświetlanie------------------------
Mult_wysw:
Load Timer0 , 90
Reset W1
Reset W2
Reset W3
Reset W4
Reset W5
Select Case Nr_wysw
Case 0:
Call Pobr_znaku(a)
Set W1
Case 1:
Call Pobr_znaku(b)
Set W2
Case 2:
Call Pobr_znaku(c)
Set W3
Case 3:
Call Pobr_znaku(d)
Set W4
Case 4:
Call Pobr_znaku(e)
Set W5
End Select
Incr Nr_wysw
If Nr_wysw = 5 Then
Nr_wysw = 0
End If
Return
'---kody cyfr---------------------------
Kody7seg:
Data &B01111111 , &B01000110 , &B01011011 , &B01001111 , &B01100110
Data &B01101101 , &B01111101 , &B01000111 , &B01111111 , &B01101111