PRINT zobrazit číslo na LCD

vloženo:09.05.2009

 Podprogram zobrazí 4místné číslo na LCD displeji, zarovnané vždy vpravo. Číslo může mít 0 až 3 desetinná místa, může být i záporné a nevýznamné nuly se nezobrazují.

 Příprava před zavoláním podprogramu (CALL PRINT)

  • rozložit binární číslo do 4 řádů R1,2,3,4 (např. pomocí HEXDEC)
  • zadat desetinnou tečku do TE
  • nastavit požadovanou pozici kurzoru v LCD (vždy 1. pozice)

    Pořadí těchto kroků může být libovolné.

R1 - bajt s nejnižším řádem
R4 - bajt s nejvyšším řádem
TE - desetinná tečka
00000000  4321 (žádné desetinné místo)
00000001 432.1
00000010 43.21
00000100 4.321

 Pro zobrazení záporného čísla musí být nastaven (log.1) příznakový bit "Znam" znaménko. Podprogram HEXDEC nastavuje tento příznak automaticky, při převodu.

 


 HEXDEC
převod hexadecimálního čísla na dekadické

 Před zobrazením čísla na LED nebo LCD displeji je potřeba převést číslo z binárního tvaru na jednotlivé řády. Ty se potom zobrazí jako samostatné znaky.

 Například převod binárního čísla 10011010010, uloženého ve dvou bajtech A1 (dolní), A2 (horní). V assembleru se používá hexadecimální zápis, takže A1=0xD2, A2=0x04.
 Podprogram HEXDEC rozloží hodnotu v A1,2 do 4 řádů R1,2,3,4 (R1 je nejnižší řád).
Výstup bude R1=0x04, R2=0x03, R3=0x02, R4=0x01.

 Ještě jeden příklad se stejným číslem, ale záporným.
Binární tvar 1111101100101110.
Hex. tvar A1=0x2E, A2=0xFB.
Výstup po převodu R1=0x04, R2=0x03, R3=0x02, R4=0x01.
Ano je to stejné jako při kladném čísle, ale nyní je nastaven příznak záporného čísla Znam=1, na displeji se tedy zobrazí znaménko mínus.

 Na začátku programu se zjistí, zda je číslo záporné (podle nejvyššího bitu, 1=záporné), pokud ano, nastaví se příznak záporného čísla (Znam=1) a samotné číslo se změní na kladné, binární negace a zvětšení o 1.
 Potom následuje vlastní převod. Pomocí matematického podprogramu LOMENO se číslo dělí tisícem, zbytek stem a nakonec deseti. Výsledky po dělení odpovídají danému řádu, a poslední zbytek po dělení deseti, to už je nejnižší řád R1.

 


 Jak nadefinovat příznak Znam a ostatní registry najdete ve zdrojovém textu LCDIP.
Je tam i jednoduchý doplněk pro pětimístné zobrazování teploty P5M.


 

