7 segmentni displej u multiplexu

Rasprava o PIC mikrokontrolerima, PIC projekti i drugo vezano za PIC-eve...

Moderators: pedja089, stojke369, [eDo], trax

Post Reply
gagi011bg
Penjem se :)
Penjem se :)
Posts: 89
Joined: 18-03-2012, 02:04

7 segmentni displej u multiplexu

Post by gagi011bg »

Pozdrav svima :)
Hteo bih da napravim sa 7 segmentnim displejom(Comon Catode) u multiplexu da mi prikazuje brojeve koje podesim i upiše u EEprom memoriju.

Sad ja sam napisao kod u PICBasic Pro...mada je malo traljavo... koliko sam znao,... :D ali radi u principu.... u proteusu...jedino ako neko može da mi pomogne oko koda...da se prepravi.... pravi mi problem kada podešavam brojeve ne mogu da pritiskam taster da podešavam.... nego moram da ga držim TASTER za podešavanje da bih podesio broj.... jer nisam znao kako da rešim petlju za podešavanje i preskoči mi broj....

Npr. ako hocu da u prvoj cifri podesim broj 4...prekoči mi na broj 5.....

Treba da radi po sistemu:
Prvi taster se pritisne... ugase se sve cifre i upali se samo prva tj. ona koja se podešava...
Drugim Tasterom podesi se žejni broj... i onda opet Prvi taster na sledeći broj i tako redom... do 4 cifre....

EVO I CODA u PicBasic Pro:

Code: Select all

Cmcon = 7 
TRISB =00000000 'set all PORTB pins as output
symbol brzina=10  'BRZINA PALJENJA MULTIPLEXA

SYMBOL DISPLEJ_1= PORTA.3
SYMBOL DISPLEJ_2= PORTA.2
SYMBOL DISPLEJ_3= PORTA.1
SYMBOL DISPLEJ_4= PORTA.0
SYMBOL TASTER_JEDAN = PORTA.4
SYMBOL TASTER_DVA = PORTA.7

INPUT porta.4
INPUT porta.7

output portb.0
output portb.1
output portb.2
output portb.3
output portb.4
output portb.5
output portb.6
output portb.7


LOW DISPLEJ_1 
LOW DISPLEJ_2 
LOW DISPLEJ_3 
LOW DISPLEJ_4
PORTB=0


Mem_broj VAR BYTE
I VAR byte
TEMP VAR byte

Citaj_memoriju:
READ 0,Mem_broj(1):READ 1,Mem_broj(2):READ 2,Mem_broj(3)
READ 3,Mem_broj(4)

;**************************************************
PROGRAM:
IF TASTER_JEDAN = 0 THEN
PORTB=128
PAUSE 1000 
goto SET_PRV_BR
endif
   
HIGH DISPLEJ_2 :HIGH DISPLEJ_3 :HIGH DISPLEJ_4

LOW DISPLEJ_1
PORTB=Mem_broj(1) :PAUSE BRZINA

HIGH DISPLEJ_1:LOW DISPLEJ_2
PORTB=Mem_broj(2):PAUSE BRZINA
PORTB=128:PAUSE BRZINA

HIGH DISPLEJ_2: LOW DISPLEJ_3
PORTB=Mem_broj(3):PAUSE BRZINA

HIGH DISPLEJ_3: LOW DISPLEJ_4
PORTB=Mem_broj(4):PAUSE BRZINA

GOTO PROGRAM
;**************************************************

SET_PRV_BR:

FOR I = 0 TO 11 
IF TASTER_dva = 0 THEN 

HIGH DISPLEJ_2 :HIGH DISPLEJ_3 :HIGH DISPLEJ_4
LOW DISPLEJ_1
PORTB=Mem_broj(1):PAUSE 350
HIGH DISPLEJ_1


Lookup i,[0,63,6,91,79,102,109,125,7,127,111],TEMP
Mem_broj(1) = temp

write 0,Mem_broj(1)
endif

next i

IF TASTER_JEDAN = 0 THEN
PORTB=Mem_broj(2)
PAUSE 1000 
GOTO SET_DRG_BR
ENDIF


HIGH DISPLEJ_2 :HIGH DISPLEJ_3 :HIGH DISPLEJ_4
LOW DISPLEJ_1
PORTB=Mem_broj(1) :PAUSE BRZINA
HIGH DISPLEJ_1

GOTO SET_PRV_BR

;*************************************************
SET_DRG_BR:

FOR I = 1 TO 11 
IF TASTER_dva = 0 THEN 

