; Kutasiewicz Karol $NOMOD51 ; disable predefined standard 8051 SFR symbols $NOLIST $INCLUDE (8051.MCU) ; include 8051 SFR symbol definitions $LIST ; 1 cykl - 1.085 us t0_dana equ 65535-921 ; dana dla licznika T0 (przerwanie co 1ms) ; t0_dana equ 65535-5000 ; dana dla licznika T0 (przerwanie co xxx) csds equ 0FF30h ; bufor wyboru wskaznika csdb equ 0FF38h ; bufor danych wskaznika stala_licznika equ 4 t0flaga bit 0 ; musimy zdef jaki to jest adres txflaga bit 1 ;ustawiamy adresy t0licznik equ 40 ;bajtowi t0licznik przypisano adres 40 wyswlicznik equ 41 ; numer obslugiwanego licznik do wyswietlacza bufor0 equ 42 ; do 48 beda zarezerwowane jako miejsce dla danycch ljmp start org 11 ; nastepna linia kodu bedzie miala adres 11 ; następujące po dyrektywie instrukcje są lokowane w pamięci programu od adresu wskazanego przez tę dyrektywę orl tl0, #t0_dana mod 256; ustaw licznik T0 mov th0, #t0_dana / 256 setb t0flaga setb x0 setb x1 reti ; petla obslugujaca mruganie diody z wykorzystaniem timera t0 start: ; przygotowanie srodowiska mov wyswlicznik, #0 ; ustawiamy mov t0licznik, #stala_licznika ; ustawiamy wartosc stala_licznika do bajtu pod adresem 40 mov tmod, #1 ; ust. ukl czas-licznikowego t0 16-minutowy licznik mod pracy na 1 (16-bitow) setb et0 setb ea setb tr0 mov bufor0, #255 mov bufor0+1, #255 mov bufor0+2, #255 ; ???????????????? mov bufor0+3, #255 ; dane do wyswieltacza 4 mov bufor0+4, #255 mov bufor0+5, #255 petla: ; glowna programu ;jezeli nie bit to t0flaga jnb t0flaga, dalej ; skocz jezeli bit jest ustawiony na 0, to idz do dalej testowanie środowiska clr t0flaga ; t0flaga = 0 lcall t0obsluga ; wywolaj t0obsluga ; zlecenie stale kilka bajtow np nawet 6 ; robic taki numer dalej: ; testujemy kolejny element srodowsiak jnb txflaga, dalej10 ;jesli bit txflaga=0 to skocz do dalej10 clr txflaga ; txflaga = 0 cpl p1.7 ; zamien bit 7 rejestru pod adresem p1 (dioda) lcall wyswietlacz ; wywolaj wyswietlacz dalej10: ; pojawilo sie dodatkowe zdarzenie lcall zlecenie ; jesli >9 to napisac mu kolejny bajt ljmp petla ; koniec petli t0obsluga: dec t0licznik ;zmn licznik (-1) mov a, t0licznik ; pob zawartosc licznika jz xxx ; if(a!=0) ret ; return xxx: mov t0licznik, #stala_licznika ; tu jest stala, tyle razy przechodzi zanim test mrugnie setb txflaga ;txflaga=1 ret ; return ; procedura do obslugi wyswietlaczy 7-segmentowych wyswietlacz: setb p1.6 ; wylacz wyswietlacz mov a, wyswlicznik ;a=wyswlicznik mov dptr, #tablica movc a, @a+dptr mov dptr, #csds movx @dptr, a mov a, #bufor0 add a, wyswlicznik mov r0, a mov a, @r0 ; pobranie z pam. RAM mov dptr, #csdb movx @dptr, a inc wyswlicznik ; wyswlicznik++ mov a, wyswlicznik ; a = wyswlicznik cjne a, #6, wysw10 ; jesli a=6 mov wyswlicznik, #0 ; zeruj wyswlicznik wysw10: clr p1.6 ; wlacz wyswietlacz ret ; return ; tablica przechowuje dane do bufora wyboru wyswietlacza i zawiera informacje o wszystkich 6 wyswietlaczach zlecenie: ; petla inc x0 mov a, x0 cjne a, #10, koniec ; jezeli sa rozne to idz do koniec mov x0, #0 ; zerowanie inc x1 ; nastepny licznik mov a, x1 cjne a, #10, koniec ; jezeli sa rozne to idz do koniec mov x1, #0 ; zerowanie koniec: ret tablica: ; db pozwala umiescic w pamieci programu bajt lub ich grupe db 00000001b ;1 wyswietlacz db 00000010b ;2 wyswietlacz db 00000100b ;3 wyswietlacz db 00001000b ;4 wyswietlacz db 00010000b ;5 wyswietlacz db 00100000b ;6 wyswietlacz tablica_wzorcow: ; hgfedcba db 00111111b ; 0 db 00000110b ; 1 db 01011011b ; 2 db 01001111b ; 3 db 01100110b ; 4 db 01101101b ; 5 db 01111101b ; 6 db 00000111b ; 7 db 01111111b ; 8 db 01101111b ; 9 end