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

Problem z programem do mikrokontrolera 8051 na bazie DSM-51

16 Lut 2006 23:08 1203 2
  • Poziom 10  
    Witam mam problem a mianowicie dostalem program oto on:

    SEG_ON EQU P1.6 ;włączenie wyświetlacza 7-segm.
    ;Pełne adresy urządzeń we/wy systemu DSM-51
    wyb EQU 0FF30H ;bufor wyboru wskaźnika
    dane EQU 0FF38H ;bufor danych wskaźnika

    LJMP START
    ORG 100H
    START:
    ;Wprowadzam liczbe i dokonuje jej konwersji na kod bcd

    mov a,#73 ;dodaje dwie liczby
    add a,#167
    mov r7,a ;wynik przenowsze do r7, bo wymaga tego proc bin2bcd
    acall bin2bcd ;dokonuje konwrsji na kod BCD ( cyfry setek, dziesiatek i jednosci )

    ;push 5; w tym progrnie r5 nie jest modyfikowane ale przyszłosciowo można to wrzucac na stos
    push 6; zapamietuje r6 bo pozniej będę go modyfikowal
    ;push 7; nie zapamietuje bo od razu wyswietlam

    ;wyswietlenie cyfry jednosci

    acall bin27seg ;konwersja na kod 7seg
    mov r6,a ;przeniesienie do r6 ( bo wymaga tego funkcja wyswietl )
    mov r7,#1 ;ustalam numer wyswietlacza
    acall wyswietl ;wyswietlenie

    ;wyswietlenie cyfry dziesiatek

    pop 6 ;odtworzenie cyfry jednosci ze stosu
    mov a,r6
    mov r7,a
    acall bin27seg ;konwersja na kod 7seg
    mov r6,a ;przeniesienie do r6 ( bo wymaga tego funkcja wyswietl )
    mov r7,#2 ;numer wyswietlacza
    acall wyswietl ;wyswietlenie

    ;wyswietlenie cyfry dziesiatek
    ;pop 5; to na wypadek gdyby mój program modyfikowal r5

    mov a,r5
    mov r7,a
    acall bin27seg ;konwersja na kod 7seg
    mov r6,a ;przeniesienie do r6 ( bo wymaga tego funkcja wyswietl )
    mov r7,#4 ;numer wyswietlacza
    acall wyswietl ;wyswietlenie

    ljmp start
    ; Proc konwersji liczby zapisanej w naturalnym kodzie binarnym na kod BCD
    ; Parametry
    ; R7 - liczba do konwersji
    ; Wartosci zwracane:
    ; cyfra setek R5
    ; cyfra dziesiatek R6
    ; cyfra jednosci R7

    bin2bcd:
    push acc
    push b
    mov a,r7
    mov b,#100
    div ab
    mov r5,a
    mov a,b
    mov b,#10
    div ab
    mov r6,a
    mov r7,b
    pop b
    pop acc
    ret

    ;Proc. konwersji liczby zapisanej w naturalnym kodzie binarnym na kod wyswietlacza 7seg
    ;Przekazywane parametry:
    ;-bajt do konwersji r7
    ;Wartosc zwracana: kod 7seg w A
    ;Poprawnosc danych wejsciowych nie jest sprawdzana ( R7<=15 )

    bin27seg:
    mov dptr,#kody_znakow
    mov a,r7
    movc a,@a+dptr
    ret

    kody_znakow :
    ; HGFEDCBA
    db 00111111b; cyfra 0
    db 00000110b; cyfra 1
    db 01011011b; cyfra 2
    db 01001111b; cyfra 3
    db 01100110b; cyfra 4
    db 01101101b; cyfra 5
    db 01111101b; cyfra 6
    db 00000111b; cyfra 7
    db 01111111b; cyfra 8
    db 01101111b; cyfra 9
    db 01110111b; cyfra A
    db 01111100b; cyfra B
    db 00111001b; cyfra C
    db 01011110b; cyfra D
    db 01111001b; cyfra E
    db 01110001b; cyfra F

    ;Proc. wyświetlająca na wybranym wskażniku jeden bajt
    ;Przekazywane parametry :
    ;- numer wskaźika przezR7
    ;- bajt do wysłania przez R6
    ;Wartość zwracana : void

    wyswietl:
    push acc
    setb SEG_ON ;gasze wyswietlacz

    ;wybieram który wskaznik ma sie wlaczyc

    MOV DPTR,#wyb ;adres bufora wyboru wskaźnika
    MOV A,R7 ;numer wskaznika jest w A bo tu tak zalozylem
    MOVX @DPTR,A ;wpisz wybrane wskaźniki

    ; wysylam dane do wskaznika
    MOV DPTR,#dane ;adres bufora danych wskaźnika
    MOV A,R6
    MOVX @DPTR,A ;wpisz wybrane segmenty

    CLR SEG_ON ;włącz wyświetlacz 7-segm
    pop acc
    ret
    end

    Program dodaje dwie liczby i wyświetla na wyswietlaczu 7-segmentowym a ja chce żeby dodawał dwie liczby po przecinku i wyświetlał liczbe po przecinku np 127.3 na wyświetlaczu 7-segm, wiem że trzeba liczyć wszystko jak dla liczby 10 razy większej np zamiast 3.7 w obliczenieach używać 37 jedyną róznicą jest fakt ze trzeba wyświetlić kropke w odpowiednim miejscu np. przy założeniu precyzji z jednym miejscu po przecinku kropke trzeba wyświetlić na drugim wyświetlaczu
    stanem kropki steruje 8 bit z bajtu który wysyła do wysweitlacza jako dane do wyświetlenia
    normalnie jest 0, czyli brak kropki
    jeśli ustawie to bede miał kropke
    aby go ustawić trzeba do danej sterującej dodać #128 i tak powiekszona liczbe wysyłać do wyswietlacza
    A ja nie wiem gdzie dopisać te #128 tak żeby działało

    Prosze o pomoc i z góry wielkie dzieki.
  • Poziom 16  
    kody_znakow :
    ; HGFEDCBA
    db 00111111b; cyfra 0
    db 00000110b; cyfra 1
    db 01011011b; cyfra 2
    db 01001111b; cyfra 3
    db 01100110b; cyfra 4
    db 01101101b; cyfra 5
    db 01111101b; cyfra 6
    db 00000111b; cyfra 7
    db 01111111b; cyfra 8
    db 01101111b; cyfra 9
    db 01110111b; cyfra A
    db 01111100b; cyfra B
    db 00111001b; cyfra C
    db 01011110b; cyfra D
    db 01111001b; cyfra E
    db 01110001b; cyfra F

    ; HGFEDCBA z kropką

    db 10111111b; cyfra 0
    db 10000110b; cyfra 1
    db 11011011b; cyfra 2
    db 11001111b; cyfra 3
    db 11100110b; cyfra 4
    db 11101101b; cyfra 5
    db 11111101b; cyfra 6
    db 10000111b; cyfra 7
    db 11111111b; cyfra 8
    db 11101111b; cyfra 9
    db 11110111b; cyfra A
    db 11111100b; cyfra B
    db 10111001b; cyfra C
    db 11011110b; cyfra D
    db 11111001b; cyfra E
    db 11110001b; cyfra F



    bin2bcd:
    push acc
    push b
    mov a,r7
    mov b,#100
    div ab
    mov r5,a
    mov a,b
    mov b,#10
    div ab
    mov r6,a
    mov r7,b ; jezeli dobrze zauwazylem to pozniej tę liczbe
    ; wyswietlasz jesli tak to dodaj tu 16
    mov a,#16
    add a,r7
    mov r7,a

    pop b
    pop acc
    ret
    Jak to zmienisz w programie powinno pojść
    warynek liczba bedze 12.4 tylko trzy cyfry
    a nie 123.5
  • VIP Zasłużony dla elektroda
    Po co 2 tabele ? Jak ma być kropka to pobierasz dane z tej samej tabeli i or 100000000b... ;)