HIGH DISPLEJ_1 :HIGH DISPLEJ_3 :HIGH DISPLEJ_4
LOW DISPLEJ_2
PORTB=Mem_broj(2) :PAUSE 400
HIGH DISPLEJ_2

Lookup i,[0,63,6,91,79,102,109,125,7,127,111],TEMP
Mem_broj(2) = temp

write 1,Mem_broj(2)
endif
next i

IF TASTER_JEDAN = 0 THEN 
PAUSE 1000 
GOTO SET_TRI_BR
ENDIF

HIGH DISPLEJ_1 :HIGH DISPLEJ_3 :HIGH DISPLEJ_4
LOW DISPLEJ_2
PORTB=Mem_broj(2) :PAUSE BRZINA
HIGH DISPLEJ_2

GOTO SET_DRG_BR

;**************************************************************

SET_TRI_BR:
FOR I = 1 TO 11 
IF TASTER_dva = 0 THEN 

HIGH DISPLEJ_1 :HIGH DISPLEJ_2 :HIGH DISPLEJ_4
LOW DISPLEJ_3
PORTB=Mem_broj(3) :PAUSE 400
HIGH DISPLEJ_3

Lookup i,[0,63,6,91,79,102,109,125,7,127,111],TEMP
Mem_broj(3) = temp

write 2,Mem_broj(3)
endif
next i

IF TASTER_JEDAN = 0 THEN 
PAUSE 1000
GOTO SET_CET_BR
ENDIF

HIGH DISPLEJ_1 :HIGH DISPLEJ_2 :HIGH DISPLEJ_4
LOW DISPLEJ_3
PORTB=Mem_broj(3) :PAUSE BRZINA
HIGH DISPLEJ_3
GOTO SET_TRI_BR

;**************************************************************
SET_CET_BR:
FOR I = 1 TO 11 
IF TASTER_dva = 0 THEN 

HIGH DISPLEJ_1 :HIGH DISPLEJ_2 :HIGH DISPLEJ_3
LOW DISPLEJ_4
PORTB=Mem_broj(4) :PAUSE 400
HIGH DISPLEJ_4

Lookup i,[0,63,6,91,79,102,109,125,7,127,111],TEMP
Mem_broj(4) = temp

write 3,Mem_broj(4)
endif
next i

IF TASTER_JEDAN = 0 THEN 
PAUSE 1000
GOTO Citaj_memoriju
ENDIF

HIGH DISPLEJ_1 :HIGH DISPLEJ_2 :HIGH DISPLEJ_3
LOW DISPLEJ_4
PORTB=Mem_broj(4) :PAUSE BRZINA
HIGH DISPLEJ_4
GOTO SET_CET_BR 
Attachments
DISPLEJ.jpg
DISPLEJ.jpg (45.12 KiB) Viewed 9210 times
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7876
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: 7 segmentni displej u multiplexu

Post by pedja089 »

Na dnu ovog posta imas objasnjeno kako da se kod izvrsava na promenu stanja tastera, a ne na drzanje. Pa vidi kako bi ga ubacio...
http://www.elektronika.ba/forum/viewtop ... 9&start=32
gagi011bg
Penjem se :)
Penjem se :)
Posts: 89
Joined: 18-03-2012, 02:04

Re: 7 segmentni displej u multiplexu

Post by gagi011bg »

Hvala Pedja na odgovoru :D
Pogledao sam i probao sa onim predlogom

Code: Select all

CODE: SELECT ALL
SYMBOL LED=PORTB.7
SYMBOL TASTER=PORTB.0
OUTPUT LED
INPUT TASTER
NovoStanje var bit
StaroStanje var bit
starostanje = taster ' ovde se uzima pocetno stanje, tj stanje kada je taster pusten  
Pocetak:     
novostanje = taster        'OVDE SE UZIMA TRENUTNO STANJE NA TASTERU
if novostanje<starostanje then ' OVDE SE UPOREDJUJU STANJA. AKO JE TASTER STISNUT TADA JE NOVO STANJE JEDNAKO 0 I SAMIM TIM JE MANJE OD STAROG STANJA
HIGH led                 'PALI LED
PAUSE 500                'PAUZA POLA SEKUNDE
LOW LED                  'GASI LED
ENDIF
STAROSTANJE=NOVOSTANJE   'OVAJ RED JE POTREBAN IZ RAZLOGA DA PRI PONOVNOM NAILASKU NA IF PROMENLJIVA NNOVO STANJE NE BI BILA MANJA OD STAROG STANJA. U OVOM SLUCAJU SE IZJEDNACAVAJU. I TAK KADA SE PROMENI STANJE SA 1 NA 0 ONDA CE SE LEDICA UPALITI
GOTO POCETAK   
END

