Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Ustawienia a wyswietlanie na LCD

Wilku 19 Feb 2004 11:29 1190 6
  • #1
    Wilku
    Level 17  
    Witam.

    Mam mały problem z programem ktory pisze w asm na '51. Otóż chodzi
    mi o ustawienia czasu (zmniejszanie) i wyświetlanie ich na LCD.
    Przy zmniejszaniu wartości godzin podczas przejscia z 0 na 23 jest ok,
    ale przy przejsciu z 20 zamiast 19 jest 25, przy przejsciu z 10 zamiast
    9 jest 15. Nie bardzo wiem jak to poprawic. oto fragment kodu:

    UST1:
    CLR RS
    MOV A,#11000010B ;POZYCJA
    ACALL SEND ;WYSLIJ do LCD
    MOV A,HOURS
    ACALL HEXASCII
    SETB RS
    ACALL SEND ;->LCD
    MOV A,B
    ACALL SEND ;->LCD

    UST2: JB SWUP,UST3 ;W GORE
    ACALL WAITMS100
    MOV A,HOURS
    ADD A,#1
    DA A
    MOV HOURS,A
    CJNE A,#24H,UST1
    MOV HOURS,#0
    SJMP UST1

    UST3: JB SWDOWN,UST4 ;W DOL
    ACALL WAITMS100
    MOV A,HOURS
    CJNE A,#0,UST33
    MOV A,#24H
    UST33:
    DEC A
    DA A
    MOV HOURS,A
    SJMP UST1

    Jest to prawie cala petla z wyświetlaniem. Fragment odpowiadajacy za zwiekszanie chodzi OK. Zmniejszanie probowalem tez zrobic z odejmowaniem ale bylo podobnie.

    Możecie coś doradzić? Pozdrawiam.
  • #2
    radziuk
    Level 13  
    Nie znam się na asm ale jeden objaw nasuwa mi taką myśl (szybką).
    Przejście z 10 na 15.
    10 w zapisie szesnastkowym to wartość 16 dziesiętnie, a 16-1=15(dziesiętnie).
    Może namieszałem i ktoś mnie zbluzga ale taka moja pierwsza myśl.
    Jeżeli ti kiszka to przepraszam i więcej się nie odezwę, ale proszę o wyrozumiałość dla maluczkiego... ;-)
  • #3
    yarpen2
    Level 22  
    rozkaz DA działa tak że jeślicyfra zapisana na bitach 3..0 akumulatora jest większa od dziewięciu lub ustawiona jest flaga AC do akumulatora jest dodawana liczba sześć co powoduje że na młodszym półbajcie otrzymuje się cyfrę zapisaną w kodzie BCD.

    dokładnie nie analizowałem twojego kodu ale może coś ci to pomoże
  • #4
    olekewaagata
    Level 25  
    Kolego, rozkaz DA nie działa prwidłowo (jest niedopuszczalny) przy odejmowaniu !!. Dodatkowo nie można go stosować po INC i przy zwiękrzaniu prawidłowo robisz przez ADD, ale przy odejmowaniu poełniasz dwa błędy w jednym, DECrement a potem DA.
    Ale co zrobić jeśli musisz od danej w kodzie BCD idjąć coś?.
    A tu asembler jest trochę kulą u nogi, daną którą chcesz odjąć musisz
    najpierw zanegować (też w kodzie BDC) a następnie dodać i potem
    zrobić DA.
    Taki prosty przykład: masz w A 01 i chcesz odjąć 1, zanegowana
    wartość 1 w kodzie BCD=99 jak to wykonasz w A zostanie Ci 0.
    I taka podpowiedz: dana wartość + jej negacja = 100 dla jednego
    bajtu, = 10000 dla dwóch bajtów itd.
  • #5
    radek.kaba
    Level 15  
    DA to konwersja sumy dwóch liczb BCD i prawidłowo działa tylko z ADD, INC nie zmienia flag przepełnień CY , AC i OV.
  • #6
    MODI
    Level 17  
    może po prostu odejmiesz błąd i tyle
  • #7
    Wilku
    Level 17  
    Odejmowane błedu to jakoś mi nie podchodzi. Trochę za dużo kombinowania. Już sobie poradziłem chociaż w mało elegancki sposób.
    No ale działa.

    ;///////////////////////////////////////////////////// KLAWISZ W DOL
    UST7: JB SWDOWN,UST8
    ACALL WAITMS100

    MOV A,MINUTES
    CJNE A,#0,UST7_1
    MOV A,#59H
    SJMP UST7END
    UST7_1:
    CJNE A,#50H,UST7_2
    MOV A,#49H
    SJMP UST7END
    UST7_2:
    CJNE A,#40H,UST7_3
    MOV A,#39H
    SJMP UST7END
    UST7_3:
    CJNE A,#30H,UST7_4
    MOV A,#29H
    SJMP UST7END
    UST7_4:
    CJNE A,#20H,UST7_5
    MOV A,#19H
    SJMP UST7END
    UST7_5:
    CJNE A,#10H,UST7_6
    MOV A,#09H
    SJMP UST7END
    UST7_6:
    DEC A
    UST7END:
    MOV MINUTES,A
    AJMP UST5 ;na lcd i obsluga innych klawiszy


    Pozdrawiam.