Seriál - PIC16F84 - 23 - Zobrazovače úvod a multiplexní režim
11. 01. 08 - 20:25. Napsal Jiří Chytil. Přečteno 6618x. 8 komentářů
Když budete dělat s MCU, tak se snad vždy naskytne nutnost něco zobrazit. Možnosti jak stav, výsledek nebo cokoliv jiného zobrazit je několik, od jediné diody, přes sedmi segmentové displeje až po grafické displeje a PCčka.
Zobrazení pomocí diod jsme používali po celou dobu. Nyní je čas přejít na něco trochu jiného a v prvé řadě to budou sedmi segmentové displeje. V dnešní době máme většinou displeje, které mají společnou ANODU. Použít můžeme i displej LCD. Běžně jsou v nabídce se zobrazením 3,5 nebo 4 znaků. Jenže se nám zde objevuje problém, už když bychom na PIC16F84A chtěli připojit dva sedmi segmentové displej napřímo, neměli bychom dostatek vývodů, a co teprve kdyby displejů bylo 6 nebo dokonce ještě víc?
Při realizaci zapojení je nutné počítat s ochrannými odpory pro jednotlivé segmenty (nejsou z úsporných důvodů zakresleny).
Řešení problémů je ohromná spousta a také má velký vliv na počet zabraných vývodů. Zatím co pokud bychom chtěli celé zapojení realizovat bez přídavných integrovaných obvodů, bylo by pro 4 sedmi segmentovky nutných minimálně 7+4 vývody, tedy 11 vývodů. Pokud bychom ovšem použili pouhé dva integrované obvody, stáhneme počet na 6 vývodů, to je skoro poloviční úspora a ušetřit se dá ještě více. Prvně se ale podíváme na zobrazovaní na jediném display. Kód je poměrně jednoduchý a je zde ukázán i převod z BCD na 7seg. Samotné zobrazení spočívá pouze s přesunem hodnot na PORTB.
INCLUDE "P16F84A.INC" LIST P=16F84A, R=DEC __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC ;------------------------------------------------------------- dat EQU H'0C' c1 EQU H'0D' c2 EQU H'0E' program BSF STATUS,RP0 ;inicializace uP MOVLW b'00000000' MOVWF TRISB BCF STATUS,RP0 CLRF dat run CALL wait ;hlavní běh programu INCF dat,1 CALL print MOVLW b'00001010' SUBWF dat,0 BTFSC STATUS,Z CALL clearB goto run print MOVLW b'00000000' ;struktura která rozhoduje o tom SUBWF dat,0 ;které číslo bude na BTFSC STATUS,Z ;7 segmentovém displeji CALL print0 ;zobrazeno BCF STATUS,Z MOVLW b'00000001' SUBWF dat,0 BTFSC STATUS,Z CALL print1 BCF STATUS,Z MOVLW b'00000010' SUBWF dat,0 BTFSC STATUS,Z CALL print2 BCF STATUS,Z MOVLW b'00000011' SUBWF dat,0 BTFSC STATUS,Z CALL print3 BCF STATUS,Z MOVLW b'00000100' SUBWF dat,0 BTFSC STATUS,Z CALL print4 BCF STATUS,Z MOVLW b'00000101' SUBWF dat,0 BTFSC STATUS,Z CALL print5 BCF STATUS,Z MOVLW b'00000110' SUBWF dat,0 BTFSC STATUS,Z CALL print6 BCF STATUS,Z MOVLW b'00000111' SUBWF dat,0 BTFSC STATUS,Z CALL print7 BCF STATUS,Z MOVLW b'00001000' SUBWF dat,0 BTFSC STATUS,Z CALL print8 BCF STATUS,Z MOVLW b'00001001' SUBWF dat,0 BTFSC STATUS,Z CALL print9 BCF STATUS,Z RETURN print0 MOVLW b'01000000' ;zobrazení čísla 0 MOVWF PORTB RETURN print1 MOVLW b'01111001' ;zobrazení čísla 1 MOVWF PORTB RETURN print2 MOVLW b'00100100' ;zobrazení čísla 2 MOVWF PORTB RETURN print3 MOVLW b'00110000' ;zobrazení čísla 3 MOVWF PORTB RETURN print4 MOVLW b'00011001' ;zobrazení čísla 4 MOVWF PORTB RETURN print5 MOVLW b'00010010' ;zobrazení čísla 5 MOVWF PORTB RETURN print6 MOVLW b'00000010' ;zobrazení čísla 6 MOVWF PORTB RETURN print7 MOVLW b'01111000' ;zobrazení čísla 7 MOVWF PORTB RETURN print8 MOVLW b'00000000' ;zobrazení čísla 8 MOVWF PORTB RETURN print9 MOVLW b'00010000' ;zobrazení čísla 9 MOVWF PORTB RETURN clearB MOVLW b'01111111' ;nulování registru data MOVWF PORTB ;a zhasnutí displeje CLRF dat RETURN wait MOVLW 255 ;podprogram čekání MOVWF c2 wait2 MOVLW 255 MOVWF c1 wait1 DECFSZ c1,1 GOTO wait1 DECFSZ c2,1 GOTO wait2 RETURN END
Prvním řešením zobrazení na více displejích je tedy multiplexní provoz, je založen na nedokonalosti lidského oka. Takže displej vlastně nesvítí, ale velice rychle bliká. Mikrořadič první rožne potřebné segmenty na displeji prvním, potom se přesune na druhý, a tak dál, a tak dál. Toto se celé opakuje mnohokrát za sekundu.
Kód, který takové zobrazení zajistí, není příliš složitý. Mnohem složitější by byl kód, který by převáděl z binární hodnoty na hodnotu BCD nebo přímo na 7segmentový displej.
INCLUDE "P16F84A.INC" LIST P=16F84A, R=DEC __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC ;------------------------------------------------------------- c1 EQU h'0C' program BSF STATUS,RP0 ;inicializace uP MOVLW b'00000000' MOVWF TRISB MOVLW b'00000000' MOVWF TRISA BCF STATUS,RP0 CLRF PORTA display CALL print2 ;zjednodušená ukázka BSF PORTA,0 ;multiplexního režimu CALL wait ;(statická) BCF PORTA,0 CALL print6 BSF PORTA,1 CALL wait BCF PORTA,1 GOTO display print0 MOVLW b'01000000' ;tisk číslic 0 - 9 MOVWF PORTB RETURN print1 MOVLW b'01111001' MOVWF PORTB RETURN print2 MOVLW b'00100100' MOVWF PORTB RETURN print3 MOVLW b'00110000' MOVWF PORTB RETURN print4 MOVLW b'00011001' MOVWF PORTB RETURN print5 MOVLW b'00010010' MOVWF PORTB RETURN print6 MOVLW b'00000010' MOVWF PORTB RETURN print7 MOVLW b'01111000' MOVWF PORTB RETURN print8 MOVLW b'00000000' MOVWF PORTB RETURN print9 MOVLW b'00010000' MOVWF PORTB RETURN wait MOVLW 255 MOVWF c1 wait1 DECFSZ c1,1 GOTO wait1 RETURN END
V další zapojení budeme používat jednoho přídavného obvodu a to převodníku z BCD na 7seg. kód. V zapojení tím ušetříme 3 vodiče. Což někdy může být i více než dost. Ovšem ani zde nám neodpadne nutnost převodu ze šestnáctkového čísla, což je záležitost poněkud komplikovaná.
INCLUDE "P16F84A.INC" LIST P=16F84A, R=DEC __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC ;------------------------------------------------------------- c1 EQU h'0C' program BSF STATUS,RP0 ;inicializace uP MOVLW b'00000000' MOVWF TRISB MOVLW b'00000000' MOVWF TRISA BCF STATUS,RP0 CLRF PORTA display CALL print3 ;zjednodušená ukázka BSF PORTA,0 ;multiplexního režimu CALL wait ;(statická) BCF PORTA,0 CALL print4 BSF PORTA,1 CALL wait BCF PORTA,1 GOTO display print0 MOVLW b'00000000' ;tísk číslic 0 - 9 MOVWF PORTB RETURN print1 MOVLW b'00000001' MOVWF PORTB RETURN print2 MOVLW b'00000010' MOVWF PORTB RETURN print3 MOVLW b'00000011' MOVWF PORTB RETURN print4 MOVLW b'00000100' MOVWF PORTB RETURN print5 MOVLW b'00000101' MOVWF PORTB RETURN print6 MOVLW b'00000110' MOVWF PORTB RETURN print7 MOVLW b'00000111' MOVWF PORTB RETURN print8 MOVLW b'00001000' MOVWF PORTB RETURN print9 MOVLW b'00001001' MOVWF PORTB RETURN wait MOVLW 255 MOVWF c1 wait1 DECFSZ c1,1 GOTO wait1 RETURN END
Ušetřit můžeme ještě více vývodů, například tím, že anody nebudeme spínat přímo z procesoru, ale přes nějaký převodník, 1 z 10 nebo podobný. Toto řešení se vyplatí tím víc, čím víc je sedmi segmentů.
Kód pro toto řešení vůbec uvádět nebudu, protože je ještě jednodušší než pro předchozí zapojení. Potřeba je ovšem dbát na to, aby se displeje stíhali bez problémů rozsvěcovat. A neblikal.
Obnovování (rozsvěcování) displeje lze při běhu nějakého programu provádět pomocí přerušení od časovače, který vždy, když je to nutné a možné, po určitém čase přeruší běh programu a znovu rozsvítí segmenty na displeji a potom se zpět vrátí se své činnosti a to se stále opakuje.
Novinky Další novinky
Anketa
Jaký obchod preferujete při nákupu součástek?
TME
GES
GME
Farnell
SOS electronic
TIPA
EZK
PS Electronic
Mouser
Buček
Denkl Electronic
FK Technics
Hadex
Conrad
Jiný český
Jiný zahraniční
Poslední komentáře