Zdravím všetkých.
Učím sa programovať PIC-ká potrebujem poradiť pri návrhu multiplexného ovládania troch 7-segmentoviek picom 16f627 ktorý pracuje ako počítadlo impulzov na vstupe RA4.Použil som TMR0 ako čítač
a chcem jeho “obsah” dostať na segmenty.Zatiaľ som sfunkčnil len jeden segment no neviem ako previesť číslo 0-255 na tri segmentovky zapojené zo spoločnou anódou.Anódy jednotlivých segmentoviek sa zapoja na výstupy RA0/2.Výstupy RB0/6 sú paralelne prepojené z jednotlivými segmentmi displejov.Vstup RA4 som zatiaľ zámerne neošetril proti zákmitom kvôli jednoduchosti.
Budem vďačný za každú radu ,prípadne za hotový zdroják na ktorom sa dá pochopiť tento problém.
Zatiaľ vďaka .Relatko.
citac.asm (1.99 KB)
Zdravim,
toto sem řešil tak že sem si vyhranil tři volné registry stovky, desitky, jednotky (nazval sem si je takto XOO,OXO,OOX) a to číslo sem si do nich rozložil. takže například: 154 bylo rozloženo > XOO=1, OXO=5, OOX=4. pak sem použil tabulku čísel jak maš vytvořenou pro zobrazení jednotlivých čísel.
průběh programu vypadal asi takto:
XOO na portB
zapni segnem XOO
počekj chvilku
zhasni segnent XOO
OXO na portB
zapni segmet OXO
počkej chvilku
zhasni segnent OXO
OOX na portB
zapni segnent OOX
počkej chvilku
zhasni segnent OOX
Zdravím.
Chcem sa opýtať ako rozdelím číslo uložené v jednom registri na tri čísla
v troch registroch,obsahujúce stovky,desiatky a jednotky?
Čítal som niečo o zamaskovaní horných a potom dolných štyroch bitov
ale nerozumiem tomu veľmi.Ďalší postup ako zobraziť na “chvíľu”
jednotky ,desiatky a stovky chápem.
Zatiaľ vďaka.Relatko.
HEX císlo rozdělíš na DEC číslo tímhle podprogramem, registry si uprav dle svojích názvů
Před volaním podprogramu dej HEX číslo do W.
;**************************************************************************
; Prevod Hex 8bit na DEC T3,T2,T1
;**************************************************************************
HexDec
banksel TMP0
movwf TMP0
clrf TMP1
banksel T1
CLRF T1
CLRF T2
Rad100
banksel TMP0
MOVLW .100
SUBWF TMP0,W ;TMP0-100
MOVWF TMP2 ;TMP2
BTFSC STATUS,C ;zaporne?
GOTO Uloz ;NE
MOVLW .1 ;
SUBWF TMP1,W ;TMP1-1
BTFSS STATUS,C ;kladne?
GOTO Rad10 ;NE
MOVWF TMP1 ;
MOVF TMP2,W
Uloz
banksel TMP0
MOVWF TMP0
banksel T2
INCF T2,F ;+1
GOTO Rad100
Rad10
banksel TMP0
MOVLW .10
SUBWF TMP0,W ;TMP0-10
BTFSS STATUS,C ;kladne?
GOTO End10 ;NE
MOVWF TMP0
banksel T1
INCF T1,F ;+1
GOTO Rad10
End10
banksel TMP0
MOVF TMP0,W
banksel T0
MOVWF T0 ;T0,1,2=vysledna hodnota
banksel 0
return
Myslim že tím, že mu předhodíš hotový program téměř bez popisu, začátečníkovi nepomůžeš.
Hodnotu z registru na 3 cifry rozdělíš takle: (Jedno z mnoha řešení)
stovky = reg / 100
desitky = zbytekpodeleni / 10
jednotky = zbytekpodeleni
Aha,promiň,to mi nějak nedošlo
*banksel * T0 je výběr registru. Je to náhrada za BSF nebo BCF STATUS,RP0 nebo RP1, viz kapitola 3.2 v datasheetu. Mám to tam proto, že kdybych náhou předělal registry do jiné banky než 0, nemusím se starat o banky.
Je to vytažené z kousku programu, kde TMPx je v BANK0 a Tx je v BANK2. Pokud používaš zatím jen BANK0, tak to tam mít nemusíš.
Pred voláním HEX16 dej do NumH a NumL 16bit číslo. V DEC1xxxx budeš mít výsledek.
Proč se to jmenuje:"Prevod Hex 16bit ", když to má převádět binární číslo?
Nebudeš tomu věřit, ale čekal jsem, že se zeptáš.
Sice je to binární číslo, ale v programu, ze kterého jsem to vytáhl, tak to tak mám, aby se mi to nepletlo. BIN 11111111 11111111 je DEC 65535, ale 2 registry po 0x255 jsou taky 65535, jinak 0xFFFF, když je spojiš. A v programech nepoužívám BINární čísla moc často, vetšinou HEX a DEC.
A psal jsem v 3 ráno, tak se mi to nechtělo moc přepisovat.
Mám to přepsat?
Nevím jestli je to dobře nebo špatně, že jsem tak průhlednej.
Ale šlo mi o to, že je to trochu zavádějící i když se tenhle obrat běžně používá.
V každém případě jsem si algoritmus zkusil a funguje.
Můžu doporučit
microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en529949
Tam je vícero algoritmů i ten Bin16BCD
Zdravím.
Všetkým ďakujem,mám vo veci úplne jasno.Relatko.
Já beru příklady odsud