podprogram pro LED displej
Moderátor: Moderátoři
podprogram pro LED displej
Dobrý den, nemáte někdo podprogram pro PIC co by zjistil hodnotu z W a následně ji ukázal na LED displeji?
- monterjirka
- Příspěvky: 2761
- Registrován: 14 čer 2003, 02:00
- Bydliště: Blížejov
Někdy v roce 2002 - 2003 vycházel v KTE magazínu dobře udělaný kurz základů programování PIC zaměřený na přípravek CHIPON, tam je popsaná komunikace PIC s displejem,...
http://www.gmelectronic.eu/index.php/cz ... o-plus-kte
http://www.gmelectronic.eu/index.php/cz ... o-plus-kte
Doufám, ze LED displejem myslíš sedmisegmentovku. Pokud ne, tak tento příspěvek možná nebude splňovat to, co jsi chtěl.
K tomuto účelu se používá tabulka.
Tabulku musis mit hned nekde na zacatku programu. Ber to jen jako vytazek z meho kodu. Ty si ji nastav jak potrebujes.
Pokud chces zobrazit viceciferne cislo, musis toto cislo nejprve rozdelit na BCD kod.
Toto pouzivam ja.
Hodne zdaru
K tomuto účelu se používá tabulka.
Kód: Vybrat vše
TAB_ZNAKU ;TADY SE PREVEDE CISLO ci HODNOTA NA 8-BITOVE CISLO, KTEREMU ODPOVIDA ZOBRAZENI NA 7.SEGMENTOVCE
; ;V NEGATIVNI LOGICE - TZN. LOG.0 = SVITI , LOG.1 = NESVITI
ADDWF PCL,F
ZN0 RETLW B'01010000' ;0
ZN1 RETLW B'01011111' ;1
ZN2 RETLW B'00110010' ;2
ZN3 RETLW B'00010110' ;3
ZN4 RETLW B'00011101' ;4
ZN5 RETLW B'10010100' ;5
ZN6 RETLW B'10010000' ;6
ZN7 RETLW B'01011110' ;7
ZN8 RETLW B'00010000' ;8
ZN9 RETLW B'00011100' ;9
ZNA RETLW B'00011000' ;10
ZNB RETLW B'10000011' ;11
ZNC RETLW B'11110000' ;12
ZND RETLW B'00010011' ;13
ZNE RETLW B'10110000' ;14
ZNF RETLW B'10111000' ;15
ZNX RETLW B'11111111' ;16
ZNST RETLW B'00111100' ;17
ZNS RETLW B'10010100' ;18
ZNU RETLW B'01010001' ;19
ZNN RETLW B'10011011' ;20
ZNR RETLW B'10111011' ;21
ZNMINUS RETLW B'10111111' ;22
ZNT RETLW B'10110001' ;23
ZNJ RETLW B'01010011' ;24
ZNO RETLW B'10010011' ;25
ZNH RETLW B'00011001' ;26
ZNY RETLW B'00111001' ;27
ZNL RETLW B'11110001' ;28
Pokud chces zobrazit viceciferne cislo, musis toto cislo nejprve rozdelit na BCD kod.
Kód: Vybrat vše
PREVODBCD ;PREVADENA HODNOTA MUSI BYT VE W REG.
CLRF BCD1
CLRF BCD10
CLRF BCD100
;STOVKY
movwf TMP0 ;NACTI HODNOTU Z W (PREVADENE CISLO) DO TMP0
clrf TMP1 ;VYMAZ TMP1
movlw .100 ;100dec do W reg.
STOVKY incf TMP1,F ;PRICTI 1 V reg. TMP1
subwf TMP0,F ;ODECTI TMP0-W A ULOZ DO TMP0
btfsc STATUS,C ;TEST, ZDA ODECET BYL PRES 0
goto STOVKY ;VRAT SE NA STOVKY
decf TMP1,W ;PRICTI JEDNA DO TMP1 A VYSLEDEK ULOZ DO W
movwf BCD100 ;VYSLEDEK OPERACE (vWreg.) PRESUN DO reg.BCD100
;DESITKY
movlw .100 ;100dec do W reg.
addwf TMP0,F
clrf TMP1
movlw .10 ;10dec do W reg.
DESITKY
incf TMP1,F
subwf TMP0,F
btfsc STATUS,C
goto DESITKY
decf TMP1,W
movwf BCD10 ;VYSLEDEK OPERACE (vWreg.) PRESUN DO reg.BCD10
;JEDNOTKY
movlw .10 ;10dec do W reg.
addwf TMP0,F
clrf TMP1
movlw .1 ;1dec do W reg.
JEDNOTKY
incf TMP1,F
subwf TMP0,F
btfsc STATUS,C
goto JEDNOTKY
decf TMP1,W
movwf BCD1 ;VYSLEDEK OPERACE (vWreg.) PRESUN DO reg.BCD1
RETURN
;Vysledek operace je v registrech BCD100, BCD10, BCD1
Hodne zdaru
Žádnej učenej z nebe nespadl ...
Není nutné aby to bylo na začátku programu.Taky je možno
před danou poslopnost příkazu napsat direktivu např. ORG 256
a překladač umístí tento kód od adresy H100,tedy na začátek
druhé stránky paměti programu.Pak stačí před voláním přepnout stánku
a volat dekódování znaku.
ToMastře ,ta podmínka v ASSEMBLERU se napíše přesně tak jak jsi
ji napsal.Assembler zná mnohem víc příkazů než jen samotné instrukce
mikrokontroléru.If,else ... jsou jedny z nich.
před danou poslopnost příkazu napsat direktivu např. ORG 256
a překladač umístí tento kód od adresy H100,tedy na začátek
druhé stránky paměti programu.Pak stačí před voláním přepnout stánku
a volat dekódování znaku.
ToMastře ,ta podmínka v ASSEMBLERU se napíše přesně tak jak jsi
ji napsal.Assembler zná mnohem víc příkazů než jen samotné instrukce
mikrokontroléru.If,else ... jsou jedny z nich.
To nejde.ale když dám if(TLAC == 1)
if - else - endif jsou direktivy překladače pro podmíněný překlad.
Příklad části kódu, která je jiná pro pic16xx a pic18xx.
Kód: Vybrat vše
#define pic 16
;#define pic 18
;kód:
...
...
if(pic==16) ;pic musí být konstanta, známá v době překladu
MOVLW 1
...
...
else
MOVLW 5
...
...
endif
...
Zkrátka if() nejde použít v kódu pro testování bitů nebo registrů.
Musíš použít výhradně instrukce z instrukční sady.
Např.
Napíšeš takto
Snad to mám dobře, dávno tomu co jsem dělal s Picama.
Musíš použít výhradně instrukce z instrukční sady.
Např.
Kód: Vybrat vše
if(PORTB.0 == 0)
W = 5
else
W = 10
Kód: Vybrat vše
BTFSS PORTB,0
GOTO B
MOVLW 10
GOTO END
B: MOVLW 5
END: