Wyswietlacz LED


Witam!
Zajelem sie obsługa wyświetlacza LED przy pomocy układu 4511.Wysyla sie dane BCD.Do tego potrzebuje 4 linie.Jak wyslac dane ,aby nie zajmować pozostałych 4 lini portu.
To moj przykład:

Led:
   Liczba = A
Reszta = Liczba Mod 10                                     
Dane_led(1) = Lookup(reszta , Led_cyfry)                    
Liczba = Liczba / 10                                       
Reszta = Liczba Mod 10
Dane_led(2) = Lookup(reszta , Led_cyfry)
 
Set Led2
Set Led1
Dataport = Dane_led(akt_led)
 
Select Case Akt_led
Case 1 : Reset Led1
Case 2 : Reset Led2
End Select
 
Incr Akt_led
If Akt_led > 2 Then Akt_led = 1
 
Return
 
 
Led_cyfry:
 Data &B00000000 , &B00000001 , &B00000010 , &B00000011 , &B00000100 , &B00000101 , &B00000110 , &B00000111 , &B00001000 , &B00001001

Przy takiej obsłudze na pozostałych portach mam caly czas 0 lub mogę ustawić 1,ale nie mogę sterować tym.




Portret użytkownika kaktus

sprawa nie jest skomplikowana

Coś mi się wydaje że oszczędzasz nogi ?C ;-))
Ja to robię tak:
po pierwsze odczytuję stan całego portu - robię kopię (-;
po drugie dalsze operacje wykonują się na tej kopii
po trzecie zapisuję wynik z kopii z powrotem do tego portu

Teraz esencja:
żeby nie nadpisać bitów które mają pozostać można wykorzystać stosowną funkcję logiczną,
żeby to lepiej zobrazować zakładam że z portu odczytano
&B10110011
chcemy nadpisać dla przykładu część LSB czterema bitami 1001, w zapisie 8 bitowym będzie to &B00001001
więc do wykonania mamy operację &B10110011 AND &B11110000 która ustawi w interesującej nas części same zera, i otrzymamy wynik &B10110000, abyśmy w drugim kroku mogli wykonać &B10110000 OR &B00001001, co da wynik &B10111001, popróbuj może da się prościej ...

gdyby bity do nadpisania nie były w ciągu jeden koło drugiego to pozostaje chyba tylko operacja wyłuskania bitowego i przepisanie interesujących nas bitów, bit po bicie np
chcemy nadpisać bity 3 i 7 więc P3.2 = zmienna.2 oraz P3.6 = zmienna.6
no chyba że ktoś poda rozwiązanie lepsze.

Operacje logiczne mają "wielką moc" i nie należy ich unikać o czym się niejednokrotnie przekonałem. Trzeba trochu makówę wysilić i do łyknięcia wszystko ;-D

-

"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".

Portret użytkownika Grzeniu 73

Nie jak na razie nie

Nie jak na razie nie oszczędzam nóg:),tylko poszerzam wiedze.W sumie ja do tego na początku źle podszedłem .Mozna to było napisać dużo prościej i napisałem to.W sumie maskowałem tak jak to opisałeś.ten scalaczek obcykałem:) Później wziąłem sie za Expander PCF i tez udało mi sie obsłużyć wyświetlacz led Jednak maskowanie mi nie wyszło.I te pozostałe 4 porty sobie mrugały jak chciały.:)teraz po twojej odpowiedzi pomyślałem,ze można sobie napisać mały programik i symulować te operacje logiczne i sobie to poćwiczyć.Kurcze skąd Wy to wszystko wiecie?To jest bardzo niesprawiedliwe!

Portret użytkownika kaktus

no już tamm....

Quote:
Kurcze skąd Wy to wszystko wiecie?

po prostu siedzę i dlube .... pewno tak samo jak Ty, i też nie mam kiedy ....
Quote:
To jest bardzo niesprawiedliwe!

Co jest niesprawiedliwe? że dostałeś rybkę zamiast wędki? ;-p
A mnie nikt nie chce podpowiadać ...

Grzeniu73 takie same "stare trufle" jesteśmy ... więc dobrze wiesz ile czasu mamy na to co zajefajne ;-)

Quote:
można sobie napisać mały programik i symulować te operacje logiczne i sobie to poćwiczyć

