; 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