Nisam bas uspeo...verovatno neznam za to da ukombinujem...
Ako si mislio na taj primer...
Nece da svaki pristskom na taster promeni broj 1...9

Kada postavim

Code: Select all

NovoStanje var bit
StaroStanje var bit
u zaglavlju...nece taster uopste da mi reaguje... :roll: onda ni kad ga drzim...

Trebalo bi predpostavljam kada u petlju For i= 1 to 10 da kada pritisnem taster ispise jedan broj i stane...čeka ponovo pritisak tastera... ali on okrece sve brojeve od 0-9 i tek onda stane...neznam da li sam petlju postavio na pravom mestu....
User avatar
WhiteHead
Pravi forumaš
Pravi forumaš
Posts: 1627
Joined: 28-06-2007, 18:36
Location: 75,35k; B&H

Re: 7 segmentni displej u multiplexu

Post by WhiteHead »

gagi011bg wrote: Trebalo bi predpostavljam kada u petlju For i= 1 to 10 da kada pritisnem taster ispise jedan broj i stane...čeka ponovo pritisak tastera... ali on okrece sve brojeve od 0-9 i tek onda stane...neznam da li sam petlju postavio na pravom mestu....
Konkretno za to, ovo mora raditi:

Code: Select all

NovoSt var bit
StaroSt var bit
NekiBroj var byte
I var byte
Do while I>9
NovoSt=Taster
if NovoSt<StaroSt then' (pod uslovom da pritisnut taster znači logičku nulu)
   NekiBroj=I' (ili NekiBroj=NekiBroj+1)
   I=I+1
endif
StaroSt=NovoSt
Loop
Ovo je samo jedan od načina
Ako kaniš pobijediti, ne smiješ izgubiti
gagi011bg
Penjem se :)
Penjem se :)
Posts: 89
Joined: 18-03-2012, 02:04

Re: 7 segmentni displej u multiplexu

Post by gagi011bg »

Hvala WhiteHead na pomoći :)

Imam jedan problem sto kada unesem ovaj deo Do while I>9 izabcije mi grešku... neće While bez Wend...

Ovo je deo koda koji mi pravi problem,da kada pritisnem TASTER_dva treba da okrene samo jednu cifru iz Lookup i stane... i da sačeka ponovo pritisak tastera i ide na drugi broj... on mi uvek vrati na prvi broj u Lookup-u...e to me buni kako da rešim???

Da praktično svakim pritiskom tastera TASTER_dva promeni drugi Mem_broj(1) u Lookup-u to mi je potrebno

Code: Select all

;**************************************************

SET_PRV_BR:

FOR I = 0 TO 11 
IF TASTER_dva = 0 THEN 

HIGH DISPLEJ_2 :HIGH DISPLEJ_3 :HIGH DISPLEJ_4
LOW DISPLEJ_1
PORTB=Mem_broj(1):PAUSE 350
HIGH DISPLEJ_1


Lookup i,[0,63,6,91,79,102,109,125,7,127,111],TEMP
Mem_broj(1) = temp

write 0,Mem_broj(1)
endif

next i

IF TASTER_JEDAN = 0 THEN
PORTB=Mem_broj(2)
PAUSE 1000 
GOTO SET_DRG_BR
ENDIF


HIGH DISPLEJ_2 :HIGH DISPLEJ_3 :HIGH DISPLEJ_4
LOW DISPLEJ_1
PORTB=Mem_broj(1) :PAUSE BRZINA
HIGH DISPLEJ_1

GOTO SET_PRV_BR

;*************************************************
gagi011bg
Penjem se :)
Penjem se :)
Posts: 89
Joined: 18-03-2012, 02:04

Re: 7 segmentni displej u multiplexu

Post by gagi011bg »

Ja sam pokušao ovako nešto..ali opet ne radi...
stavio u zaglavlju ovo:

Code: Select all

Mem_broj VAR BYTE
I VAR byte
TEMP VAR byte
NovoSt var bit
StaroSt var bit
I ovo u codu:

Code: Select all

While I>9
NovoSt=TASTER_dva
if NovoSt<StaroSt then  
Mem_broj(1)=I           
I=I+1
Lookup I,[0,63,6,91,79,102,109,7,127,111],TEMP
Mem_broj(1) = TEMP
endif
Wend
StaroSt=NovoSt 
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7876
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: 7 segmentni displej u multiplexu

Post by pedja089 »

Staro=novo treba da bude iznad wend
gagi011bg
Penjem se :)
Penjem se :)
Posts: 89
Joined: 18-03-2012, 02:04

Re: 7 segmentni displej u multiplexu