sam bym tego lepiej nie wymyślił ;-p
Masz GyGy?

-

"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".

Portret użytkownika Grzeniu 73

Siema!No mam GG

Siema!No mam GG 6032700.Jestem zawsze niewidoczny,ale popołudniu zazwyczaj jestem.Niesprawiedliwe jest,ze Wy wiecie a ja nie:)Ale spoko doganiam Was.

Portret użytkownika Wieslaw.S

Witam i przedstawiam problem

Bawię się z wyświetlaczem 7 segment. i pojawił się problem, dziwny problem.

$regfile = "m8def.dat"
$crystal = 11059200
Config Adc = Single , Prescaler = Auto , Reference = Avcc
 
 
Dim W As Word
Dim V As Single
Dim Vout As Single
Dim A As Single
Dim Pp As Single
Dim P As Single
Dim Pa As Single
 
Dim Pc As Word
 
Dim Temp As Word
 
 
Dim Mux As Byte
Dim W1 As Byte
Dim W2 As Byte
Dim W3 As Byte
Dim W4 As Byte
Dim Tw1 As Byte
Dim Tw2 As Byte
Dim Tw3 As Byte
Dim Tw4 As Byte
 
Config Portd = Output                                       '8 bitów na 7seg.
Config Pinb.5 = Output                                      'anoda 1
Config Pinb.4 = Output                                      'anoda 2
Config Pinb.3 = Output                                      'anoda 3
Config Pinb.2 = Output                                      'anoda 4
 
Config Timer0 = Timer , Prescale = 256
Config Timer1 = Timer , Prescale = 256
Enable Interrupts
Enable Timer0
Enable Timer1
On Timer0 Co4ms
On Timer1 Co1s Nosave
Declare Sub Odczyt_ramki
 
Do
Loop
End
 
 
 
 
'*************** Pinc.5 = wejscie do ADC z MPXA6115A (MPXA4115A)
 
'Vout z czujnika = 5 woltów zasilania * (0.009 * P - 0.095)
 
'czyli dla
'P=96,52kP
'Vout=3,8684V
'P=105,4kPa
'Vout = 4,268v
 
'wzór do przeliczeń   -------->  P=111.11 * Vout / VS + 10,555
 
 
Odczyt_ramki:
 
W = Getadc(5)
V = W * 5.019
Vout = V / 1023
 
'           5.019V to napięcie zasilania
 
 
 
 
Pp = 111.11 * Vout
A = Pp / 5
Pa = A + 10.555                                             ' Pa ciśnienie w kPa
P = Pa * 10                                                 'ciśnienie w hPa
Pc = Int(p)                                                 ' odrzucamy to co po przecinku
 '                                    Pc to wartość całkowita np. 1023 hPa
 
 
 
 '   ********* chwilowo wstawiona stała wartość do prób *************
 
Pc = 1234
 
 
 
 
 
' ********  coś tu nie gra z przeliczeniami bo wynik jest 0234 zamiast 1234 ************
 
W1 = Pc \ 1000
 
'***   W1 = 1234 podzielone przez 1000 bez reszty ( \ ) czyli powinno być 1
'*** a jest 0
 
Temp = Pc Mod 1000
W2 = Temp / 100
Temp = Temp Mod 100
W3 = Temp / 10
Temp = Temp Mod 10
W4 = Temp
 
' ********  coś tu nie gra bo wynik jest 0234 zamiast 1234 ************
 
W1 = Lookup(w1 , Tabela)
W2 = Lookup(w2 , Tabela)
W3 = Lookup(w3 , Tabela)
W4 = Lookup(w4 , Tabela)
 
Return
 
Co1s:
 
Timer1 = 22000
 
Gosub Odczyt_ramki
 
Return
 
   Co4ms:
 
Timer0 = 120
 
   Incr Mux
   If Mux = 4 Then Mux = 0
 
   Select Case Mux
 
   Case 0:
 
   Reset Portb.2
   Portd = W1
   Set Portb.5
 
   Case 1:
 
   Reset Portb.5
   Portd = W2
   Set Portb.4
 
   Case 2:
 
   Reset Portb.4
   Portd = W3
   Set Portb.3
 
   Case 3:
 
   Reset Portb.3
   Portd = W4
   Set Portb.2
 
 
 
 
