; 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