Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

DSM51 licznik

winfast29 09 Kwi 2012 20:51 837 0
  • #1 09 Kwi 2012 20:51
    winfast29
    Poziom 9  

    Czy mógłby mnie ktoś naprowadzić jak wykonać licznik dwukierunkowy na DSM51, tzn. sam będzie przeskakiwał na kolejne cyfry np z F na 16 itp.

    Z góry dziękuję...


    Code:
    SEG_ON       EQU P1.6 ;wlaczenie wyswietlacza 7-segm.
    
    LED      EQU P1.7
    KEY      EQU 0B5h ;odczyt klawiatury

    ;Pamiec wewnetrzna RAM
    DISPLAY    EQU 30H
    KEY_LAST   EQU DISPLAY+3

    LJMP    START
    ORG    100H

    START:
       CLR   A     
       MOV    DISPLAY,A   ;wpisz 0 do pamieci
       MOV    DISPLAY+1,A   ;danych wszystkich
       MOV   DISPLAY+2,A   ;wskaznikow
       MOV    DISPLAY+3,A

    LOOP_DISP:         ;ustaw dane do wyswietlania
                ;na wskazniku 1
       MOV   R0,#DISPLAY   ;adres pobierania kodow
       MOV   R2,#3      ;licznik - liczba wskaz.
       MOV   R3,#00000001B   ;wybor wskaznika
                ; - kod 1 z 8

    LOOP:
       SETB    SEG_ON      ;wylacz poprzedni
                ;wskaznik
       MOV   R1,#CSDS   ;adres wyboru wskaznika
       MOV   A,R3      ;nr wskaznika (1 z 8)
       MOVX   @R1,A      ;wpisz wybrany wskaznik

       MOV   R1,#CSDB   ;adres danych wskaznika
       MOV   A,@R0      ;dane wskaznika
       CJNE   R3,#01000000B,SEG   ;czy 7 wskaznik
       SJMP    LEDS      ;tak - diody swiecace
                ; nie ma zamiany na kod
    SEG:   
       LCALL   GET_COD7   ;zamiana cyfr na kod
    LEDS:
       MOVX   @R1,A      ;wpisanie kodu zapalanych
                ;segmentow do buforu
                ;danych wskaznika

       CLR   SEG_ON      ;wlaczenie wskaznika

       MOV   C,KEY      ;wstepny odczyt klawisza
       MOV   A,#1      ;odczekanie 1ms - swiecenie
       LCALL   DELAY_MS   ;jednego wskaznika

       JC   KEY_ON      ;kontrola jednoznacznosci
       JB   KEY,KEY_END   ;odczytu klawisza





    KEY_OFF:
       MOV    A,R3      ;klawisz zwolniony
       CPL   A
       ANL   KEY_LAST,A   ;zeruj odpowiedni bit
       SJMP   KEY_END

    KEY_ON:
       JNB   KEY,KEY_END
       MOV   A,R3      ;klawisz nacisniety
       ANL   A,KEY_LAST
       JNZ   KEY_END      ;klawisz byl nacisniety
                ;bez reakcji

       MOV   A,R3      ;klawisz byl zwolniony
       ORL   KEY_LAST,A   ;ustaw odpowiedni bit
       INC   @R0      ;zwieksz licznik
                ;nacisniec - liczbe na
                ;odpowiednim wskazniku
    KEY_END:
       MOV   A,R3
       RL   A      ;numer nastepnego
       MOV   R3,A      ;wskaznika (kod 1 z 8)
       INC   R0      ;adres danych nastepnego
                ;wskaznika
       DJNZ   R2,LOOP      ;kolejne swiecenie
                ;siedmiu wskaznikow
       SJMP    LOOP_DISP   ;zacznij od wskaznika 1

    ;Podprogram zamienia cyfre na kod 7-segmentowy
    GET_COD7:
       ANL   A,#0FH   ;tabela kodow 0..15
       INC   A   ;pomin rozkaz RET
       MOVC   A,@A+PC   ;pobierz kod
       RET

    COD_7SEG:
       DB   03FH   ;kod znaku 0
       DB   006H   ;kod znaku 1
       DB   05BH   ;kod znaku 2
       DB   04FH   ;kod znaku 3
       DB   066H   ;kod znaku 4
       DB   06DH   ;kod znaku 5
       DB   07DH   ;kod znaku 6
       DB   007H   ;kod znaku 7
       DB   07FH   ;kod znaku 8
       DB   06FH   ;kod znaku 9
       DB   077H   ;kod znaku A
       DB   07CH   ;kod znaku b
       DB   039H   ;kod znaku C
       DB   05EH   ;kod znaku d
       DB   079H   ;kod znaku E
       DB   071H   ;kod znaku F

    0 0