End Select
 
Return
 
Tabela:
   Data 63 , 6 , 91 , 79 , 102 , 109 , 125 , 7 , 127 , 111 , 0

Czy ktoś wie co robię źle ?

Portret użytkownika EDC

Odp - Wyświetlacze 7 segment i rzutowanie zmiennych

W Helpie do Bascom możesz przeczytać że poprawny wynik jest gwarantowany tylko jeśli wynik działania operacji matematycznej jest zapisywany do zmiennej takiego samego typu na jakich działanie jest wykonywane.
Dzieląc zmienną typu Word musisz posłużyć się pomocniczą zmienną typu Word do zapisania wyniku.
Potem dopiero wartość ze zmiennej pomocniczej zapisujesz do takiej o typie jaki potrzebujesz.

Poniżej test wykonany w symulatorze. Polecam w nim sprawdzać takie zagadki.
W pierwszej linii widać błąd obliczeń - wynik zero dla 1234/1000
W drugiej linii wynik jest prawidłowy.
Zrobiłem krótki opis obsługi tych wyświetlaczy i nie zapomniałem o tym oraz zwracałem uwagę Link Wyświetlacze 7segment

$regfile = "m32def.dat"
$crystal = 8000000
 
$hwstack = 64
 
'koniecznie umieszczaj te dane - rezerwują miejsce na podreczne obliczenia
$swstack = 64
$framesize = 64
 
 $sim                                                       'kod jest do symulatora
 
Dim W1 As Byte
Dim Pc As Word
Dim Helpw As Word                                           'pomocnicza zmienna
 
 
Pc = 1234
 
W1 = Pc / 1000                                              'wynik dzielenia Word zapisany bezposrednio do Byte
 
Cls : Lcd W1                                                'efekt = nie działa
 
Helpw = Pc / 1000                                           'zapis wyniku do zmiennej tego samego typu
W1 = Helpw                                                  'rzutowanie z Word do Byte
 
Lowerline : Lcd W1                                          'efekt = działa
 
 
End

Miłego dnia ;)

-

BARTek
Moja strona

Portret użytkownika Wieslaw.S

odpowiedź

Hejka !
Znowu Ty mnie wyciągasz z tarapatów.
Dzięki stokrotne, wrócę do domu z pracy to zaraz sprawdzę.
Faktycznie z tymi zmiennymi to prawda , bo jak zamiast Byte dałem Word
to wynik był 2234, tylko czemu a nie 1234 - pewnikiem brak tej pomocniczej.

Pozdrawiam serdecznie i życzę miłego dnia .

P.S.
Kiedys pomagałeś mi dopracować zegar z odb. GPS
a teraz znowu.

Zaglądnąłem na Twoją stronę - świetna, jest to co będę chciał ugryźć
z tym, że nie dokońca bo masz opis 595 a ja chcę 164 ( rejestr przes. )

No i jestem w domu, robię próby.
Z cyfrą 1234 jest Ok ale gdy wpiszę n.p. 0968 to już nie.

No, poradziłem sobie , doświadczenie zdobyte :)

P/W

Portret użytkownika sq2ajo

Nowe zadanie , nowy problem

zrobiłem licznik dni sterowany z odbiornika GPS.
Od zadanej przyciskami wartości początkowej licznik
jest zwiększany o jeden gdy Y1,Y2 - godziny = 00
Y3,Y4 - minuty = 00 i Y5,Y6 - sekundy =00, czyli
o godzinie 00:00:00.
Wszystko działa jak należy.
Oto kod

$regfile = "m8def.dat"
$crystal = 11059200
$hwstack = 32
$swstack = 8
$framesize = 24
 
Open "comc.2:9600,8,n,1" For Input As #2                    ' PinC.2 jako wejście UART
 
Dim Gpsin As Byte
Dim X As Byte ,
Dim Count As Byte
Dim Y(10) As Byte
Dim Z As Byte
Dim Mux As Byte
Dim Kopia(10) As Byte
Dim Jednostki As Byte
Dim Dziesiatki As Byte
Dim Setki As Byte
Dim Tysiace As Byte
 
Config Portd = Output                                       '8 bitów na 7seg.
 
Config Pinb.5 = Output                                      'anoda1
Config Pinb.4 = Output                                      'anoda2
Config Pinb.3 = Output                                      'anoda3
Config Pinb.2 = Output                                      'anoda4
 
Config Pinc.1 = Input                                       'przełącznik czasu ZIMA/LATO
Config Pinc.5 = Input                                       '  +1 ustawianie licznika dni
Config Pinc.4 = Input                                       ' +10 ustawianie licznika dni
Config Pinc.3 = Input                                       '+100 ustawianie licznika dni
 
Config Timer0 = Timer , Prescale = 256
Enable Interrupts
Enable Timer0
On Timer0 Co4ms
 
Do
 
Start:
Gpsin = Waitkey(#2)
If Gpsin <> "$" Then Goto Start
Gpsin = Waitkey(#2)
If Gpsin <> "G" Then Goto Start
Gpsin = Waitkey(#2)
If Gpsin <> "P" Then Goto Start
Gpsin = Waitkey(#2)
If Gpsin <> "G" Then Goto Start
Gpsin = Waitkey(#2)
If Gpsin <> "G" Then Goto Start
Gpsin = Waitkey(#2)
If Gpsin <> "A" Then Goto Start
Gpsin = Waitkey(#2)
If Gpsin <> "," Then Goto Start
Count = 0
For X = 1 To 6
Gpsin = Waitkey(#2)
While Gpsin = ","
Gpsin = Waitkey(#2)
Count = Count + 1
If Count = 5 Then Goto Start
Wend
Y(x) = Gpsin - 48
Next X
 
Z = Y(1) * 10
Z = Z + Y(2)
Z = Z + 1
If Z = 24 Then Z = 0
 
If Pinc.1 = 1 Then Z = Z + 1
 
If Z = 24 Then Z = 0
Y(1) = Z / 10
Y(2) = Z Mod 10
 
 
 
If Pinc.5 = 0 Then Incr Jednostki
If Pinc.4 = 0 Then Incr Dziesiatki
If Pinc.3 = 0 Then Incr Setki
 
If Jednostki = 10 Then Incr Dziesiatki
If Jednostki = 10 Then Jednostki = 0
If Dziesiatki = 10 Then Incr Setki
If Dziesiatki = 10 Then Dziesiatki = 0
If Setki = 10 Then Incr Tysiace
If Setki = 10 Then Setki = 0
If Tysiace = 10 Then Tysiace = 0
 
If Y(1) = 0 Then
If Y(2) = 0 Then
If Y(3) = 0 Then
If Y(4) = 0 Then
If Y(5) = 0 Then
If Y(6) = 0 Then
Incr Jednostki
 
End If
End If
End If
End If
End If
End If
 
Y(7) = Jednostki
Y(8) = Dziesiatki
Y(9) = Setki
Y(10) = Tysiace
 
Kopia(7) = Y(7)
Kopia(8) = Y(8)
Kopia(9) = Y(9)
Kopia(10) = Y(10)
 
Kopia(7) = Lookup(kopia(7) , Tabela2)
Kopia(8) = Lookup(kopia(8) , Tabela2)
Kopia(9) = Lookup(kopia(9) , Tabela2)
Kopia(10) = Lookup(kopia(10) , Tabela2)
 
Loop
End
 
Co4ms:
Timer0 = 110
 
   Incr Mux
   If Mux = 4 Then Mux = 0
 
   Select Case Mux
 
 
   Case 0:
 
   Reset Portb.5
   Portd = Kopia(7)
   Set Portb.2
 
   Case 1:
 
   Reset Portb.2
   Portd = Kopia(8)
   Set Portb.3
 
   Case 2:
 
   Reset Portb.3
   Portd = Kopia(9)
   Set Portb.4
 
   Case 3:
 
   Reset Portb.4
   Portd = Kopia(10)
   Set Portb.5
 
 
 
End Select
 
 
Return
 
Tabela2:
    Data 63 , 6 , 91 , 79 , 102 , 109 , 125 , 7 , 127 , 111 , 0

Obsługi wyswietlania godziny tu nie ma, ale to nie problem.

Problem pojawił się gdy zachciało mnie się takiego samego licznika
ale liczącego w dół od zadanej wartości.
Jakieś podpowiedzi ?