;-------------------------------;
;            PRINT              ;
;   zobrazit číslo na LCD       ;
;-------------------------------;
;slovak@post.cz       )S(08.2007;
;-------------------------------;
;vstup R4,3,2,1 (R1 nejnižší řád)
;Znam 0=kladné, 1=záporné
;TE desetinná tečka
;00000000  4321 (bez tečky)
;00000001 432.1 (#define TE1 TE,0)
;00000010 43.21 (#define TE2 TE,1)
;00000100 4.321 (#define TE3 TE,2)

PRINT   MOVLW   0x20            ;mezera
        MOVF    TE,F
        BTFSC   SZ
        CALL    WRDATA          ;TE=0, poslat mezeru
PRINT4  MOVF    R4,F            ;řád 1000 [-4321]
        BTFSS   SZ
        GOTO    PZR4            ;nenulové
        BTFSC   TE3
        GOTO    PZR4T           ;TE3=ZAP
        MOVLW   0x20            ;mezera
        CALL    WRDATA
PRINT3  MOVF    R3,F            ;řád 100 [-321]
        BTFSS   SZ
        GOTO    PZR3            ;nenulové
        BTFSC   TE2
        GOTO    PZR3T           ;TE2=ZAP
        MOVLW   0x20            ;mezera
        CALL    WRDATA
PRINT2  MOVF    R2,F            ;řád 10 [-21]
        BTFSS   SZ
        GOTO    PZR2            ;nenulové
        BTFSC   TE1
        GOTO    PZR2T           ;TE1=ZAP
        MOVLW   0x20            ;mezera
        CALL    WRDATA
        CALL    POZN            ;znaménko nebo mezera
        GOTO    PR1

PZR2    CALL    POZN            ;znaménko nebo mezera
PRR2    CALL    POR2            ;řád 10
        BTFSC   TE1
        GOTO    PTR1            ;TE1=ZAP
        GOTO    PR1             ;TE1=VYP

PZR3    CALL    POZN            ;znaménko nebo mezera
        CALL    POR3            ;řád 100
        MOVF    TE,F
        BTFSC   SZ
        GOTO    PR21            ;TE=0
PT2T    BTFSS   TE2
        GOTO    PR2T            ;TE2=VYP
        GOTO    PTR21           ;TE2=ZAP

PZR4    CALL    POZN            ;znaménko nebo mezera
PR4     CALL    POR4            ;řád 1000
        MOVF    TE,F
        BTFSC   SZ
        GOTO    PR321           ;TE=0
        BTFSC   TE3
        GOTO    PTR321          ;TE3=ZAP
        CALL    POR3            ;řád 100
        GOTO    PT2T

PZR2T   CALL    POZN            ;znaménko nebo mezera
PR2T    CALL    POR2            ;řád 10
PTR1    CALL    POTE            ;poslat tečku
        GOTO    PR1

PZR3T   CALL    POZN            ;znaménko nebo mezera
        CALL    POR3            ;řád 100
PTR21   CALL    POTE            ;poslat tečku
        GOTO    PR21

PZR4T   CALL    POZN            ;znaménko nebo mezera
        CALL    POR4            ;řád 1000
PTR321  CALL    POTE            ;poslat tečku

PR321   CALL    POR3            ;řád 100
PR21    CALL    POR2            ;řád 10
PR1     MOVF    R1,W            ;řád 1
PIOR    IORLW   B'000110000'
PWRET   CALL    WRDATA          ;PRINT W + RETURN
        RETURN
;................................
;poslat znaménko nebo mezeru
POZN    MOVLW   0x20            ;mezera
        BTFSC   Znam            ;záoprné číslo? (Znam=1)
        MOVLW   0x2D            ;-
        GOTO    PWRET
;poslat tečku
POTE    MOVLW   0x2E            ;.
        GOTO    PWRET
;poslat řád 1000
POR4    MOVF    R4,W            ;řád 1000
        GOTO    PIOR
;poslat řád 100
POR3    MOVF    R3,W            ;řád 100
        GOTO    PIOR
;poslat řád 10
POR2    MOVF    R2,W            ;řád 10
        GOTO    PIOR

;--------------------------------
;převod HEX/DEC, vstup A1,2, výstup R1,2,3,4
HEXDEC
;upravit záporné číslo
        BCF     Znam            ;=0
        BTFSS   A2,7            ;=1?
        GOTO    PHD
        BSF     Znam            ;=1, záporné
;změna znaménka A1,2
        COMF    A2,F
        COMF    A1,F
        INCFSZ  A1,F            ;+1=0?
        GOTO    PHD
        INCF    A2,F            ;+1
;převod
PHD     CLRF    A3
        MOVLW   0xE8            ;1000 do B
        MOVWF   B1              ;
        MOVLW   0x03            ;
        MOVWF   B2              ;
        CLRF    B3              ;
        CALL    LOMENO          ;A/B=C, zbytek je v A
        MOVF    C1,W            ;uložit řád 1000
        MOVWF   R4              ;
HDPA1   MOVLW   0x64            ;100 do B
        MOVWF   B1              ;
        CLRF    B2              ;
        CALL    LOMENO          ;A/B=C, zbytek je v A
        MOVF    C1,W            ;uložit řád 100
        MOVWF   R3              ;
        MOVLW   0x0A            ;10 do B
        MOVWF   B1              ;
        CLRF    B2              ;
        CALL    LOMENO          ;A/B=C, zbytek je v A
        MOVF    C1,W            ;uložit řád 10
        MOVWF   R2              ;
        MOVF    A1,W            ;uložit řád 1
        MOVWF   R1              ;
        RETURN

 

 

Stáhnout PRINT_HEXDEC.asm (2,9 kB)