Post by gagi011bg »

Jel ovako Pedja

Code: Select all

While I>9
NovoSt=TASTER_dva
if NovoSt<StaroSt then  
Mem_broj(1)=I           
I=I+1
Lookup I,[0,63,6,91,79,102,109,7,127,111],TEMP
Mem_broj(1) = TEMP
endif
StaroSt=NovoSt 
Wend
Neće i ovako samo mi blikne broj... i ugasi se.. i TASTER_dva ne reaguje upošte....
gagi011bg
Penjem se :)
Penjem se :)
Posts: 89
Joined: 18-03-2012, 02:04

Re: 7 segmentni displej u multiplexu

Post by gagi011bg »

Kada izbacim While i Wend.. vrati mi se broj ali neće da prebacuje brojeve....
gagi011bg
Penjem se :)
Penjem se :)
Posts: 89
Joined: 18-03-2012, 02:04

Re: 7 segmentni displej u multiplexu

Post by gagi011bg »

Izgleda da sam ja ovo mnogo zapetljao.... :shock:

Jel ima neko neki link ili kod u Picbasic pro, meni u stvari treba sve isto kao i neki Tajmer sa 4 cifre u multiplexu..sve je u principu isto...treba samo da podesim sa tasterima neki željeni broj od 4 cifre i to upiše u memoriju Eeproma to je ceo princip šta mi treba... i NE odbrojava nego ostaju ti podešeni brojevi.... to je cela zamisao...
User avatar
WhiteHead
Pravi forumaš
Pravi forumaš
Posts: 1627
Joined: 28-06-2007, 18:36
Location: 75,35k; B&H

Re: 7 segmentni displej u multiplexu

Post by WhiteHead »

Uh sorry, ja sam umjesto WEND stavio LOOP
Radio sam timer opisan ovdje:
http://www.elektronika.ba/forum/viewtop ... r&start=20

A kod s kojim radi je:

Code: Select all

TRISB=0
trisa=%00011101
portb=0
S VAR WORD
SZ var word
Br0 var byte
Br1 var byte
Br2 var byte
t var byte
C var bit
symbol Rele = porta.1    
symbol Pr = porta.4 
symbol Start= porta.3
symbol Sttop= porta.2        
rele=0
read 0,sz.highbyte 'cita iz eproma pocetnu vrijednost timera
read 1,sz.lowbyte
if sz>999 or sz=0 then sz=220 'ako nije zadata postavlja na 220 sec.
c=0

Pocetak:
 if pr=1 then  'ako nije stisnut tast za setovanje
   if start=0 then c=1 'i ako je stisnut tast start
   if sttop=0 then c=0 'ili tast stop
   if S>0 and c=1 then 
     rele = 1
   endif
   if S=0 or c=0 then
     rele =0
     c=0
     s=sz
   endif 
   if c=1 then 
     S=S-1
     goto disp
   endif 
   goto disp1
  '<<PR=0>>---postavljkanje vrednosti----------------------------------------- 
 else  'ako je stisnut tast za setovanje
   rele=0
   'smanjivanje 
   if sttop=0 AND S>1 then     
     S=S-1
     goto Disp1
   endif
   'povecavanje
   if start=0 and S <999 then     
     S=S+1
     goto Disp1
   ENDIF
    sz=s
    goto disp1
 endif

Disp:  'prikazivanje merene vrednosti i traje 1S
 br2=S DIG 2
 br1=S dig 1
 br0=S dig 0
 for t=0 to 99
    portb= br2+ 32
    pause 3
    portb= br1+64
    pause 4
    portb= br0+ 128 
    pause 3 
 next t
 goto pocetak

Disp1: 'prikazivanje iz i traje 100mS
 br2=S DIG 2
 br1=S dig 1
 br0=S dig 0
 for t=0 to 10   
    portb= br2+ 32 
    pause 3
    portb= br1+64
    pause 4
    portb= br0+ 128
    pause 3 
 next t
 goto pocetak
end
Mislim da je ovaj kod Peđin iz kratkog kursa PBP
LP
Ako kaniš pobijediti, ne smiješ izgubiti
gagi011bg
Penjem se :)
Penjem se :)
Posts: 89
Joined: 18-03-2012, 02:04

Re: 7 segmentni displej u multiplexu

Post by gagi011bg »

Hvala WhiteHead :)

Mislim da ću uspeti da iskoristim od ovog tajmera, za ovo moje.... u principu to je to.. samo ću da izbacim 74ls47.., nije mi preko potreban...da dodam još jednu cifru i da namestim da može da se podešava broj po broj... jel mi ja tako potrebno....
Post Reply