Copyright: BASCOM Basic 8051 - Opis języka. Wersja 2.10 (9 września 2002)  (c) Zbigniew Gibek


Główna strona pomocy
Język BASCOM Basic dla kontrolerów 8051.

Podstawy języka BASCOM BASIC

Słowa zastrzeżone

Różnice w stosunku do BASCOM-LT

Ograniczenia kompilatora języka BASCOM BASIC

Dyrektywy preprocesora

#IF

#ELSE

#ENDIF

Dyrektywy kompilatora

$ASM

$BAUD

$BGF

$CRYSTAL

$DEFAULT XRAM

$EXTERNAL

$INCLUDE

$IRAMSTART

$LARGE

$LCD

$LCDRS

$LIB

$MAP

$NOBREAK

$NOINIT

$NONAN

$NONULL

$NORAMCLEAR

$NOSP

$OBJ

$RAMSIZE

$RAMSTART

$RAMTRON

$REGFILE

$ROMSTART

$SERIALINPUT

$SERIALINPUT2LCD

$SERIALOUTPUT

$SIM

$TIMEOUT

$WAIT

Elementy języka BASCOM BASIC

1WRESET

1WREAD()

1WWRITE

ABS()

ALIAS

ASC()

AVG()

BAUD

BCD()

BITWAIT

BREAK

CALL

CHR()

CLS

CLOSE

CONFIG

... 1WIRE

... AUDC812

... BAUD

... BAUD1

... DEBOUNCE

... GETRC

... GRAPHLCD

... I2CDELAY

... LCD

... LCDBUS

... LCDPIN

... MICROWIRE

... PRINT

... RC5

... SCL

... SDA

... SERVOS

... SPI

... TIMER0

... TIMER1

... TIMER2

... WATCHDOG

COUNTERx

CONST

CPEEK()

CURSOR

DATA

DEBOUNCE

DECR

DECLARE SUB

DEFxxx

DEFLCDCHAR

DELAY

DIM

DISABLE

DISPLAY

DO - LOOP

ELSE

ENABLE

END

ERASE

EXIT

FOR - NEXT

FOURTHLINE

FUSING()

GET

GETAD()

GETAD2051()

GETRC()

GETRC5()

GOSUB

GOTO

HEX()

HEXVAL()

HIGH()

HIGHW()

HOME

I2CRECEIVE

I2CSEND

I2CSTART, I2CSTOP, I2CRBYTE, I2CWBYTE

IDLE

IF – THEN – ELSE – END IF

INCR

INKEY()

INP()

INPUTBIN

INPUTHEX

INPUT

INSTR()

INT()

LCD

LCDINIT

LCDHEX

LCASE()

LEFT()

LEN()

LOAD

LOCATE

LOOKUP()

LOOKUPSTR()

LOW()

LOWW()

LOWERLINE

MAKEBCD()

MAKEDEC()

MAKEINT()

MAX()

MID, MID()

MIN()

MWINIT

MWREAD

MWWOPCODE

MWWRITE

ON INTERRUPT

ON VALUE

OPEN

OUT

P1, P3

PEEK()

POKE

POWERDOWN

PRINT

PRINTBIN

PRINTHEX

PRIORITY

PSET

PUT

READ

READEEPROM

READMAGCARD

REM

REPLACE

RESET

RESTORE

RETURN

RIGHT()

RND()

ROTATE

SELECT CASE – END SELECT

SET

SHIFT

SHIFTCURSOR

SHIFTIN , SHIFTOUT

SHIFTLCD

SHOWPIC

SOUND

SPACE()

SPC()

SPIIN

SPIINIT

SPIOUT

START

STOP

STR()

STRING()

SUB

SWAP

THIRDLINE

UCASE()

UPPERLINE

VAL()

VARPTR()

WAIT

WAITKEY()

WAITMS

WHILE - WEND

WRITEEEPROM

Wstawki asemblerowe

Lista rozkazów procesorów 8051

Rejestry specjalne procesorów 8051

Od tłumacza

Opracowano na podstawie oryginalnego pliku pomocy programu BASCOM-8051 (wersja 2.10).

Wszystkie nazwy własne zostały użyte wyłącznie w celu identyfikacji.

This is a Polish translation of some piece from BASCOM-8051 help file.

Original English help file is copyrighted by MCS Electronics. All rights reserved.

Visit MCS Electronic Website: www.mcselec.com for more BASCOM stuff.


Słowo od tłumacza

Od tłumacza.

Tuż po ukończeniu pracy nad pomocą “BASCOM BASIC-AVR  Opis języka”, dokonałem małego i pobieżnego rozeznania w sprawie adaptacji tekstu na potrzeby tekstu źródłowego pomocy dla “BASCOM BASIC-8051  Opis języka”.

Okazało się, że około 75% tematów jest identycznych, gdyż obie wersję języka są w większości kompatybilne. Około dalszych 5% to tematy wymagające tylko kosmetycznych zmian (usunięcie jakiegoś akapitu, zmiana przykładów itp.). Zostało zatem około 10% do powtórnego opracowania.

Dlatego też mogę odwołać, to co kiedyś napisałem w odpowiedzi na list elektroniczny. Rozpocząłem pracę nad wersją dla BASCOM BASIC-8051 i oto jej efekt.

Wersja dla BASCOM 8051 powstała w zaskakującym (nawet dla mnie) tempie: 3 tygodnie. Jest to niewątpliwie zasługą samego autora BASCOM-a, który zadbał o kompatybilność obu języków i tym samym “uprościł sprawę”.

Nie będę tutaj kopiował tekstu z BASCOM BASIC-AVR, lecz napiszę, że tutaj także pozwoliłem sobie poprawić kilka drobnych błędów oraz pewne zdania dodać od siebie – szczególnie przy opisach: ON INTERRUPT, PRIORITY i CONFIG TIMERx.

Może się zdarzyć, że pewne fragmenty tekstu, nie dotyczą BASCOMa 8051 z powodu adaptacji tekstu o której piszę na wstępie. Niestety nie wszystko można zauważyć podczas porównywania tekstu z plikiem pomocy. Wpadki te będą oczywiście usuwane tak szybko jak to będzie możliwe, a jeśli użytkownicy pomogą, to szybkość ich eliminacji może znacznie wzrosnąć. Dlatego zapraszam do czytania i korzystania z pomocy, oraz zgłaszania nawet najmniejszych błędów. Adres e-mail na dole.

Dziękuję twórcy języka BASCOM, którym jest Mark Alberts za wsparcie i pochlebną opinię w sprawie tłumaczenia także pomocy dla BASCOM BASIC 8051, oraz za rozpowszechnianie za pomocą strony WWW tego opracowania. Thanks Mark!

Część nieoficjalna.

Wszystkich którzy myślą, że znaleźli “guru” od języka BASCOM musze głęboko rozczarować. Nie jestem nim, i nim nie będę. Powód jest prosty: JA NIE PROGRAMUJĘ W BASCOM-ie. A co za tym idzie, nie przepadam za tym językiem. Dawno temu pisałem w BASIC-u w dialekcie Sinclair Spectrum i pozostały Mi pewne doświadczenia z językiem BASIC, który lubię sobie czasem zapuścić na emulatorze.

Mogę Wam też zdradzić kolejny raz, że tłumaczenie pliku pomocy BASCOM-8051 wymusiło samo życie, gdyż sporo listów przyszło do Mnie w tej sprawie (Nawet jeden z propozycją zapłaty! Lecz Ja nie robię tego “dla mamony”). Dlatego w przerwie nad poprawkami w BASCOM-AVR, powstała ta wersja.

Mam nadzieję, że niespodzianka się udała.

Marteenez - kolejne dzięki za analizę “zakręconych” zdań.

Zbigniew Gibek

zbeegin@poczta.onet.pl


Podstawy języka BASCOM BASIC

Rozdział ten przedstawia kilka niezbędnych wiadomości, które są podstawą przy tworzeniu programów w języku BASCOM BASIC. W szczególności omówione zostanie:

•	Przeznaczenie poszczególnych symboli z zestawu znaków języka,

•	Format linii programu,

•	Tworzenie i przeznaczenie etykiet w programie,

•	Ograniczenia w długości linii oraz zmiennych,

•	Typy danych,

•	Tworzenie wyrażeń i używanie operatorów.

Zestaw znaków

Zestaw znaków BASCOM BASIC obejmuje znaki podstawowego alfabetu, liczby oraz znaki specjalne.

Do zestawu znaków podstawowego alfabetu w języku BASCOM BASIC należą duże litery od A do Z oraz ich odpowiedniki w zestawie małych liter. Można także stosować znak dolnej kreski _. Polskie znaki diakrytyczne, czyli: ĄĆĘŁŃÓŚŻŹąćęłńóśźż; nie wchodzą w skład tego zestawu. Mogą być używane tylko w treści zmiennych tekstowych oraz komentarzy.

W skład liczb języka BASCOM BASIC wchodzą liczby z zakresu 0 do 9 oraz przy zapisie szesnastkowym litery od A do H. Zapis szesnastkowy powinien być poprzedzony przedrostkiem &H.

Poniżej zestawiono znaki które posiadają szczególne znaczenie w programach w języku BASCOM BASIC:

ENTER	Oznacza koniec linii (Znak ten w nomenklaturze ASCII nazywa się CR)
	Pusty (lub spacja) – znak rozdzielający
'	Apostrof – oznacza początek komentarza
*	Gwiazdka – znak operacji mnożenia
+	Plus – znak operacji dodawania
,	Przecinek – znak rozdzielający argumenty instrukcji
-	Minus – znak operacji odejmowania
.	Kropka – oddziela część całkowitą od ułamkowej
/	Kreska ukośna – znak operacji dzielenia
:	Dwukropek – rozdziela instrukcje zapisane w jednej linii
"	Cudzysłów – rozpoczyna i kończy dane tekstowe
;	Średnik – rozdziela argumenty instrukcji wejścia/wyjścia
<	Mniejszy niż – znak operacji porównywania
=	Znak równości – występuje w operacjach przypisania oraz porównywania
>	Większy niż – znak operacji porównywania
\	Odwrotna kreska ukośna – znak dzielenia dla liczb całkowitych

Struktura pojedynczej linii programu

Linia programu w języku BASCOM BASIC składa się z następujących części:

[[identyfikator:]] [[instrukcja]] [[:instrukcja]] ... [[‘ komentarz]]

Identyfikatory i ich używanie

W języku BASCOM BASIC używany jest tylko jeden typ identyfikatora, tak zwana etykieta. Etykieta taka może się składać z dozwolonych liter i cyfr. Jej długość może zawierać się w granicach od 1 do 32 znaków i musi zaczynać się od litery, a kończyć dwukropkiem. Etykietą nie może być żadna z instrukcji języka, choć nazwy instrukcji mogą zawierać się w treści etykiety. Poniżej przedstawiono kilka poprawnych etykiet:

Alpha:

ScreenSUB:

Test3A:

Kompilator BASCOM nie rozróżnia dużych i małych liter, więc poniższe etykiety są w rozumieniu kompilatora takie same:

alpha:

Alpha:

ALPHA:

Etykieta może zaczynać się na dowolnej pozycji linii programu, byle by była umieszczona jako pierwsza w tej linii:

  Gosub Pisz_Nie

                         Pisz_Nie:  Print "NIE!"

               Return

Instrukcje języka BASCOM BASIC.

Instrukcje języka BASCOM BASIC mogą być typu “wykonywalnego” bądź też “nie wykonywalnego”.

Instrukcje “wykonywalne” tworzą logiczną strukturę działań programu – algorytm. Instrukcje “nie wykonywalne” są odpowiedzialne za cześć informacyjną oraz organizacyjną programu. Do najważniejszych instrukcji tego typu należą:

•	Instrukcja komentarza – rozpoczynająca się słowem REM lub znakiem apostrofu (’),

•	Instrukcje deklaracji – rozpoczynające się od słów DIM, DECLARE,

•	Dyrektywy kompilatora – rozpoczynające się znakiem dolara ($).

Instrukcje komentarza rozpoczynające się słowem REM lub znakiem apostrofu są sobie równoważne. Jedyna różnica między nimi to taka, że komentarz rozpoczynający się słowem REM nie będący jedyną instrukcją w linii programu, musi być rozdzielony znakiem dwukropka. Ilustruje to poniższy przykład:

Print " Cześć, co jest? " : Rem Rozweselmy użytkownika

Print " Cześć, co jest? "   'Rozweselmy użytkownika

Uwaga! Instrukcja REM musi być ostatnią instrukcją w linii programu!

Rozdzielanie znakiem dwukropka stosujemy również, gdy w linii programu występuje więcej niż jedna instrukcja:

For I = 1 To 5 : Print " Pięć razy TAK! "  : Next I

Nie zaleca się jednak stosować takich konstrukcji, gdzie nie są wymagane. Zapis taki znacznie utrudnia późniejszą analizę programu. O wiele bardziej przejrzyście wygląda ten sam fragment zapisany z wykorzystaniem wcięć:

For I = 1 To 5

  Print " Pięć razy TAK! "

Next I

Długość linii w języku BASCOM BASIC

Jeśli do tworzenia programu używamy edytora środowiska BASCOM, długość linii nie jest ograniczona. Choć jednym z dobrych nawyków, poprawiających czytelność programu, jest nie przekraczanie 80 znaków w jednej linii. W edytorze środowiska BASCOM wyświetlana jest w tym celu linia pomocnicza.

Typy danych

Każda ze zmiennych użytych w programie posiada określony typ, związany z treścią przechowywanych w niej danych. Tutaj zawarto zbiorcze informacje o tzw. typach elementarnych.

Elementarne typy danych.

W języku BASCOM BASIC zdefiniowano kilka podstawowych typów:

Bit	1/8 bajta	Bit może przyjmować tylko dwie wartości: 0 i 1.
Byte	1 bajt	Bajt może przechowywać dowolną dodatnią liczbę całkowitą z zakresu od 0 do 255.
Integer	2 bajty	Typ Integer może przechowywać dowolną liczbę całkowitą z zakresu –32768  do +32767.
Long	4 bajty	Typ Long może przechowywać dowolną liczbę całkowitą z zakresu -2^32 do 2^32-1
Word	2 bajty	Typ Word może przechowywać dowolną dodatnią liczbę całkowitą z zakresu od 0 do 65535.
Single	4 bajty	Typ Single może przechowywać dowolną liczbę stało lub zmiennoprzecinkową.
String	max. 254 bajty	Typ String przechowuje dowolny ciąg znaków o długości nie większej niż 254 znaki. Ciąg ten zakończony jest zawsze znakiem 0. Każdy znak to jeden bajt. Tak więc tekst o długości 10 znaków zajmuje 11 bajtów.
Ogólnie zmienne typu Byte, Integer, Long, Word i Single są nazywane zmiennymi numerycznymi, a typu String typem tekstowym. Taka konwencja zostanie przyjęta w tym dokumencie.

Obszar pamięci przeznaczony na zmienne znajduje się w pamięci RAM procesora. Można to zmienić stosując dyrektywy kompilatora. Informacje na ten temat znajdują się przy opisie instrukcji DIM.

Zmienne

Zmienna to określony obszar pamięci identyfikowany przez nadaną przez programistę nazwę. Wielkość tego obszaru jest ściśle powiązana z ilością pamięci potrzebnej na zapamiętanie zmiennej (patrz poprzednia tabela).

Zmienna zawsze jest kojarzona z konkretnym typem danych. W zmiennych numerycznych można przechowywać tylko dane będące liczbami. Typ String zaś tylko dane będące znakami lub ich ciągiem (który i tak jest ciągiem liczb – kodów liter przyp. tłumacza). Poniższe przykłady obrazują kilka możliwości przypisywania zmiennym wartości:

Przypisanie zmienne wartości:

A = 5

C = 1.1	      ‘zmienna C jest typu Single

D = "BASCOM" ‘zmienna D jest typu String

Przypisanie zmiennej zawartości innej zmiennej:

abc = def

k = g

Przypisanie zmiennej wyniku operacji matematycznej:

Temp = a + 5

Temp = C + 5

Przypisanie zmiennej wyniku działania funkcji:

Temp = Asc(S)    ‘zmienna S jest typu String o długości 1!

Nazwy zmiennych

Nazwy zmiennych w języku BASCOM BASIC, są objęte tymi samymi ograniczeniami co przy nazywaniu etykiet. Ich długość nie powinna przekraczać 32 znaków. Nazwa może składać się z dowolnych liter i liczb – oprócz polskich znaków, oraz rozpoczynać się od litery.

Nazwa zmiennej nie może być którymś z zastrzeżonych słów języka BASCOM BASIC, tj. nazwą instrukcji, rejestru procesora czy dyrektywy. Dla przykładu poniższa zmienna nie jest poprawna, gdyż w języku BASCOM BASIC istnieje instrukcja (operator) AND:

And = 8

choć poniższa nazwa jest całkowicie poprawna:

ToAND = 8

Lista wszystkich zastrzeżonych słów języka BASCOM BASIC znajduje się tutaj.

W instrukcji przypisywania wartości zmiennej można używać zapisu heksadecymalnego (szesnastkowy) bądź dwójkowego (bitowy). Liczby zapisane szesnastkowo muszą być poprzedzone przedrostkiem &H, a zapis dwójkowy przedrostkiem &B. Poniższy przykład ukazuje tą samą liczbę w zapisie szesnastkowym, dwójkowym i dziesiętnym:

a = &HA

a = &B1010

a = 10

Aby używać zmiennej w programie należy ją najpierw zdefiniować instrukcją DIM. Jest to wymagane, gdyż kompilator musi określić rozmiar pamięci przeznaczony na zmienną.

Dim b1 As Bit, I As Integer, k As Byte

Można także użyć specjalnych instrukcji z zestawu: DEFINT, DEFBIT, DEFBYTE, DEFWORD, DEFLNG lub DEFSNG. Instrukcje te odgórnie definiują typ użytych zmiennych w programie. Dla przykładu instrukcja:

Defint A

spowoduje, że wszystkie zmienne użyte w programie, których nazwa zaczyna się literą A, a nie były zdefiniowane instrukcją DIM, będą zmiennymi typu Integer.

Liczby zmiennoprzecinkowe (programy obsługi dostarczył Jack Tidwell)

Jedynym typem jaki może przechowywać liczby zmiennoprzecinkowe jest typ Single. Sposób reprezentowania zmiennych typu Single w pamięci, został oparty na standardzie IEEE. Liczba taka zajmuje 32 bity (4 bajty). Bity te są podzielone na bit znaku, 8 bitowy eksponent i 23 bitową mantysę:

31 30________23 22______________________________0

zn   eksponent    mantysa

Eksponent jest zapisany jako liczba 8 bitowa ze znakiem w kodzie U2. Jeśli najbardziej znaczący bit jest ustawiony (eksponent > 128) to eksponent jest traktowany jako ujemny. Bit znaku określa znak liczby przechowywanej w zmiennej. Wartość 0 oznacza liczbę dodatnią, 1 zaś ujemną. Mantysa jest przechowywana w znormalizowanym formacie “ukrytego bitu”, dzięki czemu 24-bitowa precyzja może zostać osiągnięta.

Wszystkie operacje matematyczne mogą być przeprowadzane na liczbach typu Single.

Można także dokonywać konwersji (niejawnej) z typu Single na Integer lub Word, i odwrotnie:

Dim I As Integer, S As Single

S = 100.1   'przypisujemy liczbę zmiennoprzecinkową

I = S       'ta instrukcja zmieni liczbę typu single na Integer

Tablice

Tablica to nic innego jak zbiór ponumerowanych jednakowych elementów. Każdy element tablicy posiada swój własny indeks (numer) jednoznacznie identyfikujący go. Zmiana jednego elementu tablicy nie wpływa zatem na resztę elementów przechowywanych w tablicy.

Indeks tablicy jest liczbą całkowitą (bez znaku) i musi się zawierać w przedziale od 1 do 65535. Pierwszy element tablicy ma zawsze numer 1.

Przykład:

Dim a(10) As Byte  'definiujemy tablicę a z dziesięcioma elementami

Dim c As Integer

For c = 1 To 10

  a(c) = c         'przypisanie wartość

  Print a(c)       'drukujemy

Next

a(c + 1) = a       'można także obliczać indeksy

Ciągi znaków

Ciągi znaków (typ String) mogą składać się z maksymalnie 254 znaków. Ponieważ wewnętrzna jak i zewnętrzna pamięć RAM procesora jest ograniczona, przy definiowaniu tych zmiennych należy w definicji określić przewidywaną ich długość:

Dim S As String * 10

Instrukcja ta zdefiniuje zmienną tekstową (ciąg znaków) S, której długość może wynieść 10 znaków. Zmienna ta jednak w pamięci zajmie 11 bajtów, gdyż na końcu jest umieszczony znak końca ciągu. Jest nim znak o kodie 0 (null).

Ciągi znaków można łączyć za pomocą operatora +:

Dim S As String * 10 , Z As String * 10

S = "test"

Z = S + "abc"

W języku QBasic można wykonać operację łączenia ciągów z udziałem przypisywanej zmiennej:

S = "test"

S = "a" + s

W rezultacie zmienna S będzie zawierać "atest". W języku BASCOM BASIC 8051 nie jest to możliwe, gdyż oryginalna wartość zmiennej S musiałaby być skopiowana.

W języku BASCOM BASIC 8051 do zmiennej S przypisany będzie ciąg "a" a oryginalna zawartość zmiennej S będzie utracona. Dlatego w programie należy samodzielnie utworzyć kopię zmiennej S i dopiero wykonać operacji łączenia.

Wyrażenia i operatory

Przy wszystkich obliczeniach prowadzonych w programie, używane są wyrażenia i operatory. Ten punkt opisuje jak formułować wyrażenia z użyciem operatorów w języku BASCOM BASIC. W szczególności opisowi poddane będą:

•	Operacje arytmetyczne, używane podczas obliczeń,

•	Operatory relacji, używane podczas operacji porównywania,

•	Operatory logiczne, używane przy formułowaniu warunków i manipulacji bitami.

Wyrażenia w języku BASCOM BASIC.

Wyrażenie może składać się z liczb, zmiennych i ich kombinacji połączonych za pomocą operatorów. Operatory używane w wyrażeniach stanowią element działań matematycznych lub logicznych.

Ogólnie można zdefiniować format wyrażenia jako:

[[zmienna1][liczba1]] [operator1] [[zmienna2][liczba2]] [operatorN] ...

Dla przykładu kilka poprawnych konstrukcji wyrażeń:

A = A + 1              ‘dodaj 1 do zawartości zmiennej A

B = 2 + A * 3

If b <> 6 Then b = 6   ‘są tu dwa wyrażenia!

Operacje arytmetyczne

W skład zbioru operacji arytmetycznych wchodzą następujące operacje: + - * \ / oraz ^. Należy rozróżnić operację dzielenia na dwie możliwości:

/	Jest dzieleniem, przy którym otrzymujemy liczbę zmiennoprzecinkową.

Dim a As Single

a = 5 / 2

Print a

Wynikiem działania tego programu jest liczba 2.5.

\	Jest dzieleniem, przy którym otrzymujemy liczbę całkowitą. Operator ten powinno się używać tylko i wyłącznie dla zmiennych typu całkowitego (Byte, Integer, Word, Long). Jeśli w powyższym przykładzie zmienna a będzie typu Integer, a dzielenie zastąpimy dzieleniem całkowitym to wynik jaki uzyskamy będzie liczbą 2.

Z dzieleniem całkowitym jest związany inny operator tzw. reszty modulo - MOD. Operator ten pozwala obliczyć resztę z dzielenia całkowitego. Gdyby w przykładowym programie dopisano instrukcję:

b = 5 Mod 2

to w zmiennej b znalazła by się liczba 1, gdyż 5 = 2 * 2 + 1

Przekroczenie zakresu i dzielenie przez zero.

Operacja dzielenia przez zero spowoduje błąd. Aktualnie, błąd ten nie generuje stosownego komunikatu, dlatego należy zadbać by nie doszło do dzielenia przez zero.

Operatory relacji

Operatory relacji są używane przy porównywaniu dwóch wartości. Stosowane są przede wszystkim w instrukcjach mających wpływ na sposób działania programu. Lista operatorów używanych w języku BASCOM BASIC znajduje się poniżej:

Operator	Funkcja	Wyrażenie
=	Równość	X = Y
<>	Nierówność	X <> Y
<	Mniejszy	X < Y
>	Większy	X > Y
<=	Mniejszy lub równy	X <= Y
>=	Większy lub równy	X >= Y
Operacje relacji zawsze zwracają logiczna prawdę jeśli wyrażenie jest prawdziwe lub fałsz jeśli wyrażenie jest fałszywe.

Operatory logiczne

Operatory logiczne stosuje się najczęściej jako łącznik w operacjach relacji. Język BASCOM BASIC operuje czterema poniższymi typami operacji logicznych:

Operator	Znaczenie
NOT	Logiczna negacja
AND	Iloczyn logiczny
OR	Suma logiczna
XOR	Suma symetryczna
Operatory logiczne można używać także przy operacjach na bitach. Dla przykładu operator AND jest często wykorzystywany przy maskowaniu bitów. Operator OR przy ustawianiu w stan 1 poszczególnych bitów, a operator XOR może zmieniać stan pojedynczych bitów na przeciwny.

Przykład:

A = 63 And 19

Print A

A = 10 Or 9

Print A

A = &B0110 Xor &B0010

Print A

Wynikiem działania programu będzie:

16

11

 4    ‘czyli &B0100


Ograniczenia kompilatora
Ograniczenia jakie stawia kompilator języka BASCOM BASIC 8051.

Istnieje kilka ograniczeń jakie stawia sam kompilator języka BASCOM BASIC 8051.

Pierwsze z nich to ograniczenie w stosowaniu operatorów w formułach matematycznych. Ilustruje to prosty przykład:

Dobrze	Źle
a = a * b1	a = a * b1 + c

Drugie z nich to ograniczenie ilości zagnieżdżonych pętli:

FOR..NEXT	50
IF..THEN	50
DO..LOOP	50
WHILE..WEND	50
SELECT..CASE	25

Kompilator stawia także pewne wymagania dotyczące ilości zmiennych:

Max liczba etykiet	5000
Max ilość nazw zmiennych	1000
Max liczba zmiennych typu Integer/Word	10*
Max liczba zmiennych typu Byte	20*
Max liczba zmiennych typu Bit	120*
Max liczba zmiennych typu String	Zależna od ilości dostępnej pamięci XRAM
Max liczba instrukcji ALIAS	128
*) Zależna od ilości operujących na nich instrukcji i zmiennych innego typu.

Zapotrzebowanie na pamięć zmiennych rozkłada się następująco:

•	8 zmiennych Bit używa 1 bajtu,

•	1 zmienna typu Byte używa 1 bajtu,

•	1 zmienna typu Integer/Word używa 2 bajtów,

•	1 zmienna typu Long używa 4 bajtów,

•	1 zmienna typu Single używa 4 bajtów,

•	1 zmienna typu String używa tylu bajtów ile zostało zadeklarowanych znaków plus 1 bajt.

Używając kontrolerów posiadających większą ilość pamięci RAM (np. AT89s8252, posiadający 256 bajtów RAM) spowoduje, że maksymalna ilość zmiennych danego typu wzrasta.

Program używa także maksymalnie 32 bajtów na wewnętrzne potrzeby (konwersje typów i inne). Liczba rzeczywiście użytych bajtów zależy od treści programu.

Nie należy zapominać o stosie, którego wielkość także zależy od treści programu. Stosując analizę metodą worst case daje to: (32+16+8) = 56 bajtów.

Można zobaczyć ile bajtów rzeczywiście zostało zajętych przez program analizując treść raportu kompilacji.


Słowa zastrzeżone

$  1  A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R S  T  U  V  W  X  Y  Z  Rejestry

Poniżej przedstawiono listę wszystkich słów które są zastrzeżone w języku BASCOM BASIC. Kolorem czerwonym zaznaczono te instrukcje, które są dostępne jeśli system jest wyposażony w zewnętrzną pamięć RAM.

Znaki specjalne

!

(

)

$

$ASM

$BAUD

$BGF

$CRYSTAL

$DEFAULT XRAM

$EXTERNAL

$INCLUDE

$IRAMSTART

$LARGE

$LCD

$LCDRS

$LIB

$NOBREAK

$NOINITDNOINIT

$NONAN

$NONULL

$NORAMCLEAR

$NOSP

$OBJ

$RAMSIZE

$RAMSTART

$RAMTRON

$REGFILE

$ROMSTART

$SERIALINPUT

$SERIALINPUT2LCD

$SERIALOUTPUT

$SIM

$TIMEOUT

$WAIT

1

1WRESET

1WREAD

1WWRITE

A

ACK

ALIAS

ABS()

AND

AS

ASC()

B

BAUD

BCD()

BIT

BITWAIT

BLINK

BOOLEAN

BREAK

BYTE

C

CALL

CASE

CLS

CHR()

CONFIG

CONST

COUNTER

COUNTER0

COUNTER1

CPEEK()

CURSOR

D

DATA

DEC

DECLARE

DEFBIT

DEFBYTE

DEFLCDCHAR

DEFINT

DEFWORD

DELAY

DIM

DISABLE

DISPLAY

DO

DOWNTO

E

ELSE

ELSEIF

ENABLE

END

ERR

EXIT

EXTERNAL

F

FOR

FOURTH

FOURTHLINE

G

GATE

GETAD

GOSUB

GOTO

H

HEXVAL()

HIGH()

HIGHW()

HOME

I

I2CRECEIVE

I2CSEND

I2CSTART

I2CSTOP

I2CRBYTE

I2CWBYTE

IDLE

IF

INC

INKEY

INP()

INPUT

INPUTHEX

INT0

INT1

INTEGER

INTERNAL

IS

L

LCD

LCDHEX

LEFT

LEFT()

LOAD

LOCATE

LONG

LOOKUP

LOOP

LOW()

LOWW()

LOWER

LOWERLINE

M

MAKEBCD()

MAKEDEC()

MAKEINT()

MID()

MOD

MODE

MWINIT

MWREAD

MWWOPCODE

MWWRITE

N

NACK

NEXT

NOBLINK

NOSAVE

NOT

O

OFF

ON

OR

OUT

P

P0-P6

PEEK()

POKE

POWERDOWN

PSET

PRINT

PRINTHEX

PRIORITY

R

READ

READEEPROM

REM

RESET

RESTORE

RETURN

RIGHT

RIGHT()

RND()

ROTATE

S

SELECT

SERIAL

SET

SHIFT

SHIFTLCD

SHIFTCURSOR

SHIFTIN

SHIFTOUT

SHOWPIC

SOUND

SPACE()

START

STEP

STR()

STRING()

STOP

STOP TIMER

SUB

SWAP

T

THEN

THIRD

THIRDLINE

TIMEOUT

TIMER0

TIMER1

TO

U

UNTIL

UPPER

UPPERLINE

V

VAL()

W

WAIT

WAITKEY

WAITMS

WATCHDOG

WRITEEEPROM

WEND

WHILE

WORD

X

XOR

XRAM

Rejestry

TCON

P1

SCON

IE

P3

IP

PSW

ACC

B

SP

DPL

DPH

PCON

TMOD

TL0

TL1

TH0

TH1

SBUF


Różnice w stosunku do BASCOM Basic LT
Różnice w stosunku do BASCOM LT

Istnieje kilka różnic pomiędzy BASCOM 8051 a BASCOM LT:

•	Można używać tablic dla prawie wszystkich typów zmiennych,

•	Indeks tablicy może być tylko liczbą typu Byte, Integer, Word lub stałą,

•	Wbudowano obsługę liczb zmiennoprzecinkowych – typ Single,

•	Nowy symulator wyświetlacza LCD – można używać zdefiniowanych znaków. Z drugiej strony jest on wolniejszy.

•	Nowe instrukcje: SHIFTIN, SHIFTOUT,

•	Obsługa układu 80537 posiadającego dwa porty szeregowe,

•	Obsługa programatora/symulatora firmy Sample Electronics SE512,

•	Można używać górnych 128 bajtów RAM dostępnych w niektórych procesorach,

•	Dodano obsługę programowania AT89s53 przez MCS SPI,

•	Zmieniono asembler, co zaowocowało usunięciem jednego z jego przebiegów. Został on wykorzystany do celów optymalizacji kodu, choć nie jest on jeszcze skończony,

•	Dodano dyrektywy $ASM - $END ASM by uprościć programowanie w asemblerze,

•	Dodano $SERIALINPUT2LCD by przekierować dane przesyłane przez łącze szeregowe na wyświetlacz LCD,

•	Kompilator rozpoznaje słowa STATIC, COMMON i SHARED, więc nie jest potrzebne modyfikowanie programu w QBasic-u (zostają one zastąpione instrukcjami DIM)

•	Dodano obsługę specyficznych urządzeń wbudowanych w procesory 80517 i 80537,

•	Dodano obsługę programatora JPK-Serial SPI Programmer,

•	Dodano blokowe komentarze, ‘(  oraz '),

•	Dodano sprawdzanie składni (Ctrl+F7),

•	Dodano dyrektywę $DEFAULT XRAM, by zmienne umieszczone były w pamięci XRAM,

•	Dodano instrukcję CONFIG LCDPIN pokrywającą ustawienia w menu Options,

•	Są symulowane liczniki TIMER0 i TIMER1,

•	Dodano pomocne procedury w asemblerze umieszczające adres lub wartość zmiennej w rejestrze. Zobacz opis łączenia procedur w asemblerze z programem w Basic-u,

•	Edytor obsługuje zakładki (CTRL+K+x by ustawić, CTRL+Q+x by przejść do zakładki), gdzie x to klawisz z zakresu 1 – 8.

Wprowadzono także kilka zmian:

•	Instrukcja ROTATE posiada dodatkowy parametr określający liczbę przesunięć,

•	Typ Long jest teraz zapisywany w postaci LSB, NSB, NSB, MSB. Może to powodować problemy jeśli program obsługuje inny sposób zapisu,

•	Funkcja LOOKUP() współpracuje teraz z tablicami,

•	Dodano obsługę testowania bitów: IF a.1 = 1 THEN,

•	Dodano obsługę IF THEN [ELSE] dla wersji jednoliniowej,

•	Informacje o punktach przerwania (Breakpoints) są zapisywane pomiędzy sesjami,

•	GETDATA() oraz SETDATA() zostały usunięte, gdyż dostępne są tablice.


Dyrektywy #IF-#ELSE-#ENDIF
Dyrektywy #IF-ELSE-ENDIF

Przeznaczenie:

Dyrektywy preprocesora, dające możliwość kompilacji warunkowej.

Składnia:

#IF warunek

   ciąg_instrukcji

[ #ELSE

   ciąg_instrukcji ]

#ENDIF

gdzie:

warunek	wyrażenie, od którego zależy czy instrukcje po słowie IF będą skompilowane,
ciąg_instrukcji	dowolny ciąg instrukcji.

Opis:

Dyrektywy te pozwalają na użycie w programie tzw. kompilacji warunkowej.

Co to jest kompilacja warunkowa?

Normalnie poddany kompilacji jest cały tekst programu. Można jednak sprawić, by w zależności od podanego warunku, kompilator nie brał pod uwagę jakiegoś fragmentu tekstu. W tym celu należy użyć dyrektyw preprocesora, które spełnią to zadanie.

Dyrektywy kompilacji warunkowej opierają się na stałych, których wartość jest testowana zgodnie z podanym warunkiem podczas kompilacji. Dlatego przed instrukcjami kompilacji warunkowej, należy ją zdefiniować. Poniżej znajduje się prosty przykład, wyjaśniający całą idee:

Const demo = 1  ‘1-wersja demo  0-wersja pełna

#IF test

   Print "***To jest wersja DEMO***"

#ELSE

   Print "   *** Wersja 1.0 ***    "

#ENDIF

Kompilator udostępnia kilka stałych, których stan można wykorzystać do tworzenia warunku po słowie #IF:

_BUILDVERSION = 210	zawiera numer aktualnej wersji języka BASCOM 8051, 210 – oznacza wersję 2.10
Uwaga! Nie ma THEN w dyrektywie #IF, oraz #ENDIF to nie to samo co END IF.

Można także zagnieżdżać instrukcje kompilacji warunkowej do 25 poziomów. Użycie #ELSE jest opcjonalne, lecz należy pamiętać o dyrektywie #ENDIF.


Dyrektywa $ASM

Przeznaczenie:

Rozpoczyna blok wstawki asemblerowej.

Składnia:

$ASM

 ...

$END ASM

Opis:

Dyrektywa $ASM jest używana razem z dyrektywą $END ASM, podczas tworzenia bloków kodu w języku asembler, umieszczanych jako wstawki w programach języka BASCOM BASIC. Zamiast używać tych dyrektyw, można także przed każdą linią zawierającą mnemonik postawić znak !.

Większość mnemoników asemblera nie potrzebuje przedrostka !, gdyż są one rozpoznawane automatycznie przez kompilator BASCOM.

Zobacz także: Wstawki asemblerowe , Lista rozkazów

Przykład:

Dim c As Byte

$asm

  Mov R0,#{C}  ;adres zmiennej C

  Mov A,#1

  Mov @R0,A    ;zapisz 1 do zmiennej C

$end asm

Print c

End


Dyrektywa $BAUD

Przeznaczenie:

Zmienia ustawienie szybkości pracy wbudowanego układu RS-232. Użycie tej dyrektywy w programie zastępuje wartość podaną w opcjach kompilatora.

Składnia:

$BAUD = wartość

gdzie:

wartość	Liczba określająca szybkość pracy łącza RS 232 w bitach na sekundę (bod). Wartość nie może być zmienną, lub liczbą obliczaną podczas kompilacji.

Opis:

Jeśli istnieje potrzeba użycia innych częstotliwości pracy i szybkości transmisji niż te, które mogą być wybrane w opcjach kompilatora, należy użyć tej dyrektywy.

Uwaga! Należy także określić częstotliwość taktowania procesora dyrektywą $CRYSTAL, gdyż dyrektywy te występują zawsze razem.

W generowanym raporcie kompilacji, znajduje się informacja o aktualnej szybkości transmisji. Przy czym informacja ta jest podana gdy w programie występuje choć jedna instrukcja korzystająca z łącza szeregowego: PRINT, INPUT itd.

Zobacz także: $CRYSTAL

Przykład:

$baud = 2400

$crystal = 14000000       'zegar 14 MHz

Print "Czesc"

End


Dyrektywa $BGF

Przeznaczenie:

Dołącza do kodu programu treść pliku graficznego w formacie BASCOM Graphic File (BGF).

Składnia:

$BGF  "nazwa_pliku"

gdzie:

nazwa_pliku	Nazwa (ze ścieżką) pliku graficznego.

Opis:

Aby wyświetlić tak zapisany obrazek należy użyć instrukcji SHOWPIC.

Konwersje bitmapy na format BGF należy przeprowadzić za pomocą narzędzia z menu: Tools | Graphics Converter.

Zobacz także: SHOWPIC , PSET , CONFIG GRAPHLCD

Zobacz także: SHOWPIC , PSET , CONFIG GRAPHLCD

Przykład:

'------------------------------------------------------------------------------

'                                (c) 2000 MCS Electronics

'                                       GLCD.BAS

' Przykład pokazuje obsługę graficznego wyświetlacza LCD z kontrolerem T6963C

' Tylko wyświetlacze 240*64 są obsługiwane z 30 kolumnami (na razie)

' Komunikacja z wyświetlaczem jest przeprowadzana tylko w trybie PORT

' Połączenia:

' P1.0 - P1.7 z DB0-DB7 wyświetlacza LCD

' P3.2        do FS, wybór czcionki (może być połączone na stałe)

' P3.5        do CE, wybór układu

' P3.4        do CD, wybór rozkazy/dane

' P3.6        do WR

' P3.7        do RD

'Przyszłe wersje pozwolą na dostęp do wyświetlacza za pomocą szyny adresowej i danych (tryb BUS)

'Wyświetlacz pochodzący z oferty firmy Konrad (www.conrad.com) wymaga

'ujemnego napięcia zasilania do regulacji kontrastu.

'Ja używam 2 baterii 9V

'------------------------------------------------------------------------------

'konfiguracja wyświetlacza

Config Graphlcd = 240 * 64 , Port = P1 , Ce = P3.5 , Cd = P3.4 , Cols = 30

'definicja niektórych zmiennych

Dim X As Byte , Y As Byte

'

Reset P3.2 'szerokie znaki (8 bit) dają 30 kolumn

'Obsługiwane są następujące instrukcje:

Cls      'usunie wszystko z ekranu LCD (tekst i grafikę)

'Cls TEXT  usunie tylko tekst

'Cls GRAPH usunie tylko część graficzną

'By dokonać inicjalizacji wyświetlacza można użyć:

'Lcdinit

'Nie jest to jednak wymagane gdyż wyświetlacz jest inicjalizowany po resecie

'Można użyć Locate gdzie liczba rzędów to 1-8, a kolumn 1-30

Locate 1 , 1

'Kontrola stanu kursora jest taka sama jak dla alfanumerycznego LCD

Cursor On Blink

'No to teraz wypiszemy jakiś tekst

Lcd "Witaj swiecie"

'Uwaga! Kursor nie zmienia swojej pozycji. Należy go przesuwać instrukcją Locate

'A teraz część artystyczna z użyciem grafiki

'Można wyświetlać bitmapy, stworzone w jednym z edytorów graficznych.

'Muszą one być jednak przetworzone do postaci plku BGF (Bascom Graphics File)

'narzędziem umieszczonym w menu Tools.

'Konwersja zamienia wszystkie punkty nie mające koloru białego na czarne. Dodatkowo pakuje dane i zapisuje w formacie BGF.

'By wyświetlić tak przetworzoną grafikę, należy użyć instrukcji SHOWPIC.

'Która posiada trzy parametry: X,Y to pozycja wyświetlania grafiki na ekranie

'Wartości te muszą być podzielne przez 8 lub być zerem.

'Trzeci parametr to etykieta określająca adres danych graficznych.

Showpic 0 , 0 , Picture1

'Do dyspozycji jest także instrukcja PSET (znana z QBasic-a) zapalająca

'lub gasząca określony piksel. Wartość 0 zeruje a 1 ustawia piksel.

'Jakiś kwadracik

For X = 0 To 10

  For Y = 0 To 10

    Pset X , Y , 1

  Next

Next

'można go teraz usunąć

For X = 0 To 10

  For Y = 0 To 10 Step 2

    Pset X , Y , 0

  Next

Next

'Za pomocą PSET można stworzyć prosty oscyloskop lub rejestrator!

'Mamy nadzieję, że w przyszłości otrzymamy program od jakiegoś

'zainspirowanego użytkownika :-)

End

'adres danych obrazka

Picture1:

 '$BGF dołącza dane obrazka do kodu z pliku

  $bgf "samples\mcs.bgf"


Dyrektywa $CRYSTAL

Przeznaczenie:

Zmienia ustawienie częstotliwości zegara taktującego procesor. Użycie tej dyrektywy w programie zastępuje wartość podaną w opcjach kompilatora.

Składnia:

$CRYSTAL = wartość

gdzie:

wartość	Liczba określająca częstotliwość (w Hz!) kwarcu lub oscylatora taktującego procesor. Wartość nie może być zmienną, lub liczbą obliczaną podczas kompilacji.

Opis:

Jeśli istnieje potrzeba użycia innych częstotliwości pracy i szybkości transmisji, niż te które mogą być wybrane w opcjach kompilatora, należy użyć tej dyrektywy.

Uwaga! Należy także określić szybkość pracy łącza RS-232 dyrektywą $BAUD, gdyż dyrektywy te występują zawsze razem.

Zobacz także: $BAUD

Przykład:

$baud = 2400

$crystal = 14000000

Print "Czesc"

End


Dyrektywa $DEFAULT XRAM

Przeznaczenie:

Określa rodzaj pamięci w której umieszczone będą zmienne.

Składnia:

$DEFAULT XRAM

Opis:

Gdyby większość zmiennych miała być umieszczona w pamięci XRAM, zamiast dla każdej zmiennej określać obszar pamięci, można zastosować dyrektywę $DEFAULT XRAM:

$default XRAM

wtedy zmienne określane instrukcją DIM będą umieszczane w pamięci zewnętrznej.

Uwaga! Aby umieścić zmienną w pamięci wewnętrznej należy wtedy użyć instrukcji DIM z parametrem IRAM.

Zobacz także: DIM

Przykład:

$default XRAM

Dim A As Byte, b As Byte, C As Byte

'zmienne a, b oraz c będą umieszczone w pamięci XRAM

Dim D As IRAM Byte

'zmienna D będzie umieszczona w pamięci IRAM


Dyrektywa $EXTERNAL

Przeznaczenie:

Informuje kompilator by dołączył procedury lub funkcje w języku asembler z biblioteki.

Składnia:

$EXTERNAL Procedura1 [, Procedura2]

gdzie:

Procedura1
Procedura2	Nazwy procedur umieszczonych w bibliotece mające być dołączonych do kodu programu.

Opis:

Dyrektywa $EXTERNAL jest używana wewnętrznie przez kompilator by umożliwić użytkownikowi dostosowanie procedur w języku asemblera.

Można ją używać także by dołączyć własne procedury w asemblerze. Aktualnie, podane procedury są dołączane niezależnie od tego czy są używane w programie czy nie.

Zobacz także: $LIB

Przykład:

$lib "mylib.lib"    'określ nazwę pliku biblioteki

$external _dec76    'skorzystamy z jednej z procedur


Dyrektywa $INCLUDE

Przeznaczenie:

Wstawia zawartość pliku ASCII (np. fragment programu) od bieżącej pozycji tekstu źródłowego.

Składnia:

$INCLUDE ”nazwa_pliku”

gdzie:

nazwa_pliku	Nazwa dołączanego pliku ze ścieżką dostępu. Plik musi zawierać tekst programu w języku BASCOM BASIC.

Opis:

Ta dyrektywa pozwala na dołączenie innego programu lub pliku z tekstem źródłowym najczęściej używanych fragmentów programu.

Pozwala to na stworzenie biblioteki sprawdzonych procedur, których użycie jest niezbędne w aktualnym programie głównym. Można w ten sposób uporządkować tworzony program lub ukryć niepotrzebne szczegóły. Jeśli zaś wymagane są zmiany w programie, można zmienić tylko treść dołączanego programu, a nie programu głównego.

Uwaga! Można dołączać tylko pliki z tekstem, tzw. pliki ASCII.

Przykład:

'------------------------------------------------------------

'                  (c) 1997-2000 MCS Electronics

'------------------------------------------------------------

'  plik: INCLUDE.BAS

'  demo: $INCLUDE

'------------------------------------------------------------

Print "INCLUDE.BAS"

$include "123.bas"   'dołącz plik który drukuje tekst HELLO

Print "Powracamy do INCLUDE.BAS"

End


Dyrektywa $IRAMSTART

Przeznaczenie:

Określa pierwszą dostępną komórkę wewnętrznej pamięci RAM procesora.

Składnia:

$IRAMSART = adres

gdzie:

adres	adres pierwszej komórki (0-255).

Opis:

Zobacz także: $NOINIT , $RAMSTART

Przykład:

$noinit

$nosp

$iramstart = &H60        'pierwsza komórka nadająca się do użycia

SP = 80

Dim I As Integer


Dyrektywa $LARGE

Przeznaczenie:

Informuje kompilator by zastępował rozkazy ACALL rozkazami LCALL.

Składnia:

$LARGE

Opis:

Wewnętrznie podprogramy są wywoływane przez ACALL. Rozkaz ACALL zajmuje tylko 2 bajty (LCALL 3 bajty).

Rozkaz ACALL może być jednak używany tylko dla wywołań procedur w obrębie strony (2048 bajtów). W układzie AT89c2051 nie stwarza to problemu, gdyż ma tylko 2 KB pamięci Flash.

Kiedy kod jest generowany dla innego mikroprocesora, podprogramy mogą być umieszczone poza obszarem działania ACALL, więc kompilator zgłasza błąd. Umieszczając w programie dyrektywę $LARGE, informujemy kompilator by używał instrukcji LCALL, która pozwala na zaadresowanie pełnych 64KB.

Przykład:

$large             'wystąpił błąd 148 więc użyjemy tej opcji


Dyrektywa $LCD

Przeznaczenie:

Informuje kompilator by generował kod dla wyświetlacza LCD podłączonego przez szynę danych.

Składnia:

$LCD =  [&H]adres

gdzie:

adres	Adres, który należy ustawić na szynie adresowej by sterować linią E wyświetlacza. Adres zapisany szesnastkowo musi mieć przedrostek &H.

Opis:

Szyna danych wyświetlacza (linie db0-db7) musi być podłączona do szyny danych procesora D0-D7. Gdyby wyświetlacz pracował w trybie komunikacji 4 bitowej, podłączone są tylko linie D4-D7. Adres sterujący sygnałem RS wyświetlacza należy ustawić dyrektywą $LCDRS.

W systemach z zewnętrzną pamięcią (EP)ROM/RAM, można umieścić wyświetlacz w jej przestrzeni adresowej. Wtedy za pomocą dekodera adresów sterujemy linią E i RS wyświetlacza.

Uwaga! Użycie tej dyrektywy, ma sens tylko przy zdefiniowaniu także adresu sterującego wyświetlaczem dyrektywą $LCDRS.

Zobacz także: $LCDRS

Przykład:

$lcd = &H8000      'zapisywanie wartości pod ten adres ma powodować

                   'ustawienie linii E wyświetlacza LCD.

$lcdrs = &H8002    'zapisywanie wartości pod ten adres ma powodować

                   'ustawienie linii RS wyświetlacza LCD.

Cls

Lcd "Witaj świecie!"

End


Dyrektywa $LCDRS

Przeznaczenie:

Informuje kompilator by generował kod dla wyświetlacza LCD podłączonego przez szynę danych.

Składnia:

$LCDRS =  [&H]adres

gdzie:

adres	Adres, który należy ustawić na szynie adresowej by sterować linią RS wyświetlacza. Adres zapisany szesnastkowo musi mieć przedrostek &H.

Opis:

Szyna danych wyświetlacza (linie db0-db7) musi być podłączona do szyny danych procesora D0-D7. Gdyby wyświetlacz pracował w trybie 4 bitowym, podłączone są tylko linie D4-D7. Adres sterujący sygnałem E wyświetlacza należy ustawić dyrektywą $LCD.

W systemach z zewnętrzną pamięcią (EP)ROM/RAM, można umieścić wyświetlacz w jej przestrzeni adresowej. Wtedy za pomocą dekodera adresów sterujemy linią E i RS wyświetlacza.

Uwaga! Użycie tej dyrektywy, ma sens tylko przy zdefiniowaniu także adresu sterującego wyświetlaczem dyrektywą $LCD.

Zobacz także: $LCD

Przykład:

$lcd = &H8000      'zapisywanie wartości pod ten adres ma powodować

                   'ustawienie linii E wyświetlacza LCD.

$lcdrs = &H8002    'zapisywanie wartości pod ten adres ma powodować

                   'ustawienie linii RS wyświetlacza LCD.

Cls

Lcd "Elektor"


Dyrektywa $LIB

Przeznaczenie:

Informuje kompilator o korzystaniu z procedur umieszczonych w zewnętrznej bibliotece.

Składnia:

$LIB  "biblioteka"

gdzie:

biblioteka	Nazwa biblioteki w których należy szukać procedur zdefiniowanych dyrektywą $EXTERNAL.

Opis:

Dyrektywa $LIB jest używana wewnętrznie przez kompilator by umożliwić użytkownikowi dostosowanie procedur w języku asemblera.

Można użyć tej dyrektywy by korzystać w programach z własnych bibliotek. Można dla przykładu skopiować bibliotekę mcs.lib do nowego pliku, nazwanego np. mylib.lib oraz zmodyfikować starą jej treść. W ten sposób kompilator może używać biblioteki użytkownika. Jednakże plik mcs.lib musi pozostać w podkatalogu LIB, gdyż nie można go usuwać.

Uwaga! Zawsze rób kopie zapasowe pliku mcs.lib przed każdą jej modyfikacją.

Nie jest zalecana modyfikacja zawartości biblioteki mcs.lib, ponieważ biblioteka ta ulega modyfikacjom przy tworzeniu nowych wersji BASCOM-8051 i użytkownik musiałby wszystkie zmiany wprowadzać na nowo.

Zobacz także: $EXTERNAL

Przykład:

$lib "mylib.lib"    'określ nazwę pliku biblioteki

$external _dec76    'skorzystamy z jednej z procedur


Dyrektywa $MAP

Przeznaczenie:

Informuje kompilator by wygenerował adresy linii programu w raporcie kompilacji.

Składnia:

$MAP

Opis:

Dyrektywa $MAP powoduje dołączenie adresów poszczególnych linii w pamięci kodu, do generowanego raportu kompilacji. Informacja ta może być użyta podczas usuwania błędów w programie przez inne narzędzia.

Przykład:

$map

Print "Hello"

Print "Test"

W raporcie kompilacji umieszczony będzie poniższy fragment:

Code map

-----------------------------------------------------------

Line                                   Address(hex)

-----------------------------------------------------------

 2                                     52

 3                                     69

 5                                     80


Dyrektywa $NOBREAK

Przeznaczenie:

Instruuje kompilator by nie generował kodu dla instrukcji BREAK.

Składnia:

$NOBREAK

Opis:

Instrukcja BREAK, umieszcza w skompilowanym programie specjalny kod (który nie jest wykonywany przez procesor) używany przez symulator by zatrzymać symulację.

Jeśli program ma być skompilowany z pominięciem instrukcji BREAK, wtedy zamiast usuwać wszystkie te instrukcje, można na początku programu umieścić dyrektywę $NOBREAK.

Zobacz także: BREAK

Przykład:

$nobreak

Break       'nie zostanie skompilowana

End


Dyrektywa $NOINIT

Przeznaczenie:

Instruuje kompilator by generował kod bez fragmentu odpowiedzialnego za inicjalizację.

Składnia:

$NOINIT

Opis:

BASCOM BASIC dołącza odpowiedni kod inicjalizujący procesor w zależności od używanych w programie instrukcji.

Jeśli użytkownik chce samodzielnie przeprowadzić inicjalizację, można na początku programu umieścić właśnie dyrektywę $NOINIT.

Inicjalizacja jest wykonywana zawsze jeśli ustawiany jest programowy stos oraz gdy potrzebna jest inicjalizacja wyświetlacza LCD (jeśli w programie używana jest instrukcja LCD).

Jeśli jako monitor w opcjach został wybrany Altair, generowany jest poniższy fragment kodu:

Mov IE,#255

Mov SCON,#82

Jest to spowodowane tym, że program monitora Altair wymaga umieszczenia tego fragmentu kodu. Jest on dodawany automatycznie, mimo iż użyto w programie dyrektywy $NOINIT.

Zobacz także: $NOSP

Przykład:

$noinit

' program będzie tutaj

End


Dyrektywa $NONAN

Przeznaczenie:

Dyrektywa zmieniająca wartość NAN (Not A Number) na 0.0 dla zmiennych typu Single.

Składnia:

$NONAN

Opis:

Zmienne typy Single mogą zwracać wartość NAN jeśli nie są brane pod uwagę jako liczby. Umieszczenie dyrektywy $NONAN powoduje, że zmienne te zwracają wtedy wartość 0.0.


Dyrektywa $NONULL

Przeznaczenie:

Dyrektywa zmieniająca sposób zapisu ciągów znaków w liniach DATA.

Składnia:

$NONULL = wartość

gdzie:

wartość	0 – tryb normalny, -1 – tryb specjalny.

Opis:

Ciągi znaków umieszczone w liniach DATA są zapisywane zawsze z końcowym znakiem o kodzie 0, który służy jako wskaźnik końca ciągu. W niektórych sytuacjach może to przeszkadzać. Na przykład jeśli programista napisze własne procedury, pracujące z długimi ciągami znaków.

Jeśli w programie umieszczono: $NONULL = -1, wtedy dodatkowy znak 0 nie będzie dodawany. Powrót do normalnego trybu zapewnia dyrektywa z parametrem 0.

Przykład:

$nonull = -1

Lbl:

  Data "test" , "test"

Lbl2:

$nonull = 0                          'tryb normalny

  Data "test" , "test"


Dyrektywa $NORAMCLEAR

Przeznaczenie:

Instruuje kompilator by nie umieszczał w procedurze inicjalizacji fragmentu czyszczącego zawartość pamięci.

Składnia:

$NORAMCLEAR

Opis:

Normalnie pamięć RAM jest kasowana podczas inicjalizacji. Gdy zawartość pamięci nie powinna być kasowana (zapisywana zerami), można użyć tej dyrektywy.

Ponieważ podczas kasowania pamięci zawartość wszystkich zmiennych jest ustawiana jako 0 lub "" (dla String), umieszczenie dyrektywy $NORAMCLEAR spowoduje, że ich zawartość będzie nieznana. Prawdopodobnie będą one wypełnione wartością &H0FF, choć nie jest to pewne.

Zobacz także: $NOINIT

Przykład:

$noramclear

' program będzie tutaj

End


Dyrektywa $NOSP

Przeznaczenie:

Instruuje kompilator by generował kod bez fragmentu odpowiedzialnego za inicjalizację stosu.

Składnia:

$NOINIT

Opis:

BASCOM BASIC dołącza odpowiedni kod inicjalizujący procesor w zależności od używanych w programie instrukcji.

Jeśli użytkownik chce samodzielnie przeprowadzić inicjalizację, można na początku programu umieścić właśnie dyrektywę $NOINIT.

Inicjalizacja jest wykonywana zawsze jeśli ustawiany jest programowy stos oraz gdy potrzebna jest inicjalizacja wyświetlacza LCD (jeśli w programie używana jest instrukcja LCD).

Dyrektywa $NOSP pozwala na ominięcie fragmentu odpowiedzialnego za ustawienie stosu.

Zobacz także: $NOINIT

Przykład:

$noinit

$nosp

' program będzie tutaj

End


Dyrektywa $OBJ

Przeznaczenie:

Dołącza do programu fragmenty umieszczone w plikach OBJ w standardzie Intel.

Składnia:

$OBJ kod

gdzie:

kod	Kod w pliku OBJ

Opis:

W niektórych przypadkach może być użyteczne dołączenie kodu z pliku OBJ. Kod ten może zostać wygenerowany przez inne narzędzia.

Przykład:

$obj D291          'ekwiwalent SET P1.1


Dyrektywa $RAMSIZE

Przeznaczenie:

Informuje kompilator o rozmiarze zewnętrznej pamięci RAM.

Składnia:

$RAMSIZE =  [&H]rozmiar

gdzie:

rozmiar	rozmiar (w bajtach) pamięci zewnętrznej. Aby podać rozmiar w zapisie szesnastkowym, musi on mieć przedrostek &H.

Opis:

Jeśli system jest wyposażony w pamięć XRAM (zewnętrzną), należy określić jak duża jest ta pamięć.

Zobacz także: $RAMSTART

Przykład:

$romstart = &H4000

$ramstart = 0

$ramsize = &H1000

Dim x As XRAM Byte     'zmienna będzie umieszczona w XRAM


Dyrektywa $RAMSTART

Przeznaczenie:

Informuje kompilator o adresie pierwszej komórki zewnętrznej pamięci RAM.

Składnia:

$RAMSTART =  [&H]adres

gdzie:

rozmiar	adres począwszy od którego umieszczane będą zmienne w XRAM, lub najniższy adres który uaktywnia pamięć XRAM. Aby podać adres w zapisie szesnastkowym, musi on mieć przedrostek &H.

Opis:

Można użyć tej opcji, gdy program jest uruchamiany w systemach wyposażonych w pamięć XRAM.

Zobacz także: $RAMSIZE

Przykład:

$romstart = &H4000

$ramstart = 0

$ramsize = &H1000


Dyrektywa $RAMTRON

Przeznaczenie:

Informuje kompilator by używał pamięci komunikującej się przez SPI jako XRAM.

Składnia:

$RAMTRON

Opis:

Firma Ramtron (www.ramtron.com) sprzedaje specjalną pamięć EEPROM, która jest tak samo szybka jak normalna pamięć SRAM. Może ona być przeprogramowana około bilion razy.

Podanie dyrektywy $RAMTRON powoduje, że jako pamięć XRAM będzie używany chip firmy Ramtron. Dyrektywa działa tylko z układem AT89S8252, gdyż pamięć ta może być dołączona do sprzętowego SPI.

Jeśli w programie zadeklarowane będą zmienne, umieszczane w XRAM, w rzeczywistości do ich przechowywania będzie używana pamięć EEPROM.

Jest to dobre rozwiązanie dla rozszerzenia pamięci bez konieczności stosowania dekodera adresów, multipleksowanej szyny danych itd. Pamięć EEPROM jest umieszczona w obudowie 8 końcówkowej, co pozwala na uproszczenie systemu.

Uwaga! Dobrym rozwiązaniem w tym wypadku, jest używanie zmiennych w XRAM sporadycznie. Co prawda dane katalogowe podają, że pamięć ta może być przeprogramowana wiele razy i mogą minąć lata zanim któraś z komórek przestanie działać poprawnie. Jednak należy pamiętać, że nadal jest to EEPROM.

Asembler:

Jeśli zapisywana jest pamięć XRAM instrukcją MOVX @DPTR,A, wykonywany jest skok do procedury _WriteRamtron. Żaden z rejestrów nie jest niszczony i nic nie jest zwracane.

Jeśli zaś dokonywany jest odczyt z pamięci XRAM instrukcją MOVX A,@DPTR, wykonywany jest skok do procedury _ReadRamtron. Zawartość komórki jest zwracana w akumulatorze, tak samo jakby to zrobiła instrukcja MOVX.

Obie procedury są umieszczone w bibliotece mcs.lib. Wywołują one procedurę _Wait_Spif oczekującą na ustawienie bitu SPIF.

Przykład:

'-------------------------------------------------------

'                  (c) 2002 MCS Electronics

'                        RAMTRON.BAS

' Przykład ten pokazuje jak używać pamięci firmy RAMTRON jako XRAM

'-------------------------------------------------------

'działa tylko z kontrolerem 89s8252

$regfile = "89s8252.dat"

'Informujemy kompilator o używaniu pamięci Ramtron

'NIE JEST MOŻLIWE PRZEPROWADZENIE SUYMULACJI, gdyż występuje dyrektywa $RAMTON

'Rozwiązaniem jest umieszczenie tej dyrektywy tuż po przeprowadzeniu niezbędnych symulacji.

$ramtron

Dim X As Byte , X1 As Byte

'Teraz zdefiniujemy coś w XRAM. Będzie to umieszczone w pamięci Ramtron

Dim Z(10) As Xram Byte

Wait 1

'Ja używam P1.3 jako linii sterującej CS więc biblioteka mcs.lib także używa tej końcówki

'P1.4 może być także używany, choć wymaga to zmian w bibliotece mcs.lib

'Przykład ten teraz działa!

'Lecz posiadam także kod jak: *+4, który nie zawsze działa.

'Muszę zmienić ten kod. Poinformujcie mnie jeśli któraś z procedur nie będzie działać

'w połączeniu z dyrektywą $RAMTRON

'zapiszmy coś do pamięci

For X = 1 To 10

  Z(x) = X

Next

'drukujemy dane

For X = 1 To 10

  Print Z(x)

Next

End


Dyrektywa $REGFILE

Przeznaczenie:

Informuje kompilator, by użył podanego pliku definicji rejestrów, zamiast określonego w opcjach kompilatora.

Składnia:

$REGFILE = ”nazwa”

gdzie:

nazwa	Nazwa pliku z definicją rejestrów.

Opis:

Pliki z definicjami rejestrów są umieszczone w katalogu programu BASCOM-8051 i mają rozszerzenie .DAT. Plik definicji zawiera informacje o nazwach rejestrów wewnętrznych, ich adresów w konkretnym typie kontrolera oraz o adresach przerwań.

Uwaga! Dyrektywa $REGFILE musi być pierwszą dyrektywą umieszczoną w programie.

Przykład:

'komentarze to nie problem, gdyż nie są one tłumaczone na kod

$regfile = "8052.DAT"


Dyrektywa $ROMSTART

Przeznaczenie:

Instruuje kompilator by umieścił kod w pliku HEX od podanego adresu.

Składnia:

$ROMSTART = adres

gdzie:

adres	adres bazowy jaki ma przyjąć kompilator podczas generowania kodu.

Opis:

Jeśli dyrektywa ta nie występuje, standardowo adres początkowy jest ustawiany na 0. Zatem pierwsza instrukcja umieszczona będzie pod adresem 0. Zmiana tego adresu spowoduje, że kod umieszczony będzie od podanego adresu.

Można używać tej opcji gdy zachodzi potrzeba przetestowania kodu umieszczonego w pamięci RAM. Kod musi być załadowany i umieszczony pod wskazanym adresem oraz wywołany przez program monitora.

Program monitora musi jednak przesunąć adresy przerwań w odpowiednie miejsce! Gdy dyrektywa określa: $ROMSTART = &H4000, wtedy program monitora musi wykonać instrukcję LJMP. Jeśli adresem przerwania jest 3, monitor musi wykonać skok pod adres &H4003. Inaczej przerwanie nie zostanie obsłużone prawidłowo. Dotyczy to jednak tylko programu typu monitor.

Zobacz także: $RAMSTART

Przykład:

$romstart = &H4000    'ROM umieszczony pod adresem 4000h


Dyrektywa $SERIALINPUT

Przeznaczenie:

Informuje kompilator by użył procedury użytkownika dla instrukcji INPUT.

Składnia:

$SERIALINPUT = nazwa

gdzie:

nazwa	Adres procedury, przekazany przez etykietę, która ma być wywołana by odebrać znak.

Opis:

Za pomocą tej dyrektywy można zmienić standardową procedurę odczytywania znaków przez instrukcję INPUT, by korzystała z procedury użytkownika. Można w ten sposób określić inne urządzenie pełniące rolę wejścia.

Odebrany znak musi być umieszczony w akumulatorze (ACC).

Uwaga! Instrukcja INPUT jest wykonywana do czasu odebrania znaku <CR> (kod 13).

Zobacz także: $SERIALOUTPUT

Przykład:

$serialinput = Myinput

 'tutaj będzie twój program

End

!myinput:

 ;potrzebne operacje będą tutaj

  Mov a, SBUF  ;bufor transmisji do acc

  Ret


Dyrektywa $SERIALINPUT2LCD

Przeznaczenie:

Dyrektywa włącza przekierowanie odebranych znaków z urządzenia UART na ekran LCD.

Składnia:

$SERIALINPUT2LCD

Opis:

Można stworzyć własne procedury wejścia/wyjścia i za pomocą dyrektyw $SERIALINPUT oraz $SERIALOUTPUT przekierować działanie instrukcji INPUT czy PRINT. Dyrektywa $SERIALINPUT2LCD może być bardzo pomocna przy testowaniu tych procedur.

Zobacz także: $SERIALINPUT , $SERIALOUTPUT

Przykład:

$serialinput2lcd

Dim v As Byte

Cls

Input "Liczba ", v   'to zostanie także wyświetlone na ekranie LCD


Dyrektywa $SERIALOUPUT
Dyrektywa $SERIALOUTPUT

Przeznaczenie:

Informuje kompilator by użył procedury użytkownika dla instrukcji PRINT.

Składnia:

$SERIALOUTPUT = nazwa

gdzie:

nazwa	Nazwa procedury (etykieta!), która ma być wywołana by wysłać znak.

Opis:

Za pomocą tej dyrektywy można zmienić standardową procedurę przesyłania znaków przez instrukcję PRINT, by korzystała z innego urządzenia niż przez wbudowany UART. Procedura obsługi urządzenia musi być napisana przez użytkownika.

Uwaga! Wysyłany znak jest umieszczony w akumulatorze (ACC).

Zobacz także: $SERIALINPUT, $SERIALINPUT2LCD

Przykład:

$serialoutput = MyOutput

'twój program będzie tutaj

Do

  Print "Witaj"

Loop

End

!Myoutput:

 'umieść treść procedury tutaj

  Mov SBUF , A   ;rejestr bufora UART (domyślnie)

  Ret


Dyrektywa $SIM

Przeznaczenie:

Instruuje kompilator by nie generował pętli opóźniających dla instrukcji WAIT. Spowoduje to zwiększenie szybkości symulacji.

Składnia:

$SIM

Opis:

Symulacja instrukcji WAIT może trwać dość długo, zwłaszcza gdy otwarte jest okno podglądu zawartości pamięci. Umieszczenie tej dyrektywy spowoduje, że kompilator nie wygeneruje pętli opóźniających dla instrukcji WAIT. Przyśpieszy to oczywiście symulację programu.

Uwaga! Gdy program będzie gotowy, należy usunąć (lub umieścić w linii komentarza) dyrektywę $SIM przed programowaniem pamięci Flash/EPROM, inaczej instrukcje WAIT nie będą działać poprawnie.

Zobacz także: BREAK

Przykład:

$sim        ‘nie generuj kodu dla instrukcji WAIT i WAITMS

Do

  Wait 2    ‘teraz symulacja jest bardzo szybka

Loop


Dyrektywa $TIMEOUT

Przeznaczenie:

Instruuje kompilator, że instrukcje wprowadzania danych przez łącze szeregowe używają parametru TIMEOUT.

Składnia:

$TIMEOUT

Opis:

Dyrektywa $TIMEOUT powoduje zmodyfikowanie procedur wejściowych łącza szeregowego i umożliwia stosowanie parametru TIMEOUT w instrukcjach: INPUT, INPUTBIN , INPUTHEX i innych.

Zobacz także: INPUT , GET

Przykład:

$timeout

Dim Name As String * 10

Rem teraz można używać parametru TIMEOUT

Input "Name " , name TIMEOUT = 100000   'używa opcji “time out”

Input "Name " , name                    'czeka aż użytkownik naciśnie Enter


Dyrektywa $WAIT

Przeznaczenie:

Dyrektywa kompilatora która powoduje wstawienie do procedury inicjalizacyjnej dwusekundowego opóźnienia.

Składnia:

$WAIT

Opis:

Gdy używany jest ISP w kontrolerze AT89c8252, wymaga on by po resecie odczekać 1 sekundę. Inaczej można na stałe zablokować możliwość programowania pamięci kontrolera przez ISP!

Nie należy mylić dyrektywy $WAIT z instrukcją WAIT.

Uwaga! Dyrektywa $WAIT jest potrzebna tylko dla AT89c8252!

Przykład:

$wait           'tylko dla at89c8252


Instrukcja 1WRESET

Przeznaczenie:

Instrukcja ta przywraca poprawny stan magistrali 1Wire, oraz wysyła rozkaz reset do urządzeń podłączonych do magistrali.

Składnia:

1WRESET

1WRESET pin

gdzie:

pin	nazwa końcówki portu pełniącej rolę magistrali, np.: P1.1

Opis:

Instrukcja 1WRESET zeruje stan szyny 1Wire. Jeśli operacja się nie powiedzie, zmienna ERR zwraca wartość 1 jako kod błędu.

Można także pracować z kilkoma magistralami urządzeniami 1Wire, dołączonymi do różnych końcówek portu mikrokontrolera. By używać tego rozszerzonego trybu, w każdej operacji na szynie 1Wire musi być określona końcówka portu (pin).

Instrukcje 1WRESET, 1WWRITE i 1WREAD mogą nadal pracować według starej składni. Wtedy końcówkę portu będącą szyną 1Wire określa się w opcjach kompilatora lub instrukcją CONFIG 1WIRE.

Zobacz także: 1WREAD, 1WWRITE

Przykład:

'--------------------------------------------------------------

'                    1WIRE.BAS

' Demonstruje 1wreset, 1wwrite oraz 1wread()

' Wymagany jest rezystor podciągający 4K7 na linii portu P.1

' pastylka DS2401 dołączona jest do P1.1

'--------------------------------------------------------------

Config 1wire = P1.1                     'używamy tej końcówki portu

Dim Ar(8) As Byte , A As Byte , I As Byte

1wreset                                 'reset

Print Err                               'wydrukuj błąd jeśli wystąpił

1wwrite &H33                            'rozkaz odczytaj ROM

For I = 1 To 8

  Ar(i) = 1wread()                      'wpisz do tablicy (numer ID)

Next

For I = 1 To 8

   Printhex Ar(i);                      'wydrukuj

Next

Print                                   'następna linia

'Można używać wiele końcówek jako osobnych magistral

'Najpierw zdefiniujemy alias

Tsensor Alias P1.2

'Parametr opcjonalny określa używaną nazwę portu

1wreset Tsensor                     'reset

1wwrite &H33 Tsensor                'prześlij daną przez Tsensor

1wwrite Ar(1) , 2 Tsensor           'wyślij dwa bajty przez Tsensor

A = 1wread(tsensor)                 'odczytaj bajt z Tsensor

Ar(1) = 1wread(2 , P1.2)            'odczytaj dwa bajty z Tsensor

End


Funkcja 1WREAD()

Przeznaczenie:

Instrukcja odczytuje dane z urządzeń podłączonych do magistrali 1Wire.

Składnia:

zmienna = 1WREAD( [ il_bajtów ] )

zmienna = 1WREAD( [ il_bajtów ] [, pin] )

gdzie:

zmienna	zmienna do której odczytana zostanie dana,
il_bajtów	opcjonalnie; określa ilość odbieranych bajtów,
pin	nazwa końcówki portu pełniącego rolę magistrali, np.: P1.1.

Opis:

Instrukcja odczytuje dane z urządzenia podłączonego do magistrali 1Wire. Gdy il_bajtów nie jest podana jako parametr, instrukcja odczytuje jeden bajt danych.

Odczytywanie kilku bajtów danych, ma sens tylko gdy zmienna nie jest typu Byte. Najlepszym rozwiązaniem jest użycie tablicy bajtów.

Można także pracować z kilkoma magistralami 1Wire dołączonymi do różnych końcówek portu mikrokontrolera. By używać tego rozszerzonego trybu, w każdej operacji na szynie 1Wire musi być określona końcówka portu (pin).

Instrukcje 1WRESET, 1WWRITE i 1WREAD mogą nadal pracować według starej składni. Wtedy końcówkę portu będącą szyną 1Wire określa się w opcjach kompilatora lub instrukcją CONFIG 1WIRE.

Zobacz także: 1WWRITE , 1WRESET

Przykład:

'--------------------------------------------------------------

'                    1WIRE.BAS

' Demonstruje 1wreset, 1wwrite oraz 1wread()

' Wymagany jest rezystor podciągający 4K7 na linii portu P.1

' pastylka DS2401 dołączona jest do P1.1

'--------------------------------------------------------------

Config 1wire = P1.1                     'używamy tej końcówki portu

Dim Ar(8) As Byte , A As Byte , I As Byte

1wreset                                 'reset

Print Err                               'wydrukuj błąd jeśli wystąpił

1wwrite &H33                            'rozkaz odczytaj ROM

For I = 1 To 8

  Ar(i) = 1wread()                      'wpisz do tablicy (numer ID)

Next

For I = 1 To 8

   Printhex Ar(i);                      'wydrukuj

Next

Print                                   'następna linia

'Można używać wiele końcówek jako osobnych magistral

'Najpierw zdefiniujemy alias

Tsensor Alias P1.2

'Parametr opcjonalny określa używaną nazwę portu

1wreset Tsensor                     'reset

1wwrite &H33 Tsensor                'prześlij daną przez Tsensor

1wwrite Ar(1) , 2 Tsensor           'wyślij dwa bajty przez Tsensor

A = 1wread(tsensor)                 'odczytaj bajt z Tsensor

Ar(1) = 1wread(2 , P1.2)            'odczytaj dwa bajty z Tsensor

End


Instrukcja 1WWRITE

Przeznaczenie:

Instrukcja wysyła dane do urządzeń podłączonych do magistrali 1Wire.

Składnia:

1WWRITE zmienna [, il_bajtów]

1WWRITE zmienna [, il_bajtów ] , pin

gdzie:

zmienna	zmienna w której umieszczono wysyłane dane. Można także podawać stałe liczbowe.
il_bajtów	opcjonalnie określa ilość wysyłanych bajtów,
pin	nazwa końcówki portu pełniąca rolę magistrali, np.: P1.1.

Opis:

Można pracować z kilkoma magistralami 1Wire dołączonymi do różnych końcówek portu mikrokontrolera. By używać tego rozszerzonego trybu, w każdej operacji na szynie 1Wire musi być określona końcówka portu (pin).

Instrukcje 1WRESET, 1WWRITE i 1WREAD mogą nadal pracować według starej składni. Wtedy końcówkę portu będącą szyną 1Wire określa się w opcjach kompilatora lub instrukcją CONFIG 1WIRE.

Zobacz także: 1WREAD , 1WRESET

Przykład:

'--------------------------------------------------------------

'                    1WIRE.BAS

' Demonstruje 1wreset, 1wwrite oraz 1wread()

' Wymagany jest rezystor podciągający 4K7 na linii portu P.1

' pastylka DS2401 dołączona jest do P1.1

'--------------------------------------------------------------

Config 1wire = P1.1                     'używamy tej końcówki portu

Dim Ar(8) As Byte , A As Byte , I As Byte

1wreset                                 'reset

Print Err                               'wydrukuj błąd jeśli wystąpił

1wwrite &H33                            'rozkaz odczytaj ROM

For I = 1 To 8

  Ar(i) = 1wread()                      'wpisz do tablicy (numer ID)

Next

For I = 1 To 8

   Printhex Ar(i);                      'wydrukuj

Next

Print                                   'następna linia

'Można używać wiele końcówek jako osobnych magistral

'Najpierw zdefiniujemy alias

Tsensor Alias P1.2

'Parametr opcjonalny określa używaną nazwę portu

1wreset Tsensor                     'reset

1wwrite &H33 Tsensor                'prześlij daną przez Tsensor

1wwrite Ar(1) , 2 Tsensor           'wyślij dwa bajty przez Tsensor

A = 1wread(tsensor)                 'odczytaj bajt z Tsensor

Ar(1) = 1wread(2 , P1.2)            'odczytaj dwa bajty z Tsensor

End


Funkcja ABS()

Przeznaczenie:

Zwraca wartość absolutną zmiennej numerycznej.

Składnia

zmienna1 = ABS( zmienna2 )

gdzie:

zmienna1	zmienna której przypisuje się wartość absolutną,
zmienna2	zmienna której wartość absolutną trzeba obliczyć, musi być typu Integer, Long.

Opis:

Wartość absolutna jest zawsze liczbą dodatnią.

Różnice w stosunku do QBasic-a:

Nie jest możliwe stosowanie stałych ani zmiennych typu Single jako parametru zmienna2 w funkcji ABS().

Przykład:

Dim a As Integer, c As Integer

a = -1000

c = Abs(a)

Print c

End


Instrukcja ALIAS

Przeznaczenie:

Pozwala na zdefiniowanie przyjaznej nazwy zmiennej.

Składnia:

nowa_nazwa ALIAS stara_nazwa

gdzie:

stara_nazwa	Bieżąca nazwa zmiennej,
nowa_nazwa	Nowa nazwa zmiennej.

Opis:

Instrukcję ALIAS stosuje się do zmiany nazw zmiennych na przyjazne. Jest to szczególnie użyteczne przy nazywaniu rejestrów, czy portów procesora.

Można także używać instrukcji ALIAS by nadać nazwę konkretnym bitom w zmiennej.

Zobacz także: CONST

Przykład:

Direction Alias P1.1   'można teraz używać direction zamiast P1.1

Set Direction          'to samo co SET P1.1

Dim A As Byte

M Alias A.0

N Alias A.1

Set M

Set N

If M = N Then

  Print "Oba bity są ustawione"

End If

End


Funkcja ASC()

Przeznaczenie:

Zwraca kod ASCII podanego znaku.

Składnia:

zmienna = ASC( tekst )

gdzie:

zmienna	nazwa zmiennej której przypisywany jest wynik. Może być typu Byte, Integer, Word lub Long.
tekst	zmienna tekstowa lub stała tekstowa, do konwersji.

Opis:

Funkcja zwraca kod ASCII znaku zawartego w zmiennej tekstowej. Dla zmiennych typu String dłuższych niż jeden znak, funkcja przekształca tylko pierwszy znak ciągu. Jeśli ciąg był pusty ("") funkcja zwraca kod zero.

Zobacz także: CHR

Przykład:

Dim a As Byte, s As String * 10

s = "ABC"

a = Asc(s)

Print a        'wydrukuje liczbę 65

End


Funkcja AVG()

Przeznaczenie:

Zwraca obliczoną średnią dla liczb umieszczonych w tablicy.

Składnia

zmienna = AVG( tablica(1) )

gdzie:

zmienna	zmienna której przypisuje się wartość średnią,
tablica	nazwa tablicy, której elementy podlegać będą obliczeniom.

Opis:

Uwaga! Funkcja obsługuje tylko tablice składające się z bajtów. W przyszłości także inne typy tablic zostaną udostępnione.

Zobacz także:  MIN , MAX

Przykład:

Dim ar(10) As Byte

Dim bP As Byte

For bP = 1 To 10

  ar(bP) = bP

Next

bP = Avg(ar(1))

Print bP

End


Instrukcja BAUD
Zmienna specjalna BAUD

Przeznaczenie:

Zmienia szybkość transmisji wbudowanego układu UART.

Składnia:

BAUD = szybkość

gdzie:

szybkość	szybkość transmisji jaka ma obowiązywać od tej pory.

Opis:

Można zmienić szybkość pracy układu UART w trakcie działania programu. Można także w ten sposób określić niestandardową szybkość pracy łącza.

Nie należy mylić instrukcji BAUD z dyrektywą $BAUD. Dyrektywa $BAUD zmienia domyślne ustawienia w opcjach kompilatora a instrukcja BAUD programowo zmienia bieżącą szybkość transmisji.

Zobacz także: $CRYSTAL, $BAUD

Przykład:

$baud = 2400

$crystal = 14000000    'kwarc 14 MHz

Print "Hello"

'teraz zmienimy szybkość transmisji

Baud = 9600

Print "Zmieniłem szybkość!"

End


Funkcja BCD()

Przeznaczenie:

Zamienia wartość zapisaną w kodzie BCD na tekst.

Składnia:

PRINT BCD( zmienna )

LCD BCD( zmienna )

gdzie:

zmienna	wartość poddana konwersji. Może być typu Byte, Integer, Word, Long lub stałą liczbową.

Opis:

Gdyby zaistniała konieczność przedstawienia wartości BCD jako tekstu można użyć funkcji BCD(). Funkcja ta zwraca wartość z dodanym na początku zerem.

Uwaga! Funkcja ta działa tylko w połączeniu z instrukcjami PRINT i LCD.

Aby stosować konwersję do innych celów niż drukowanie wartości, należy używać funkcji MAKEBCD.

Zobacz także: MAKEDEC , MAKEBCD

Przykład:

Dim a as Byte

a = 65

Lcd a

Lowerline

Lcd Bcd(a)

End


Instrukcja BITWAIT

Przeznaczenie:

Instrukcja oczekująca na ustawienie lub wyzerowanie bitu.

Składnia:

BITWAIT bit , SET | RESET

gdzie:

bit	nazwa zmiennej bitowej lub bitu w porcie mikrokontrolera, np.: P1.0

Opis:

Instrukcja powoduje wstrzymanie działania programu, dopóki określony bit nie zostanie ustawiony w stan 1 (parametr SET) lub w stan 0 (parametr RESET).

Gdy jako bit została podana nazwa zdefiniowanej zmiennej bitowej, należy zadbać by była ona modyfikowana przez program – np. w procedurze obsługującej przerwania. Jeśli będą używane rejestry procesora ustawiane bądź zerowane sprzętowo jak np. P1.0, wtedy kontynuacja działania programu zależy od urządzenia skojarzonego z tą końcówką.

Asembler:

Instrukcja Bitwait P1.0 , SET  przetłumaczona zostanie na:

Jnb h'91,*+0

Instrukcja Bitwait P1.0 , RESET  zaś na:

Jb h'91,*+0

Przykład:

Dim a As Bit

Bitwait a , Set          'czekaj aż bit będzie ustawiony

Bitwait P1.7, Reset      'czekaj aż 7 linia portu 1 będzie w stanie 0.

End


Instrukcja BREAK

Przeznaczenie:

Wstawia w kod wynikowy zarezerwowaną instrukcję, co powoduje zatrzymanie symulatora.

Składnia:

BREAK

Opis:

Instrukcja BREAK, umieszcza w skompilowanym programie specjalny kod (który nie jest wykonywany przez procesor) używany przez symulator by zatrzymać symulację. Kodem tym jest bajt o wartości 0A5h.

Po przeprowadzeniu symulacji i stwierdzeniu że program działa poprawnie, instrukcje BREAK należy usunąć. Można nie usuwać wszystkich tych instrukcji i umieścić w programie dyrektywę $NOBREAK, która zablokuje kompilację instrukcji BREAK.

Zobacz także: $NOBREAK

Przykład:

Print ”Witaj”

Break       'tu symulator przerwie

End


Instrukcja CALL

Przeznaczenie:

Wywołuje i wykonuje procedurę.

Składnia:

CALL nazwa [( parametr1 [, parametrn] )]

gdzie:

nazwa	nazwa wywoływanej procedury,
parametr1
parametrn	dowolna zmienna lub stała.

Opis:

Instrukcja CALL wywołuje procedurę napisaną przez użytkownika. Ilość parametrów zależy od zadeklarowanej w instrukcji DECLARE SUB. Można także wywoływać procedury bezparametrowe.

W przeciwieństwie do wywoływania podprogramów instrukcją GOSUB, stosowanie instrukcji CALL i procedur, pozwala na przejrzyste przekazanie parametrów.

Uwaga! Jest szczególnie ważne by procedura została zadeklarowana przez DECLARE SUB, przed jej używaniem w programie. Ilość parametrów podanych podczas wywołania musi się zgadzać z ilością parametrów zadeklarowanych.

Przewidziano także możliwość wywoływania procedur bez słowa CALL. Przy tego typu wywołaniu nie stosuje się zamykania parametrów w nawiasach:

Call MojaProc(x,y,z)

jest równoważne:

MojaProc x , y , x

Jest to także sposób na lokalne utworzenie nowych instrukcji języka BASCOM BASIC.

Zobacz także: DECLARE SUB , SUB , EXIT

Przykład:

Dim A As Byte, bb As Byte 'określimy kilka zmiennych

'deklaracja procedury

Declare Sub Test(bb As Byte)

A = 65                    'przypisujemy wartość zmiennej A

Call Test (A)             'wywołujemy proc. Test z parametrem A

Test A                    'inny sposób wywołania

Print A                   'drukujemy zawartość A

End

Sub Test(bb As Byte)

'parametry musza być takie same jakie zadeklarowano!!

  Lcd bb                    'piszemy na LCD

  Lowerline

  Lcd Bcd(bb)

End Sub


Funkcja CHR()

Przeznaczenie:

Zamienia liczbowy kod na odpowiadający mu znak zestawu ASCII.

Składnia:

PRINT CHR( zmienna2 )

zmienna1 = CHR( zmienna2 )

gdzie:

zmienna2	zmienna numeryczna lub stała,
zmienna1	zmienna tekstowa.

Opis:

Funkcja ta zamienia wartość zapisaną w zmiennej na odpowiadający tej wartości kod ASCII. Jest często używana do wypisywania znaków, których nie można uzyskać bezpośrednio z klawiatury  podczas pisania programu. Dotyczy to szczególnie znaków wyświetlacza LCD zdefiniowanych przez użytkownika (kody 0-7).

Może być także użyteczna gdy kod znaku jest dopiero obliczany w programie.

Zobacz także: ASC()

Przykład:

Dim a As Byte    'jakaś zmienna

a = 65           'teraz ma 65

LCD a            'pisz wartość (65)

Lowerline

Lcdhex(a)        'teraz wartość w Hex (41)

Lcd Chr(a)       'a teraz znak czyli A

End


Instrukcja CLS

Przeznaczenie

Usuwa znaki z ekranu wyświetlacza LCD.

Składnia (dla wyświetlaczy alfanumerycznych):

CLS

Składnia (dla wyświetlaczy graficznych):

CLS  [ TEXT | GRAPH ]

Opis:

Wykonanie tej instrukcji powoduje wyczyszczenie zawartości wyświetlacza LCD, oraz ustawienie kursora na początek pierwszej linii. Instrukcja ta nie narusza pamięci CG-RAM gdzie są umieszczone znaki zdefiniowane przez użytkownika.

Dla wyświetlaczy graficznych instrukcja CLS kasuje stronę tekstową i graficzną. Podanie jednak argumentu TEXT lub GRAPH, spowoduje że tylko dane z określonej “strony graficznej” zostaną usunięte.

Zobacz także: $LCD , LCD

Przykład:

Cls          'kasuj wyświetlacz

Lcd "Czesc"  'wypisz to co zwykle :)

Wait 5

Cls

End


Instrukcja CLOSE
Instrukcja CLOSE #

Przeznaczenie:

Zamyka otwarty kanał transmisji programowego lub sprzętowego urządzenia UART.

Składnia:

CLOSE #kanał

gdzie:

kanał	numer otwartego kanału.

Opis:

Instrukcja ta zamyka otwarty wcześniej kanał instrukcją OPEN. Numer kanału jest nadawany przy operacji otwarcia.

Uwaga! Każdy otwarty kanał powinien zostać zamknięty gdy nie jest już wykorzystywany.

Zobacz także: OPEN , GET , PUT , PRINT

Przykład:

Zobacz przykłady w opisie instrukcji OPEN.


Instrukcje CONFIG

Instrukcja CONFIG w połączeniu z nazwą urządzenia, używana jest do konfiguracji urządzeń sprzętowych. Lista wszystkich możliwych form instrukcji jest przedstawiona poniżej:

CONFIG 1WIRE

CONFIG ADUC812

CONFIG BAUD

CONFIG BAUD1

CONFIG DEBOUNCE

CONFIG GETRC

CONFIG GRAPHLCD

CONFIG I2CDELAY

CONFIG LCD

CONFIG LCDBUS

CONFIG LCDPIN

CONFIG MICROWIRE

CONFIG PRINT

CONFIG SCL

CONFIG SDA

CONFIG SERVOS

CONFIG SPI

CONFIG TIMER0

CONFIG TIMER1

CONFIG TIMER2

CONFIG WATCHDOG


Instrukcje CONFIG TIMER0, CONFIG TIMER1

Przeznaczenie:

Ustala sposób działania sprzętowego licznika-czasomierza TIMER0 lub TIMER1.

Składnia:

CONFIG TIMERx = COUNTER | TIMER , GATE = INTERNAL | EXTERNAL , MODE = 0 | 1 | 2 | 3

gdzie:

x	0 – TIMER0, 1 – TIMER1,

Opis:

TIMER0 i TIMER1 mogą pracować jako liczniki impulsów zewnętrznych gdy pierwszy parametr jest ustawiony jako COUNTER. Impulsy zliczane muszą być dostarczane za pomocą końcówki T0 dla TIMER0 i T1 dla TIMER1.

Gdy liczniki mają pracować jako czasomierze, wtedy pierwszy parametr ma być ustawiony jako TIMER. Licznik wtedy zlicza impulsy zegarowe, pochodzące z generatora taktującego procesor. Są one wcześniej dzielone przez dzielnik o stopniu podziału 12.

Parametr GATE służy do włączania lub wyłączania zewnętrznego bramkowania. Gdy jest ustawiony jako INTERNAL wtedy sterowaniem zliczania zajmuje się tylko bit TR0 dla licznika TIMER0 i TR1 dla licznika TIMER1. Oba bity są umieszczone w rejestrze TCON.

Jeśli zaś parametr ten jest określony jako EXTERNAL, wtedy można dodatkowo sterować zliczaniem za pomocą końcówek INT0 dla TIMER0 i INT1 dla TIMER1. Należy jednak pamiętać, że wyzerowanie bitu TRx, także wyłącza zliczanie.

Licznik TIMER0 i TIMER1 mogą pracować w trzech trybach 0, 1, 2. Tryb 3 jest zarezerwowany tylko dla licznika TIMER0.

W trybie 0 i 1 liczniki pracują jako normalne liczniki/czasomierze. Różnica pomiędzy tymi trybami, polega na różnej ilości bitów wchodzących w skład licznika. W trybie 0 licznik jest 13 bitowy (jest on wtedy kompatybilny z licznikiem w układach MCS-48), a w trybie 1 licznik jest 16 bitowy.

W trybie 2 licznik pracuje jako 8-bitowy i posiada funkcje automatycznego przeładowywania. Zliczane impulsy trafiają wtedy do rejestru TLx, natomiast THx służy do zapamiętywania wartości, która ma być automatycznie wpisana po przepełnieniu TLx.

Tryb 3 to specjalny tryb pracy licznika/czasomierza TIMER0, w którym obie połówki 16-bitowego licznika mogą pracować jako dwa niezależnie liczniki 8 bitowe. Przy czym TL0 zlicza impulsy zewnętrzne lub zegarowe (określa to stan bitu C/T w bajcie TMOD), a TH0 może zliczać tylko impulsy zegarowe. Sterowanie zliczaniem odbywa się: dla TL0 bitem TR0 i/lub zewnętrznym bramkowaniem; dla TH0 bitem TR1.

Dla przykładu instrukcja:

Config Timer0 = Counter , Gate = Internal , Mode = 2

ustawi pracę licznika TIMER0 jako licznika impulsów zewnętrznych, bez zewnętrznego bramkowania, pracującego w trybie 2 (z automatycznym przeładowywaniem).

Dalszych informacji należy szukać w danych katalogowych firmy Intel lub Atmel.

Licznik po skonfigurowaniu jest zatrzymany. Uruchomienie licznika następuje przez wydanie polecenia START TIMERx. Aby w dowolnej chwili zatrzymać pracę licznika, należy użyć instrukcji STOP TIMERx. Instrukcje te powodują ustawienie lub wyzerowanie odpowiednich bitów w rejestrze TCON.

Uwaga! Licznik TIMER1 jest używany do generowania impulsów, taktujących układ transmisji szeregowej. Dlatego nie może być używany jeśli w programie występują instrukcje korzystające z układu UART.

Przykład:

'Na początku musisz skonfigurować pracę licznika Timer0, by pracował

'jako licznik lub czasomierz

'Skonfigurujemy go jako licznik 16 bitowy, bez bramkowania.

Config Timer0 = Counter , Mode = 1 , Gate = Internal

'By odczytać lub zapisać dane do licznika użyjemy specjalnej zmiennej

'systemowej

'Najpierw ją zerujemy

Counter0 = 0

Start Counter0      'musimy włączyć pracę licznika gdyż wpisaliśmy nową wartość

Delay

Print Counter0      'zobaczymy ile impulsów zliczył

End


Instrukcja CONFIG TIMER2

Przeznaczenie:

Ustala sposób działania sprzętowego licznika-czasomierza TIMER2. Tylko układy 8032/8052 i kompatybilne.

Składnia:

CONFIG  TIMER2 = TIMER | COUNTER , GATE = INTERNAL | EXTERNAL , MODE = 0 | 1 | 2 | 3 | 4 | 5

CONFIG  TIMER2 = COUNTER , GATE = INTERNAL | EXTERNAL , MODE = 0 , DIRECTION = UP | DOWN

Opis:

Licznik TIMER2 występuje w kontrolerach 8032/8052 i kompatybilnych. Poniższy opis dotyczy układu 8032/8052. Nie jest on jednak przeznaczony dla układu 80c535.

TIMER2 jest 16-bitowym uniwersalnym licznikiem-czasomierzem, mogącym pracować jako licznik zdarzeń lub jako czasomierz. TIMER2 pracuje w trzech podstawowych trybach: z przechwytywaniem, z automatycznym przeładowaniem (liczenie w górę lub w dół) i jako generator szybkości transmisji.

Tryb z przechwytywaniem

W trybie z przechwytywaniem można stosować dwie opcje:

Licznik pracuje jako 16-bitowy licznik-czasomierz, ustawiający bit TF2 po przepełnieniu licznika. Bit ten może być źródłem przerwania:

Praca jako licznik:

CONFIG TIMER2 = COUNTER , GATE = INTERNAL , MODE = 1

Praca jako czasomierz:

CONFIG TIMER2 = TIMER , GATE = INTERNAL , MODE = 1

Praca licznika może odbywać się tak samo jak powyżej z dodaną opcją przechwytywania zawartości licznika, gdy nastąpi zmiana stanu na końcówce T2EX z logicznej 1 na 0. Po stwierdzeniu zmiany zawartość rejestrów TL2 i TH2, zostaje skopiowana do rejestrów RCAP2L i RCAP2H.

Praca jako licznik:

CONFIG TIMER2 = COUNTER, GATE = EXTERNAL, MODE = 1

Praca jako czasomierz:

CONFIG TIMER2 = TIMER , GATE = EXTERNAL , MODE = 1

Dodatkowo zmiana stanu końcówki T2EX powoduje ustawienie bitu EXF2 w rejestrze T2CON, który może być także źródłem przerwania jak bit TF2.

Procedura przerwania licznika TIMER2 może zbadać stan bitów TF2 oraz EXF2 by dokładnie określić co było źródłem przerwania. (Nie ma możliwości ustawiania zawartości rejestrów odpowiedzialnych za funkcję automatycznego przeładowywania w tym trybie. Jeśli wystąpi warunek przechwycenia, licznik zlicza dalej przez czas zmiany stanu T2EX lub fosc/12 impulsów).

Tryb z automatycznym przeładowywaniem.

W trybie tym TIMER2 pracuje jako 16-bitowy licznik-czasomierz z możliwością automatycznego przeładowywania zawartości licznika po przepełnieniu lub niedopełnieniu, gdyż licznik może wtedy zliczać w górę lub w dół (Tylko niektóre układy! przyp. tłumacza). Stan bitu DCEN (w rejestrze T2MOD) i końcówki T2EX określa kierunek zliczania.

Licznik TIMER2 normalnie zlicza w górę do wartości &H0FFFF i ustawia flagę TF2 gdy licznik się przepełni. Powoduje to także, że rejestry wchodzące w skład licznika TIMER2 (tj. TL2 i TH2) zostaną automatycznie załadowane wartością przechowywaną w rejestrach RCAP2L i RCAP2H.

Wartości znajdujące się w rejestrach RCAP2L i RCAP2H są określane przez program użytkownika.

Praca jako licznik:

CONFIG TIMER2 = COUNTER , GATE = INTERNAL , MODE = 0

Praca jako czasomierz:

CONFIG TIMER2 = TIMER , GATE = INTERNAL , MODE = 0

Jeśli bit EXEN2 = 1 wtedy przeładowywanie następuje po stwierdzeniu wysokiego stanu bitu TF2 lub też po stwierdzeniu zmiany stanu (z logicznej 1 na 0) końcówki T2EX. Zmiana ta ustawia także flagę EXF2. Przerwanie licznika TIMER2 może zostać zgłoszone zarówno po ustawieniu flagi TF2 jak i ustawieniu flagi EXF2.

Praca jako licznik:

CONFIG TIMER2 = COUNTER , GATE = EXTERNAL , MODE = 0

Praca jako czasomierz:

CONFIG TIMER2 = TIMER , GATE = EXTERNAL , MODE = 0

W niektórych układach licznik TIMER2 może liczyć zarówno w górę jak i w dół. W trybie tym stan końcówki T2EX określa kierunek zliczania. Stan wysoki powoduje, że licznik zlicza w górę. Przepełnienie następuje gdy licznik przekroczy &H0FFFF. Ustawiana jest wtedy flaga TF2, co powoduje wygenerowania przerwania – jeśli są one włączone. Przepełnienie licznika spowoduje także automatyczne przepisanie nowej wartości do rejestrów licznika z rejestrów RCAP2L i RCAP2H.

Praca jako licznik:

CONFIG TIMER2 = COUNTER , GATE = INTERNAL | EXTERNAL , MODE = 0 , DIRECTION = UP

Praca jako czasomierz:

CONFIG TIMER2 = COUNTER , GATE = INTERNAL | EXTERNAL , MODE = 0 , DIRECTION = UP

Logiczne zero na końcówce T2EX powoduje, że licznik TIMER2 zlicza w dół. Gdy wystąpi niedopełnienie – co oznacza, że zawartość licznika zgadza się zawartością rejestrów RCAP2L i RCAP2H – do licznika wpisana będzie wartość &H0FFFF i ustawiona zostanie także flaga TF2.

Praca jako licznik:

CONFIG TIMER2 = COUNTER , GATE = INTERNAL | EXTERNAL , MODE = 0 , DIRECTION = DOWN

Praca jako czasomierz:

CONFIG TIMER2 = COUNTER , GATE = INTERNAL | EXTERNAL , MODE = 0 , DIRECTION = DOWN

Bit flagi TF2 zatem zmienia się, gdy występuje przepełnienie lub niedopełnienie licznika TIMER2. W trybie ze zliczaniem w dół, flaga EXF2 nie jest źródłem przerwań.

Praca jako generator szybkości transmisji

Tryb ten pozwala na używanie licznika TIMER2 jako generatora sygnału zegarowego dla układu UART, w celu ustawienia odpowiedniej szybkości transmisji. Licznik TIMER1 może wtedy służyć do innych celów.

CONFIG TIMER2 = TIMER , GATE = INTERNAL , MODE = 2

W trybach gdzie TIMER2 jest generatorem dla układu UART, można wykorzystać flagę EXF2 do detekcji opadającego zbocza na końcówce T2EX. W konsekwencji tego generowane jest także przerwanie licznika TIMER2. Przy czym należy w programie ustawić bit EXEN2!

Praca tylko jako generator dla odbiornika

Tryb ten pozwala na używanie licznika TIMER2 tylko jako generatora sygnału zegarowego dla odbiornika układu UART. Licznik TIMER1 może wtedy służyć jako generator dla innej szybkości transmisji.

CONFIG TIMER2 = TIMER , GATE = INTERNAL , MODE = 3

Uwaga! Tryb pracy licznika TIMER1 musi być ustawiony z poziomu asemblera.

Praca tylko jako generator dla nadajnika

Tryb ten pozwala na używanie licznika TIMER2 tylko jako generatora sygnału zegarowego dla nadajnika układu UART. Licznik TIMER1 może wtedy służyć jako generator dla innej szybkości transmisji.

CONFIG TIMER2 = TIMER , GATE = INTERNAL , MODE = 4

Uwaga! Tryb pracy licznika TIMER1 musi być ustawiony z poziomu asemblera.

Generator impulsów

Niektóre z wariantów 8052 (np. Atmel 89c52 przyp. tłumacza) posiadają możliwość generowania impulsów prostokątnych o wypełnieniu 50% na końcówce P1.0. Tryb ten można ustawić instrukcją:

CONFIG TIMER2 = TIMER , MODE = 5

Częstotliwość wyjściowa jest określana wtedy wzorem: fout = (fosc / 4) / (65536 - CAPTURE). By wpisać wartość do rejestrów RCAP2L i RCAP2H, należy użyć: CAPTURE = wartość , gdzie wartość powinna być typu Word.

Jak określić co wywołało przerwanie ?

Można przetestować stan bitu T2CON.7 by określić czy przerwanie wywołane było przepełnieniem licznika. Tak samo testowanie stanu bitu T2CON.6 pozwala stwierdzić, czy źródłem przerwania było przeładowanie nowej wartości do licznika (reload) lub przechwyceniem zawartości licznika (capture) w związku ze zmianą stanu końcówki T2EX.

Bity te nie są zerowane po przyjęciu przerwania.

Timer2_ISR:

  If T2CON.7 = 1 Then

    Print "Licznik się przepełnił"

  Else

    If T2CON.6 = 1 Then

      Print "Zmiana stanu końcówki T2EX"

    End If

  End If

  Reset T2CON.6          ‘bity te nie są zerowane sprzętowo i należy

  Reset T2CON.7          ‘je skasować przed opuszczeniem procedury

Return


Instrukcja CONFIG LCD

Przeznaczenie:

Ustala typ wyświetlacza LCD, pokrywając ustawienia w opcjach kompilatora.

Składnia:

CONFIG LCD = typ_LCD

gdzie:

typ_LCD	typ dołączonego wyświetlacza. W języku BASCOM BASIC zdefiniowano następujące typy:
	40 * 4,
	40 * 2
	20 * 4,
	20 * 2,
	16 * 4,
	16 * 2 (wartość domyślna),
	16 * 1,
	40 * 4a
	16 * 1a.

Opis:

Standardowo jest zdefiniowany wyświetlacz 16 * 2 (chyba że zostało to zmienione w opcjach kompilatora), więc jeśli taki typ wyświetlacza jest używany, można pominąć instrukcję CONFIG LCD.

Wyświetlacz typu 16 * 1a jest odpowiednikiem wyświetlacza dwie linie po 8 znaków, w którym pierwszy znak drugiej linii zaczyna się pod adresem 8.

Wyświetlacz 40 * 4a to także specjalna wersja wyświetlacza. Posiada on dwa niezależne kontrolery i w tym celu ma dwie linie ENABLE. Instrukcja CONFIG LCDPIN dla tego typu wyświetlacza musi rozpoczynać się tak:

CONFIG LCDPIN = PIN , E1 = Pin , E2 = Pin , itd.

By wybrać pomiędzy liniami E1 a E2 należy odpowiednio ustawić rejestr B:

Mov b,#0   'wybiera E1

Mov b,#1   'wybiera E2

Instrukcja LCD działa ze stałymi, a także z ciągami znaków. By wywołać procedury niskiego poziomu należy użyć:

Mov A,#2           ; rozkaz w akumulatorze

Mov b,#0           ; lub Mov b,#1

Acall LCD_CONTROL  ; wywołaj procedurę

Wy wysłać daną a nie rozkaz należy użyć WRITE_LCD zamiast LCD_CONTROL.

Większość procedur dotyczących LCD działa poprawnie z wyświetlaczem 40*4a, choć niektóre mogą zawieść. W tym wypadku należy użyć procedur niskopoziomowych, jak pokazano to wyżej.

Przykład:

'Przykład dla normalnego wyświetlacza

Config Lcd = 40 * 4

Lcd "Hello"        'coś piszemy

Fourthline         'wybieramy linię 4

Lcd "4"            'i drukujemy 4

End


Instrukcja CONFIG LCDBUS

Przeznaczenie:

Określa sposób komunikacji z wyświetlaczem LCD.

Składnia:

CONFIG  LCDBUS = ilość_bitów

gdzie:

ilość_bitów	4 dla transmisji 4-bitowej, 8 dla transmisji 8-bitowej.

Opis:

Instrukcji tej powinno się używać w połączeniu z dyrektywą $LCD.

Kiedy komunikacja z wyświetlaczem LCD następuje po szynie danych, standardowo jest używane 8 bitów. Aby przełączyć tryb komunikacji na 4-bitowy, należy użyć tej instrukcji.

W trybie 4-bitowym wykorzystywane są tylko dane od D7 do D4.

Zobacz także: CONFIG LCD

Przykład:

$lcd = &H8000           'adres sygnału E

Config Lcdbus = 4       'komunikacja 4 bitowa

Lcd "Witaj"


Instrukcja CONFIG 1WIRE

Przeznaczenie:

Konfiguruje sposób podłączenia magistrali 1Wire do mikrokontrolera.

Składnia:

CONFIG  1WIRE = końcówka_portu

gdzie:

końcówka_portu	nazwa końcówki portu, będąca magistralą 1Wire.

Opis:

Instrukcja CONFIG 1WIRE pokrywa tylko standardowe ustawienie w opcjach kompilatora.

Zobacz także: 1WRESET , 1WREAD , 1WWRITE

Przykład:

Config 1wire = P1.0      'P1.0 będzie pełnił rolę magistrali 1Wire

1wreset                  'reset magistrali


Instrukcja CONFIG SDA

Przeznaczenie:

Pokrywa domyślne ustawienia dotyczące linii SDA interfejsu I2C.

Składnia:

CONFIG  SDA = końcówka_portu

gdzie:

końcówka_portu	nazwa końcówki portu pełniącego rolę sygnału SDA.

Opis:

Gdy sposób dołączenia magistrali I2C zmienia się w zależności od projektu, można używać tej instrukcji by lokalnie zmienić domyślne ustawienia z menu Options | Compiler. W ten sposób będziesz pamiętał jakie końcówki portu zostały użyte w bieżącym projekcie, i nie trzeba będzie za każdym razem zmieniać ustawień w opcjach kompilatora.

Zobacz także: CONFIG SCL  ,  CONFIG I2CDELAY

Przykład:

Config Sda = P3.7      'P3.7 będzie linią SDA

'Zobacz także przykład dotyczący magistrali I2C.


Instrukcja CONFIG SCL

Przeznaczenie:

Pokrywa domyślne ustawienia dotyczące linii SCL interfejsu I2C.

Składnia:

CONFIG  SCL = końcówka_portu

gdzie:

końcówka_portu	nazwa końcówki portu pełniącego rolę sygnału SCL.

Opis:

Gdy sposób dołączenia magistrali I2C zmienia się w zależności od projektu, można używać tej instrukcji by lokalnie zmienić domyślne ustawienia z menu Options | Compiler. W ten sposób będziesz pamiętał jakie końcówki portu zostały użyte w bieżącym projekcie, i nie trzeba będzie za każdym razem zmieniać ustawień w opcjach kompilatora.

Instrukcja nie może być używana do dynamicznej zmiany końcówek podczas pracy programu.

Zobacz także: CONFIG SDA  ,  CONFIG I2CDELAY

Przykład:

Config Scl = P3.5      'P3.5 będzie linią SCL


Instrukcja CONFIG DEBOUNCE

Przeznaczenie:

Określa czas opóźnienia kolejnych odczytów w instrukcji DEBOUNCE.

Składnia:

CONFIG  DEBOUNCE = czas

gdzie:

czas	opóźnienie w milisekundach, pomiędzy kolejnymi odczytami stanu portu.

Opis:

Standardowo opóźnienie to wynosi 25ms. Można je zmienić podając inny czas opóźnienia w instrukcji CONFIG DEBOUNCE.

Uwaga! Czas opóźnienia bazuje na wartości uzyskanej przy zegarze 12MHz.

Zobacz także: DEBOUNCE

Przykład:

Config Debounce = 30  'kiedy nie będzie użyta ta opcja, domyślnym

                      'opóźnieniem jest 25ms

Debounce P1.0 , 0 , Pr , Sub

Debounce P1.0 , 0 , Pr , Sub

'                    ^----- etykieta określająca gdzie skoczyć

'               ^---------- skocz gdy P1.0 przejdzie w stan 0

'         ^---------------- testuj P1.0

'Debounce P1.0 , 1 , Pr1  'a tu aż przejdzie w stan 1

Pr:

  Print "P1.0 przeszedł w stan niski"

Return

Pr1:

  Print "P1.0 przeszedł w stan wysoki"

Return


Instrukcja CONFIG SPI

Przeznaczenie:

Konfiguruje tryb pracy interfejsu SPI.

Składnia (emulacja programowa):

CONFIG  SPI = SOFT, DIN = pin , DOUT = pin , CS = pin , CLK = pin , DATA ORDER = pin , NOCS =

gdzie:

pin	nazwa końcówki pełniącej rolę sygnału.

Składnia (interfejs sprzętowy):

CONFIG SPI = HARD, INTERRUPT = ON | OFF , DATA ORDER = LSB | MSB , MASTER = YES | NO , POLARITY = HIGH | LOW , PHASE = 0 | 1 , CLOCKRATE = 4 | 16 | 64 | 128

CONFIG SPI = ON | OFF

Opis:

Tylko procesor 89s8252 posiada sprzętowy interfejs SPI. Dla innych procesorów nie posiadających tego układu, język BASCOM BASIC udostępnia emulację programową tego interfejsu. Gdy jest ona wybrana (SPI = SOFT) należy określić, które końcówki będą pełnić rolę sygnałów interfejsu SPI.

Dodatkowy parametr NOCS= (nie podaje się żadnej wartości!), określa że stan końcówki CS musi być ustawiany przez użytkownika. Opcja ta jest przydatna jeśli chcemy przesłać dużą ilość danych pomiędzy mikrokontrolerem a urządzeniem, z którym komunikujemy się za pomocą SPI. Można to zrobić małymi krokami, wykorzystując przy tym pewien obszar pamięci, lecz oczywiście nie trzeba zmieniać stanu końcówki CS po każdym użyciu procedur SPIIN lub SPIOUT.

W trybie sprzętowym (SPI = HARD) interfejs używa przydzielonych mu fabrycznie końcówek:

DIN	Wejście danych lub MISO.
DOUT	Wyjście danych lub MOSI.
SS	Slave Select.
CLOCK	Taktowanie.

Dodatkowo można określić następujące cechy interfejsu:

INTERRUPT	Określa czy ma być generowane przerwanie z układu SPI.
DATA ORDER	Wybiera czy najpierw ma być przesyłany bit najstarszy (MSB) czy najmłodszy (LSB).
MASTER	Można podać YES lub NO. By móc używać procedur języka BASCOM 8051 należy ustawić YES.
POLARITY	Wybiera czy stan linii CLOCK ma być ustawiona w stan wysoki (HIGH) czy niski (LOW), gdy interfejs nie jest aktywny.
PHASE	Przeczytaj notę katalogową, by dowiedzieć się więcej o ustawieniach związanych z tą opcją.
CLOCKRATE	Wybiera stopień podziału sygnału zegarowego, który jest potem dostarczony jako sygnał taktujący interfejs SPI.

Można także włączyć i wyłączyć interfejs SPI podając jako parametr ON lub OFF.

Zobacz także: SPIIN , SPIOUT , SPIINIT

Przykład1:

Config Spi = Soft, DIN = P1.0, DOUT = P1.1, CS = P1.2, CLK = P1.3

Dim var As Byte

Spiinit            'Inicjalizacja SPI oraz portów.

Spiout var , 1     'transmisja 1 bajtu


Instrukcja CONFIG LCDPIN

Przeznaczenie:

Pokrywa ustawienia dotyczące sposobu podłączenia wyświetlacza.

Składnia:

CONFIG  LCDPIN =PIN , DB4 = pin , DB5 = pin , DB6 = pin , DB7 = pin , E = pin , RS = pin

gdzie:

pin	nazwa końcówki portu pełniąca przypisaną funkcję.

Opis:

Można za pomocą tej instrukcji lokalnie zmienić sposób dołączenia wyświetlacza LCD pokrywając ustawienia w menu Compiler | Settings.

Uwaga! Linia WR wyświetlacza musi być połączona z masą.

Zobacz także: CONFIG LCD

Przykład:

Config Lcdpin = PIN , DB4=P1.1, DB5=P1.2 , DB6=P1.3 , DB7=P1.4 , E=P1.5 , RS=P1.6

‘ instrukcja musi być umieszczona w jednej linii!!


Instrukcja CONFIG WATCHDOG

Przeznaczenie:

Konfiguruje opóźnienie zadziałania systemu WATCHDOG w kontrolerze AT89c8252.

Składnia:

CONFIG WATCHDOG = czas

gdzie:

czas	czas w milisekundach po jakim układ WATCHDOG uaktywni sygnał reset procesora. Możliwe są wartości: 16 , 32, 64 , 128 , 256 , 512 , 1024 oraz 2048.

Opis:

Mikrokontroler 89s8232 ma wbudowany układ Watchdog, który zabezpiecza przed skutkami zakłóceń w działaniu programu, mogącymi się pojawić przez czynniki zewnętrzne.

Działanie układu Watchdog polega na zliczaniu impulsów zegarowych przez specjalny licznik. Gdyby program główny w odpowiednim czasie nie wyzerował licznika, układ Watchdog uaktywni sygnał reset mikrokontrolera. Spowoduje to rozpoczęcie działania programu od początku. W ten sposób można zapobiec niekontrolowanym skokom czy przeciwdziałać zapętleniom się programu.

Po uaktywnieniu układu Watchdog, reset mikrokontrolera nastąpi po podanym czasie. Przy wartości 2048 czas pomiędzy kolejnymi instrukcjami RESET WATCHDOG jest dość długi i wynosi około 2 sekundy.

Zobacz także: START WATCHDOG , STOP WATCHDOG , RESET WATCHDOG

Przykład:

'-----------------------------------------------------

'                (c) 2000 MCS Electronics

' WATCHD.BAS demonstruje działanie układu Watchdog

' Tylko dla układu AT89s8232!!!

'-----------------------------------------------------

Config Watchdog = 2048               'reset wystąpi po 2048ms

Start Watchdog                       'uruchamiamy układ Watchdog

Dim I As Word

For I = 1 To 10000

  Print I                            'drukujemy coś

  'Reset Watchdog

  'Pętla For..Next nie zakończy się gdyż układ Watchdog zresetuje

  'mikrokontroler.

  'Gdyby instrukcja RESET WATCHDOG nie została usunięta z pętli

  'wtedy układ Watchdog nie spowodowałby wyzerowania procesora

  'gdyż nie zdążyłby odliczyć ustawionego czasu.

Next

End


Instrukcja CONFIG I2CDELAY

Przeznaczenie:

Dyrektywa kompilatora określająca szybkość pracy magistrali I2C.

Składnia:

CONFIG  I2CDELAY = wartość

gdzie:

wartość	Liczba z zakresu od 0 do 255.

Opis:

Dla instrukcji używających magistrali I2C jest obliczane opóźnienie, by częstotliwość taktująca procesor nie miała wpływu na szybkość magistrali. Opóźnienie to jest dostosowane tak by każde urządzenie korzystające z I2C mogło działać poprawnie. Gdy pewne jest, że używane będą urządzenia mogące pracować w trybie szybkim (częstotliwość SCL max. 400kHz przyp. tłumacza), można ustawić 0.

Wartość 1 przywraca standardową częstotliwość pracy magistrali. Dla wartości większych od 1, szybkość transmisji magistralą I2C zostaje zmniejszona.

Normalnie używana jest procedura opóźniająca wywoływana przez ACALL:

Delay5:

  Nop

  Ret

Dla kwarcu 12 MHz, kolejne cykle są wykonywane z częstotliwością 1 MHz (gdyż każdy cykl to 12 faz generatora przyp. tłumacza). Dlatego nie licząc innych instrukcji, minimalne opóźnienie wynosi: 4 * 2 = 8 cykli.

Zobacz także: CONFIG SCL , CONFIG SDA

Przykład:

Config Sda = P3.7         'P3.7 będzie pełnił rolę linii SDA

Config I2cdelay = 0       'stosujemy przyspieszenie


Instrukcja CONFIG ADUC812

Przeznaczenie:

Konfiguruje sposób pracy procesora ADUC812.

Składnia (dla konwertera ADC):

CONFIG  ADUC812 = ADCON , MODE = tryb , CLOCK = zegar , AQUISITION = aq , TIMER2 = tm , EXTRIG = wartość

Składnia (dla konwertera ADC):

CONFIG  ADUC812 = DAC , MODE = tryb , RANGE0 = r0 , RANGE1 = r1 , CLEAR0 = clr0 , CLEAR1 = clr1 , SYNC = syn , POWER0 = pw0 , POWER1 = pw1

Opis (dla konwertera ADC):

tryb	Można określić: POWERDOWN, NORMAL, PDNE, STANDBY. PDNE oznacza POWERDOWN jeśli nie jest wykonywany cykl konwersji.
zegar	Jest to stała określająca stopień podziału głównego sygnału zegarowego. Można podać: 1, 2, 4, lub 8. Konwersja ADC wymaga dodatkowo 16 cykli dla wybranej liczby taktów aquisition.
aq	Jest to stała określająca czas dostępu dla wzmacniacza wejściowego/układu próbkującego, który zajmuje się pomiarem sygnału analogowego. Wartość może zawierać się w przecdziale 1 - 4. Wartość 1 jest wystarczająca dla impedancji nie przekraczającej 8K.
tm	Można podać ENABLED lub DISABLED. Jeśli podano ENABLED przepełnienia licznika TIMER2 stanowią sygnał wyzwalający dla konwersji AD.
wartość	Zewnętrzne wyzwalanie. Można ustawić ENABLED lub DISABLED. Jeśli podano ENABLED wtedy stan niski na końcówce 23 (CONVST) może służyć do wyzwalania operacji konwersji AD.

Opis (dla konwertera DAC):

tryb	Przetwornik DAC może pracować w trybie 8 bitowym lub 12 bitowym. Więc parametr ten określa z jaką rozdzielczością mają pracować przetworniki.
r0	Zakres wyjściowy przetwornikia DAC0. Jeśli podano VDD to zakres ten wynosi 0-VDD, a jeśli podano VREF to zakres ten wynosi odpowiednio 0-VREF.
r1	Zakres wyjściowy przetwornikia DAC1. Jeśli podano VDD to zakres ten wynosi 0-VDD, a jeśli podano VREF to zakres ten wynosi odpowiednio 0-VREF.
clr0	Jeśli podano TRUE spowoduje to wyzerowanie przetwornika DAC0. Napięcie wyjściowe zostaje wtedy sprowadzone do zera.
clr1	Jeśli podano TRUE spowoduje to wyzerowanie przetwornika DAC0. Napięcie wyjściowe zostaje wtedy sprowadzone do zera.
syn	Może być ENABLED lub DISABLED. Jeśli podano ENABLED przetwornik dokona konwersji tak szybko jak to będzie możliwe po wpisaniu danych do rejestru DACxL w przestrzeni SFR. Użytkownik może kolejno aktualizować oba przetworniki wpisując najpierw dane do rejestrów DACxL/H, dopóki parametr SYNC jest określony jako DISABLED.  Oba przetworniki są aktualizowane jeśli parametr SYNC jest określony jako ENABLED.
pw0	Parametr określa czy przetwornik DAC0 ma byś włączony (ON) czy wyłączony (OFF).
pw1	Parametr określa czy przetwornik DAC1 ma byś włączony (ON) czy wyłączony (OFF).


Instrukcja CONFIG GRAPHLCD

Przeznaczenie:

Konfiguruje sposób dołączenia graficznego wyświetlacza LCD.

Składnia:

CONFIG  GRAPHLCD = typ , PORT = port , CE = pin , CD = pin , COLS = ilość_kolumn

gdzie:

GRAPHLCD	Określa organizację wyświetlacza. Aktualnie możliwa jest 240 * 64 (240 * 128 będzie dodana później),
PORT	Nazwa portu będącego szyną danych, np.: P1,
CE	Nazwa końcówki pełniącej rolę linii Enable,
CD	Numer końcówki rolę sygnału Command/Data,
COLS	Liczba kolumn dla wyświetlania tekstu. Na razie obsługuje tylko 30 kolumn.

Opis:

Procedury komunikacji zostały oparte na wyświetlaczu z kontrolerem T6963C, który jest używany w wielu wyświetlaczach. Na razie połączenie wyświetlacza z mikrokontrolerem rozwiązano w trybie PIN. Tak jest! Sterowanie wyświetlaczem to nic innego jak ustawianie odpowiednich stanów na końcówkach.

Połączenia w trybie BUS zostaną wprowadzone w przyszłości. Tryb PIN może być używany w połączeniu z każdym mikrokontrolerem 8051, dlatego został zaimplementowany jako pierwszy.

Używane są następujące połączenia:

Końcówka procesora	Końcówka wyświetlacza	Przeznaczenie
P1.0 – P1.7	DB0 – DB7	Szyna danych
P3.2	FS	Wybór czcionki
P3.5	CE	Sygnał Enable
P3.4	CD	Wybór Rozkazy/DaneLCD
P3.6	WR	Zapis do sterownika
P3.7	RD	Odczyt ze sterownika
Końcówka FS powinna być ustawiona w stan niski, by uzyskać 30 kolumn przy znakach 8x8. Można ona być połączona z masą w tym celu.

Kod w bibliotece obsługuje tylko tryb 30 kolumnowy. W przyszłości planuje się dodanie trybu 40 kolumn. Można zmienić kod w bibliotece, aby uzyskać zamiast 30 - 40 kolumn.

Wyświetlacz T6963C posiada zarówno stronę graficzną jak i tekstową. Mogą one być używane razem. Procedury używają trybu zapisu XOR by wyświetlać tekst i grafikę nałożoną na siebie.

Instrukcje które mogą być używane w połączeniu z graficznym wyświetlaczem LCD:

CLS  kasuje zawartość ekranu wyświetlacza.

CLS GRAPH  kasuje tylko dane graficzne (stronę graficzną).

CLS TEXT kasuje tylko dane tekstowe (strona tekstowa).

LOCATE rząd , kolumna  ustawia kursor na podanej pozycji. Rząd może przyjąć wartości od 1 do 16, kolumna zaś od 1 do 40. Wartości te ściśle zależą od trybu w jakim pracuje wyświetlacz oraz organizacji pikseli wyświetlacza.

CURSOR [ON | OFF] [BLINK | NOBLINK]  może być używane tak samo jak w wyświetlaczach alfanumerycznych.

LCD  również działa w tak samo jak dla wyświetlacza alfanumerycznego.

SHOWPIC x , y , etykieta  wyświetla obrazek na pozycji (x,y), którego dane znajdują się pod adresem określonym podaną etykietą.

PSET x , y , kolor  zapala lub kasuje określony piksel. X może przyjąć 0-239, a Y z zakresu 0-63. Gdy kolor jest określony jako 0, piksel jest kasowany. Jeśli kolor jest określony jako 1 lub większy, piksel jest zapalany.

$BGF "plik.bgf"  wstawia dane graficzne z pliku BGF na bieżącej pozycji.

Graficzny wyświetlacz LCD pochodzący z oferty f-my Konrad (www.konrad.de) wymaga dodatkowo ujemnego zasilania potrzebnego do regulacji kontrastu. Dwie baterie 9V i potencjometr wystarczą. Niektóre wyświetlacze maja wyjście Vout, które może być używane do regulacji kontrastu(Vo).

Zobacz także: SHOWPIC , PSET , $BGF , LCD

Przykład:

'------------------------------------------------------------------------------

'                                (c) 2000 MCS Electronics

'                                       GLCD.BAS

' Przykład pokazuje obsługę graficznego wyświetlacza LCD z kontrolerem T6963C

' Tylko wyświetlacze 240*64 są obsługiwane z 30 kolumnami (na razie)

' Komunikacja z wyświetlaczem jest przeprowadzana tylko w trybie PORT

' Połączenia:

' P1.0 - P1.7 z DB0-DB7 wyświetlacza LCD

' P3.2        do FS, wybór czcionki (może być połączone na stałe)

' P3.5        do CE, wybór układu

' P3.4        do CD, wybór rozkazy / dane

' P3.6        do WR

' P3.7        do RD

'Przyszłe wersje pozwolą na dostęp do wyświetlacza za pomocą szyny adresowej i danych (tryb BUS)

'Wyświetlacz pochodzący z oferty firmy Konrad (www.conrad.com) wymaga

'ujemnego napięcia zasilania do regulacji kontrastu.

'Ja używam 2 baterii 9V

'------------------------------------------------------------------------------

'konfiguracja wyświetlacza

Config Graphlcd = 240 * 64 , Port = P1 , Ce = P3.5 , Cd = P3.4 , Cols = 30

'definicja niektórych zmiennych

Dim X As Byte , Y As Byte

'

Reset P3.2 'szerokie znaki (8 bit) dają 30 kolumn

'Obsługiwane są następujące instrukcje:

Cls      'usunie wszystko z ekranu LCD (tekst i grafikę)

'Cls TEXT  usunie tylko tekst

'Cls GRAPH usunie tylko część graficzną

'By dokonać inicjalizacji wyświetlacza można użyć:

'Lcdinit

'Nie jest to jednak wymagane gdyż wyświetlacz jest inicjalizowany po resecie

'Można użyć Locate gdzie liczba rzędów to 1-8, a kolumn 1-30

Locate 1 , 1

'Kontrola stanu kursora jest taka sama jak dla alfanumerycznego LCD

Cursor On Blink

'No to teraz wypiszemy jakiś tekst

Lcd "Witaj świecie"

'Uwaga! Kursor nie zmienia swojej pozycji. Należy go przesuwać instrukcją Locate

'A teraz część artystyczna z użyciem grafiki

'Można wyświetlać bitmapy, stworzone w jednym z edytorów graficznych.

'Muszą one być jednak przetworzone do postaci pliku BGF (Bascom Graphics File)

'narzędziem umieszczonym w menu Tools.

'Konwersja zamienia wszystkie punkty nie mające koloru białego na czarne. Dodatkowo pakuje dane i zapisuje w formacie BGF.

'By wyświetlić tak przetworzoną grafikę, należy użyć instrukcji SHOWPIC.

'Która posiada trzy parametry: X,Y to pozycja wyświetlania grafiki na ekranie

'Wartości te muszą być podzielne przez 8 lub być zerem.

'Trzeci parametr to etykieta określająca adres danych graficznych.

Showpic 0 , 0 , Picture1

'Do dyspozycji jest także instrukcja PSET (znana z QBasic-a) zapalająca

'lub gasząca określony piksel. Wartość 0 zeruje a 1 ustawia piksel.

'Jakiś kwadracik

For X = 0 To 10

  For Y = 0 To 10

    Pset X , Y , 1

  Next

Next

'można go teraz usunąć

For X = 0 To 10

  For Y = 0 To 10 Step 2

    Pset X , Y , 0

  Next

Next

'Za pomocą PSET można stworzyć prosty oscyloskop lub rejestrator!

'Mamy nadzieję, że w przyszłości otrzymamy program od jakiegoś

'zainspirowanego użytkownika :-)

End

'adres danych obrazka

Picture1:

 '$BGF dołącza dane obrazka do kodu z pliku

  $bgf "samples\mcs.bgf"


Instrukcja CONFIG SERVOS

Przeznaczenie:

Konfiguruje ile serwomechanizmów będzie kontrolowanych.

Składnia:

CONFIG  SERVOS = liczba , SERVO1 = końcówka [ , SERVOn = końcówka ] , RELOAD = czas

gdzie:

liczba	liczba serwomechanizmów, maksymalnie 16,
końcówka	Nazwa końcówki sterującej odpowiednim serwomechanizmem,
czas	czas opóźnienia pomiędzy kolejnymi przerwaniami licznika TIMER0.

Opis:

Serwomechanizmy wymagają zmiennych impulsów by sterowane były poprawnie. Instrukcja CONFIG SERVOS inicjalizuje specjalne zmienne, w których zapisywany będzie czas ich włączenia. Instrukcja konfiguruje także procedurę przerwania licznika TIMER0.

Dla przykładu instrukcja:

Config Servos = 2 , Servo1 = P1.0 , Servo2 = P1.1 , Reload = 100

spowoduje że:

•	procedura przerwania będzie wywoływana co 100 μs.

•	zostaną utworzone zmienne o nazwie SERVOx, gdzie x oznacza numer serwomechanizmu.

Ustawiając odpowiednią wartość w jednej ze zmiennych, kontrolowany jest czas podawania stanu wysokiego na skojarzonej końcówce. Po upływie tego czasu stan końcówki zostanie wyzerowany. Po upłynięciu 20ms sytuacja powtórzy się.

Jeśli ma być kontrolowana większa ilość serwomechanizmów, wtedy wartość podana w parametrze RELOAD musi być większa, gdyż może wystąpić utrata impulsów. Jeśli wartość wynosi 10μs, wtedy nie jest fizycznie możliwe kontrolowanie za pomocą procesora 8051 więcej niż 1 serwomechanizmu.

Dla 2 serwomechanizmów opóźnienie powinno wynosić co najmniej 20 lub 25μs, by rezultat był zgodny z oczekiwaniem.

Uwaga! Instrukcja używa przerwania licznika TIMER0.

Przykład:

'-------------------------------------------------------------------

'                    (c) 2001 MCS Electronics

'             servo.bas demonstruje instrukcję SERVO

'-------------------------------------------------------------------

'Serwomechanizmy wymagają impulsów sterujących dla poprawnego działania

'Stosując instrukcję CONFIG SERVOS ustalamy iloma serwomechanizmami

'chcemy sterować, oraz które końcówki będą do tego używane

'Maksymalnie można używać 16 serwomechanizmów

'Instrukcja SERVO potrzebuje jednego bajta z pamięci SRAM i

'wykorzystuje licznik TIMER0. Dlatego używanie licznika TIMER0 nie jest możliwe.

'Wartość podawana jako parametr RELOAD, określa czas pomiędzy

'poszczególnymi przerwaniami (w mikrosekundach).

Config Servos = 2 , Servo1 = P1.0 , Servo2 = P1.1 , Reload = 100

'Używamy 2 serwomechanizmów sterowanych z precyzją 100 mikrosekund

'Zmienne Servox są tworzone automatycznie. Można jej użyć do

'sterowania czasem włączenia

Servo1 = 10                              'włącz na 1000 mikrosekund

Servo2 = 20                              'włącz na 2000 mikrosekund

Dim I As Byte

Do

 For I = 1 To 20

   Servo1 = I

   Waitms 1000

 Next

 For I = 20 DownTo 1

   Servo1 = I

   Waitms 1000

 Next

Loop

End


Instrukcja CONFIG GETRC

Przeznaczenie:

Określa czas ładowania kondensatora w funkcji GETRC.

Składnia:

CONFIG  GETRC = czas

gdzie:

czas	czas w milisekundach, w którym kondensator jest ładowany.

Opis:

Przed rozpoczęciem pomiaru rozładowania kondensatora, musi on być wcześniej naładowany. Standardowo czas ten wynosi około 20 ms.

Zobacz także: GETRC


Instrukcja CONFIG PRINT
Instrukcja CONFIG PRINT, CONFIG PRINTMODE

Przeznaczenie:

Ustala sposób pracy instrukcji PRINT.

Składnia:

CONFIG  PRINT = końcówka

CONFIG  PRINTMODE = SET | RESET

gdzie:

końcówka	końcówka która ma być ustawiana lub zerowana podczas instrukcji PRINT.

Opis:

Gdy transmisja znaków wysyłanych przez PRINT, jest przeprowadzana w standardzie RS-485, potrzebna jest dodatkowa końcówka sterująca kierunkiem przesyłania danych.

Jeśli końcówka ma być w stanie wysokim podczas działania instrukcji PRINT, należy wtedy podać parametr SET, jeśli ma być w stanie niskim wtedy parametrem tym powinno być RESET.

Uwaga! Instrukcje te występują zawsze razem.

Przykład:

Config Print = P3.0         'końcówka ta kontroluje bufor

Config Printmode = SET      'będzie ona ustawiana podczas działania instrukcji PRINT

Print "Witam"


Instrukcja CONFIG BAUD

Przeznaczenie:

Konfiguruje mikroprocesor by używał wewnętrznego generatora dla transmisji przez UART. Tylko układy: 80515, 80517, 80535, 80537 i ściśle kompatybilne.

Składnia:

CONFIG  BAUD = 4800 | 9600

Opis:

Kontrolery 80515, 80517, 80535, 80537 i ściśle kompatybilne, posiadają wewnętrzny generator dla układu UART, który może generować sygnał zegarowy, odpowiedni dla szybkości transmisji 4800 lub 9600 bodów.

Zobacz także: CONFIG BAUD1

Przykład:

Config Baud = 9600      'użyj wewnętrznego generatora

Print "Cześć"

End


Instrukcja CONFIG BAUD1

Przeznaczenie:

Konfiguruje mikroprocesor by używał wewnętrznego generatora dla transmisji przez rozszerzony UART. Tylko układy: 80517 i 80537.

Składnia:

CONFIG  BAUD1 = szybkość

gdzie:

szybkość	szybkość pracy drugiego układu UART. Może być pomiędzy 2048 a 37500.

Opis:

Kontrolery 80517 i 80537, posiadają wewnętrzny generator dla układu UART, który może generować sygnał zegarowy także dla drugiego układu UART.

Zobacz także: CONFIG BAUD

Przykład:

Config Baud1 = 9600      'użyj wewnętrznego generatora

Open "COM2:" For Binary As #1

Print #1, "Cześć"

Close #1

End


Instrukcja CONFIG MICROWIRE

Przeznaczenie:

Konfiguruje końcówki dla instrukcji współpracujących z układami komunikującymi się przez magistralę MICROWIRE.

Składnia:

CONFIG  MICROWIRE = PIN , CS = port , DIN = port , DOUT = port , CLOCK = port , , AL = liczba

gdzie:

CS	końcówka pełniąca rolę wyboru układu,
DIN	końcówka pełniąca rolę końcówki wejściowej,
DOUT	końcówka pełniąca rolę końcówki wyjściowej,
CLOCK	końcówka pełniącą rolę zegara synchronizującego,
AL	liczba linii adresowych.

Opis:

Parametrowi AL musi być przypisana liczba linii adresowych konkretnego układu. Lista obsługiwanych układów i liczba która musi być przypisana temu parametrowi jest następująca:

Układ	93C46	93C56	93C57	93C66
Liczba bitów danych	8	16	8	16	8	16	8	16
AL	7	6	9	8	8	7	9	8

Zobacz także: MWINIT , MWWOPCODE , MWWRITE , MWREAD


Instrukcja CONFIG RC5

Przeznaczenie:

Zmienia domyślne ustawienia dla linii wejściowej danych z odbiornika RC5.

Składnia:

CONFIG  RC5 = pin

gdzie:

pin	nazwa końcówki portu podłączonej z wyjściem odbiornika podczerwieni.

Opis:

Instrukcja ta pokrywa domyślne ustawienia w zakładce Options | Compiler Settings, które są zapisywane w plikach .CFG poszczególnych projektów.

Zobacz także: GETRC5

Przykład:

Config Rc5 = P3.5           'P3.5 będzie końcówką wejściową sygnałów RC5


Zmienne systemowe COUNTERx, CAPTURE

Przeznaczenie:

Zmienne te służą do modyfikacji rejestrów sprzętowych liczników.

Składnia:

COUNTER0 = wartość
zmienna = COUNTER0	zawartość licznika TIMER0
COUNTER1 = wartość
zmienna = COUNTER1	zawartość licznika TIMER1
W układach posiadających licznik TIMER2 można używać jeszcze:

COUNTER2 = wartość
zmienna = COUNTER2	zawartość licznika TIMER2
CAPTURE = wartość
zmienna = CAPTURE	zmienna określająca wartość wpisywaną do pary rejestrów RCAP2L i RCAP2H licznika TIMER2. Tylko układy 8032/8052.

gdzie:

wartość	zmienna typu Byte, Integer lub Word, albo stała liczbowa określająca nową zawartość licznika,
zmienna	zmienna do której przekazana będzie aktualna zawartość licznika.

Opis:

Specjalne zmienne COUNTERx są przeznaczone do ustawiania i odczytywania rejestrów liczników-czasomierzy w języku BASCOM. COUNTER0 to para rejestrów TL0 i TH0, itd.. Dlatego zmienne COUNTERx są 16 bitowe.

By wyzerować stan licznika należy do zmiennej COUNTERx wpisać zero.

Aby odczytać bądź zapisać wartość do rejestrów TLx / THx, można użyć: TL0 = 5 (przykładowo), gdyż nazwy rejestrów specjalnych są rozpoznawane przez BASCOM.

Zmienne COUNTERx mogą modyfikować zawartość liczników pracujących w trybie TIMER jak i COUNTER, gdyż licznik i czasomierz używają tych samych rejestrów do zliczania wartości. Praca jako licznik czy czasomierz dotyczy tylko sposobu dostarczania zliczanych impulsów.

By załadować wartość do rejestrów służących do automatycznego przeładowywania licznika należy użyć instrukcji LOAD.

UWAGA! Przed odczytem licznika lub zapisem nowej wartości do licznika, jest on zatrzymywany. Dlatego jeśli ma pracować dalej należy ponownie uruchomić zliczanie instrukcją START COUNTERx.

Liczniki TIMER0/TIMER1 mogą liczyć do 255 w trybie 2 (8-bitowy z automatycznym przeładowaniem), a w trybie 1 (16-bitowy) do 65535.

W trybie 0 liczniki TIMER0/TIMER1 mogą zliczyć do 8192. Wykorzystany jest wtedy cały bajt MSB oraz 5 bitów z bajtu LSB licznika (jest to tryb “kompatybilny” z licznikiem w kontrolerach z poprzedniej serii MCS-48 przyp. tłumacza). Wpisywana wartość do licznika w trybie 0 jest automatycznie umieszczana w odpowiednich bitach:

Counter0 = &B1_1111_1111_1111   '13 bitów

zostanie zamienione na: 1111_1111_0001_1111.

Asembler:

Dla poniższej instrukcji:

Counter0 = 1000

generowany jest następujący kod:

Clr TCON.4

Mov tl0,#232

Mov th0,#3

Przykład:

'--------------------------------------------------------------

'                 (c) 1997-2002 MCS Electronics

'--------------------------------------------------------------

'  plik: COUNTER.BAS

'  demo: COUNTER

'--------------------------------------------------------------

'     podłącz wejście licznika P3.4 z wyjściem generatora

'     *TIMER/COUNTER 1 jest używany jako generator szybkości transmisji dla układu RS-232

'--------------------------------------------------------------

Dim A As Byte , C As Integer

Config Timer0 = Counter , Gate = Internal , Mode = 1

'Timer0 = Counter : timer0 pracuje jako licznik

'Gate = Internal  : brak zewnętrznego bramkowania

'Mode = 1         : licznik jest 16-bitowy

Counter0 = 0                            'zerowanie licznika

Start Counter0                          'włączanie zliczania

Do                                      'początek pętli

  A = Inkey                             'sprawdź czy przyszedł znak

  C = Counter0                          'odczytaj zawartość licznika

  Print C                               'wydrukuj

  Start Counter0                        'uruchom ponownie zliczanie gdyż licznik

                                        'został zatrzymany podczas odczytu wartości

Loop Until A = 27                       'powtarzaj dopóki nie naciśnięto Esc

End


Instrukcja CONST

Przeznaczenie:

Deklaruje nazwę stałej.

Składnia:

CONST nazwa = liczba

CONST nazwa = ”tekst”

CONST nazwa = wyrażenie

Starsza wersja składni, wycofywana

DIM nazwa AS CONST wartość

gdzie:

nazwa	nazwa pod jaką będzie identyfikowana stała,
liczba	wartość liczbowa przypisana stałej,
tekst	wartość tekstowa przypisana stałej.
wyrażenie	dowolne wyrażenie języka BASCOM BASIC

Opis:

Stałe nie używają pamięci przeznaczonej na zmienne, gdyż podczas kompilacji w miejsce nazwy stałej jest przypisywana jej wartość.

Można teraz używać wyrażeń do obliczania wartości stałych. Funkcje, które mogą wchodzić w skład wyrażenia to: ASC , ABS , ATN , COS , EXP , FIX , INT , LOG , RND , SGN , SIN , SQR , TAN. Jako operatorów można używać: AND, OR , XOR +, - , / , \ , ^ , * , NOT , > , < , = , >= , <= , <> , ( , ).

Zobacz także: ALIAS , DIM

Przykład:

'----------------------------------------------------

'         (c) 1997-2000 MCS Electronics

'                CONST.BAS

'----------------------------------------------------

Dim A As Const 5                        'zdefiniuj a jako stałą

Dim B1 As Const &B1001

Dim S As Single

'Teraz należy używać nowej wersję składni

Const Cbyte = &HF

Const Cint = -1000

Const Csingle = 1.1

Const Cstring = "test"

S = Csingle

Print S ; "  " ; Cstring

Waitms A                                'czekaj 5 milisekund

Print A

Print B1

'można teraz używać także wyrażeń

Const X = (b1 * 3) + 2

Const Ssingle = Sin(1)

Print X ; "  " ; Sstring

End


Funkcja CPEEK()

Przeznaczenie:

Zwraca zawartość wskazanej komórki pamięci kodu.

Składnia:

zmienna = CPEEK( adres )

gdzie:

zmienna	zmienna liczbowa której przypisana będzie zawartość komórki,
adres	adres pamięci kodu.

Opis:

Można odczytać zawartość pamięci kodu za pomocą funkcji CPEEK. Nie istnieje funkcja CPOKE, gdyż zapis do pamięci kodu nie jest możliwy podczas działania programu.

Wielkość przestrzeni adresowej pamięci kodu jest zależna od typu mikrokontrolera. Pierwsza komórka jest identyfikowana adresem 0.

Zobacz także: PEEK , POKE , INP , OUT

Przykład:

'-----------------------------------------------------

'              (c) 1998-2000 MCS Electronics

'                   PEEK.BAS

' demonstracja PEEK, POKE, CPEEK, INP oraz OUT

'-----------------------------------------------------

Dim I As Integer , B1 As Byte

'zrzut pamięci RAM kontrolera

For I = 0 To 127                  'Dla 8032 można podać 255

  'Break

  B1 = Peek(i)                    'czytamy bajt

  Printhex(b1) ; "  ";

  'Poke I , 1                     'można zmieniać zawartość pamięci

Next

Print                                   'piszemy CR

'Ostrożnie z bezpośrednią manipulacją pamięci RAM!!

'A teraz podejrzymy sobie pamięć kodu(programu)

For I = 0 To 255

  B1 = Cpeek(i)                   'czytamy bajt z ROM

  Printhex(b1) ; "  ";

Next

'Nie można zapisywać do pamięci ROM!!

Out &H8000 , 1              'zapisujemy 1 do XRAM pod adresem 8000

B1 = Inp(&H8000)            'a teraz czytamy

Print B1

End


Instrukcja CURSOR

Przeznaczenie:

Ustawia stan kursora wyświetlacza LCD.

Składnia:

CURSOR [ ON | OFF] [ BLINK | NOBLINK ]

Opis:

Instrukcja pozwala na sterowanie atrybutami kursora sprzętowego wyświetlacza LCD.

Można stosować razem parametry ON/OFF i BLINK/NOBLINK. W czasie inicjalizacji wyświetlacza LCD stan kursora jest ustawiany na ON i NOBLINK.

Zobacz także: DISPLAY , LCD

Przykład:

Dim a As Byte

a = 255

Lcd a

Cursor Off      'schowaj kursor

Wait 1          '1 sekunda pauzy

Cursor Blink    'teraz migaj

End


Instrukcja DATA

Przeznaczenie:

Służy do umieszczania danych odczytywanych instrukcja READ w trakcie działania programu.

Składnia:

DATA wartość1 [, wartośćn]

gdzie:

wartość	stała numeryczna lub tekstowa.

Opis:

Instrukcja wykorzystywana jest do definiowania ciągu danych, umieszczonych w pamięci kodu. Dane te można wykorzystać w dowolny sposób. Odczyt danych umożliwia instrukcja READ.

By umieścić w liniach DATA znak, którego bezpośrednie wprowadzenie z klawiatury nie jest możliwe (np. kody definiowanych znaków) należy jego kod poprzedzić znakiem dolara ($). Tak samo umieszczenie znaku cudzysłowu nie jest możliwe bezpośrednio, należy więc użyć zapisu $34. Do pojedynczych znaków dodawany jest na końcu znak o kodzie 0 i stają one się defacto ciągami o długości jednego znaku!

Można wyłączyć dodawanie znaku o kodzie zero – także dla ciągów znaków – umieszczając przed liniami DATA dyrektywę $NONULL :

Data "abcd"            'zapisany z znakiem końca ciągu

$nonull = -1           'o tego miejsca ciągi i znaki będą

                       'umieszczane bez końcowego znaku 0

Data "abcd" , "efgh"

$nonull = 0            'wracamy do normalnego sposobu zapisu ciągów

Nowość w wersji 2.09.

Począwszy od wersji 2.09 BASCOM-8051, dopuszczalne jest umieszczanie wyrażeń w liniach DATA. Nie można jednak łączyć danych obliczanych z danymi podawanymi jawnie w jednej linii instrukcji DATA.

Data  INTEGER(15 * constval + x)

gdzie constval i x są zdefiniowanymi wcześniej stałymi (instrukcją CONST).

By kompilator wiedział, że obliczona wartość ma być typu Integer, należy użyć kwalifikatora INTEGER(). Podobnie działają kwalifikatory WORD(), LONG() lub SINGLE().

Różnice w stosunku do QBasic-a.

Wartości typu Integer i Word muszą być zakończone znakiem %. Wartości Long, znakiem &, a wartości Single zaś znakiem !.

Zobacz także: READ , RESTORE , $NONULL

Przykład:

'-------------------------------------------------------------

'                      READDATA.BAS

'             Copyright 2000 MCS Electronics

'-------------------------------------------------------------

Dim A As Integer , B1 As Byte , Count As Byte

Dim S As XRAM String * 15

Dim L As Long

Restore Dta1                           'ustawiamy wskaźnik

For Count = 1 To 3                     'czytamy trzy dane

   Read B1 : Print Count ; "  " ; B1

Next

Restore Dta2                           'ustawiamy wskaźnik

For Count = 1 To 2                     'czytamy dwie dane

   Read A : Print Count ; "  " ; A

Next

Restore Dta3

Read S : Print S

Read S : Print S

Restore Dta4

Read L : Print L                       'dane typu Long

End

'Typ danej odczytywanej instrukcją READ i zapisanej w linii DATA

'musi się zgadzać.

Dta1:

  Data &B10 , &HFF , 10

Dta2:

  Data 1000% , -1%

  'Uwaga! Dane typu Integer (>255 lub <0) muszą być zakończone znakiem %

Dta3:

  Data "Witaj" , "Świecie"

Dta4:

  Data 123456789&

  'Uwaga! Dane typu Long muszą być zakończone znakiem &

Rem Można także mieszać różne typy danych w jednej linii

Rem Należy pamiętać by kolejne dane odczytywać instrukcją READ podaniem odpowiedniego typu zmiennej!!!

Data "TEST" , 5 , 1000% , -1& , 1.1!


Instrukcja DEBOUNCE

Przeznaczenie:

Eliminuje drgania styków przełącznika dołączonego bezpośrednio do linii portu.

Składnia:

DEBOUNCE  końcówka , stan , etykieta [, SUB]

gdzie:

końcówka	sprawdzana linia portu (np.: P1.0),
stan	0 gdy sygnałem aktywnym ma być stan niski, 1 gdy stan wysoki,
etykieta	etykieta określająca miejsce skoku,
SUB	skacze jak do podprogramu (GOSUB).

Opis:

Instrukcja DEBOUNCE oczekuje na zmianę stanu linii portu do określonego stanu. Kiedy określony stan pojawi się na linii portu, instrukcja czeka 25ms i sprawdza ponownie stan portu (eliminuje to drganie styków). Jeśli stan się nie zmienił, skacze do podanej etykiety.

Przed kolejną instrukcją DEBOUNCE stan linii portu musi być nieaktywny, by zapobiec powtórnemu skokowi.

Gdy użyty jest opcjonalny parametr SUB, instrukcja skacze do podprogramu jak instrukcja GOSUB.

Każda instrukcja DEBOUNCE korzysta z 1 bitu pamięci RAM, by zapamiętać stan portu. Dla każdego użytego portu jest przydzielany osobny bit.

Powinienem w tym miejscu wspomnieć, że linie portów P2.2-P2.7 oraz P3 mają wbudowany wewnętrzny rezystor podciągający, który może wpływać na działanie instrukcji DEBOUNCE. Dla tych końcówek portów instrukcja powinna być używana w ten sposób: Debounce P3.0, 0, Pr [, SUB ]. Nie jest wymagany zewnętrzny rezystor podciągający.

Zobacz także: CONFIG DEBOUNCE

Przykład:

'-----------------------------------------------------

'                      DEBOUN.BAS

'                Demonstracja DEBOUNCE

'-----------------------------------------------------

Config Debounce = 30  'kiedy nie użyjemy tej opcji, domyślnym

                      'opóźnieniem będzie 25ms

Debounce P1.0 , 0 , Pr , Sub

Debounce P1.0 , 0 , Pr , Sub

'                    ^----- etykieta określająca gdzie skoczyć

'               ^---------- skocz gdy P1.0 przejdzie w stan 0

'         ^---------------- testuj P1.0

'Debounce P1.0 , 1 , Pr  'a tu aż przejdzie w stan 1

'kiedy P1.0 przejdzie w stan niski skacze do Pr

'P1.0 musi przejść w stan wysoki przed ponownym skokiem

'do Pr gdy P1.0 przejdzie w stan niski

Debounce P1.0 , 1        'nie będzie skoku

Debounce P1.0 , 1 , Pr   'spowoduje błąd Return without gosub

End

Pr:

  Print "P1.0 przeszedł w stan niski"

Return


Instrukcja DECR

Przeznaczenie:

Zmniejsz o jeden zawartość zmiennej.

Składnia:

DECR zmienna

gdzie:

zmienna	zmienna typu Byte, Integer, Word, Long lub Single

Opis:

Instrukcja zmniejsza o jeden zawartość zmiennej podanej jako parametr. Instrukcja działa szybciej niż jej odpowiednik z użyciem operatorów: zmienna = zmienna – 1.

Zobacz także:  INCR

Przykład:

'--------------------------------------------------------------

'                     (c) 1997,1998 MCS Electronics

'--------------------------------------------------------------

'  plik: DECR.BAS

'  demo: DECR

'--------------------------------------------------------------

Dim A As Byte

A = 5                  'niech w A będzie 5

Decr A                 'zmniejszamy (o jeden)

Print A                'drukujemy

End


Instrukcja DECLARE SUB

Przeznaczenie:

Definiuje nagłówek procedury.

Składnia:

DECLARE SUB nazwa [( parametr AS typ )]

gdzie:

nazwa	nazwa deklarowanej funkcji,
parametr	nazwa parametrów,
typ	typ przekazywanych parametrów,

Opis:

Każda procedura musi być zdefiniowana instrukcją DECLARE SUB przed jej pierwszym użyciem w programie. Jest to konieczne, gdyż kompilator musi określić jakie parametry powinny być przekazane procedurze.

Zobacz także:  CALL, SUB

Przykład:

Dim a As Byte, b1 As Byte, c As Byte

Declare Sub Test(a As Byte)

a = 1 : b1 = 2: c = 3

Print a ; b1 ; c

Call Test(b1)

Print a ;b1 ; c

End

Sub Test(a As byte)

  Print a ; b1 ; c

End Sub


Instrukcje DEFxxx
Instrukcja DEFxxx

Przeznaczenie

Odgórnie deklaruje zmienne nie określone w instrukcjach DIM.

Składnia:

DEFBIT litera	zmienne Bit

DEFBYTE litera	zmienne Byte

DEFINT litera	zmienne Integer

DEFWORD litera	zmienne Word

Opis:

Instrukcje te deklarują typ zmiennych nie zdefiniowanych przez DIM, o nazwach zaczynających się od podanej litery.

Róznice w stosunku do QBasic-a.

QBasic pozwala na określenie zakresu liter początkowych definiowanych zmiennych, jak na przykład DEFINT A - D. BASCOM BASIC pozwala tylko określić jedną literę.

Przykład:

Defbit b : Defint c      'zmienne bitowe zaczynać się będą od b

                         'a Integer od c

Set b1                   'na przykład taka zmienna

c = 10                   'oraz c = 10


Instrukcja DEFLCDCHAR

Przeznaczenie:

Definiuje znak użytkownika dla wyświetlacza LCD.

Składnia:

DEFLCDCHAR  nr_znaku, r1, r2, r3, r4, r5, r6, r7, r8

gdzie:

nr_znaku	numer znaku którego dotyczy definicja (0-7),
r1-r8	kolejne bajty odpowiadające postaci znaku.

Opis:

Wyświetlacze kompatybilne z standardem Hitachi posiadają pamięć CG-RAM, gdzie można zdefiniować do 8 znaków użytkownika. Maja one kody od 0 do 7. Znaki te można wyświetlać używając instrukcji LCD w połączeniu z funkcja CHR().

W środowisko BASCOM wbudowano narzędzie projektowe dla tych znaków. Znajduje się ono w menu: Tools | Character Designer.

Uwaga! Instrukcja CLS powinna być użyta po instrukcjach DEFLCDCHAR.

Zobacz także: Tools - LCD designer (w oryginalnym pliku pomocy)

Przykład:

Deflcdchar 0,0,28,28,28,28,28,28,0   'definiujemy znak 0

Cls                                  'wybieramy LCD DATA RAM

Lcd Chr(0)                           'wyświetlamy

End


Instrukcja DELAY

Przeznaczenie:

Opóźnia działanie programu na krótki czas.

Składnia:

DELAY

Opis:

Można używać instrukcji DELAY by opóźnić działanie programu. Czas opóźnienia wynosi około 100μs przy częstotliwości taktowania 12MHz.

Zobacz także: WAIT  , WAITMS

Przykład:

P1 = 5     'wpisz 5 do rejestru portu P1

Delay      'czekaj aż urządzenie będzie gotowe


Instrukcja DIM

Przeznaczenie:

Definiuje zmienną.

Składnia:

DIM nazwa [( rozmiar )] AS [ XRAM | IRAM ] typ

gdzie:

nazwa	nazwa pod jaka identyfikowana będzie zmienna,
rozmiar	ilość elementów dla zmiennej tablicowej,
typ	typ zmiennej,

Opis:

Każda zmienna powinna być zdefiniowana instrukcją DIM. Zmienne domyślnie są umieszczane w pamięci RAM procesora, jeśli nie zastosowano argumentu XRAM.

Gdy zastosowano argument XRAM, zmienna zostanie umieszczona w pamięci zewnętrznej procesora. Argument IRAM wprowadzono w związku z dyrektywą $DEFULT XRAM, która powoduje, że wszystkie zmienne trafiają do pamięci zewnętrznej. Aby jednak umożliwić umieszczanie zmiennych w pamięci RAM wewnątrz procesora, stosuje się dla takich zmiennych argument IRAM.

Zmienne typu String wymagają dodatkowego parametru określającego ich przewidywaną długość w znakach:

Dim s As XRAM String * 10

W powyższym przykładzie zmienna tekstowa s może zapamiętać ciąg znaków o długości nie większej niż 10 znaków. Zostanie ona umieszczona w pamięci zewnętrznej.

Uwaga! Zmienne bitowe mogą być umieszczone tylko w pamięci IRAM (wewnętrznej).

Różnice w stosunku do QBasic-a.

W języku QBasic nie trzeba definiować zmiennych przed ich użyciem. W języku BASCOM obszar przeznaczony na zmienne jest ograniczony. Należy więc poinformować kompilator o zamiarze używania zmiennej. Kompilator zaś powiadomi jeśli brakuje miejsca w pamięci na zmienną. Tworzy to mechanizm bezpiecznego gospodarowania pamięcią RAM, oraz służy dodatkowemu zabezpieczeniu kodu przed błędami.

Dodatkowo, argumenty XRAM, IRAM nie występują w składni języka QBasic.

Zobacz także: CONST , ERASE

Przykład:

'--------------------------------------------------------------

'                     (c) 2000 MCS Electronics

'--------------------------------------------------------------

'  plik: DIM.BAS

'  demo: DIM

'--------------------------------------------------------------

Dim B1 As Bit                    'bit może mieć wartość 0 lub 1

Dim A As Byte                    'bajt 0-255

Dim C As Integer                 'integer -32767 - +32768

Dim L As Long

Dim W As Word

Dim S As String * 10             'tekst może mieć do 10 znaków

'przypisanie bitu

B1 = 1                           'lub

Set B1                           'używając Set

'przypisanie bajtu

A = 12

A = A + 1

'przypisanie integer

C = -12

C = C + 100

Print C

W = 50000

Print W

'long

L = 12345678

Print L

'ciągu tekstu

S = "Witaj świecie"

Print S

End


Instrukcja DISABLE

Przeznaczenie:

Wyłącza źródła przerwań.

Składnia

DISABLE źródło

gdzie:

źródło	symboliczna nazwa źródła przerwania:
Nazwa	Źródło przerwania
INT0	Przerwanie zewnętrzne (końcówka INT0)
INT1	Przerwanie zewnętrzne (końcówka INT1)
TIMER0	Przerwanie przepełnienia licznika TIMER0
TIMER1	Przerwania przepełnienia licznika TIMER1
TIMER2	Przerwania przepełnienia licznika TIMER2 (Tylko układy 8052/8032 i kompatybilne!)
SERIAL	Przerwania układu transmisji szeregowej.
Inne mikrokontrolery mogą mieć jeszcze dodatkowe źródła przerwań, np.:

INT2	Przerwanie zewnętrzne (końcówka INT2)
INT3	Przerwanie zewnętrzne (końcówka INT3)
INT4	Przerwanie zewnętrzne (końcówka INT4)
INT5	Przerwanie zewnętrzne (końcówka INT5)
INT6	Przerwanie zewnętrzne (końcówka INT6)
INT7	Przerwanie zewnętrzne (końcówka INT7)
TIMER2EX	Przerwanie zewnętrzne końcówka T2EX,
CTF	Wystąpił warunek porównania,
AD	Przerwanie przetwornika ADC,
CAN	???

Opis:

Za pomocą instrukcji DISABLE można wyłączać pojedyncze źródła przerwań lub całość systemu przerwań. Standardowo wszystkie przerwania są wyłączone.

Aby wyłączyć cały system przerwań należy użyć nazwy: INTERRUPTS. Aby ponownie włączyć system przerwań należy użyć instrukcji ENABLE INTERRUPTS.

Zobacz także: ENABLE

Przykład:

Enable Interrupts                         'włącz system przerwań

Enable Timer0                             'włącz przerwanie TIMER0

Disable Serial                            'wyłącz przerwanie UART

Disable Interrupts                        'wyłącz przerwania


Instrukcja DISPLAY

Przeznaczenie:

Włącza lub wyłącza ekran LCD.

Składnia:

DISPLAY ON | OFF

Opis:

Ekran LCD jest włączany automatycznie, gdyż kompilator BASCOM umieszcza w procedurze inicjalizacji stosowne instrukcje.

Zobacz także: LCD

Przykład:

Dim a As Byte

a = 255

Lcd a

Display Off

Wait 1

Display On

End


Instrukcja DO..LOOP
Instrukcje DO - LOOP

Przeznaczenie:

Powtarza blok programu dopóki nie zostanie spełniony warunek końcowy.

Składnia:

DO

   ciąg_instrukcji

LOOP [UNTIL warunek]

Opis:

Instrukcja tworzy blok zwany pętlą. Instrukcje zawarte pomiędzy DO a LOOP, będą się wykonywać dopóki warunek nie zostanie spełniony – tj. będzie miał wartość logicznego fałszu. Gdy warunek nie jest podany pętla będzie się wykonywać w nieskończoność. Można wyjść z pętli w dowolnym momencie stosując instrukcję EXIT DO.

Uwaga! Warunek pętli jest obliczany na końcu, więc instrukcje w pętli wykonają się co najmniej jeden raz.

Zobacz także: EXIT , WHILE - WEND , FOR - NEXT

Przykład:

Dim A As Byte

Do                    'początek pętli

   A = A + 1          'zwiększamy A

   Print A            'drukujemy

Loop Until A = 10     'powtarzamy aż A = 10

Print A


Instrukcja ELSE

Przeznaczenie:

Wykonuje instrukcje po słowie ELSE, jeśli wyrażenie w instrukcji IF-THEN jest fałszywe.

Składnia:

ELSE instrukcja

gdzie:

instrukcja	dowolna instrukcja języka BASCOM BASIC.

Opis:

Instrukcja ELSE może być używana tylko w konstrukcjach IF – THEN oraz SELECT. Jeśli warunek podany jako wyrażenie w instrukcji IF-THEN będzie fałszywe, to program przejdzie do instrukcji występującej po słowie ELSE.

Po słowie ELSE można także umieścić kilka instrukcji oddzielonych dwukropkami. Ważne jest, by były one umieszczone w jednej linii programu.

Jeśli fragment programu wykonywany po instrukcji ELSE jest dość złożony, należy użyć konstrukcji IF-THEN-END IF.

Aby sprawdzić kolejny warunek można użyć instrukcji ELSEIF. Na przykład:

If a = 1 Then

  ...

  Elseif a = 2 Then

    ...

    Elseif b1 > a Then

      ...

      Else

        ...

End If

Zobacz także: IF-THEN-ELSE-ENDIF , SELECT CASE - END SELECT

Przykład:

A = 10                            'niech a = 10

If A > 10 Then                    'podejmujemy decyzję

   Print "A > 10"                 'to się nie wyświetli

 Else                             'alternatywa:

   Print "A nie większe niż 10"   'to będzie wyświetlone

End If


Instrukcja ENABLE

Przeznaczenie:

Włącza źródła przerwań.

Składnia

ENABLE źródło

gdzie:

źródło	symboliczna nazwa źródła przerwania:
Nazwa	Źródło przerwania
INT0	Przerwanie zewnętrzne (końcówka INT0),
INT1	Przerwanie zewnętrzne (końcówka INT1),
TIMER0	Przerwanie przepełnienia licznika TIMER0,
TIMER1	Przerwania przepełnienia licznika TIMER1,
TIMER2	Przerwania przepełnienia licznika TIMER2 (Tylko układy 8052/8032 i podobne!),
SERIAL	Przerwanie układu transmisji szeregowej.
Inne mikrokontrolery mogą mieć jeszcze dodatkowe źródła przerwań, np.:

INT2	Przerwanie zewnętrzne (końcówka INT2),
INT3	Przerwanie zewnętrzne (końcówka INT3),
INT4	Przerwanie zewnętrzne (końcówka INT4),
INT5	Przerwanie zewnętrzne (końcówka INT5),
INT6	Przerwanie zewnętrzne (końcówka INT6),
INT7	Przerwanie zewnętrzne (końcówka INT7),
TIMER2EX	Przerwanie zewnętrzne końcówka T2EX,
CTF	Wystąpił warunek porównania,
AD	Przerwanie przetwornika ADC,
CAN	???

Opis:

Za pomocą instrukcji ENABLE można włączać pojedyncze źródła przerwań lub całość systemu przerwań. Standardowo wszystkie przerwania są wyłączone.

Aby włączyć cały system przerwań należy użyć nazwy: INTERRUPTS. Aby ponownie wyłączyć system przerwań należy użyć instrukcji DISABLE INTERRUPTS.

Zobacz także: DISABLE

Przykład:

Enable Interrupts  'włączamy system przerwań

Enable Timer1      'włączamy przerwanie przepełniania licznika TIMER1


Instrukcja END

Przeznaczenie:

Kończy działanie programu.

Składnia

END

Opis:

Po wykonaniu instrukcji END, wszystkie przerwania są wyłączane i wykonywana jest tzw. nieskończona pętla.

Zamiast instrukcji END można użyć instrukcji STOP. Różnica jest taka, że instrukcja STOP nie powoduje wyłączenia przerwań przed przejściem do nieskończonej pętli.

Zobacz także: STOP

Przykład:

Print "Cześć"      'drukujemy

End                'kończymy program i wyłączamy przerwania


Instrukcja ERASE

Przeznaczenie:

Usuwa określoną zmienną, zwalniając zajmowaną przez nią pamięć.

Składnia

ERASE zmienna

gdzie:

zmienna	nazwa zmiennej która ma być usunięta.

Opis:

Jeśli w jakimś fragmencie programu, potrzebna będzie zmienna tymczasowa, można ją po użyciu usunąć. Tym samym program zużyje mniej pamięci, gdyż bajty zajmowane przez zmienną trafią do puli bajtów do wykorzystania.

Uwaga! Zmienna musi być zdefiniowana przed jej usunięciem.

Można usuwać tylko ostatnio zdefiniowane zmienne Dlatego jeśli zdefiniujemy dwie zmienne dla lokalnych celów, należy je także “lokalnie” usunąć. Porządek w jakim będą usuwane zmienne jest nieistotny. Dla przykładu:

Dim a1 As Byte , a2 As Byte , a3 As Byte , a4 As Byte

'zdefiniujemy parę zmiennych

Erase a3 : Erase a4                  'usuniemy ostatnie dwie zmienne, gdyż nie będą już potrzebne

Jeśli w programie dalej umieścilibyśmy instrukcję:

Dim a5 As Byte                       'zdefiniujemy nową zmienną

wtedy usunięcie zmiennych a1 oraz a2 nie byłoby możliwe!

Uwaga! Usuwane zmienne nie są umieszczane w raporcie kompilacji oraz nie występują na liście zmiennych podczas symulacji.

Zobacz także: DIM

Przykład:

Dim A As Byte                             'zdefiniujemy zmienną A

A = 255                                   'coś do niej wpiszemy

Print A                                   'i zobaczymy czy tak jest

Erase A                                   'usuń zmienną

Dim A As Integer                          'zdefiniuj ponownie jako Integer

Print A                                   'drukuj ponownie

Rem Teraz zmienna A używa tych samych bajtów co poprzednia zmienna A

Rem dlatego część LSB zmiennej A nadal przechowuje tą samą wartość.

End


Instrukcja EXIT

Przeznaczenie:

Wychodzi z instrukcji: FOR..NEXT, DO..LOOP , WHILE..WEND, SUB..END SUB lub FUNCTION..END FUNCTION.

Składnia:

EXIT  FOR

EXIT  DO

EXIT  WHILE

EXIT  SUB

EXIT  FUNCTION

Opis:

Za pomocą instrukcji EXIT można w każdej chwili wyjść z dowolnej instrukcji strukturalnej.

Przykład:

If a >= b1 Then          'jakiś kod

   Do                    'zaczynamy pętlę DO..LOOP

     A = A + 1           'jak Incr a

     If A = 100 Then     'czy a = 100?

       Exit Do           'wychodzimy!

     End If              'koniec instrukcji IF..THEN

   Loop                  'koniec DO..LOOP

End If                   'koniec pierwszej IF..THEN


Instrukcja FOR..NEXT
Instrukcje FOR - NEXT

Przeznaczenie:

Wykonuje blok instrukcji pomiędzy FOR a NEXT określoną ilość razy jednocześnie modyfikując podaną zmienną.

Składnia:

FOR zmienna = liczba_początkowa TO | DOWNTO liczba_końcowa [STEP krok]

 ...

NEXT [zmienna]

gdzie:

zmienna	dowolna zmienna numeryczna, będąca licznikiem przejść pętli,
liczba_początkowa	liczba startowa licznika pętli,
liczba_końcowa	liczba końcowa licznika pętli,
krok	krok co jaki będzie zmieniany licznik pętli po dotarciu do instrukcji NEXT.

Opis:

W przeciwieństwie do innych pętli DO-LOOP czy WHILE-WEND, pętla FOR-NEXT wykona się tylko z góry określoną liczbę razy. Można to określić wzorem: (liczba_końcowa – liczba_początkowa) / krok.

Każda pętla FOR musi się kończyć instrukcja NEXT. Użycie STEP jest opcjonalne, standardowo krok wynosi 1 (lub –1 gdy użyto DOWNTO).

Uwaga! Nie należy mieszać ze sobą pętli, jak to pokazano tutaj:

For A = 1 To 10

  For B = 1 To 20

    Print A ; ":" ; B

  Next A

Next B

Program będzie działał poprawnie, lecz konstrukcja ta może stać się nieczytelna (przyp. tłumacza).

Zobacz także:  EXIT FOR

Przykład:

'--------------------------------------------------------------

'                     (c) 2000 MCS Electronics

'--------------------------------------------------------------

'  plik: FOR_NEXT.BAS

'  demo: FOR, NEXT

'--------------------------------------------------------------

Dim A As Byte , B1 As Byte , C As Integer

For A = 1 To 10 Step 2

   Print "A jest równe " ; A

Next A

Print "Teraz spróbujemy DOWNTO"

For C = 10 Downto -5

  Print "C jest równe " ; C

Next

Print "Możesz zagnieżdżać kilka pętli FOR..NEXT"

For A = 1 To 10

  Print "To jest A " ; A

  For B1 = 1 To 10

    Print "A to jest B1 " ; B1

  Next

  'nie musisz umieszczać nazwy zmiennej, gdyż kompilator wie że chodzi

  'o zmienną B1

Next A

End


Instrukcja FOURTHLINE

Przeznaczenie:

Ustawia kursor wyświetlacza LCD w czwartej linii.

Składnia:

FOURTHLINE

Opis:

Instrukcja ta działa tylko na wyświetlaczach posiadających cztery linie.

Zobacz także:  HOME , UPPERLINE , LOWERLINE , THIRDLINE , LOCATE

Przykład:

Dim a As byte

a = 255

Lcd a

Fourthline

Lcd a

Upperline

End


Funkcja FUSING()

Przeznaczenie:

Formatuje liczbę zmiennoprzecinkową według podanego wzorca.

Składnia:

rezultat = FUSING( zmienna , "maska" )

gdzie:

rezultat	zmienna tekstowa, w której umieszczony zostanie sformatowany tekst,
zmienna	zmienna typu Single zawierająca formatowaną liczbę,
maska	wzorzec formatowania.

Opis:

Maska jest ciągiem znaków, który musi zaczynać się od znaku # (hash). Po kropce należy umieścić tyle znaków #, ile ma pojawić się znaków po przecinku. Na przykład podanie maski jako "#.###" sformatuje liczbę do postaci 123.456. Gdy liczba cyfr po przecinku jest większa niż określona w masce, nastąpi zaokrąglenie ostatniej cyfry. Na przykład liczba 123.4567 zostanie sformatowana do 123.457.

Jeśli operacja zaokrąglania nie powinna być przeprowadzana, zamiast umieszczonych po kropce znaków # należy umieścić znak & (ampersand). Dla powyższej liczby maska "#.&&&" spowoduje sformatowanie liczby do postaci 123.456.

Gdy liczba jest zerem funkcja zwraca zawsze 0.0, niezależnie od podanej maski.

Zobacz także: STR

Przykład:

'---------------------------------------------------------------------

'                            FUSING.BAS

'                     (c) 2001 MCS ELectronics

'---------------------------------------------------------------------

Dim S As Single , Z As String * 10

'najpierw przypiszemy zmiennej jakąś wartość

S = 123.45678

'Użycie funkcji Str() pozwala na konwersję liczby na jej

'reprezentację w postaci tekstu

Z = Str(s)

Print Z                              'wydrukuje 123.456779477

Z = Fusing(s , "#.##")

'Teraz sformatujemy liczbę według wzorca z zaokrąglaniem

Print Fusing(s , "#.##")             'wydrukuje 123.46

'A teraz to samo tylko bez zaokrąglania

Print Fusing(s , "#.&&")             'wydrukuje 123.45

'Maska musi rozpoczynać się od znaku #.

'Należy także umieścić choć jeden znak # lub & po kropce.

'Nie można mieszać znaków # i & w masce po kropce.

End


Instrukcja GET

Przeznaczenie:

Odbiera bajty przez programowy UART.

Składnia:

GET #nr_kanału , zmienna [ TIMEOUT = czas ]

gdzie:

zmienna	zmienna do której wpisany będzie odebrany bajt,
nr_kanału	numer otwartego wcześniej kanału programowego UART,

Opis:

Instrukcja odbiera jeden bajt za pomocą programowego UART-u.

Uwaga! Kanał transmisji musi być przedtem otwarty przez OPEN. Instrukcja CLOSE musi być ostatnią w programie (zobacz uwagi w opisie instrukcji OPEN ).

Parametr TIMEOUT pozwala na podanie czasu, po którym instrukcja przerwie działanie jeśli nie odebrano bajtu.

Zobacz także:  OPEN , PUT , $TIMEOUT

Przykład:

Dim S As String * 12 , I As Byte , A As Byte , Dum As Byte

Open "com3.1:9600" For Output As #1 'p3.1 jest normalnie używany jako końcówka TxD więc testowanie programu jest łatwe

Open "com3.0:9600" For Input As #2  'p3.0 jest normalnie używany jako końwówka RxD

S = "Testowanie!"                    'jakiś tekst

Dum = Len(s)                         'ile ma znaków

For I = 1 To Dum                     'prześlemy każde z nich po kolei

  A = Mid(s , I , 1)                 'wytnij znak

  Put #1 , A                         'puść w kabelek ;-)

Next

Do

  Get #2 , A                         'odbierz znak

  Put #1 , A                         'zrobimy echo

  Print A                            'użyj normalnego kanału

Loop

Printbin #1, a                       'Printbin jak i Inputbin

Inputbin #2, a                       'są także dostępne

Close #1                             'na koniec zamykamy kanały

Close #2

End

'by używać parametru TIMEOUT należy dodać (normalnie, bez komentarza):

'$timeout

'Get #2 , A TIMEOUT = 10000          'czekaj na znak


Funkcja GETAD()

Przeznaczenie:

Pobiera wynik przetwarzania z wbudowanego układu A/D.

Składnia:

zmienna = GETAD( nr_kanału , zakres )

gdzie:

zmienna	zmienna do której wpisana będzie przetworzona wartość,
nr_kanału	numer kanału przetwornika A/D. Może być z zakresu 0 – 7. Dla kontrolerów 80517 i 80537 także 8 – 11,
zakres	liczba określająca zakres działania przetwornika, dozwolone są wartości:
	0	0 – 5V
	192	0 – 3.75V
	128	0 – 2.5V
	64	0 – 1.25V
	12	3.75V – 5V
	200	2.5 – 3.75V
	132	1.25 – 2.5V

Opis:

Funkcja GETAD jest przeznaczona dla kontrolerów: 80515, 80535, 80517, 80535 oraz 80552. Dla rodziny 89Cx051 użyj funkcji GETAD2051.

Końcówki wejściowe przetwornika A/D działają także jako normalne linie portów. Jest szczególnie ważne, by podczas pracy przetwornika ich stan nie był zmieniany.

Zobacz także: GETAD2051

Przykład:

Dim b1 As Byte , Channel As Byte , ref As Byte

channel = 0                'wejście na P6.0

ref = 0                    'zakres od 0 do 5V

b1 = Getad(channel , ref)  'odczytaj wartość i wpisz do b1

Print b1

End


Funkcja GETAD2051()

Przeznaczenie:

Dokonuje pomiaru napięcia za pomocą procesorów 89c2051 lub 89c4051.

Składnia:

zmienna = GETAD2051()

gdzie:

zmienna	zmienna do której wpisana będzie przetworzona wartość,

Opis:

Funkcja GETAD2051 jest przeznaczona tylko dla kontrolerów: 89c2051 lub 89c4051, które mają wbudowany komparator analogowy.

Schemat układu pomiarowego jest pokazany poniżej:

Zobacz także: GETAD

Przykład:

$regfile = "89c2051.dat"

Dim A As Byte

Do

  A = Getad2051()

  A = Lookup(a , Dta)

  Print A

Loop

End

'Poniższa tablica służy do konwersji odczytanej wartości na liczbę w formacie spakowanym BCD

'Liczba ta może być użyta do wyświetlania wartości na 2 wyświetlaczach 7-segmentowych

Dta:

  Data 0                             ' 0  0.000

  Data 1                             ' 1  0.047

  Data 1                             ' 2  0.093

  Data 2                             ' 3  0.138

  Data 2                             ' 4  0.184

  Data 3                             ' 5  0.229

  Data 3                             ' 6  0.273

  Data 3                             ' 7  0.317

  Data 4                             ' 8  0.361

  Data 4                             ' 9  0.404

  Data 5                             ' 10 0.447

  Data 5                             ' 11 0.489

  Data 6                             ' 12 0.531

  Data 6                             ' 13 0.573

  Data 6                             ' 14 0.614

  Data 7                             ' 15 0.655

  Data 7                             ' 16 0.696

  Data 8                             ' 17 0.736

  Data 8                             ' 18 0.776

  Data 8                             ' 19 0.815

  Data 9                             ' 20 0.854

  Data 9                             ' 21 0.893

  Data &H10                          ' 22 0.931

  Data &H10                          ' 23 0.969

  Data &H10                          ' 24 1.006

  Data &H11                          ' 25 1.044

  Data &H11                          ' 26 1.080

  Data &H11                          ' 27 1.117

  Data &H12                          ' 28 1.153

  Data &H12                          ' 29 1.189

  Data &H12                          ' 30 1.224

  Data &H13                          ' 31 1.260

  Data &H13                          ' 32 1.295

  Data &H13                          ' 33 1.329

  Data &H14                          ' 34 1.363

  Data &H14                          ' 35 1.397

  Data &H14                          ' 36 1.431

  Data &H15                          ' 37 1.464

  Data &H15                          ' 38 1.497

  Data &H15                          ' 39 1.530

  Data &H16                          ' 40 1.562

  Data &H16                          ' 41 1.594

  Data &H16                          ' 42 1.626

  Data &H17                          ' 43 1.657

  Data &H17                          ' 44 1.688

  Data &H17                          ' 45 1.719

  Data &H18                          ' 46 1.750

  Data &H18                          ' 47 1.780

  Data &H18                          ' 48 1.810

  Data &H19                          ' 49 1.840

  Data &H19                          ' 50 1.869

  Data &H19                          ' 51 1.898

  Data &H19                          ' 52 1.927

  Data &H20                          ' 53 1.956

  Data &H20                          ' 54 1.984

  Data &H20                          ' 55 2.012

  Data &H21                          ' 56 2.040

  Data &H21                          ' 57 2.068

  Data &H21                          ' 58 2.095

  Data &H21                          ' 59 2.122

  Data &H22                          ' 60 2.149

  Data &H22                          ' 61 2.176

  Data &H22                          ' 62 2.202

  Data &H22                          ' 63 2.228

  Data &H23                          ' 64 2.254

  Data &H23                          ' 65 2.279

  Data &H23                          ' 66 2.305

  Data &H23                          ' 67 2.330

  Data &H24                          ' 68 2.355

  Data &H24                          ' 69 2.379

  Data &H24                          ' 70 2.404

  Data &H24                          ' 71 2.428

  Data &H25                          ' 72 2.452

  Data &H25                          ' 73 2.476

  Data &H25                          ' 74 2.499

  Data &H25                          ' 75 2.523

  Data &H26                          ' 76 2.546

  Data &H26                          ' 77 2.569

  Data &H26                          ' 78 2.591

  Data &H50                          ' 79 5.000

  Data &H49                          ' 80 4.953

  Data &H49                          ' 81 4.907

  Data &H48                          ' 82 4.862

  Data &H48                          ' 83 4.816

  Data &H47                          ' 84 4.771

  Data &H47                          ' 85 4.727

  Data &H47                          ' 86 4.683

  Data &H46                          ' 87 4.639

  Data &H46                          ' 88 4.596

  Data &H45                          ' 89 4.553

  Data &H45                          ' 90 4.511

  Data &H44                          ' 91 4.469

  Data &H44                          ' 92 4.427

  Data &H44                          ' 93 4.386

  Data &H43                          ' 94 4.345

  Data &H43                          ' 95 4.304

  Data &H42                          ' 96 4.264

  Data &H42                          ' 97 4.224

  Data &H42                          ' 98 4.185

  Data &H41                          ' 99 4.146

  Data &H41                          ' 100 4.107

  Data &H40                          ' 101 4.069

  Data &H40                          ' 102 4.031

  Data &H40                          ' 103 3.994

  Data &H39                          ' 104 3.956

  Data &H39                          ' 105 3.920

  Data &H39                          ' 106 3.883

  Data &H38                          ' 107 3.847

  Data &H38                          ' 108 3.811

  Data &H38                          ' 109 3.776

  Data &H37                          ' 110 3.740

  Data &H37                          ' 111 3.705

  Data &H37                          ' 112 3.671

  Data &H36                          ' 113 3.637

  Data &H36                          ' 114 3.603

  Data &H36                          ' 115 3.569

  Data &H35                          ' 116 3.536

  Data &H35                          ' 117 3.503

  Data &H35                          ' 118 3.470

  Data &H34                          ' 119 3.438

  Data &H34                          ' 120 3.406

  Data &H34                          ' 121 3.374

  Data &H33                          ' 122 3.343

  Data &H33                          ' 123 3.312

  Data &H33                          ' 124 3.281

  Data &H32                          ' 125 3.250

  Data &H32                          ' 126 3.220

  Data &H32                          ' 127 3.190

  Data &H31                          ' 128 3.160

  Data &H31                          ' 129 3.131

  Data &H31                          ' 130 3.102

  Data &H31                          ' 131 3.073

  Data &H30                          ' 132 3.044

  Data &H30                          ' 133 3.016

  Data &H30                          ' 134 2.988

  Data &H29                          ' 135 2.960

  Data &H29                          ' 136 2.932

  Data &H29                          ' 137 2.905

  Data &H29                          ' 138 2.878

  Data &H28                          ' 139 2.851

  Data &H28                          ' 140 2.824

  Data &H28                          ' 141 2.798

  Data &H28                          ' 142 2.772

  Data &H27                          ' 143 2.746

  Data &H27                          ' 144 2.721

  Data &H27                          ' 145 2.695

  Data &H27                          ' 146 2.670

  Data &H26                          ' 147 2.645

  Data &H26                          ' 148 2.621

  Data &H26                          ' 149 2.596

  Data &H26                          ' 150 2.572

  Data &H25                          ' 151 2.548

  Data &H25                          ' 152 2.524

  Data &H25                          ' 153 2.501

  Data &H25                          ' 154 2.477

  Data &H24                          ' 155 2.454

  Data &H24                          ' 156 2.431

  Data &H24                          ' 157 2.409


Funkcja GETRC()

Przeznaczenie:

Określa wartość zmiany rezystancji lub pojemności.

Składnia:

zmienna = GETRC( port )

gdzie:

zmienna	zmienna typu Word w której znajdzie się wynik pomiaru,
port	nazwa portu procesora, np.: P1.0,

Opis:

Poniżej pokazano sposób podłączenia obwodu RC:

Uwaga! Funkcja używa licznika TIMER0. Należy go wcześniej skonfigurować.

Przykład:

'-----------------------------------------------------------------------

'                            GETRC.BAS

'  Zwraca wartość rezystancji

'  Połącz potencjometr 10K pomiędzy +5V a P1.7

'  Podłącz także kondensator 10nF pomiędzy P1.7 a masą

'  Funkcja GETRC() dokonuje pomiaru czasu rozładowania kondensatora

'-----------------------------------------------------------------------

Config Timer0 = Timer , Gate = Internal , Mode = 1

'funkcja GETRC() używa Timera 0

Config Getrc = 10

'10ms opóźnienie dla ładowania kondensatora. Jest to wartość domyślna

'więc instrukcja CONFIG dla tej wartości nie jest wymagana

$baud = 9600                              'takie są moje ustawienia

$crystal = 11059200

Dim W As Word                             'miejsce na zmienne

Do                                        'pętelka

  W = Getrc(p1.7)                         'odczytaj wartość

  Print W                                 'wydrukuj

  Wait 1                                  'czekaj 1 sekundę

Loop

'Wartości zwrócone przy kondensatorze 10nF.

'Wartości rezystancji zostały zmierzone miernikiem cyfrowym.

'             250 for 10k9

'             198 for  9k02

'             182 for  8k04

'             166 for  7k

'             154 for  6k02

'             138 for  5k04

'             122 for  4k04

'             106 for  3k06

'              86 for  2k16

'              54 for  1k00

'              22 for   198om

'              18 for   150om

'              10 for   104om

'               6 for     1om (minimum)

'Jak możesz zauważyć charakterystyka jest umiarkowanie liniowa.

'Więc należy użyć jakiegoś wzoru matematycznego by otrzymać wartości rezystancji

'Lecz funkcja jest przeznaczona do mierzenia przybliżonej wartości rezystancji

'Można zmienić pojemność kondensatora by uzyskać większe wartości.

'Dla wartości 10nF, zwrócone wartości mieszczą się w bajcie.


Funkcja GETRC5()

Przeznaczenie:

Odbiera i rozkodowuje sygnał pilota pracującego w standardzie RC5.

Składnia:

GETRC5( adres , rozkaz )

gdzie:

adres	adres urządzenia, dla którego przeznaczony jest rozkaz,
rozkaz	bajt określający rozkaz.

Opis:

Jako odbiornik podczerwieni używany jest scalony detektor SFH506-36 produkowany przez Siemens-a lub jego odpowiednik pracujący na częstotliwości 36kHz.

Aby detektor pracował bez zakłóceń należy odpowiednio odfiltrować jego zasilanie:

Wiele urządzeń audio-video jest wyposażonych w system zdalnego sterowania pracujący w podczerwieni. Dość duża grupa tego typu urządzeń (szczególnie produkowanych przez europejskie firmy przyp. tłumacza) używa transmisji w kodzie RC5.

Nadajniki pracujące według standardu RC5 transmitują 14-bitowe słowa danych, kodowane w formacie bi-phase, zwanym także kodem Manchester.

Pierwsze dwa bity słowa są zawsze jedynkami i tworzą razem sygnał startu. Następny bit jest bitem kontrolnym, zmienianym w kolejnych nadawanych słowach, gdy użytkownik przytrzyma klawisz pilota – umożliwia to powtarzanie komend. Kolejne 5 bitów reprezentuje adres urządzenia, które ma być właściwym odbiornikiem transmisji. Dla przykładu: odbiorniki telewizyjne maja zazwyczaj adres 0, a magnetowidy adres 5. Ostatnie 6 bitów reprezentuje jedną z 64 możliwych komend.

Zobacz także: CONFIG RC5

Przykład:

'----------------------------------------------------------------------------

'                  RC5.BAS  (c) 2002 MCS Electronics

'  podłącz wyjście odbiornika SFH506-36 do PORT 3.2 (INT0)

'  Wybierz odpowiedni port w opcjach Compiler | I2C. Int0 powinien być końcówką P3.2

'  Inne układy mogą używać innej końcówki!

'----------------------------------------------------------------------------

Dim New As Bit

Dim Command As Byte , Subaddress As Byte

Reset Tcon.0                         'wyzwalanie narastającym zboczem

On Int0 Receiverc5

Enable Int0

Enable Interrupts

Do

  If New = 1 Then                    'odebrano nowy kod

     Disable Int0

     Print Command ; "  " ; Subaddress

     New = 0                         'zeruj flagę

     Enable Int0

  End If

Loop

Receiverc5:                          'procedura obsługi przerwania

  'funkcja Getrc5 używa 30 bajtów(!) stosu dla pomiaru

  'odcinków czasu pomiędzy bitami

  Getrc5(Subaddress, command)

  New = 1                            'ustaw flagę

Return


Instrukcja GOSUB

Przeznaczenie:

Wykonuje skok to podprogramu.

Składnia:

GOSUB etykieta

gdzie:

etykieta	nazwa etykiety do której skacze program.

Opis:

Za pomocą instrukcji GOSUB można wykonać skok pod adres określony etykietą i wykonać umieszczone tam instrukcje. Pozwala to na podzielenie programu na fragmenty – podprogramy, które mogą być wykorzystane wielokrotnie, bez potrzeby pisania ich za każdym razem.

Gdy w podprogramie umieszczona będzie instrukcja RETURN, nastąpi powrót do instrukcji następującej po instrukcji GOSUB (tej która wykonała skok). Adresy powrotne są zapamiętywane na specjalnym stosie.

Zobacz także: GOTO , CALL , RETURN

Przykład:

Gosub Routine            'skok do podprogramu

Print "Czesc"            'powrót z podprogramu nastąpi tutaj

End                      'koniec programu

Routine:                 'tutaj jest podprogram

  x = x + 2              'obliczymy coś

  Print X                'wydrukujemy wynik

Return                   'i wracamy


Instrukcja GOTO

Przeznaczenie:

Wykonuje skok do określonej etykiety.

Składnia:

GOTO etykieta

gdzie:

etykieta	nazwa etykiety do której nastąpi skok

Opis:

Instrukcja skacze bezwarunkowo do określonej etykiety. Nie istnieje instrukcja powrotu jak w instrukcji GOSUB. Etykieta może mieć maksimum 32 znaki.

Gdy w programie wystąpią dwie etykiety o tej samej nazwie, kompilator zasygnalizuje ten fakt.

Zobacz także: GOSUB

Przykład:

Start:                   'etykieta zakończona musi być dwukropkiem

 A = A + 1               'zwiększamy A

 If A < 10 Then          'czy jest mniejsza niż 10?

   Goto Start            'jeśli tak to powtarzamy

 End If                  'koniec struktury IF

 Print "Ready"           'i to wszystko


Funkcja HEX()

Przeznaczenie:

Zwraca w formie tekstu szesnastkową reprezentacje liczby.

Składnia:

zmienna = HEX( liczba )

gdzie:

zmienna	zmienna tekstowa, w której znajdzie się liczba zapisana w formacie szesnastkowym,
liczba	liczba poddana konwersji, może być stałą lub zmienną typu Integer, Word, Long czy Byte.

Opis:

Zobacz także: HEXVAL

Przykład:

Dim a As Byte, S As String * 10

a = 123

s  = Hex(a)

Print s

End


Funkcja HEXVAL()

Przeznaczenie:

Zamienia tekstową reprezentację liczby szesnastkowej na odpowiadającą jej wartość.

Składnia:

zmienna = HEXVAL( liczba )

gdzie:

zmienna	zmienna do której zapisana będzie liczba po konwersji,
liczba	liczba szesnastkowa poddana konwersji, zapisana w zmiennej tekstowej.

Opis:

Różnice w stosunku do QBasic-a.

W języku QBasic można używać funkcji VAL() do konwersji liczb szesnastkowych. Określenie czy liczba jest rzeczywiście w zapisie szesnastkowym, odbywa się za pomocą testu czy rozpoczyna się od przedrostka &H.

W języku BASCOM BASIC by uniknąć testowania wprowadzono osobną instrukcję HEXVAL.

Zobacz także: HEX , VAL , STR

Przykład:

Dim a As Integer, s As String * 15

s = "A"

a = Hexval(s) : Print a

End


Funkcja HIGH()

Przeznaczenie:

Zwraca starszą cześć (bajt MSB) podanej zmiennej.

Składnia:

rezultat = HIGH( zmienna )

gdzie:

rezultat	zmienna do której zapisana będzie starszy bajt zmiennej,
zmienna	zmienna której starsza część ma być określona.

Opis:

Zobacz także: HIGHW , LOW , LOWW

Przykład:

Dim I As Integer , Z As Byte

I = &H1001

Z = High(I)                          'zwróci 16


Funkcja HIGHW()

Przeznaczenie:

Zwraca starszą część (słowo MSB) podanej zmiennej typu Long.

Składnia:

rezultat = HIGHW( zmienna )

gdzie:

rezultat	zmienna do której zapisana będzie starsze słowo zmiennej,
zmienna	zmienna typu Long której starsza część ma być określona.

Opis:

Zobacz także: LOW , LOWW , HIGH

Przykład:

Dim X As Word , L As Long

L = &H12345678

X = Highw(L)

Printhex x


Instrukcja HOME

Przeznaczenie:

Ustawia pozycję kursora LCD na początku określonej linii.

Składnia:

HOME  [ UPPER | LOWER | THIRD | FOURTH ]

Opis:

Jeśli nie podano nazwy linii, kursor ustawiany jest na początku pierwszej linii wyświetlacza.

Można także użyć skrótowego zapisu nazwy linii, np.: HOME U, co odpowiada instrukcji HOME UPPER.

Zobacz także: CLS , LOCATE

Przykład:

Lowerline

Lcd "Under"

Home Upper

Lcd "Upper"


Instrukcja I2CRECEIVE

Przeznaczenie:

Odczytuje dane z urządzenia dołączonego do magistrali I2C.

Składnia:

I2CRECEIVE  adres, zmienna

I2CRECEIVE  adres, zmienna, bajty_zapisywane, bajty_odczytywane

gdzie:

adres	zmienna lub stała określająca adres urządzenia,
zmienna	zmienna z której zapisywane i do której odczytywane będą dane,
bajty_zapisywane	ilość bajtów które należy przesłać do urządzenia,
bajty_odczytywane	ilość bajtów które należy odebrać z urządzenia.

Opis:

Jako adres należy podać adres bazowy, gdyż instrukcja sama ustawia bit R/W w bajcie adresowym urządzenia I2C.

Uwaga! Przy podawaniu ilości bajtów zapisywanych/odczytywanych należy uważać by nie określić ich za dużo.

Różnice w stosunku do BASCOM LT.

W BASCOM LT należy podać DATA jako zmienną, lecz w języku BASCOM BASIC-8051dostępne są tablice i przy należy jako zmienną podać nazwę tablicy.

Zobacz także: I2CSEND

Przykład:

x = 0                           'zerowanie zmiennej

slave = &H40                    'określamy adres np.: PCF 8574 I/O

I2creceive  slave, x            'odczytujemy stan końcówek

Print x                         'i drukujemy

Dim buf(10) As Byte

buf(1) = 1 : buf(2) = 2

I2creceive slave, buf(), 2, 1   'zapisujemy dwa bajty i czytamy jeden

Print buf(1)                    'drukujemy co odebraliśmy


Instrukcja I2CSEND

Przeznaczenie:

Wysyła ciąg danych do urządzenia podłączonego do magistrali I2C.

Składnia:

I2CSEND adres, zmienna

I2CSEND adres, zmienna, bajty_zapisywane

gdzie:

adres	zmienna lub stała określająca adres urządzenia,
zmienna	zmienna będąca z której pobrane będą dane do wysłania,
bajty_zapisywane	ilość bajtów które należy przesłać do urządzenia.

Opis:

Większość układów komunikujących się za pomocą magistrali I2C, posiada możliwość odbioru większej ilości danych. Do najpopularniejszych należą pamięci EEPROM, które posiadają tryb zapisu wielobajtowego. Po podaniu początkowego adresu można kolejno przesyłać bajty, które umieszczone zostaną jeden za drugim w strukturze pamięci. Pamięć sama wtedy będzie zwiększać adres, po odebraniu bajtu.

Zobacz także: I2CRECEIVE

Przykład:

x = 5                         'wpisujemy 5

Dim ax(10) As Byte

Const slave = &H40            'adres układu PCF 8574 I/O

I2csend slave, x              'przesyłamy liczbę 5

For a = 1 To 10

  ax(a) = a                   'wypełniamy tablicę danych

Next

bytes = 10

I2csend slave, ax(), bytes    'transmitujemy dane

End


Instrukcje I2CSTART, I2CSTOP, I2CRBYTE, I2CWBYTE
Instrukcje I2START, I2CSTOP, I2CRBYTE, I2CWBYTE

Przeznaczenie:

I2CSTART generuje sygnał startu wymagany przy inicjacji transmisji po magistrali I2C.

I2CSTOP generuje sygnał stopu wymagany po zakończeniu transmisji magistralą I2C.

I2CRBYTE odbiera jeden bajt z zaadresowanego urządzenia.

I2CWBYTE wysyła jeden bajt do określonego urządzenia.

Składnia:

I2CSTART

I2CSTOP

I2CRBYTE zmienna , [ 8 | 9 | ACK | NACK ]

I2CWBYTE zmienna

Opis:

Instrukcje wprowadzono jako dodatkowe dla instrukcji I2CSEND oraz I2CRECEIVE.

Instrukcja I2CRBYTE posiada dodatkowy parametr, którego znaczenie jest następujące:

8 lub ACK	Parametr ACK występuje, gdy bieżący odbierany bajt nie jest ostatnim.
9 lub NACK	Parametr NACK występuje, gdy bieżący bajt jest ostatnim z odczytywanych.

Zobacz także: I2CRECEIVE , I2CSEND

Przykład:

‘-------- Zapis i odczyt danych z pamięci EEPROM 2404 ---------------

Dim a As Byte

Const adresW = 174  'adres do zapisu układu 2404

Const adresR = 175  'adres do odczytu układu 2404

I2cstart            'warunek startu

I2cwbyte  adresW    'wyślij adres układu

I2cwbyte  1         'wyślij adres w pamięci EEPROM

I2cwbyte  3         'wyślij daną

I2cstop             'warunek stopu

Waitms 10           'czekamy 10mS ponieważ 2404 potrzebuje czasu na

                    'zapisanie danych w pamięci

‘--------------- teraz odczytamy to co zapisaliśmy ------------------

I2cstart            'warunek startu

I2cwbyte adresW     'zaadresujemy urządzenie

I2cwbyte 1          'wyślij adres komórki EEPROM

I2cstart            'znów generujemy warunek startu

I2cwbyte adresR     'adresujemy układ EEPROM do odczytu

I2crbyte a , Nack   'odczytujemy komórkę pamięci.

                    'Nack oznacza że nie będzie następnego odczytu

I2cstop             'warunek stopu

Print a             'i drukujemy zawartość komórki

End


Instrukcja IDLE

Przeznaczenie:

Wprowadza procesor w stan bezczynności – Idle.

Składnia:

IDLE

Opis:

W stanie bezczynności, jednostka centralna zostaje zatrzymana i nie wykonuje żadnych rozkazów. Działa jednak system przerwań, układ transmisji szeregowej i liczniki.

Wyprowadzenie procesora ze stanu bezczynności następuje po zgłoszeniu przerwania (np.: z liczników, wejść przerywających czy przetwornika A/D) lub na skutek wyzerowania procesora - RESET.

Zobacz także: POWERDOWN

Przykład:

Idle

Print ”Pobudka!”        ‘O! Było przerwanie...


Instrukcja IF..THEN..END IF
Instrukcja IF-THEN-ELSE-END IF

Przeznaczenie:

Tworzy tzw. blok decyzyjny.

Składnia:

IF wyrażenie THEN

  ciąg_instrukcji

  [ ELSEIF wyrażenie THEN ciąg_instrukcji ]

  [ ELSE ciąg_instrukcji ]

END IF

IF wyrażenie THEN ciąg_instrukcji [ ELSE ciąg_instrukcji]

gdzie:

wyrażenie	testowane wyrażenie logiczne,
ciąg_instrukcji	dowolny ciąg instrukcji, wykonywanych po spełnieniu lub nie warunku określonego w wyrażeniu.

Opis:

Instrukcja IF..THEN oblicza logiczną wartość podanego wyrażenia. Jeśli będzie ono prawdziwe (wynikiem będzie logiczna prawda) wykonany zostanie blok instrukcji umieszczony po instrukcji THEN. Jeśli będzie ono fałszywe, to instrukcje po słowie THEN nie zostaną wykonane. Wykonane za to będą instrukcje po słowie ELSE, jeśli ono występuje.

Aby nie stosować dość złożonych zagnieżdżonych bloków instrukcji IF..THEN przewidziano też instrukcję ELSEIF, w której testowane może być dodatkowe wyrażenie – po stwierdzeniu fałszywego pierwszego wyrażenia (występującego po słowie IF).

Nowością jest możliwość testowania stanu bitów:

Dim a As Byte

If A.3 = 1 Then ...

Także nowością jest możliwość indeksowania numerów bitów za pomocą zmiennych:

Dim var As Byte, idx As Byte

Idx = 1

If var.Idx = 1 Then

Od wersji 2.00 wprowadzono także możliwość stosowania złożonych warunków:

If a > 10 AND A < 10 OR A = 15 Then

  Nop

End if

Złożone warunki na razie nie działają z ciągami znaków. Tylko wartości numeryczne można w ten sposób testować.

Można za to testować bajty jakby były znakami. Ilustruje to przykład:

Dim X As Byte

If X = "A" Then       'Normalnie należałoby zapisać jak poniżej:

If X = 65 Then        'Teraz te dwie linie są równoważne

Zobacz także: ELSE

Przykład:

Dim A As Integer

A = 10

If A = 10 Then                          'jeśli wyrażenie będzie prawdziwe

  Print "Ta część zostanie wykonana."   'to zostanie wydrukowane

Else

  Print "Ta instrukcja się nie wykona."  'jeśli będzie fałszywe, wydrukujemy to

End If

If A = 10 Then Print "Nowość w języku BASCOM BASIC"

If A = 10 Then Goto Label1 Else Print "A<>10"

LABEL1:

Rem Poniższy fragment pokazuje rozszerzenia instrukcji IF THEN

If A.15 = 1 Then                     'testowanie stanu bitu

   Print "Bit 15 jest ustawiony"

End If

Rem a tu przykład instrukcji IF THEN [ELSE] umieszczonej w jednej linii.

If A.15 = 0 Then Print "BIT 15 jest wyzerowany" Else Print "BIT 15 jest ustawiony"


Instrukcja INCR

Przeznaczenie:

Zwiększa zawartość zmiennej o jeden.

Składnia:

INC zmienna

gdzie:

zmienna	zmienna typu Byte, Integer, Word, Long lub Single

Opis:

Zawartość zmiennej jest zwiększana o jeden. Instrukcja ta jest szybsza niż ta sama operacja z użyciem operatorów: zmienna = zmienna + 1

Zobacz także: DECR

Przykład:

Do                 'pętelka

  Incr a           'zwiększamy a o jeden

  Print a          'drukujemy

Loop Until a > 10  'powtarzamy aż a będzie większe niż 10


Funkcja INKEY()

Przeznaczenie:

Zwraca kod ASCII pierwszego znaku znajdującego się w buforze transmisji szeregowej.

Składnia:

zmienna = INKEY( )

zmienna = INKEY( #kanał )

gdzie:

zmienna	dowolna zmienna typu Byte, Integer, Word, Long lub Single,
kanał	numer otwartego kanału, przy odczytywaniu kodów z sprzętowego urządzenia UART.

Opis:

Jeśli w buforze nie ma żadnego znaku funkcja zwraca zero.

Funkcja INKEY może być użyteczna gdy projektowany system mikroprocesorowy posiada interfejs RS-232. Interfejs ten może być połączony z komputerem PC wyposażonym w port COM.

Uwaga! Drugi format instrukcji działa tylko z sprzętowym układem UART.

Zobacz także: WAITKEY

Przykład1:

Do                 'jakaś pętelka

  A = Inkey()      'odczytujemy znak

  If A > 0 Then    'czy był jakiś (> 0)?

    Print A        'jeśli tak to piszemy

  End If

Loop               'to będzie pętelka nieskończona

'Powyższy przykład dotyczy SPRZĘTOWEGO układu UART!

Przykład2:

$regfile = "80517.dat"

Open "COM2:" For Binary As #1   'otwórz kanał #1 jako COM2 w 80537

Dim St As Byte

St = Inkey(#1)                  'odczytaj klawisz przez COM2

If St > 0 Then

   Printbin #1 , St             'wyślij przez COM2

End If

Close #1


Funkcja INP()

Przeznaczenie:

Zwraca bajt odczytany z podanego adresu w przestrzeni adresowej zewnętrznej pamięci XRAM.

Składnia:

zmienna = INP( adres )

gdzie:

zmienna	dowolna zmienna typu Byte,
adres	adres w przestrzeni adresowej (0-&HFFFF) z którego odczytany zostanie bajt.

Opis:

Funkcja PEEK() potrafi odczytać tylko z wewnętrznej pamięci RAM. Aby mieć dostęp do dowolnej komórki pamięci XRAM należy użyć INP().

Uwaga! Funkcja działa tylko w systemach posiadających szynę danych i adresową.

Zobacz także: OUT, PEEK

Przykład:

Dim a As Byte

a = Inp(&H8000)    'odczytanie stanu szyny danych d0-d7

‘gdy na szynie adresowej jest wystawiony adres 8000h

Print a

End


Instrukcja INPUTBIN

Przeznaczenie:

Odczytuje dane przesyłane portem szeregowym.

Składnia:

INPUTBIN zmienna1 [, zmienna2]

INPUTBIN #kanał , zmienna1 [, zmienna2]

gdzie:

zmienna1	dowolna zmienna do której wpisane będą odebrane znaki,
zmienna2	opcjonalnie - następna zmienna (i dalsze) do której wpisane będą odebrane znaki,
kanał	numer kanału przy korzystaniu z programowego lub sprzętowego urządzenia UART.

Opis:

Przy odbieraniu znaków przez drugi sprzętowy UART należy podać numer wcześniej otwartego kanału.

Liczba odczytywanych bajtów jest określana na podstawie typu podanej zmiennej. Gdy jako parametr będzie użyta zmienna typu Byte, instrukcja odbierze jeden znak. Przy zmiennych typu Integer odczytane zostaną dwa znaki. To samo dotyczy zmiennych tablicowych, instrukcja INPUTBIN zakończy się dopiero gdy wszystkie elementy tablicy zostaną odebrane!

Uwaga! Instrukcja INPUTBIN nie kończy się gdy zostanie odebrany znak <CR> (kod 13), tylko gdy wszystkie bajty zostaną odebrane.

Zobacz także: PRINTBIN

Przykład:

Dim a As Byte, C As Integer

Inputbin a , c                       'oczekuje na 3 znaki

'Poniższy fragment jest dla kontrolerów 80517 i 80537

'posiadających dwa układy UART

Open "COM2:" For Binary As #1        'otwórz kanał i nadaj mu numer 1

Inputbin #1, a

Close #1

End


Instrukcja INPUTHEX

Przeznaczenie

Pozwala na wprowadzanie danych w zapisie szesnastkowym, za pomocą zewnętrznego terminala.

Składnia:

INPUTHEX ["tekst_zachęty" ] , zmienna1  [ , zmiennan ] [ NOECHO ] [ TIMEOUT = xx ]

gdzie:

tekst_zachęty	opcjonalnie - tekst pojawiający się w oknie terminala,
zmienna1 zmiennan	zmienna której przypisana zostanie odebrana wartość,
xx	opcjonalnie, czas opóżnienia.

Opis:

Instrukcja INPUTHEX może być używana gdy system mikroprocesorowy posiada interfejs RS-232, połączony z portem COM komputera osobistego. W ten sposób za pomocą programu emulatora terminala, mogą być wprowadzane dane z klawiatury. Środowisko BASCOM posiada wbudowany emulator terminala.

Podanie parametru NOECHO powoduje, że odczytywane znaki nie będą przesyłane z powrotem do terminala.

Jeśli podano dodatkowy parametr TIMEOUT należy podać czas po upłynięciu którego działanie instrukcji zostanie przerwane, jeśli nie zostaną wprowadzone znaki. Wpisanie zera powoduje oczekiwanie przez maksymalnie dostępny czas.

Do odmierzania czasu nie jest używany żaden z liczników. Natomiast są rezerwowane 4 bajty składające się na programowy licznik.

Uwaga! Jeśli podano parametr TIMEOUT to wszystkie instrukcje INPUT/INPUTHEX muszą posiadać tą opcję.

Należy uważać by podawać tylko liczby 0-9 i znaki A-F (lub a-f) używane w zapisie szesnastkowym. Ilość przyjmowanych znaków jest różna w zależności od podanej zmiennej. Jeśli zmienna jest typu Byte pod uwagę brane są tylko dwa znaki. Gdy zmienna jest typu Integer lub Word – 4 znaki, a typ Long przyjmuje 8 znaków.

Odebranie znaku <CR> (kod 13) kończy wprowadzanie danych dla bieżącej zmiennej.

Różnice w stosunku do QBasic-a.

W języku QBasic można podać przedrostek &H co spowoduje, że instrukcja INPUT rozpozna daną w zapisie szesnastkowym.

W języku BASCOM BASIC zaimplementowano w tym celu specjalną instrukcje: INPUTHEX.

Zobacz także: INPUT

Przykład:

Dim x As Byte

Inputhex "Podaj liczbę " , x         'wydrukuj tekst zachęty


Instrukcja INPUT

Przeznaczenie

Pozwala na wprowadzanie danych, za pomocą zewnętrznego terminala.

Składnia:

INPUT ["tekst_zachęty" ] , zmienna1  [ , zmiennan ] [ NOECHO ] [ TIMEOUT = xx ]

gdzie:

tekst_zachęty	opcjonalnie - tekst pojawiający się w oknie terminala,
zmienna1 zmiennan	zmienna której przypisana zostanie odebrana wartość.
xx	opcjonalnie, czas opóżnienia.

Opis:

Instrukcja INPUT może być używana gdy system mikroprocesorowy posiada interfejs RS-232, połączony z portem COM komputera osobistego. W ten sposób za pomocą programu emulatora terminala, mogą być wprowadzane dane z klawiatury. Środowisko BASCOM posiada wbudowany emulator terminala.

Podanie parametru NOECHO powoduje, że odczytywane znaki nie będą przesyłane z powrotem do terminala.

Jeśli podano dodatkowy parametr TIMEOUT należy podać czas po upłynięciu którego działanie instrukcji zostanie przerwane, jeśli nie zostaną wprowadzone znaki. Wpisanie zera powoduje oczekiwanie przez maksymalnie dostępny czas.

Do odmierzania czasu nie jest używany żaden z liczników. Natomiast są rezerwowane 4 bajty  składające się na programowy licznik.

Uwaga! Jeśli podano parametr TIMEOUT to wszystkie instrukcje INPUT/INPUTHEX muszą posiadać tą opcję.

Odebranie znaku <CR> (kod 13) kończy wprowadzanie danych dla bieżącej zmiennej.

Zobacz także: INPUTHEX, PRINT, $TIMEOUT

Przykład:

'--------------------------------------------------------------

'                 (c) 1997,1998 MCS Electronics

'--------------------------------------------------------------

'  plik: INPUT.BAS

'  demo: INPUT, INPUTHEX

'--------------------------------------------------------------

'Gdy używane będą inną szybkość pracy kontrolera i UART, zmień

'wartości w dyrektywach $BAUD =  i $CRYSTAL =

$baud = 1200                            'spróbujmy 1200 bodów

$crystal = 12000000                     '12 MHz

'---------------------------------------------------------------

'  Gdy wymagane jest w programie przerwanie instrukcji INPUT po określonym czasie

'  (gdy instrukcja nie odebrała żadnego znaku), wtedy można użyć parametru TIMEOUT.

'  Gdy znaki nie pojawią się w określonym czasie zmienna Err

'  będzie ustawiona inaczej Err będzie zerem.

'   WAŻNE: Parametr TIMEOUT używa 4 bajtów z pamięci RAM

'---------------------------------------------------------------

Dim V As Byte , B1 As Byte

Dim C As Integer , D As Byte

Dim S As String * 15                    'tylko dla uP z pamięcią XRAM

Input "Użyj tej konstrukcji by wypisać tekst zachęty " , V

Input B1                                'opuszczamy tekst zachęty

Input "Podaj liczbę typu Integer " , C

Print C

Inputhex "Podaj liczbę szesnastkową (4 bajty) " , C

Print C

Inputhex "Podaj liczbę szesnastkową (2 bajty) " , D

Print D

Input "Czekam na trzy dane " , C , D

Print C ; " " ; D

Input C Noecho                          'bez lokalnego echa

Input "Podaj swoje imię " , S

Print "Witaj " ; S

Input S Noecho                          'bez lokalnego echa

Print S

'Usuń komentarz z poniższych linii a wszystkie powyżej wstaw do komentarza.

'Jest to konieczne gdyż użycie gdziekolwiek parametru TIMEOUT

'musi dotyczyć wszystkich instrukcji INPUT

'Input "Imię " , S Timeout = 0

'Print Err ; " " ; s

End


Funkcja INSTR()

Przeznaczenie:

Zwraca pozycję szukanego ciągu znaków w podanym tekście.

Składnia:

zmienna = INSTR( start , tekst , szukany_ciąg )

zmienna = INSTR( tekst , szukany_ciąg )

gdzie:

zmienna	zmienna numeryczna, której przypisana będzie pozycja szukanego ciągu w przeszukiwanym tekście,
start	opcjonalny parametr określający znak w tekście od którego rozpoczęte zostaną poszukiwania; normalnie poszukiwania rozpoczynają się od początku tekstu,
tekst	przeszukiwany tekst,
szukany_ciąg	szukany ciąg znaków.

Opis:

Funkcja zwraca zero, gdy poszukiwany ciąg znaków nie występuje w podanym tekście.

Uwaga! Tekst w którym poszukiwany jest ciąg znaków nie może być stałą. Tylko szukany ciąg może być stałą znakową.

Zobacz także:

Przykład:

Dim S As String * 10 , Z As String * 5

Dim bP As Byte

s = "To jest test"

Z = "st"                             'szukamy st

bP = Instr(s,z) : Print bP           'powinno być 6

bP = Instr(7,s,z) : Print bP         'powinno być 11

End


Funkcja LCASE()

Przeznaczenie:

Zamienia wszystkie znaki z ciągu na ich odpowiedniki w zestawie małych liter.

Składnia:

zmienna = LCASE( ciąg )

gdzie:

zmienna	zmienna typu String, do której wpisany będzie wynik działania funkcji,
ciąg	ciąg którego znaki należy zamienić.

Opcje:

Funkcja nie rozpoznaje polskich znaków diakrytycznych.

Zobacz także: UCASE

Przykład:

Dim S As String * 12 , Z As String * 12

S = "Witaj świecie"

Z = Lcase(s)

Print Z

Z = Ucase(s)

Print Z

End


Instrukcja LCD

Przeznaczenie:

Pokazuje wartość zmiennej lub stałej na wyświetlaczu LCD.

Składnia:

LCD x

gdzie:

x	zmienna lub stała, która zostanie wyświetlona na wyświetlaczu LCD,

Opis:

Można wyświetlać więcej niż jedną zmienną lub stałą, oddzielając każdą z nich średnikiem:

LCD a ; b1 ; "stały tekst"

Instrukcja LCD zachowuje się podobnie jak instrukcja PRINT.

Zobacz także: LCDHEX , $LCD , CONFIG LCD

Przykład:

'--------------------------------------------------------------

'                 (c) 2000 MCS Electronics

'--------------------------------------------------------------

'  plik: LCD.BAS

'  demo: LCD, CLS, LOWERLINE, SHIFTLCD, SHIFTCURSOR, HOME

'        CURSOR, DISPLAY

'--------------------------------------------------------------

'Uwaga : Testowano z wyświetlaczem podłączonym za pomocą 4-bitów

Config Lcdpin = Pin , Db4 = P3.1 , Db5 = P3.2 , Db6 = P3.3 , Db7 = P3.4 , E = P3.5 , Rs = P3.6

Rem Używając tej instrukcji można zmienić domyślne ustawienia w opcjach kompilatora

Config Lcd = 16 * 2                  'ustawiamy typ wyświetlacza

'inne wartości: 16 * 4 , 20 * 4, 20 * 2 , 16 * 1a

'Nie umieszczenie tej instrukcji spowoduje że wybrany będzie wyświetlacz 16 * 2

'16 * 1a to wyświetlacz 2 linie po 8 znaków z liniowym odwzorowaniem pamięci

'$LCD = Podanie tej dyrektywy przełączy komunikację z LCD do trybu BUS (8-bitowy)

'       Można go użyć jeśli system jest wyposażony w zewnętrzną pamięć RAM lub ROM

'       Zwalnia to parę końcówek portów!

Dim A As Byte

Cls                                  'kasujemy LCD

Lcd "Witaj świecie."                   'wydrukujemy tekst w górnej linii

Wait 1

Lowerline                            'wybieramy drugą linię

Wait 1

Lcd "..... Przesuwamy ....."        'wydrukujemy to w drugiej linii

Wait 1

For A = 1 To 10

   Shiftlcd Right                    'przesuniemy tekst w prawo

   Wait 1                            'czekamy aż wykona

Next

For A = 1 To 10

   Shiftlcd Left                     'przesuniemy tekst w lewo

   Wait 1                            'czekamy aż wykona

Next

Locate 2 , 1                         'ustawiamy pozycje kursora

Lcd "*"                              'wydrukujemy to

Wait 1                               'czekamy aż wykona

Shiftcursor Right                    'przesuniemy kursor w prawo

Lcd "@"                              'drukujemy to

Wait 1                               'czekamy aż wykona

Home Upper                           'wybieramy 1 linię i wracamy na początek

Lcd "Zamieniono"                     'zastępujemy tekst

Wait 1                               'czekamy

Cursor Off Noblink                   'chowamy kursor

Wait 1                               'czekamy

Cursor On Blink                      'pokazujemy kursor

Wait 1                               'czekamy

Display Off                          'wyłączamy wyświetlacz

Wait 1                               'czekamy

Display On                           'i włączamy z powrotem

'----------NOWOŚĆ! Obsługa czteroliniowych wyświetlaczy------

Thirdline

Lcd "Linia 3"

Fourthline

Lcd "Linia 4"

Home Third                           'wracamy na początek trzeciej linii

Home Fourth

Home F                               'skróty też działają

Locate 4 , 1 : Lcd "Linia 4"

Wait 1

'Teraz zdefiniujemy znak użytkownika

'pierwszy bajt to kod znaku (0-7)

'reszta to postać znaku

'Użyj narzędzia LCD Designer

Deflcdchar 1 , 225 , 227 , 226 , 226 , 226 , 242 , 234 , 228

Deflcdchar 0 , 240 , 224 , 224 , 255 , 254 , 252 , 248 , 240

Cls                                  'wybieramy Data RAM

Rem Jest szczególnie ważne by po zdefiniowaniu znaków wykonać instrukcję

Rem CLS, ponieważ przełączy to kontroler wyświetlacza na Data RAM

Lcd Chr(0) ; Chr(1)                  'drukujemy zdefiniowane znaki

'---------- Teraz użyjemy wewnętrznej procedury ------------

Acc = 1                           'dana do rejestru ACC

Call WRITE_LCD                    'wyświetlamy

End


Instrukcja LCDINIT

Przeznaczenie:

Inicjalizuje wyświetlacz LCD.

Składnia:

LCDINIT

Opis:

Inicjalizacja wyświetlacza LCD jest przeprowadzana podczas startu systemu, gdy program korzysta z wyświetlacza LCD.

Instrukcja LCD bazuje na tym, że końcówka WR wyświetlacza jest połączona z masą. Jeśli w projektowanym systemie, końcówka WR jest także połączona z mikrokontrolerem, to gdy będzie ona w stanie wysokim podczas inicjalizacji, wyświetlacz nie zostanie przeprogramowany poprawnie.

Instrukcja LCDINIT pozwala na inicjalizację wyświetlacza po ustawieniu końcówki połączonej z wyprowadzeniem WR, w stan niski.

Zobacz także: LCD , LCDHEX , $LCD , CONFIG LCD

Przykład:

'--------------------------------------------------------------

'                 (c) 2000 MCS Electronics

'--------------------------------------------------------------

'  plik: LCD.BAS

'  demo: LCD, CLS, LOWERLINE, SHIFTLCD, SHIFTCURSOR, HOME

'        CURSOR, DISPLAY

'--------------------------------------------------------------

Config Lcdpin = Pin , Db4 = P3.1 , Db5 = P3.2 , Db6 = P3.3 , Db7 = P3.4 , E = P3.5 , Rs = P3.6

Rem Używając tej instrukcji można zmienić domyślne ustawienia w opcjach kompilatora

Config Lcd = 16 * 2                  'ustawiamy typ wyświetlacza

'inne wartości: 16 * 4 , 20 * 4, 20 * 2 , 16 * 1a

'Nie umieszczenie tej instrukcji spowoduje że wybrany będzie wyświetlacz 16 * 2

'16 * 1a to wyświetlacz 2 linie po 8 znaków z liniowym odwzorowaniem pamięci

'$LCD = Podanie tej dyrektywy przełączy komunikację z LCD do trybu BUS (8-bitowy)

'       Można go użyć jeśli system jest wyposażony w zewnętrzną pamięć RAM lub ROM

'       Zwalnia to parę końcówek portów!

Dim A As Byte

'---- te dwie linie mogą być pomocne jeśli WR jest podłączony na przykład do P1.0 ---

P1.0 = 0

Initlcd

'-----------------------------------------------------------------------------------------

Cls                                  'kasujemy LCD

Lcd "Witaj świecie."                   'wydrukujemy tekst w górnej linii

Wait 1

Lowerline                            'wybieramy drugą linię

Wait 1

Lcd "..... Przesuwamy ....."        'wydrukujemy to w drugiej linii

Wait 1

For A = 1 To 10

   Shiftlcd Right                    'przesuniemy tekst w prawo

   Wait 1                            'czekamy aż wykona

Next


Instrukcja LCDHEX

Przeznaczenie:

Pokazuje wartość zmiennej lub stałej w formacie szesnastkowym na wyświetlaczu LCD.

Składnia:

LCDHEX x

gdzie:

x	zmienna lub stała numeryczna, która zostanie wyświetlona na wyświetlaczu LCD,

Opis:

Można wyświetlać więcej niż jedną zmienną lub stałą, oddzielając każdą z nich średnikiem:

Lcdhex a ; b1 ; 10

Instrukcja LCDHEX zachowuje się podobnie jak instrukcja PRINTHEX.

Zobacz także: LCD , $LCD , CONFIG LCD

Przykład:

Dim a As Byte

a = 255

Lcd a

Lowerline

Lcdhex a

End


Funkcja LEFT()

Przeznaczenie:

Zwraca określoną liczbę znaków z tekstu począwszy od lewej strony.

Składnia:

zmienna = LEFT( tekst , il_znaków )

gdzie

zmienna	zmienna tekstowa, do której przepisane będą skopiowane znaki,
tekst	tekst z którego skopiowane będą znaki,
il_znaków	ilość kopiowanych znaków.

Opis:

Zobacz także: RIGHT , MID

Przykład:

Dim s As XRAM String * 15, z As String * 15

s = "ABCDEFG"

z = Left(s , 5)

Print z                 'wydrukuje ABCDE

End


Funkcja LEN()

Przeznaczenie:

Zwraca liczbę znaków znajdujących się w zmiennej tekstowej.

Składnia:

zmienna = LEN( tekst )

gdzie

zmienna	zmienna numeryczna, do której wpisana będzie długość tekstu,
tekst	zmienna tekstowa której długość będzie obliczona.

Opis:

Ciągi znaków w języku BASCOM BASIC mogą mieć długość do 254 znaków.

Przykład:

Dim S As String * 12

Dim A As Byte

S = "test"

A = Len(s)

Print A               'wydrukuje 4

Print Len(s)


Instrukcja LOAD

Przeznaczenie:

Powoduje wpisanie wartości do rejestru odpowiedzialnego za automatyczne przeładowanie licznika.

Składnia:

LOAD licznik , wartość

gdzie

licznik	nazwa licznika; może być: TIMER0, TIMER1 lub TIMER2,
wartość	liczba potrzebnych impulsów.

Opis:

Licznik TIMER0/TIMER1 pracujący w trybie 2, umożliwia załadowanie rejestru THx wartością, która po przepełnieniu licznika zostaje automatycznie wpisana do licznika (rejestru TLx). Podana ilość impulsów może być z zakresu 1-255.

Przed załadowaniem wartości do licznika, instrukcja dokonuje niezbędnego przeliczenia w postaci: 256-wartość. Tak więc instrukcja:

Load Timer0, 10

spowoduje, że do licznika trafi liczba 246, więc licznik przepełni się właśnie po 10 impulsach.

Uwaga! Instrukcja LOAD wpisuje do rejestrów THx i TLx taką samą wartość.

Licznik TIMER2 pracuje jako 16 bitowy więc, przeliczenie jest wykonywane w postaci 65536-wartość. Dla tego licznika możliwa ilość impulsów to 1-65535. Jest ona wpisywana do pary rejestrów RCAP2L i RCAP2H.

Instrukcja LOAD nie jest przeznaczona do wpisywania wartości do rejestrów przechowujących zliczoną wartość w innych trybach pracy liczników. W celu modyfikacji tych rejestrów przeznaczono specjalne zmienne COUNTERx.

Przykład:

Load Timer0, 100       'odliczaj po 100 impulsów

wygeneruje kod:

Mov tl0,#h'9C

Mov th0,#h'9C

Load Timer2, 1000

wygeneruje kod:

Mov RCAP2L,#24

Mov RCAP2H,#252


Instrukcja LOCATE

Przeznaczenie:

Przesuwa kursor wyświetlacza LCD na określoną pozycję.

Składnia:

LOCATE y , x

gdzie

x	pozycja kursora w linii; można podać pozycję z zakresu od 1 do 64  - zależnie od posiadanego wyświetlacza,
y	numer linii wyświetlacza; może być z zakresu 1 - 4 – zależnie od typu używanego wyświetlacza.

Opis:

Zobacz także:  CONFIG LCD , LCD , HOME , CLS

Przykład:

Lcd "Czesc"

Locate 1,10

Lcd "*"


Funkcja LOOKUP()

Przeznaczenie:

Zwraca wartość wybranego elementu w liniach DATA.

Składnia:

zmienna = LOOKUP( nr_elementu , etykieta )

gdzie

zmienna	zmienna, której przypisana będzie wartość podanego elementu,
nr_elementu	numer elementu,
etykieta	etykieta określająca adres danych umieszczonych w liniach DATA.

Opis:

Elementy są numerowane od zera. Numer elementu nie może być większy niż 65535.

Różnice w stosunku do BASCOM LT.

W BASCOM LT, funkcja LOOKUP działa tylko z danymi typu Byte. W BASCOM-8051, można używać funkcji do przeszukiwania danych typu Integer, Word, Long oraz Single.

Zobacz także: LOOKUPSTR

Przykład:

Dim b1 As Byte ,  I As Integer

b1 = Lookup(1, DTA)

Print b1                      'wydrukuje 2 (elementy liczone od zera)

I = Lookup(0, DTA2)

End

DTA:

 Data 1 , 2 , 3 , 4 , 5

DTA2:                         'dane typu Integer

 Data 1000% , 2000%


Funkcja LOOKUPSTR()

Przeznaczenie:

Zwraca wartość wybranego tekstu umieszczonego w liniach DATA.

Składnia:

zmienna = LOOKUPSTR( nr_elementu , etykieta [, język , długość ] )

gdzie

zmienna	zmienna typu String, której przypisana będzie wartość podanego elementu,
nr_elementu	numer elementu,
etykieta	etykieta określająca adres danych umieszczonych w liniach DATA,
język	parametr opcjonalny zawierający kod języka. Języki są numerowane od zera,
długość	długość danych dla każdego języka.

Opis:

Elementy są numerowane od zera. Numer elementu nie może być większy niż 255.

Zobacz także: LOOKUP

Przykład:

Dim s As String, idx As Byte

idx = 3 : s = Lookupstr(idx, Sdata)

Print s                              'wydrukuje 'tylko'

End

Sdata:

  Data "To" , "jest" ,"tylko" ,"test"

Przykład2:

Dim S As As String * 8 , Idx As Byte , Language As Byte

Idx = 0 : Language = 1

S = Lookupstr(idx , Sdata , Language , 21)

Print S                                    'wydrukuje 'Dit '

End

Sdata:

  Data "To  " , "jest" , "tylko test"      'każda wersja językowa musi mieć tą sama długość ciągów

  Data "Dit " , "is  " , "een test  "      'długość jest podana jako 21 gdyż każdy ciąg kończy się znakiem #0


Funkcja LOW()

Przeznaczenie:

Zwraca młodszą cześć (bajt MSB) podanej zmiennej.

Składnia:

rezultat = LOW( zmienna )

gdzie:

rezultat	zmienna do której zapisana będzie młodszy bajt zmiennej,
zmienna	zmienna której młodsza część ma być określona.

Opis:

Zobacz także: LOWW , HIGH , HIGHW

Przykład:

Dim I As Integer , Z As Byte

I = &H1001

Z = Low(I)          'zwróci 1

Printhex Z


Funkcja LOWW()

Przeznaczenie:

Zwraca młodszą cześć (słowo MSB) podanej zmiennej typu Long.

Składnia:

rezultat = LOWW( zmienna )

gdzie:

rezultat	zmienna do której zapisana będzie młodszy bajt zmiennej,
zmienna	zmienna której młodsza część ma być określona.

Opis:

Zobacz także: LOW , HIGH , HIGHW

Przykład:

Dim I As Long , Z As Word

I = &HFEDCBA98

Z = Loww(I)          'zwróci 47768 (w hex: 0BA98h)

Printhex Z


Instrukcja LOWERLINE

Przeznaczenie:

Ustawia kursor wyświetlacza LCD w drugiej linii.

Składnia:

LOWERLINE

Opis:

Instrukcja ustawia kursor wyświetlacza na początek dolnej linii (wyświetlacze 2 liniowe) lub w drugiej linii (wyświetlacze 4 liniowe).

Zobacz także:  HOME , UPPERLINE , THIRDLINE , FOURTHLINE , LOCATE

Przykład:

$config Lcd = 16 * 2

Dim a As Byte

a = 255

Lcd a

Lowerline

Lcd a

End


Funkcja MAKEBCD()

Przeznaczenie:

Dokonuje konwersji liczby na format BCD.

Składnia:

zmienna1 = MAKEBCD( zmienna2 )

gdzie:

zmienna1	zmienna, do której zapisany będzie rezultat działania funkcji,
zmienna2	zmienna zawierająca liczbę dziesiętną.

Opis:

Większość zegarów czasu rzeczywistego (np. PCF8535) korzysta z formatu BCD. Dlatego podczas ustawiania jego rejestrów należy najpierw przekształcić daną dziesiętna na BCD.

Aby wydrukować liczbę w formacie BCD najlepiej użyć funkcji BCD(), która powoduje przekształcenie jej wartości na postać tekstu.

Zobacz także: MAKEDEC , BCD

Przykład:

Dim a As Byte

a = 65

Lcd a

Lowerline

Lcd Bcd(a)

a = Makebcd(a)

Lcd "   " ; a

End


Funkcja MAKEDEC()

Przeznaczenie:

Dokonuje konwersji liczby w formacie BCD na jej postać dziesiętną.

Składnia:

zmienna1 = MAKEDEC( zmienna2 )

gdzie:

zmienna1	zmienna, do której zapisany będzie rezultat działania funkcji,
zmienna2	zmienna zawierająca liczbę w formacie BCD.

Opis:

W niektórych przypadkach wymagana jest konwersja odwrotna: z formatu BCD na postać dziesiętną. Jest to szczególnie użyteczne przy sterowaniu dekoderów wyświetlaczy 7-segmentowych, czy odczytywaniu danych z rejestrów zegarów RTC.

Zobacz także: MAKEBCD

Przykład:

Dim a As Byte

a = 65

Lcd a

Lowerline

Lcd Bcd(a)

a = Makedec(a)

Lcd "   "  ; a

End


Funkcja MAKEINT()

Przeznaczenie:

Łączy dwa bajty w zmienną typu Integer lub Word.

Składnia:

zmienna = MAKEINT( część_LSB , część_MSB )

gdzie:

zmienna	zmienna, do której zapisany będzie rezultat działania funkcji,
część_LSB	bajt stający się częścią LSB zmiennej wynikowej,
część_MSB	bajt stający się częścią MSB zmiennej wynikowej.

Opis:

Funkcja ta odpowiada następującej operacji matematycznej: zmienna = (256 * część_MSB) + część_LSB.

Uwaga! Jeśli część MSB będzie większa od 128, to powstała liczba przypisana zmiennej typu Integer będzie ujemna.

Zobacz także: LOW , HIGH

Przykład:

Dim a As Integer, I As Integer

a = 2

I = Makeint(a , 1)                   'I = (1 * 256) + 2  = 258

End


Funkcja MAX()

Przeznaczenie:

Zwraca największą wartość znaleziona w tablicy z elementami typu Word.

Składnia:

zmienna1 = MAX( zmienna2 )

MAX( tablica(1) , max , indeks )

gdzie:

zmienna1	zmienna, do której zapisana będzie odnaleziona maksymalna wartość,
zmienna2	adres pierwszego elementu tablicy,
tablica	nazwa zmiennej tablicowej,
max	zmienna do której wpisana będzie odnaleziona maksymalna wartość,
indeks	numer elementu tablicy gdzie odnaleziono maksymalną wartość.

Opis:

Funkcja MAX występuje w dwóch formach. Pierwsza z nich odnajduje tylko samą maksymalną wartość i działa jak normalna funkcja. Drugi format pozwala oprócz odnalezienia maksymalnej wartości, określenie w której komórce tablicy się ona znajduje.

Uwaga! Na razie funkcja obsługuje tylko dane typu Byte.

Jeśli wartość maksymalna nie występuje (np. gdy elementy tablicy są sobie równe) funkcja zwraca indeks równy 0.

Zobacz także: MIN , AVG

Przykład:

'------------------------------------------------------------------

'                       (c) 2001-2002 MCS

'                           minmax.bas

' Przykład ten pokazuje działanie funkcji MIN i MAX

' Funkcje te działają tylko dla tablic złożonych z typu Byte!!!!!

'------------------------------------------------------------------

'Określamy zmienne

Dim Wb As Word , B As Byte

Dim W(10) As Word

'wypełniamy tablicę wartościami od 1 do 10

For B = 1 To 10

  W(b) = B

Next

Print "Max liczba " ; Max(w(1))

Print "Min liczba " ; Min(w(1))

End


Funkcja MID()

Przeznaczenie:

Funkcja MID() zwraca określony fragment tekstu.

Składnia:

zmienna = MID( tekst , start [, ilość] )

gdzie:

zmienna	zmienna, do której zapisany będzie rezultat działania funkcji,
tekst	tekst którego fragment będzie zwrócony,
start	pozycja w tekście od której tekst będzie zwrócony,
ilość	parametr opcjonalny - ilość zwracanych znaków.

Opis:

Gdy nie jest podana ilość znaków, funkcja zwraca wszystkie znaki od pozycji startowej do końca tekstu.

Zobacz także: LEFT , RIGHT , MID

Przykład:

Dim s As XRAM String * 15, z As XRAM String * 15

s = "ABCDEFG"

z = Mid(s, 2, 3)

Print z                'BCD

z="12345"

Mid(s, 2, 2) = z

Print s                'A12DEFG

End


Instrukcja MID

Przeznaczenie:

Instrukcja MID zamienia określoną część tekstu.

Składnia:

MID( tekst , start [, ilość] ) = zmienna

gdzie:

zmienna	zmienna zawierająca wstawiany ciąg,
tekst	tekst na którym przeprowadzone będą operacje,
start	pozycja w tekście od której ma być wstawiony ciąg,
ilość	parametr opcjonalny, ilość wstawianych znaków.

Opis:

Gdy nie jest podana ilość znaków, instrukcja wstawia wszystkie znaki znajdujące się w zmiennej.

Zobacz także: LEFT , RIGHT , MID()

Przykład:

Dim s As XRAM String * 15, z As XRAM String * 15

s = "ABCDEFG"

z = Mid(s, 2, 3)

Print z                'BCD

z = "12345"

Mid(s, 2, 2) = z

Print s                'A12DEFG

End


Funkcja MIN()

Przeznaczenie:

Zwraca najmniejszą wartość znalezioną w tablicy z elementami typu Word.

Składnia:

zmienna1 = MIN( zmienna2 )

MIN( tablica(1) , min , indeks )

gdzie:

zmienna1	zmienna, do której zapisana będzie odnaleziona minimalna wartość,
zmienna2	adres pierwszego elementu tablicy,
tablica	nazwa zmiennej tablicowej,
max	zmienna do której wpisana będzie odnaleziona minimalna wartość,
indeks	numer elementu tablicy gdzie odnaleziono minimalną wartość.

Opis:

Funkcja MIN występuje w dwóch formach. Pierwsza z nich odnajduje tylko samą maksymalną wartość i działa jak normalna funkcja. Drugi format pozwala oprócz odnalezienia maksymalnej wartości, określenie w której komórce tablicy się ona znajduje.

Jeśli wartość minimalna nie występuje (np. gdy elementy tablicy są sobie równe) funkcja zwraca indeks równy 0.

Uwaga! Na razie funkcja obsługuje tylko dane typu Byte.

Zobacz także: MAX , AVG

Przykład:

'------------------------------------------------------------------

'                       (c) 2001-2002 MCS

'                           minmax.bas

' Przykład ten pokazuje działanie funkcji MIN i MAX

' Funkcje te działają tylko dla tablic złożonych z typu Byte!!!!!

'------------------------------------------------------------------

'Określamy zmienne

Dim Wb As Word , B As Byte

Dim W(10) As Word

'wypełniamy tablicę wartościami od 1 do 10

For B = 1 To 10

  W(b) = B

Next

Print "Max liczba " ; Max(w(1))

Print "Min liczba " ; Min(w(1))

End


Instrukcja MWINIT

Przeznaczenie:

Inicjalizuje stan końcówek używanych do transmisji przez magistralę Microwire.

Składnia:

MWINIT

Zobacz także: CONFIG MICROWIRE , MWREAD , MWWRITE , MWWOPCODE


Instrukcja MWREAD

Przeznaczenie:

Odczytuje wartość przesyłaną magistralą Microwire.

Składnia:

MWREAD zmienna , kod_op , adres , l_bajtów

gdzie:

zmienna	zmienna, do której wpisana będzie odczytana wartość,
kod_op	kod operacji,
adres	adres urządzenia,
l_bajtów	liczba odczytanych bajtów.

Opis:

Zobacz także: CONFIG MICROWIRE , MWINIT , MWWRITE , MWWOPCODE

Przykład:

'-----------------------------------------------------------------

'                    MicroWire – program testowy

' Przeczytaj proszę specyfikację magistrali Microwire by zrozumieć program

'-----------------------------------------------------------------

'CS   - wybór układu CS

'DIN  - linia DI

'DOUT – linia DO

'CLOCK- zegar CLK

'AL   - liczba linii adresowych:

'                93C46    93C56    93C57    93C66

'----------------------------------------------------------------------------

' Bity danych:   8  16    8  16    8  16    8  16

' AL         :   7   6    9   8    8   7    9   8

'Można połączyć razem linie DIN oraz DOUT

'Używamy 93C46 w trybie bajtowym więc AL jest równe 7

Config Microwire = Pin , Cs = P1.1 , Din = P1.2 , Dout = P1.4 , Clock = P1.5 , Al = 7

'inicjalizacja końcówek

Mwinit

'zadeklarujemy zmienne

Dim X As Byte

'włączymy możliwość zapisu do eeprom

'wyślemy bit startu, kod operacji (00) i 11 + adres

'MWWOPCODE kod_op, liczba_bitów

Mwwopcode &B1001100000 , 10

'Mwwopcode może wysyłać rozkazy(kod_op) dla urządzenia

X = 10

'Zapis wartości zmiennej X pod adres 0

'kod_op równy 01

'wpisujemy 1 bajt

'MWWRITE zmienna, kod_op, adres, liczba_bajtów

Mwwrite X , &B101 , 0 , 1

Waitms 10

X = 0

'odczytamy teraz wartość z powrotem

'MWREAD zmienna, kod_op, adres, liczba_bajtów

Mwread X , &B110 , 0 , 1

'blokada zapisu

'wyślij bit startu, kod operacji (00) oraz 00 + adres

Mwwopcode &B1000000000 , 10

End


Instrukcja MWWOPCODE

Przeznaczenie:

Przesyła kod rozkazu dla urządzenia Microwire.

Składnia:

MWWOPCODE kod_op , l_bitów

gdzie:

kod_op	kod operacji,
l_bajtów	liczba przesyłanych bitów w kodzie operacji.

Opis:

Zanim możliwe będzie wykonywanie operacji z wykorzystaniem urządzenia Microwire, musi być do niego przesłany odpowiedni kod. Dla przykładu zapis do pamięci EEPROM musi być wcześniej włączony.

Zobacz także: CONFIG MICROWIRE , MWINIT , MWREAD , MWRITE

Przykład:

'-----------------------------------------------------------------

'                    MicroWire – program testowy

' Przeczytaj proszę specyfikację magistrali Microwire by zrozumieć program

'-----------------------------------------------------------------

'CS   - wybór układu CS

'DIN  - linia DI

'DOUT – linia DO

'CLOCK- zegar CLK

'AL   - liczba linii adresowych:

'                93C46    93C56    93C57    93C66

'----------------------------------------------------------------------------

' Bity danych:   8  16    8  16    8  16    8  16

' AL         :   7   6    9   8    8   7    9   8

'Można połączyć razem linie DIN oraz DOUT

'Używamy 93C46 w trybie bajtowym więc AL jest równe 7

Config Microwire = Pin , Cs = P1.1 , Din = P1.2 , Dout = P1.4 , Clock = P1.5 , Al = 7

'inicjalizacja końcówek

Mwinit

'zadeklarujemy zmienne

Dim X As Byte

'włączymy możliwość zapisu do eeprom

'wyślemy bit startu, kod operacji (00) i 11 + adres

'MWWOPCODE kod_op, liczba_bitów

Mwwopcode &B1001100000 , 10

'Mwwopcode może wysyłać rozkazy(kod_op) dla urządzenia

'odczytamy teraz wartość z powrotem

'MWREAD zmienna, kod_op, adres, liczba_bajtów

Mwread X , &B110 , 0 , 1

'blokada zapisu

'wyślij bit startu, kod operacji (00) oraz 00 + adres

Mwwopcode &B1000000000 , 10

End


Instrukcja MWWRITE

Przeznaczenie:

Zapisuje wartość przesyłaną magistralą Microwire.

Składnia:

MWWRITE zmienna , kod_op , adres , l_bajtów

gdzie:

zmienna	zmienna, z której pobrana będzie wartość przeznaczona do zapisania,
kod_op	kod operacji,
adres	adres urządzenia,
l_bajtów	liczba zapisywanych bajtów.

Opis:

Zobacz także: CONFIG MICROWIRE , MWINIT , MWREAD , MWWOPCODE

Przykład:

'-----------------------------------------------------------------

'                    MicroWire – program testowy

' Przeczytaj proszę specyfikację magistrali Microwire by zrozumieć program

'-----------------------------------------------------------------

'CS   - wybór układu CS

'DIN  - linia DI

'DOUT – linia DO

'CLOCK- zegar CLK

'AL   - liczba linii adresowych:

'                93C46    93C56    93C57    93C66

'----------------------------------------------------------------------------

' Bity danych:   8  16    8  16    8  16    8  16

' AL         :   7   6    9   8    8   7    9   8

'Można połączyć razem linie DIN oraz DOUT

'Używamy 93C46 w trybie bajtowym więc AL jest równe 7

Config Microwire = Pin , Cs = P1.1 , Din = P1.2 , Dout = P1.4 , Clock = P1.5 , Al = 7

'inicjalizacja końcówek

Mwinit

'zadeklarujemy zmienne

Dim X As Byte

'włączymy możliwość zapisu do eeprom

'wyślemy bit startu, kod operacji (00) i 11 + adres

'MWWOPCODE kod_op, liczba_bitów

Mwwopcode &B1001100000 , 10

'Mwwopcode może wysyłać rozkazy(kod_op) dla urządzenia

X = 10

'Zapis wartości zmiennej X pod adres 0

'kod_op równy 01

'wpisujemy 1 bajt

'MWWRITE zmienna, kod_op, adres, liczba_bajtów

Mwwrite X , &B101 , 0 , 1

Waitms 10

X = 0

'odczytamy teraz wartość z powrotem

'MWREAD zmienna, kod_op, adres, liczba_bajtów

Mwread X , &B110 , 0 , 1

'blokada zapisu

'wyślij bit startu, kod operacji (00) oraz 00 + adres

Mwwopcode &B1000000000 , 10

End


Instrukcja ON INTERRUPT

Przeznaczenie:

Wykonuje skok do podprogramu gdy wystąpiło określone przerwanie.

Składnia:

ON źródło_przerwania  nazwa_podprogramu [ NOSAVE ]

gdzie:

źródło_przerwania	symboliczna nazwa źródła przerwania,
nazwa_podprogramu	etykieta określająca gdzie znajduje się podprogram obsługi przerwania.

Opis:

Gdy wystąpi określone przerwanie – określone symbolicznie po słowie ON – instrukcja skacze do podanego podprogramu.

Język BASCOM BASIC rozpoznaje następujące źródła przerwania:

INT0	przerwanie zewnętrzne końcówka INT0
INT1	przerwanie zewnętrzne końcówka INT1
TIMER0	przerwanie przepełnienia licznika TIMER0
TIMER1	przerwanie przepełnienia licznika TIMER1
TIMER2	przerwanie przepełnienia licznika TIMER2 (Tylko niektóre kontrolery !)
SERIAL	przerwanie układu UART
Ilość i źródła przerwań są ściśle związane z budową użytego procesora. Nazwy możliwych przerwań można znaleźć w pliku rejestrów wybranego procesora.

Procedura obsługi musi się kończyć instrukcją RETURN, co spowoduje, że na końcu procedury zostanie umieszczona instrukcja maszynowa RETI.

Instrukcja RETURN może występować w kilku miejscach podprogramu. W przypadku podprogramów obsługi przerwań tylko pierwsza instrukcja RETURN zostanie przetłumaczona na sekwencję powrotu z przerwania (tj. odtworzenie stanu rejestrów i wykonanie RETI). Przy czym nie może ona występować w połączeniu z instrukcja warunkową. Wszystkie dalsze instrukcje RETURN zostaną skompilowane do zwykłego RET.

Uwaga! Nie można używać licznika TIMER1 do generowania przerwań, jeśli w programie występują instrukcje korzystające z układu UART – np. instrukcja PRINT. Jest to spowodowane tym, że licznik TIMER1 jest używany jako generator szybkości transmisji.

Gdy używane są przerwania INT0 lub INT1, można określić warunek zgłoszenia tego przerwania. Należy w tym celu użyć instrukcji SET / RESET i ustawić odpowiednie bity w rejestrze TCON:

Set TCON.0    ;wyzwalanie INT0 za pomocą opadającego zbocza

Reset TCON.0  ;wyzwalanie INT0 za pomocą stanu niskiego

Set TCON.2    ;wyzwalanie INT1 za pomocą opadającego zbocza

Reset TCON.2  ;wyzwalanie INT1 za pomocą stanu niskiego

Podanie parametru NOSAVE spowoduje, że zawartość rejestrów nie będzie zapamiętana przed wejściem do procedury przerwania i odtworzona na jej końcu. Dlatego też należy zapewnić by zawartość rejestrów została zapamiętana i otworzona.

Zrozumieć przerwania

By przybliżyć idee działania przerwań, można sobie wyobrazić następującą sytuację: W dość dużym domu z ogrodem jest zatrudniona osoba zajmująca się pracą w ogrodzie jak i w roli kamerdynera. Kamerdyner gdy nie ma co robić strzyże żywopłot. Gdy ktokolwiek zadzwoni do drzwi frontowych obowiązkiem kamerdynera jest zostawienie nożyc w ogrodzie, zrzucenie ubrania roboczego i przystąpienie do obowiązków przyjmowania gości.

Gdy wszystkie grzeczności zostaną już zakończone, kamerdyner znów wraca do miejsca w którym przerwał pracę ogrodnika i zostawił nożyce.

W powyższym przykładzie (przytoczonym przez tłumacza) źródłem przerwania jest dzwonek u drzwi, a procedurą obsługi są wszystkie działania kamerdynera począwszy od usłyszenia dzwonka, a skończywszy na powrocie do pracy ogrodnika.

W przełożeniu na język BASCOM BASIC, wygenerowanie sygnału przerwania spowoduje wstrzymanie działania programu głównego, gdyż procesor przechodzi do wykonywania procedury obsługi przerwania. Po zakończeniu procedury procesor wraca do miejsca w którym zatrzymał program główny. Można na przykład stworzyć pustą pętlę DO..LOOP, która będzie przerywana, gdy na określonej końcówce pojawi się stan niski.

Najlepszym przykładem wykorzystania przerwań jest program zegara. Można zaprogramować któryś z liczników, by co 10ms generował przerwanie. Procedura jego obsługi będzie zliczać te impulsy. Naliczenie 100 impulsów oznacza, że upłynęła właśnie jedna sekunda i trzeba licznik sekund zwiększyć. Gdy przepełni się licznik sekund (>59), zwiększany będzie licznik minut, itd.

Program główny będzie się zajmował tylko obsługą klawiatury i wyświetlacza, nie zważając na to co robi procedura przerwania.

Używanie przerwań w języku BASCOM BASIC.

By używać przerwań we własnych programach należy obowiązkowo włączyć globalny system przerwań instrukcją ENABLE INTERRUPTS, oraz włączyć odpowiednie źródło przerwania. Na przykład:

Enable Timer0

spowoduje, że będą generowane przerwania przepełnienia licznika TIMER0.

Instrukcją DISABLE można wyłączyć system przerwań jak i poszczególne ich źródła.

Gdy procesor stwierdzi, że wystąpiło przerwanie, skacze pod ustalony adres, umieszczony na początku pamięci. Adresy te i powiązane z nimi źródła przerwań są zdefiniowane przez projektantów z procesora. Przeglądając pliki .DAT można dowiedzieć się, o które adresy dokładnie chodzi.

Normalnie pod tymi adresami kompilator BASCOM BASIC umieszcza instrukcje RETI, więc po wygenerowaniu przerwania, nic się nie dzieje i procesor natychmiast wraca do programu głównego.

Gdy jednak w programie umieszczona będzie instrukcja ON INTERRUPT, wtedy pod odpowiednim adresem procedury obsługi przerwania zostanie umieszczony skok do podprogramu, którego adres określa podana etykieta.

Przed wykonaniem jednak zawartego pod podaną etykietą kodu, zostanie zapamiętana zawartość niektórych rejestrów (Prawdopodobnie ACC, PSW i rejestrów użytkowych przyp. tłumacza). Zostaną one później przed wykonaniem właściwej instrukcji RETURN odtworzone. Chodzi o to, by po powrocie z przerwania stan procesora był dokładnie taki sam jak tuż przed wystąpieniem przerwania. Inaczej mogłoby dojść do zakłóceń w działaniu programu głównego. Zakończyło by się to pewnie – w żargonie programistów - “pójściem w maliny” programu.

W procesorach z rodziny MCS-51 jest możliwe ustawienie priorytetu źródeł przerwań. Standardowo priorytet jest ustawiany według adresów programów obsługi. Dlatego przerwania o mniejszym adresie programu obsługi stoją wyżej w hierarchii (mają wyższy priorytet)!

Można to zmienić ustawiając odpowiednie bity w rejestrze IP (Interrupt Priority) lub prościej za pomocą instrukcji PRIORITY. Jedynka na określonym bicie ustawia wyższy priorytet. Gdy dwa źródła przerwań mają ustawiony wysoki priorytet, najpierw wykonane zostanie przerwanie o mniejszym adresie.

Zobacz także: ENABLE , DISABLE , PRIORITY

Przykład:

Enable Interrupts

Enable Int0                'włączenie przerwania

On Int0 Label2 Nosave      'nastąpi skok do Label2 gdy wystąpi przerwanie

Do                         'nieskończona pętla

Loop

End

Label2:

 Dim a As Byte

 If a > 1 Then

   Return                  'zastąpione będzie przez RET, gdyż

                           'jest powiązanie z instrukcja IF

 End if

 Return                    'zostanie przetłumaczone na RETI, gdyż

                           'jest to pierwsza instrukcja RETURN

 Return                    'zostanie przetłumaczone na RET, gdyż

                           'jest to następna instrukcja RETURN


Instrukcja ON VALUE

Przeznaczenie:

Wykonuje skok do jednej z podanych etykiet, w zależności od zawartości zmiennej.

Składnia:

ON zmienna [ GOTO | GOSUB ] etykieta1 [, etykietaN ]

gdzie:

zmienna	testowana zmienna,
etykieta1, etykietaN	etykieta lub lista etykiet określająca miejsca skoków.

Opis:

Jako zmienna można podać także któryś z rejestrów specjalnych np.: P1.

Uwaga! Skok do pierwszej etykiety na liście nastąpi gdy zmienna będzie miała wartość zero.

Przykład:

x = 2                           'przypisujemy wartość

On x Gosub lbl1, lbl2, lbl3     'nastąpi zatem skok do lbl3

x = 0

On x Goto lbl1, lbl2, lbl3

End

lbl3:

  Print "lbl3"

Return

Lbl1:

  Print "lbl1"

Lbl2:

  Print "lbl2"


Instrukcja OPEN

Przeznaczenie:

Otwiera kanał urządzenia UART.

Składnia:

OPEN  "urządzenie"  FOR tryb  AS #kanał

gdzie:

urządzenie	nazwa urządzenia,
tryb	tryb pracy urządzenia,
kanał	numer przypisanego urządzeniu kanału.

Opis:

Domyślnym urządzeniem transmisyjnym jest wbudowany w mikroprocesor układ transmisji szeregowej, nazywany COM1:. Jest on automatycznie otwierany, tak więc może być używany przez instrukcje INPUT oraz PRINT, bez potrzeby używania instrukcji OPEN.

Język BASCOM BASIC oferuje oprócz wbudowanego w procesor układu UART, także jego emulację programową. “Urządzenie” to posiada kilka wirtualnych kanałów transmisji, mogących być używanych niezależnie. Każdy z kanałów przed użyciem musi zostać otwarty, a po zakończeniu transmisji zamknięty.

Programowe urządzenie UART, korzysta z dowolnie wybranych końcówek portów, gdyż transmisją zajmuje się procesor. Dlatego w instrukcji OPEN należy określić, która z końcówek portu ma być użyta jako linia transmisyjna. Ponadto należy także określić szybkość transmisji. Na przykład, podanie jako nazwy urządzenia:

COM3.0:9600

informuje, że linią transmisyjną stanie się końcówka P3.0, a transmisja odbywać się będzie z szybkością 9600 bodów.

Uwaga! Jest szczególnie ważne, aby końcówkę portu – używaną jako linię transmisyjną – można adresować bitowo. W większości przypadków rejestry portów są dostępne także jako bity, choć niektóre mikrokontrolery nie pozwalają na to. Jeśli końcówka nie może być adresowana bitowo zgłoszony zostanie błąd: Error 208, bit variable not found.

Ogólnie format nazwy urządzenia wygląda następująco:

COMpin:szybkość [,INVERTED]

gdzie:

pin	nazwa końcówki portu mającego pełnić rolę linii transmisyjnej, np.: 3.x lub 1.x ; gdzie x określa umowny bit portu,
szybkość	szybkość transmisji w bodach,
Można dodać także parametr opcjonalny: INVERTED, który spowoduje że nastąpi odwrócenie polaryzacji (zanegowanie) sygnałów programowego łącza RS-232. Na przykład instrukcja:

Open "COM1.1:9600,INVERTED" For Output As #1

spowoduje, że końcówka P1.1 stanie się wyjściem programowego urządzenia UART. Transmisja będzie przebiegać z prędkością 9600 bodów. Nastąpi także odwrócenie polaryzacji sygnału.

Uwaga! Z programowym UART-em mogą tylko współpracować instrukcje GET, PUT oraz PRINTBIN i INPUTBIN. W przyszłości zestaw instrukcji zostanie rozszerzony.

Niektóre z kontrolerów posiadają dwa układy UART. W tym wypadku, należy najpierw otworzyć jedno z tych urządzeń, aby instrukcje korzystające z łącza szeregowego “wiedziały” z którego łącza mają skorzystać. Pierwszy z nich reprezentowany jest nazwą COM1:, a drugi COM2:.

Instrukcje korzystające z sprzętowego UART-u to: PRINT, INPUT, INPUTHEX, INKEY oraz WAITKEY.

Tryb pracy dla urządzenia COM1: (lub COM2:) może być określony następująco:

BINARY	transmisja może odbywać się w obu kierunkach,
INPUT	tylko odbiór,
OUTPUT	tylko nadawanie.
Dla urządzenia programowego UART, możliwe są tylko tryby:

INPUT	kanał będzie używany jako wejściowy,
OUTPUT	kanał będzie używany jako wyjściowy.
Ponieważ instrukcja OPEN nie używa prawdziwych “uchwytów plików” (file handles) jak np. w systemie DOS; lecz pracuje jak dyrektywa kompilatora, ważne jest by umieścić instrukcję CLOSE jako ostatnią w programie (Choć przed END! przyp. tłumacza).

Poniższy fragment pokazuje przykład błędnego programu, który pozornie wygląda OK. lecz NIE BĘDZIE DZIAŁAŁ.

Open "COM2:" For Binary As #1        'otwórz port

Print #1, "Hello"                    'drukuj przez pierwszy kanał COM2

Gosub Test

Print "Hello"                        'drukuje przez normalny RS

Close #1

Test:

  Print #1, "test"

Return

Ponieważ kompilator zwolni “uchwyt” po napotkaniu w programie instrukcji CLOSE, instrukcja Print #1, "test" nigdy nie zostanie wykonana. By rozwiązać ten problem należy instrukcję Close #1 umieścić po instrukcji Return.

Open "COM2:" For Binary As #1        'otwórz port

Print #1, "Hello"                    'drukuj przez pierwszy kanał COM2

Gosub Test

Print "Hello"                        'drukuje przez normalny RS

Test:

  Print #1, "test"

Return

Close #1

Zobacz także: CLOSE , GET , PUT

Przykład1:

'tylko dla układów 80517 lub 80537

Config Baud1 = 9600                  'szybkość portu COM2

Open "COM2:" For Binary As #1        'otwórz port

Print #1, "Hello"                    'drukuje przez COM2

Print "Hello"                        'drukuje przez COM1

Close #1                             'zamknij kanał

Przykład2:

'działa z każdą końcówką portu

Dim A As Byte , S As String * 16 , I As Byte , Dum As Byte

'W nazwie programowego UART-u należy określić nazwę używanej końcówki

'Dla przykładu P3.0 będzie "COM3.0:" (nie ma więc P)

'Dla programowego UART należy podać szybkość transmisji,

'więc dla 9600 bodów, nazwa urządzenia powinna wyglądać: "COM3.0:9600"

'Jeśli końcówka portu ma pracować jako wyjście należy jako tryb podać OUTPUT

'Jeśli zaś końcówka ma pracować jako wejście należy podać INPUT

'Na razie tylko zmienne mogą być wysyłane i odbierane instrukcjami PUT i GET.

'W przyszłości także instrukcje PRINT, INPUT, itd.; będą obsługiwały programowy UART.

Open "Com3.1:9600" For Output As #1             'p3.1 jest używany normalnie jako TxD więc testowanie programu będzie łatwe

Open "Com3.0:9600,INVERTED" For Input As #2     'p3.0 jest używany normalnie jako RxD

S = "test this"                      'jakiś tekst

Dum = Len(s)                         'oblicz długość

For I = 1 To Dum                     'dla każdego ze znaków wykonaj:

  A = Mid(s , I , 1)                 'wytnij znak

  Put #1 , A                         'i wyślij go

Next

Do

  Get #2 , A                         'odczytamy znak z portu COM

  Put #1 , A                         'prześlemy go z powrotem

  Print A                            'używamy normalnego kanału

Loop

Close #1                             'na koniec zamykamy

Close #2

End


Instrukcja OUT

Przeznaczenie:

Wysyła bajt do określonej komórki zewnętrznej pamięci XRAM.

Składnia:

OUT adres , dana

gdzie:

adres	dowolny adres w przestrzeni adresowej (0-&HFFFF) pamięci XRAM,
dana	dowolna stała lub zmienna typu Byte.

Opis:

Instrukcja OUT może zapisać dowolną liczbę mieszczącą się w bajcie pod dowolny adres w przestrzeni adresowej pamięci XRAM.

Jako adres należy używać liczb typu Word. Liczby typu Integer mogą przyjmować wartości ujemne, które owszem są zapisywane jako 16 bitowa liczba. W liczbach Integer wskaźnikiem znaku jest najbardziej znaczący bit. Dlatego adresy powyżej 32767 należałoby przeliczać do wartości ujemnych.

Uwaga! Instrukcja działa tylko w systemach posiadających szynę danych i adresową.

Zobacz także: INP

Przykład:

Out &H8000 , 16   'wystawienie na szynie danych d0-d7 liczby 16

                  'gdy na szynie adresowej jest wystawiony adres 8000h

End

‘zostanie przetłumaczone do:

‘Mov A,#1

‘Mov Dptr,#h'8000

‘Movx @dptr,a


Funkcja PEEK()

Przeznaczenie:

Odczytuje daną z pamięci wewnętrznej.

Składnia:

zmienna = PEEK ( adres )

gdzie:

zmienna	dowolna zmienna, do której zwrócona będzie zawartość rejestru,
adres	adres w przestrzeni wewnętrznej pamięci RAM procesora (0-255)

Opis:

Funkcja PEEK działa podobnie jak funkcja INP, z tym że odnosi się do wewnętrznej pamięci RAM.

By odczytać bajt z pamięci XRAM, należy użyć funkcji INP.

Zobacz także: POKE , CPEEK , INP , OUT

Przykład:

Dim A As Byte

a = Peek(0)       'zwraca bajt spod adresu 0 (rejestr R0)

End


Instrukcja POKE

Przeznaczenie:

Zapisuje daną do określonej komórki wewnętrznej pamięci RAM.

Składnia:

POKE adres , dana

gdzie:

adres	dowolny adres w przestrzeni adresowej wewnętrznej pamięci RAM procesora (0-255),
dana	dowolna stała lub zmienna typu Byte.

Opis:

Instrukcja jest dokładną odwrotnością funkcji PEEK.

Aby zapisać daną do dowolnej komórki pamięci XRAM należy użyć instrukcji OUT.

Uwaga! Ostrożnie z umieszczaniem danych w dowolnym miejscu pamięci RAM. Można w ten sposób zmienić zawartość którejś ze zmiennej, lub komórek zajętych przez stos. Może to doprowadzić do błędów w działaniu programu, z jego zawieszeniem się włącznie.

Zobacz także: PEEK , CPEEK , OUT

Przykład:

Poke 1 , 1       'zapisze 1 do rejestru R1

End


Zmienne P1, P3

Przeznaczenie:

P1 oraz P3 to rejestry w przestrzeni SFR, które są reprezentowane jako zmienne.

Składnia:

Px = zmienna

zmienna = Px

gdzie:

x	numer portu, dla AT89cx051 tylko 1 i 3,
zmienna	zmienna lub stała typu Byte,

Opis:

Zmienne P0, P1, P2, P3 itd. są odzwierciedlają stan rejestrów portów i mogą być używane jak zmienne typu Byte.

Uwaga! W niektórych procesorach jest możliwe używanie portów P4, P5 itd. Informacji należy szukać w danych katalogowych lub w plikach .DAT.

W “małych Atmel-ach” nie może być używana końcówka P3.6.

Faktem jest, że każdy z rejestrów w przestrzeni SFR może być traktowany jak zmienna w języku BASCOM BASIC 8051. Na przykład instrukcja ACC = 0, spowoduje wyzerowanie stanu akumulatora.

Lista tych rejestrów znajduje się tutaj.

Ustawianie stanu bitów w rejestrach portów ma jeszcze jeden aspekt. Aby linia portu mogła pracować jako wejście do odpowiedniego bitu musi być wpisana jedynka. Tak samo, jeśli linia portu ma spełniać funkcję alternatywną (WR, RD, TxD, RxD itd.) także do odpowiedniego bitu w rejestru portu musi być wpisana jedynka.

Przykład:

Dim A As Byte , B1 As Bit

A = P1                                    'odczytanie wartości z portu 1

A = A Or 2                                'zmienimy wartość

P1 = A                                    'ustaw nową wartość w porcie

P1 = &B10010101                           'używanie notacji dwójkowej

P1 = &HAF                                 'a tu szesnastkowej

B1 = P1.1                                 'można odczytywać także bity

P1.1 = 0                                  'i ustawiać ich stan


Instrukcja POWERDOWN

Przeznaczenie:

Zatrzymuje procesor do czasu jego wyzerowania – Power Down Mode.

Składnia:

POWERDOWN

Opis:

W trybie Power Down, zewnętrzny oscylator zostaje zatrzymany. Użytkownik może przywrócić działanie procesora tylko za pomocą wyzerowania procesora.

Uwaga! Tryb Power Down jest dostępny tylko w kontrolerach wykonanych w technologii CHMOS.

Zobacz także: IDLE

Przykład:

Powerdown


Instrukcja PRINT

Przeznaczenie:

Wysyła dane przez sprzętowy UART.

Składnia:

PRINT [ zmienna | stała ] [; [ zmienna | stała ]]

PRINT #nr_kanału , [ zmienna | stała ] [; [ zmienna | stała ]]

gdzie:

zmienna,  stała	dowolna stała lub zmienna,
nr_kanału	numer wcześniej otwartego kanału sprzętowego układu UART

Opis:

Można umieszczać więcej zmiennych lub stałych w instrukcji PRINT, rozdzielając je znakiem średnika ( ; ). Gdy średnik zostanie umieszczony na końcu listy zmiennych lub stałych, nie zostanie wysłany znak przejścia do następnej linii.

Instrukcje PRINT można używać gdy projektowany system mikroprocesorowy wyposażony jest w interfejs RS-232. Interfejs ten może być połączony z portem COM komputera osobistego, gdzie za pomocą dowolnego emulatora terminala, lub wbudowanego w środowisko BASCOM 8051 - można odbierać znaki z mikrokontrolera.

Zobacz także: INPUT , OPEN , CLOSE , PRINTHEX , SPC

Przykład:

'--------------------------------------------------------------

'                (c) 2000 MCS Electronics

'--------------------------------------------------------------

'  plik: PRINT.BAS

'  demo: PRINT, PRINHEX

'--------------------------------------------------------------

Dim A As Byte , B1 As Byte , C As Integer

A = 1

Print "Drukujemy wartość zmiennej A " ; A

Print                                   'przejście do nowej linii

Print "Jakiś tam tekst"                 'drukowanie stałej

B1 = 10

Printhex(B1)                           'drukowanie w formacie HEX

C = &HA000

Printhex(C)                            'drukowanie w formacie HEX

Print C                                'drukowanie w formacie decymalnym

C = -32000

Print C

Printhex(C)

Rem Uwaga! Liczby Integer mają zakres -32767 To 32768

End


Instrukcja PRINTBIN

Przeznaczenie:

Przesyła binarnie zawartość dowolnej zmiennej łączem szeregowym.

Składnia:

PRINTBIN  zmienna [; zmiennaN ]

PRINTBIN #nr_kanału , zmienna [; zmiennaN ]

gdzie:

zmienna, zmiennaN	dowolna zmienna,
nr_kanału	numer wcześniej otwartego kanału programowego lub sprzętowego układu UART

Opis:

Gdy jest używany drugi format instrukcji, musi być podany numer otwartego wcześniej (instrukcją OPEN) kanału transmisji urządzenia UART. Inaczej kompilator zasygnalizuje błąd.

Instrukcja PRINTBIN jest jakby ekwiwalentem instrukcji Print Chr(zmienna); z tym, że można przesyłać zmienne dowolnego typu. Na przykład podanie jako parametru zmiennej typu Long, spowoduje wysłanie 4 bajtów. Można także przesyłać całą zawartość zmiennej tablicowej.

Zobacz także: INPUTBIN

Przykład:

Dim a(10) As Byte, c As Byte

For c = 1 To 10

  a(c) = a         ’wpiszemy jakieś dane

Next

Printbin a(1)      'i wydrukujemy

'Poniższy kod tylko dla procesorów 80517/80537 posiadających

'dwa układy UART

Open "COM2:" For Binary As #1        'otwórz kanał numer 1

Printbin #1 , a(1) ; a(2) ; a(3)

'Uwaga! Numer kanału należy oddzielać za pomocą przecinka, a zmienne średnikiem

Close #1


Instrukcja PRINTHEX

Przeznaczenie:

Drukuje wartość zmiennych lub stałych w formacie szesnastkowym.

Składnia:

PRINTHEX [ zmienna | stała ] [; [ zmienna | stała ]]

gdzie:

zmienna,  stała	dowolna stała lub zmienna numeryczna,

Opis:

Można umieszczać więcej zmiennych lub stałych w instrukcji PRINTHEX, rozdzielając je znakiem średnika ( ; ). Gdy średnik zostanie umieszczony na końcu listy zmiennych lub stałych, nie zostanie wysłany znak przejścia do następnej linii.

Instrukcję PRINTHEX można używać gdy projektowany system mikroprocesorowy wyposażony jest w interfejs RS-232. Interfejs ten może być połączony z portem COM komputera osobistego, gdzie za pomocą dowolnego emulatora terminala, lub wbudowanego w środowisko BASCOM 8051 - można odbierać znaki z mikrokontrolera.

Zobacz także: PRINT , INPUTHEX , SPC

Przykład:

Dim x As Byte

Input x                              'zapytaj o liczbę

Print x                              'drukuj normalnie

Printhex "Hex: " ; x                 'drukuj w zapisie szesnastkowym


Instrukcja PRIORITY

Przeznaczenie:

Ustala priorytety przerwań.

Składnia:

PRIORITY  SET | RESET źródło_przerwania

gdzie:

źródło_przerwania	symboliczna nazwa źródła przerwania,
Nazwa	Źródło przerwania
INT0	Przerwanie zewnętrzne (końcówka INT0)
INT1	Przerwanie zewnętrzne (końcówka INT1)
TIMER0	Przerwanie przepełnienia licznika TIMER0
TIMER1	Przerwania przepełnienia licznika TIMER1
TIMER2	Przerwania przepełnienia licznika TIMER2 (Tylko układy 8032/8052 i podobne !)
SERIAL	Przerwanie z układu UART

Opis:

W kontrolerach z rodziny MCS-51 występuje mechanizm priorytetów przerwań. Oznacza to, że program obsługi przerwania o niższym priorytecie może zostać przerwany przez zgłoszenie przerwania o wyższym priorytecie. Podobnie jest, gdy dwa przerwania zostaną zgłoszone jednocześnie. Wtedy wykonane najpierw będzie przerwanie o wyższym priorytecie. Firma Intel ustaliła sztywne priorytety dla poszczególnych przerwań (Można zauważyć, że wyższy priorytet mają przerwania o niższym adresie programu obsługi. przyp. tłumacza):

Nazwa	Priorytet
INT0	1 (najwyższy)
TIMER0	2
INT1	3
TIMER1	4
SERIAL	5 (najniższy)

Istnieje jednak możliwość ustalenia wyższego priorytetu dla jednego wybranego przerwania lub kilku przerwań. W tym celu do BASCOM BASIC 8051 wprowadzono instrukcję PRIORITY. Za jej pomocą ustalamy które przerwanie ma mieć wyższy priorytet. Służy do tego parametr SET.

Aby odwołać przydzielony wyższy priorytet należy użyć instrukcji PRIORITY z parametrem RESET.

Uwaga! Należy pamiętać, że jeśli ustawimy priorytet dla dwóch lub więcej przerwań, przy jednoczesnym ich zgłoszeniu decyduje sprzętowy poziom priorytetu! To samo dotyczy zgłaszania przerwań w trakcie wykonywania programu obsługi przerwania.

Składnia dla układów 80517 i 80537.

PRIORITY  SET | RESET źródło_przerwania , poziom

gdzie:

źródło_przerwania	symboliczna nazwa źródła przerwania,
poziom	poziom na którym ustawione będzie przerwanie. Można podać 0 (najniższy), 1, 2, 3 (najwyższy)
Nazwa*)	Źródło przerwania
INT0/ADC/SERIAL1	Końcówka INT0, przetwornik ADC lub drugi układ UART,
TIMER0/INT2	Licznik TIMER0 lub końcówka INT2,
INT1/INT3	Końcówka INT1 lub końcówka INT3,
TIMER1/CTF/INT4	Licznik TIMER1, lub końcówka INT4,
SERIAL/INT5	Pierwszy układ UART lub końcówka INT5,
TIMER2/INT6	Licznik TIMER2 lub końcówka INT6.
*) Źródła SERIAL1 i CTF są dostępne tylko w kontrolerze 80537.

Uwaga! Tylko jedno z pary/trójki przerwań może być podane jako parametr źródło_przerwania. Na przykład:

Priority Set Int4, 3                 'najwyższy priorytet będą miały TIMER1, CTF i INT4

Opis dla układów 80517 i 80537:

W kontrolerach tych jest możliwe czterostopniowe określenie poziomu priorytetu każdego z przerwań. Należy jednak pamiętać, że niektóre źródła są połączone w pary lub trójki. Jeśli zdarzy się sytuacja, że przyjęte zostanie jednocześnie przerwanie TIMER0 i INT2, pierwszeństwo ma TIMER0 (kolejność taka jak podano w powyższej tabeli).

Dalszych informacji należy szukać w danych katalogowych producenta układu.

Zobacz także: ON INTERRUPT

Przykład:

Priority Set Serial                  'ustaw UART na wyższym poziomie

Enable Serial                        'włącz przerwanie Int0

Enable Timer0                        'włącz przerwanie Timer0

Enable Interrupts                    'włącz system przerwań

On Serial Label                      'skocz do Label jeśli wystąpi przerwanie UART

Do                                   'jakaś pusta pętelka

Loop

Label:                               'początek programu obsługi

   Print "Wystąpiło przerwanie UART" 'drukuj komunikat

Return                               'powrót z przerwania


Instrukcja PSET

Przeznaczenie:

Zapala lub gasi określony piksel na ekranie graficznego wyświetlacza LCD.

Składnia:

PSET x , y , kolor

gdzie:

x, y	współrzędne piksela,
kolor	kolor jaki ma mieć podany piksel.

Opis:

Współrzędna X piksela może się zawierać w granicach 0-239. Pozycja Y zaś w granicach 0-63. Kolor piksela może przyjąć wartości 0 – zgaszony i 1 – zapalony.

Instrukcja PSET może być użyteczna przy rysowaniu skomplikowanych wzorów lub do rysowania przebiegów w programie prostego oscyloskopu.

Zobacz także: SHOWPIC , CONFIG GRAPHLCD

Przykład:

'Można także rysować linie za pomocą PSET X ,Y , on/off

'parametr on/off to: 0 – skasowanie piksela, 1 – postawienie piksela

For X = 0 To 140

   Pset X , 20 , 1                 'narysuj punkt

Next

Wait 2


Instrukcja PUT

Przeznaczenie:

Wysyła bajt przez programowy UART.

Składnia:

PUT #nr_kanału , zmienna

gdzie:

zmienna	zmienna typu Byte, której zawartość będzie wysłanat,
nr_kanału	numer otwartego wcześniej kanału.

Opis:

Instrukcja wysyła jeden bajt za pomocą programowego UART-u.

Uwaga! Kanał transmisji musi być przedtem otwarty przez OPEN. Instrukcja CLOSE musi być ostatnią w programie (zobacz uwagi w opisie instrukcji OPEN ).

Zobacz także:  OPEN , GET

Przykład:

Dim S As String * 12 , I As Byte , A As Byte , Dum As Byte

Open "Com3.1:9600" For Output As #1 'p3.1 jest normalnie używany jako końcówka TxD więc testowanie programu jest łatwe

Open "Com3.0:9600" For Input As #2  'p3.0 jest normalnie używany jako końwówka RxD

S = "Testowanie!"                    'jakiś tekst

Dum = Len(s)                         'ile ma znaków

For I = 1 To Dum                     'prześlemy każde z nich po kolei

  A = Mid(s , I , 1)                 'wytnij znak

  Put #1 , A                         'puść w kabelek ;-)

Next

Do

  Get #2 , A                         'odbierz znak

  Put #1 , A                         'zrobimy echo

  Print A                            'użyj normalnego kanału

Loop

Printbin #1, a                       'Printbin jak i Inputbin

Inputbin #2, a                       'są także dostępne

Close #1                             'na koniec zamykamy kanały

Close #2

End


Instrukcja READ

Przeznaczenie:

Odczytuje dane z linii DATA i przypisuje je podanej zmiennej.

Składnia:

READ zmienna

gdzie:

zmienna	dowolna zmienna.

Opis:

W programie można umieszczać ciągi danych, które mogą być potem odczytywane instrukcją READ. Dane umieszczone w liniach DATA mogą być dowolnego typu (oprócz Bit!) i mogą być odczytywane wielokrotnie.

Instrukcja READ współpracuje z specjalnym wskaźnikiem danych i dlatego należy go ustawić za pomocą instrukcji RESTORE.

Różnice w stosunku do QBasic-a.

Należy zwracać uwagę na zgodność typów odczytywanych a umieszczonych w liniach DATA.

Zobacz także: DATA , RESTORE

Przykład:

'-------------------------------------------------------------

'                      READDATA.BAS

'             Copyright 2000 MCS Electronics

'-------------------------------------------------------------

Dim A As Integer , B1 As Byte , Count As Byte

Dim S As String * 15

Dim L As Long

Restore Dta1                           'ustawiamy wskaźnik

For Count = 1 To 3                     'czytamy trzy dane

   Read B1 : Print Count ; "  " ; B1

Next

Restore Dta2                           'ustawiamy wskaźnik

For Count = 1 To 2                     'czytamy dwie dane

   Read A : Print Count ; "  " ; A

Next

Restore Dta3

Read S : Print S

Read S : Print S

Restore Dta4

Read L : Print L                       'dane typu Long

End

Dta1:

  Data &B10 , &HFF , 10

Dta2:

  Data 1000% , -1%

Dta3:

  Data "Hello" , "World"

'Uwaga! Dane typu Integer (>255 lub <0) muszą być zakończone znakiem %

'Typ danych odczytywanych instrukcją READ i zapisanych w liniach DATA 'musi się zgadzać.

Dta4:

  Data 123456789&

'Uwaga! Dane typu Long muszą być zakończone znakiem &


Instrukcja READMAGCARD

Przeznaczenie:

Odczytuje dane zapisane na karcie magnetycznej.

Składnia:

READMAGCARD zmienna , licznik , 5 | 7 , czas

gdzie:

zmienna	zmienna tablicowa do której wpisane będą odczytane bajty,
licznik	zmienna zawiera ilość rzeczywiście odczytanych bajtów,
czas	czas, w którym instrukcja oczekuje na kartę. Po upłynięciu tego czasu instrukcja zostaje zakończona a zmienna ERR jest ustawiana.

Opis:

Karta magnetyczna (wyglądająca tak samo jak karta kredytowa czy bankomatowa), posiada szeroki magnetyczny pasek, na którym umieszczono trzy ścieżki danych. Na pierwszej ścieżce zapisywany jest ciąg 7 bitowych danych włącznie z bitem parzystości. Jest ona przewidziana do umieszczenia na niej dowolnych danych alfanumerycznych. Dwie pozostałe ścieżki zawierają dane zakodowane w postaci 5 bitowej.

Instrukcja READMAGCARD działa z kartami zgodnymi z standardem ISO7811-2 z 5 oraz 7 bitowym dekodowaniem. Dane zwracane są w kodzie 5 bitowym:

zwracana liczba	znak wg normy ISO
0	0
1	1
2	2
3	3
4	4
5	5
6	6
7	7
8	8
9	9
10	hardware control
11	bajt startu
12	hardware control
13	separator
14	hardware control
15	bajt stopu

Asembler:

Wywołuje procedurę: _Read_Magcard_Code5

Przykład:

'------------------------------------------------------------------

'                        (c) 2000 MCS Electronics

'                               MAGCARD.BAS

'Przykład ten pokazuje w jaki sposób odczytać dane z karty magnetycznej

'[definicja zmiennych]

Dim X(40) As Byte , I As Byte , Bts As Byte

'Czytnik kart posiada 5 wyprowadzeń (kabelków):

'czerwony  - +5V

'czarny    - GND

'żółty     - sygnał Card Inserted (CS)

'zielony   - sygnał zegarowy

'niebieski - linia danych

'Jeśli twój czytnik posiada inne wyprowadzenia, to możesz znaleźć

'poszczególne dołączając zasilanie i wkładając kartę do czytnika.

'Przesuwanie karty powinno spowodować, że:

' – linia CS ustawiana będzie w stan niski gdy będziesz wkładał kartę,

' – linia zegarowa będzie generować równomierne impulsy,

' – na linii danych pojawiały będą się przypadkowo jedynki i zera.

'Pamiętaj także o prawidłowym włożeniu karty, mnie się czasem zdarza

'włożyć ją odwrotnie :-). {mam to samo przyp. tłumacza}

'Niestety mam znikome pojęcie o kartach magnetycznych, więc proszę o

'nie zasypywanie mnie pytaniami na ten temat.

'[używamy aliasów dla określenia nazw portów]

_mdata Alias P1.0                   'dane (niebieski) PORTB.0

_mcs Alias P1.1                     'linia CS (żółty)PORTB.

_mclock Alias P1.2                  'zegar (zielony) PORTB.2

Do

  Print "Wprowadź kartę"            'drukujemy tekst zachęty

  Readmagcard X(1) , Bts , 5 , 1000 'czytamy dane

'                          ^- Może być 5 lub 7. 7 bitowe kodowanie

'                             nie jest jeszcze obsługiwane :(

  Print "Znacznik błędu " ; Err

  Print " " ; Bts ; " odczytanych bajtów"

  For I = 1 To Bts

    Print x(i);                      'i drukujemy

  Next

  Print

Loop


Instrukcja REM

Przeznaczenie:

Instruuje kompilator by potraktował podany tekst jako komentarz.

Składnia:

REM lub '

Opis:

W tekście programu można (a nawet powinno się! przyp. tłumacza) umieszczać komentarze. Pozwoli to później zrozumieć jakie operacje wykonuje program, oraz uprości sprawę przy ewentualnych jego modyfikacjach.

Tekst umieszczony po słowie REM lub znaku apostrofu do końca linii programu, nie będzie brany pod uwagę przez kompilator. Dlatego też instrukcję komentarza należy umieszczać jako ostatnią w linii.

Można zamiennie używać instrukcji komentarza REM lub ' (apostrofu). Istnieje także komentarz w postaci bloku:

'(  początek bliku komentarza

Print "To nie zostanie skompilowane"

')  koniec bloku komentarza

Uwaga! Początkowy znak apostrofu gwarantuje kompatybilność z językiem QBasic/Visual Basic.

Przykład:

Rem  TEST.BAS wersja 1.00

Print a    ‘ ;  "  to jest komentarz "  :  PRINT " Witaj "

‘               ^--- to nie zostanie wykonane!


Instrukcja REPLACE

Przeznaczenie:

Zamienia określone znaki w ciągu innym znakiem.

Składnia:

REPLACE ciąg , znak , nowy_znak

gdzie:

ciąg	ciąg poddawany operacji zamiany,
znak	określa znak, który należy zastąpić. Można podać kod znaku lub stałą znakową.
nowy_znak	określa nowy znak którym poprzedni znak będzie zastąpiony. Można podać kod znaku lub stałą znakową.

Opis:

Przykład:

Dim S As String * 12

S = "Hello"

Replace s , "e" , "a"                'teraz zmienimy na holenderski :-)

Print s                              'powinien wydrukować Hallo


Instrukcja RESET

Przeznaczenie:

Ustawia określony bit w stan 0.

Składnia:

RESET bit

RESET zmienna.x

RESET WATCHDOG

gdzie:

bit	nazwa bitu; określonego w przestrzeni rejestrów specjalnych czy jako zmienna bitowa
zmienna	dowolna zmienna,
x	numer określający bit z zmiennej; 0-7 dla bajtów, 0-15 dla Integer/Word, 0-31 dla Long.

Opis:

Instrukcja RESET WATCHDOG działa tylko dla kontrolera 89s8232 i powoduje wyzerowanie licznika układu Watchdog.

Zobacz także: SET

Przykład:

Dim b1 As Bit , b2 As Byte , I As Integer

Reset Portb.3      'ustaw bit 3 w porcie B

Reset b1           'albo zmienną bitową

Reset b2.0         'lub też określony bit w b2

Reset I.15         'albo bit MSB w zmiennej I


Instrukcja RESTORE

Przeznaczenie:

Ustawia wewnętrzny wskaźnik danych dla instrukcji READ.

Składnia:

RESTORE etykieta

gdzie:

etykieta	etykieta określająca adres danych na które ma być ustawiony wskaźnik.

Opis:

Zobacz także: DATA, READ

Przykład:

Dim a As Byte, I As Byte

Restore dta

For a = 1 To 3

  Read a : Print a

Next

Restore DTA2

Read I : Print I

Read I : Print I

End

DTA1:

  Data 5 , 10 , 100

DTA2:

  Data -1% , 1000%

‘Dane typu Integer (<0 lub >255) muszą być zakończone znakiem %


Instrukcja RETURN

Przeznaczenie:

Wykonuje powrót z podprogramu.

Składnia:

RETURN

Opis:

Podprogramy wywoływane przez GOSUB muszą kończyć się instrukcją RETURN. Nastąpi wtedy powrót do instrukcji następującej po instrukcji GOSUB.

Instrukcja służy także do zakończenia podprogramów obsługi przerwań. Skompilowana będzie wtedy do instrukcji powrotu z przerwania RETI. Dalsze informacje przy opisie instrukcji ON INTERRUPT

Zobacz także: GOSUB , ON INTERRUPT

Przykład:

Gosub Pr                 'skoczymy do podprogramu

Print result             'wydrukujemy rezultat jego działania

End                      'koniec programu głównego

Pr:                      'podprogram musi rozpoczynać się etykietą

  result = 5 * y         'robimy coś głupiego

  result = result + 100  'a może jeszcze coś dodamy...

Return                   'i wracamy


Funkcja RIGHT()

Przeznaczenie:

Zwraca określoną liczbę znaków z tekstu licząc od prawej strony.

Składnia:

zmienna = RIGHT( tekst , il_znaków )

gdzie

zmienna	zmienna tekstowa, do której przepisane będą skopiowane znaki,
tekst	tekst z którego skopiowane będą znaki,
il_znaków	ilość kopiowanych znaków.

Opis:

Zobacz także: LEFT , MID()

Przykład:

Dim s As XRAM String * 15, z As String * 15

s = "ABCDEFG"

z = Right(s , 3)

Print z                              'wydrukuje EFG

End


Funkcja RND()

Przeznaczenie:

Zwraca pseudolosową liczbę z określonego zakresu.

Składnia:

zmienna =  RND( zakres )

gdzie

zmienna	dowolna zmienna numeryczna, w której znajdzie się wygenerowana liczba pseudolosowa,
zakres	liczba określająca górną granicę generowanych liczb.

Opis:

Funkcja RND zwraca liczbę typu Integer/Word. Każde wywołanie funkcji RND powoduje wygenerowanie nowej pseudolosowej liczby.

Uwaga! Liczby są generowane przez odpowiedni kod programu. Każdy restart systemu, powoduje, że sekwencja tych liczb będzie taka sama.

Przykład:

Dim I As Integer

Do

  I = Rnd(100)                       'zwraca liczbę pseudolosową z zakresu 0-99

  Print I

  Wait 1

Loop

End


Instrukcja ROTATE

Przeznaczenie:

Przesuwa wszystkie bity w wybranym kierunku.

Składnia:

ROTATE zmienna , LEFT | RIGHT [, liczba_przesunięć ]

gdzie

zmienna	dowolna zmienna stałoprzecinkowa, która podlega przesuwaniu,
liczba_przesunięć	liczba określająca ilość kroków przesunięć.

Opis:

Instrukcja ROTATE przesuwa wszystkie bity zmiennej w prawo lub lewo. Żaden z bitów nie wychodzi poza zmienną, gdyż przesuwane są one w pętli. Oznacza to, że wychodzący bit z jednej strony zostaje automatycznie wpisany z drugiej. Tak więc, przesunięcie bajtu zawierającego liczbę 1 osiem razy nie zmieni zawartości bajtu – będzie on dalej zawierał 1.

Gdy potrzebna jest funkcja, która usunie bit(y) z prawej lub lewej strony, należy użyć instrukcji SHIFT.

Zobacz także: SHIFT , SHIFTIN , SHIFTOUT

Asembler:

Wywołuje _ROTATE_LEFT lub _ROTATE_RIGHT.

Przykład:

Dim a As Byte

a = 128

Rotate a , Left , 2

Print a                              'wydrukuje 2


Instrukcja SELECT CASE..END SELECT
Instrukcja SELECT CASE..CASE..END SELECT

Przeznaczenie:

Specjalna instrukcja wykonująca odpowiedni ciąg instrukcji na podstawie wartości zmiennej.

Składnia:

SELECT CASE  zmienna

   CASE [ IS ] test1 : instrukcje

 [ CASE [ IS ] test2 : instrukcje ]

 [ CASE wart_pocz TO wart_końcowa : instrukcje ]

 [ CASE ELSE : instrukcje ]

END SELECT

gdzie:

zmienna	zmienna numeryczna, której wartość będzie przedmiotem testowania,
test1, test2	wartości jakie powinna zawierać zmienna by wykonać podane instrukcje, przy podaniu IS należy podać > lub < przed liczbą,
instrukcje	dowolny ciąg instrukcji.
wart_pocz	dolna liczba zakresu wartości zmiennej
wart_końcowa	górna liczba zakresu wartości zmiennej

Opis:

Przykład:

Dim X As Byte

Do

  Input "X ? " , X

  Select Case X

    Case 1 To 3 : Print "1 , 2 lub 3 są w porządku"

    Case 4 : Print "O! Wpisałeś 4"

    Case Is > 10 : Print "X jest większe niż 10"

    Case Else : Print "Taka liczba nie jest poprawna!"

  End Select

Loop

End


Instrukcja SET

Przeznaczenie:

Ustawia określony bit w stan 1.

Składnia:

SET bit

SET zmienna.x

gdzie:

bit	nazwa bitu; określonego w przestrzeni rejestrów specjalnych czy jako zmienna bitowa
zmienna	dowolna zmienna,
x	numer określający bit z zmiennej; 0-7 dla bajtów, 0-15 dla Integer/Word, 0-31 dla Long.

Opis:

Zobacz także: RESET

Przykład:

Dim b1 As Bit , b2 As Byte , I As Integer

Set P3.3           'ustaw bit 3 w porcie P3

Set b1             'albo zmienną bitową

Set b2.0           'lub też określony bit w b2

Set I.15           'albo bit MSB w zmiennej I


Instrukcja SHIFT

Przeznaczenie:

Przesuwa wszystkie bity zmiennej o jedną (lub więcej) pozycję w prawo lub lewo.

Składnia:

SHIFT zmienna , LEFT | RIGHT [, il_przesunięć ]

gdzie:

zmienna	dowolna zmienna typu Byte, Integer, Word czy Long, której zawartość będzie przesuwana,
il_przesunięć	opcjonalnie liczba przesunięć.

Opis:

Instrukcja SHIFT przesuwa wszystkie bity składające się na podaną zmienną w prawo lub lewo.

Gdy podany jest parametr LEFT bit MSB zostaje usunięty, a reszta bitów jest przesuwana w lewo. Na pozycji LSB zostaje umieszczone zero. Przesuwanie wartości zmiennej w lewo, jest równoznaczne z pomnożeniem jej zawartości przez dwa.

Gdy podany jest parametr RIGHT bit LSB zostaje usunięty, a reszta bitów jest przesuwana w prawo. Na pozycji MSB zostaje umieszczone zero. Przesuwanie wartości zmiennej w prawo, jest równoznaczne z podzieleniem jej zawartości przez dwa.

Dzielenie lub mnożenie przez dwa wykonywane przez SHIFT jest o wiele szybsze niż ta sama operacja wykonywana przez operatory matematyczne.

Zobacz także: ROTATE , SHIFT

Przykład:

Dim a As Byte

a = 128

Shift a, Left , 2

Print a           'wydrukuje 0


Instrukcja SHIFTCURSOR

Przeznaczenie:

Przesuwa kursor wyświetlacza LCD o jedna pozycję w prawo lub lewo.

Składnia:

SHIFTCURSOR  LEFT | RIGHT

Zobacz także: SHIFTLCD

Przykład:

Lcd "Witaj"

Shiftcursor Left

End


Instrukcje SHIFTIN i SHIFTOUT
Instrukcje SHIFTIN, SHIFTOUT

Przeznaczenie:

Instrukcja SHIFTIN wsuwa ciąg bitów do zmiennej, a instrukcja SHITOUT wysuwa bity.

Składnia:

SHIFTIN pin_danych , pin_zegarowy , zmienna , opcje [ PRE ]

SHIFTOUT pin_danych , pin_zegarowy , zmienna , opcje

gdzie:

pin_danych	nazwa końcówki portu będącą linią wejściową strumienia bitów,
pin_zegarowy	nazwa końcówki portu będąca linią zegarową,
zmienna	zmienna do której wsuwane będą bity,
opcje	opcje,

Opis:

Instrukcja ta może być używana, do szybkiej transmisji szeregowej pomiędzy dwoma procesorami.

Pin_danych powinien być połączony z końcówką wyjściową drugiego procesora, który jest nadajnikiem strumienia bitów. Pin_zegarowy w trybie MASTER generuje sygnał zegarowy synchronizujący transmisję. W trybie SLAVE jest on wejściem sygnału zegarowego pochodzącego z drugiego procesora.

Podana jako parametr zmienna może być dowolną – oprócz zmiennych bitowych! - zmienną języka BASCOM BASIC. Bity odczytywane trafią właśnie do tej zmiennej.

Liczba bitów jest automatycznie określana na podstawie ilości bitów składających się na zmienną. Dla typu Byte będzie to 8 bitów a dla typu Word – 16.

Znaczenie liczby podanej jako parametr opcje, jest następujące:

0	najpierw bit MSB jest wpisywany/ustawiany przy wystawieniu niskiego poziomu logicznego na końcówce zegarowej
1	najpierw bit MSB jest wpisywany/ustawiany przy wystawieniu wysokiego poziomu logicznego na końcówce zegarowej
2	najpierw bit LSB jest wpisywany/ustawiany przy wystawieniu niskiego poziomu logicznego na końcówce zegarowej
3	najpierw bit LSB jest wpisywany/ustawiany przy wystawieniu wysokiego poziomu logicznego na końcówce zegarowej

Gdy liczba określająca opcję zostanie powiększona o 4, wtedy sygnał zegarowy nie będzie generowany i lina zegarowa będzie pełnić rolę wejścia zewnętrznego sygnału zegarowego (tryb SLAVE).:

4	najpierw bit MSB jest wpisywany/ustawiany przy niskim poziomie logicznym na końcówce zegarowej
5	najpierw bit MSB jest wpisywany/ustawiany przy wysokim poziomie logicznym na końcówce zegarowej
6	najpierw bit LSB jest wpisywany/ustawiany przy niskim poziomie logicznym na końcówce zegarowej
7	najpierw bit LSB jest wpisywany/ustawiany przy wysokim poziomie logicznym na końcówce zegarowej
Umieszczenie parametru PRE (bez przecinka) przy odbieraniu strumienia bitów powoduje, że stan końcówki wejściowej jest testowany przed zmianą stanu końcówki zegarowej.

Przykład:

Dim a As Byte

Shiftin P1.0 , P1.1 , A , 0   'odczytuje 8 bitów, tryb MASTER

Shiftout P1.0 , P1.1 , A , 0  'wysyła 8 bitów, tryb MASTER

Dla instrukcji SHIFTIN stosowanej w przykładzie generowany jest kod:

  Setb P1.1

  Mov R0,#h'21

  Mov r2,#h'01

__UNQLBL1:

  Mov r3,#8

__UNQLBL2:

  Clr P1.1

  Nop

  Nop

  Mov c,P1.0

  Rlc a

  Setb P1.1

  Nop

  Nop

  Djnz r3,__UNQLBL2

  Mov @r0,a

  Dec r0

  Djnz r2,__UNQLBL1

Przy odbieraniu bitów przy dostarczaniu zewnętrznego sygnału zegarowego:

Shiftin P1.0, P1.1 , a , 4   'podaj 4 by używać tej funkcji

generowany jest następujący kod:

  Mov R0,#h'21

  Mov r2,#h'01

__UNQLBL1:

  Mov r3,#8

__UNQLBL2:

  Jnb P1.1,*+0

  Mov c,P1.0

  Rlc a

  Jb P1.1,*+0

  Djnz r3,__UNQLBL2

  Mov @r0,a

  Dec r0

  Djnz r2,__UNQLBL1


Instrukcja SHIFTLCD

Przeznaczenie:

Przesuwa zawartość wyświetlacza LCD o jedną pozycję w prawo lub w lewo.

Składnia:

SHIFTLCD  LEFT | RIGHT

Zobacz także: SHIFTCURSOR

Przykład:

Lcd "Bardzo dłuuuuuuuuuugi tekst"

Shiftlcd Left

Wait 1

Shiftlcd Right

End


Instrukcja SHOWPIC

Przeznaczenie:

Wyświetla obrazek zapisany w formacie BGF na ekranie graficznego wyświetlacza LCD.

Składnia:

SHOWPIC x , y , etykieta

gdzie:

x , y	punkt w którym ma się znaleźć lewy górny róg obrazka,
etykieta	adres określony etykietą, pod jakim znajdują się dane obrazka.

Opis:

Instrukcja SHOWPIC potrafi wyświetlić bitmapy monochromatyczne skonwerterowane do pliku .BGF narzędziem znajdującym się w menu Tools | Graphic Converter.

Parametry x oraz y określają gdzie obrazek ma być umieszczony na ekranie. Muszą to być wartości podzielne przez 8, albo równe 0. Wysokość obrazka jak i jego szerokość także muszą być wielokrotnością liczby 8.

Podana etykieta określa gdzie w pamięci kodu znajdują się dane obrazka. Nazwę pliku obrazka należy umieścić w dyrektywie $BGF pod wspomnianą etykietą. Najlepiej dane umieścić na końcu programu po słowie END.

Można umieścić wiele obrazków, przy czym dla każdego z nich należy określić osobną etykietę.

Uwaga! Dane obrazka w pliku BGF są spakowane metodą RLE (Run Lenght Encoded – opartą na eliminacji powtórzeń bajtów – przyp. tłumacza) by zmniejszyć rozmiar zajmowanych danych.

Zobacz także: PSET , $BGF , CONFIG GRAPHLCD

Przykład:

'-----------------------------------------------------------------

'                   (c) 2001-2002 MCS Electronics

'-----------------------------------------------------------------

'SHOWPIC X , Y , etykieta

'Etykieta określa początek danych gdzie zapisany jest obrazek

Showpic 0 , 0 , Plaatje

Wait 2

Cls Text                             'skasuj tekst

End

'Tutaj znajduje się obrazek

Plaatje:

'Dyrektywa $BGF spowoduje umieszczenie danych obrazka w tym miejscu

 $bgf "mcs.bgf"

'Możesz dodać inne obrazki tutaj


Instrukcja SOUND

Przeznaczenie:

Wysyła ciąg impulsów na wybraną końcówkę portu.

Składnia:

SOUND  port , il_impulsów , czas_impulsu [, NOINIT ]

gdzie:

port	nazwa końcówki portu będącą linią wyjściową,
il_impulsów	ilość generowanych pełnych impulsów,
czas_impulsu	czas trwania pojedynczego impulsu.

Opis:

Gdy do podanej linii portu dołączony będzie głośniczek lub buzzer, można użyć instrukcji SOUND w celu generacji pojedynczych tonów.

Końcówka portu jest ustawiana w stan 0 i 1 w czasie trwania pełnego impulsu. Czas trwania tej sekwencji jest określony parametrem czas_impulsu. Liczba tych impulsów jest określona jako drugi parametr.

Podanie parametru NOINT spowoduje wyzerowanie bitu zezwolenia na przerwania i podczas generowania dźwięku żadne przerwania nie będą przyjęte. Po zakończeniu działania instrukcji SOUND zawartość rejestru IE (Interrupt Enable) zostaje odtworzona.

Uwaga! Instrukcja SOUND nie jest przeznaczona do generowania przebiegów o określonej częstotliwości. W tym celu najlepiej użyć przerwań jednego z sprzętowych liczników.

Zobacz także:

Przykład:

Sound P1.1 , 10000, 10       'generuj jakiś dźwięk

End


Funkcja SPACE()

Przeznaczenie:

Zwraca ciąg znaków wypełniony znakiem spacji.

Składnia:

zmienna = SPACE( il_spacji )

gdzie:

zmienna	zmienna typu String,
il_spacji	długość generowanego ciągu.

Opis:

Podanie zera jako parametru funkcji spowoduje utworzenie ciągu o długości 255 znaków. Spowodowane jest to brakiem testowania czy parametr jest równy 0.

Zobacz także: STRING , SPC

Przykład:

Dim s As String * 15, z As String * 15

s = Space(5)

Print " {" ; s ; " }"                 '{     }

Dim A As Byte

A = 3

S = Space(a)

Generowany kod dla 2 ostatnich linii:

; ---------- library routine -----------

_sStr_String:

Mov @r1,a

Inc r1

Djnz r2,_sStr_String

Clr a

Mov @r1,a

Ret

;---------------------------------------

Mov R1,#h'22 ; location of string

Mov R2,h'21  ; number of spaces

Mov a,#32

Acall _sStr_String


Funkcja SPC()

Przeznaczenie:

Drukuje określona liczbę spacji.

Składnia:

PRINT SPC( il_spacji )

gdzie:

il_spacji	ilość drukowanych spacji.

Opis:

Funkcja SPC może być używana w połączeniu z instrukcją PRINT oraz LCD.

Istnieje podobna funkcja SPACE. Różnicą jest, iż funkcja SPACE zwraca ciąg znaków składających się ze spacji, który można przypisać zmiennej tekstowej. Funkcja SPC może jedynie drukować spacje.

Używanie funkcji SPACE do drukowania spacji, powoduje, że tworzona jest tymczasowa zmienna w pamięci. Zaś funkcja SPC nie potrzebuje tej zmiennej gdyż działa bezpośrednio.

Uwaga! Podanie jako ilość spacji liczby zero spowoduje wydrukowanie 255 znaków spacji. Jest to spowodowane brakiem testowania czy podana liczba jest zerem.

Zobacz także: SPACE

Przykład:

Dim s As String * 15 , z As String * 15

Print "{"  ; Spc(5) ; "}"            '{     }

Lcd "{"  ; Spc(5) ; "}"              '{     }


Instrukcja SPIIN

Przeznaczenie:

Odczytuje dane przesłane przez interfejs SPI.

Składnia:

SPIIN  zmienna , il_bajtów

gdzie:

zmienna	zmienna do której wpisane będą odebrane bajty,
il_bajtów	ilość odczytanych bajtów.

Opis:

Zobacz także: SPIOUT , SPIINIT, CONFIG SPI

Przykład:

Dim a(10) As Byte

Config SPI = Soft, DIN = P1.0, DOUT = P1.1, CS = P1.2, CLOCK = P1.3

Spiinit                  'inicjalizacja interfejsu

Spiin a(1) , 4           'odczytuje 4 bajty


Instrukcja SPIINIT

Przeznaczenie:

Inicjalizuje programowy lub sprzętowy interfejs SPI.

Składnia:

SPIINIT

Opis:

Po skonfigurowaniu nazw końcówek używanych przez SPI, należy dokonać ich inicjalizacji, by ustalić kierunki ich działania. Gdy końcówki interfejsu SPI nie są używane w inny sposób w programie, instrukcję SPIINIT należy wykonać tylko raz.

Gdy inne procedury zmienią stan końcówek interfejsu SPI, należy powtórnie użyć instrukcji SPIINIT, przed użyciem SPIIN lub SPIOUT.

Zobacz także: SPIIN , SPIOUT, CONFIG SPI

Przykład:

Dim a(10) As Byte

Config SPI = Soft, DIN = P1.0, DOUT = P1.1, CS = P1.2, CLOCK = P1.3

Spiinit                  'inicjalizacja interfejsu

Spiin a(1) , 4           'odczytujmy 4 bajty


Instrukcja SPIOUT

Przeznaczenie:

Wysyła dane przez interfejs SPI.

Składnia:

SPIOUT zmienna , il_bajtów

gdzie:

zmienna	zmienna z której pochodzą wysyłane bajy,
il_bajtów	ilość wysyłanych bajtów.

Opis:

Zobacz także: SPIIN , SPIINIT, CONFIG SPI

Przykład:

Config SPI = Soft, DIN = P1.0, DOUT = P1.1, CS = P1.2, CLOCK = P1.3

Dim a(10) As Byte , X As Byte

Spiout a(1) , 5                      'wyślemy 5 bajtów

Spiout X , 1                         'i jeszcze jeden


Instrukcja START

Przeznaczenie:

Uruchamia określone urządzenie.

Składnia:

START urządzenie

gdzie:

urządzenie	nazwa symboliczna uruchamianego urządzenia.

Opis:

Instrukcja START powoduje włączenie (uruchomienie) podanego urządzenia. Jako parametr należy podać nazwę symboliczną urządzenia. W języku BASCOM BASIC zdefiniowano następujące nazwy urządzeń:

Nazwa	Typ urządzenia
TIMER0	Licznik TIMER0
TIMER1	Licznik TIMER1
TIMER2	Licznik TIMER2
COUNTER0 *)	Licznik TIMER0
COUNTER1 *)	Licznik TIMER1
WATCHDOG	Układ Watchgog, (Tylko dla kontrolera AT89s8232!)
*) Nazwa COUNTERx może być stosowana zamiennie z TIMERx.

Uwaga! Liczniki-czasomierze muszą zostać włączone by mogły generować przerwania (przy wyłączonym zewnętrznym bramkowaniu).

Zobacz także: STOP

Przykład:

On Timer0 label2

Load Timer0 , 100

Start Timer0

Do                                   'początek pętli

Loop                                 'pętla bez końca

End

label2:                              'tutaj będzie procedura obsługi przerwania

  Nop

Return


Instrukcja STOP

Przeznaczenie:

Zatrzymuje działanie programu lub określone urządzenie.

Składnia:

STOP

STOP urządzenie

gdzie:

urządzenie	nazwa symboliczna uruchamianego urządzenia.

Opis:

Pierwszy format instrukcji powoduje zatrzymanie działania programu. W tym celu jest wykonywana pusta pętla, podobnie jak w instrukcji END. Jednak przy instrukcji STOP nie są wyłączane przerwania.

Drugi format instrukcji STOP powoduje wyłączenie (zatrzymanie) podanego urządzenia. Jako parametr należy podać nazwę symboliczną urządzenia. W języku BASCOM BASIC zdefiniowano następujące nazwy urządzeń:

Nazwa	Typ urządzenia
TIMER0	Licznik TIMER0
TIMER1	Licznik TIMER1
TIMER2	Licznik TIMER2
COUNTER0 *)	Licznik TIMER0
COUNTER1 *)	Licznik TIMER1
WATCHDOG	Układ Watchgog, (Tylko dla kontrolera AT89s8232!)
*) Nazwa COUNTERx może być stosowana zamiennie z TIMERx.

Zobacz także: START , END

Przykład:

'--------------------------------------------------------------

'                 (c) 1997-2002 MCS Electronics

'--------------------------------------------------------------

'  plik: TIMER0.BAS

'  demo: ON TIMER0

'  *TIMER1 jest używany jako generator szybkości transmisji

'--------------------------------------------------------------

Dim Count As Byte , Gt As Byte

Config Timer0 = Timer , Gate = Internal , Mode = 2

'Timer0 = Timer   : timer0 jako licznik

'Gate = Internal  : brak zewnętrznego bramkowania

'Mode = 2         : tryb 8-bit z automatycznym przeładowaniem

On Timer0 Timer_0_int

Load Timer0 , 100                       'kiedy licznik zliczy 100 impulsów zgłoszone będzie przerwanie

Enable Interrupts                       'włącz globalny system przerwań

Enable Timer0                           'włącz przerwania licznika TIMER0

Rem Ustawiamy priorytet

Priority Set Timer0                     'TIMER0 ma wyższy priorytet

Start Timer0                            'uruchom licznik

Count = 0                               'utworzymy sobie licznik

Do

  Input "Liczba " , Gt

  Print "Wpisałeś : " ; Gt

Loop Until Gt = 1                       'powtarzaj dopóki użytkownik nie wprowadzi 1

Stop Timer0

End

Rem Procedura obsługi przerwania licznika TIMER0

Timer_0_int:

   Inc Count

   If Count = 250 Then

      Print "Timer0 wywołał przerwanie"

      Count = 0

   End If

Return


Funkcja STR()

Przeznaczenie:

Zwraca tekstową reprezentacje podanej liczby.

Składnia:

zmienna = STR( x )

gdzie:

zmienna	zmienna typu String do której wpisany będzie wynik działania funkcji,
x	dowolna zmienna lub stała, poddana konwersji.

Opis:

Zmienna String musi mieć odpowiednią długość, by pomieścić wszystkie znaki

Różnice w stosunku do QBasic-a.

W języku QBasic funkcja STR() dodaje na początku spację, w języku BASCOM BASIC spacja ta nie występuje.

Zobacz także: VAL

Przykład:

Dim a As Byte , S As XRAM String * 10

a = 123

s = Str(a)

Print s

End


Funkcja STRING()

Przeznaczenie:

Zwraca ciąg znaków wypełniony znakiem o podanym kodzie ASCII.

Składnia:

zmienna = STRING( il_znaków , kod_znaku )

gdzie:

zmienna	zmienna typu String,
il_znaków	długość generowanego ciągu,
kod_znaku	kod ASCII znaku wypełniającego ciąg.

Opis:

Ponieważ ciągi znaków w języku BASCOM BASIC zakończone są zawsze znakiem o kodzie zero, jako kod znaku nie można podać 0. Gdyż tak wygenerowany ciąg w rozumieniu języka BASCOM BASIC będzie pusty.

Podanie zera jako parametru il_znaków funkcji STRING, spowoduje utworzenie ciągu o długości 255. Jest to wynikiem braku testowania czy parametr jest równy 0.

Zobacz także: SPACE

Przykład:

Dim s As String * 15

s = String(5, 65)

Print " {" ; s ; " }"                '{AAAAA}


Instrukcja SUB

Przeznaczenie:

Rozpoczyna treść procedury użytkownika.

Składnia:

SUB nazwa [ ( parametr AS typ [, parametr AS typ] ) ]

   instrukcje procedury

END SUB

gdzie:

nazwa	nazwa procedury,
parametr	nazwa parametru procedury,
typ	typ przekazywanego parametru.

Opis:

Każda procedura musi być zakończona instrukcją END SUB.

Najlepiej skopiować deklarację procedury (instrukcja DECLARE SUB na początku programu) a następnie skasować słowo DECLARE. Można w ten sposób ustrzec się od błędów, polegających na różnicy pomiędzy częścią deklaracyjną a treścią procedury.

Parametry są zmiennymi globalnymi dla programu i należy je zdefiniować wcześniej instrukcją DIM. Dlatego zmienne te mogą być modyfikowane przez program główny jak i przez procedury. Ilustruje to przykład:

Dim a As Byte, b1 As Byte, c As Byte 'definicja zmiennych

Declare Sub Test(a As Byte)          'deklaracja procedury

a = 1 : b1 = 2: c = 3                'przypisz wartości zmiennym

Print a ; b1 ; c                     'wydrukuj

Call Test(b1)                        'wywołaj procedurę

Print a ; b1 ; c                     'wydrukuj wartości zmiennych

End

Sub Test(a As Byte)                  'początek procedury

  Print a ; b1 ; c                   'drukuj zmienne

End Sub

Zobacz temat DECLARE SUB by poznać dodatkowe szczegóły.


Instrukcja SWAP

Przeznaczenie:

Zamienia między sobą wartości podanych zmiennych.

Składnia:

SWAP zmienna1 , zmienna2

gdzie:

zmienna1	zmienna dowolnego typu, oprócz typu Single oraz tablicowego,
zmienna2	zmienna takiego samego typu co zmienna1.

Opis:

Po wykonaniu tej instrukcji zmienna1 będzie miała wartość zmiennej2 i na odwrót.

Przykład:

Dim a As Integer , b1 As Integer

a = 1 : b1 = 2                       'przypisujemy wartości

Swap a , b1                          'zamieniamy

Print a ; b1                         'wydrukuje 21


Instrukcja THIRDLINE

Przeznaczenie:

Ustawia kursor wyświetlacza LCD w trzeciej linii.

Składnia:

THIRDLINE

Opis:

Instrukcja ustawia kursor wyświetlacza na początek trzeciej linii.

Uwaga! Instrukcja działa tylko na wyświetlaczach posiadających cztery linie.

Zobacz także:  UPPERLINE , LOWERLINE , FOURTHLINE , LOCATE

Przykład:

Dim a As byte

a = 255

Thirdline

Lcd a

Home Upper

Lcd a

End


Funkcja UCASE()

Przeznaczenie:

Zamienia wszystkie znaki z ciągu na ich odpowiedniki w zestawie dużych liter.

Składnia:

zmienna = UCASE( ciąg )

gdzie:

zmienna	zmienna typu String, do której wpisany będzie wynik działania funkcji,
ciąg	ciąg którego znaki należy zamienić.

Opis:

Instrukcja nie rozpoznaje polskich znaków diakrytycznych.

Zobacz także: LCASE

Przykład:

Dim S As String * 12 , Z As String * 12

S = "Witaj swiecie"

Z = Lcase(s)

Print Z

Z = Ucase(s)

Print Z

End


Instrukcja UPPERLINE

Przeznaczenie:

Ustawia kursor wyświetlacza LCD w pierwszej linii.

Składnia:

UPPERLINE

Opis:

Zobacz także: LOWERLINE , THIRDLINE , FOURTHLINE

Przykład:

Lowerline

Lcd "Under"

Upperline

Lcd "Upr"


Funkcja VAL()

Przeznaczenie:

Zamienia tekstową reprezentację liczby na jej postać binarną.

Składnia:

zmienna = VAL( tekst )

gdzie:

zmienna	zmienna numeryczna do której wpisany będzie wynik działania funkcji,
tekst	zmienna tekstowa, zawierająca liczbę w postaci tekstu.

Opis:

Zobacz także: STR

Przykład:

Dim a As Byte , s As String * 10

s = "123"

a = Val(s)            'zamiana ciągu na liczbę

Print a

End


Funkcja VARPTR()

Przeznaczenie:

Zwraca adres pod jakim umieszczono podaną zmienną.

Składnia:

zmienna = VARPTR( zmienna2 )

gdzie:

zmienna	zmienna typu Integer lub Word do której wpisany będzie adres zmiennej2,
zmienna2	dowolna zmienna, której adres należy obliczyć.

Opis:

Zobacz także: PEEK , POKE

Przykład:

Dim I As Integer , W As Word

W = Varptr(I)

Printhex(w)                          ‘podaj adres zmiennej I

End


Instrukcja WAIT

Przeznaczenie:

Przerywa działanie programu na określony czas.

Składnia:

WAIT il_sekund

gdzie:

il_sekund	liczba określająca czas opóźnienie w sekundach.

Opis:

Instrukcja wstrzymuje działanie programu na podaną ilość sekund. Odmierzany czas jest wartością przybliżoną, więc nie należy stosować tej instrukcji do dokładnego odmierzania czasu. Używanie przerwań, może znacznie wydłużyć działanie instrukcji.

Zobacz także: DELAY , WAITMS

Przykład:

Wait 3                               'wstrzymanie działania programu na około 3 sekundy

Print "*"


Funkcja WAITKEY()

Przeznaczenie:

Funkcja wstrzymuje działanie programu do czasu pojawienia się w buforze transmisji szeregowej odebranego znaku.

Składnia:

zmienna = WAITKEY()

zmienna = WAITKEY( #nr_kanału )

gdzie:

zmienna	zmienna tekstowa lub numeryczna, do której wpisany będzie kod ASCII odebranego znaku,
nr_kanału	numer otwartego wcześniej kanału sprzętowego układu UART.

Opis:

Zobacz także: INKEY

Przykład:

Dim A As Byte

A = Waitkey()                        'czekamy na znak

Print A


Instrukcja WAITMS

Przeznaczenie:

Przerywa działanie programu na określony czas.

Składnia:

WAITMS czas

gdzie:

czas	liczba określająca czas opóźnienie w milisekundach, maksymalnie 255.

Opis:

Instrukcja wstrzymuje działanie programu na podaną ilość milisekund. Odmierzany czas jest wartością przybliżoną, więc nie należy stosować tej instrukcji do jego dokładnego odmierzania. Używanie przerwań, może znacznie wydłużyć działanie instrukcji.

Instrukcję przewidziano do generowania opóźnień przy transmisji magistralą I2C. Dla przykładu układ pamięci szeregowej potrzebuje około 10ms by zapisać dane. Instrukcja WAITMS pozwala na łatwe odmierzenie tego czasu.

Zobacz także: DELAY , WAIT

Przykład:

Waitms 10                            'wstrzymanie działania programu na około 10 milisekund

Print "*"


Instrukcja WHILE..WEND
Instrukcja WHILE-WEND

Przeznaczenie:

Wykonuje określony ciąg instrukcji dopóki warunek jest spełniony.

Składnia:

WHILE warunek

   ciąg_instrukcji

WEND

gdzie:

warunek	wyrażenie obliczane jako warunek pętli,
ciąg_instrukcji	dowolny ciąg instrukcji języka BASCOM BASIC.

Opis:

Instrukcja służy do konstruowania pętli programowych. Gdy podany warunek jest prawdziwy (zwraca wartość logicznej prawdy) wtedy wykonywany będzie ciąg instrukcji umieszczony pomiędzy WHILE a WEND.

Wyjście z pętli jest możliwe tylko gdy warunek nie będzie spełniony (zwróci wartość logicznego fałszu), lub też za pomocą instrukcji EXIT WHILE

Jest to instrukcja podobna do instrukcji DO..LOOP, z tą różnicą, że warunek jest obliczany przed wejściem do pętli. Gdy warunek nie będzie spełniony ciąg instrukcji nie zostanie wykonany.

Zobacz także: DO..LOOP

Przykład:

Dim a As Byte

a = 0

While a <= 10                        'jeśli a jest mniejsze lub równe 10 to

  Print a                            'drukujemy wartość a

  Incr a                             'i zwiększamy o jeden

Wend


Instrukcje READEEPROM, WRITEEEPROM

Przeznaczenie:

Instrukcje służą do odczytu i zapisu danych we wbudowanej w procesor pamięci EEPROM. Tylko układy AT89s8232.

Składnia:

READEEPROM zmienna [ , adres ]

WRITEEEPROM zmienna [ , adres ]

gdzie:

zmienna	dowolna zmienna języka BASCOM BASIC,
adres	adres komórki pamięci przeznaczonej do odczytu/zapisu. Może być z zakresu 0-2048.

Opis:

Procesory AT89s8232 posiadają wbudowaną pamięć EEPROM o pojemności 2KB.

W obu instrukcjach parametr adres jest opcjonalny. Jeśli pierwszy raz użyta zostanie instrukcja WRITEEEPROM, wtedy jako adres będzie przypisany adres podany w raporcie kompilacji.

Odmienna sytuacja wystąpi w instrukcji READEEPROM, tu należy podać adres lub użyć wcześniej w programie WRITEEEPROM.

Uwaga! Instrukcje te nie służą do odczytywania/zapisywania zewnętrznej pamięci EEPROM połączonej magistralą I2C z procesorem.

Przykład:

Dim S As String * 15 , S2 As String * 10

S = "Cześć" : S2 = "test"

Dim L As Long

L = 12345678

Writeeeprom S

Writeeeprom S2                          'zapisujemy tekst

Writeeeprom L                           'a tutaj zm. Long

S = "" : S2 = "" : L = 0                'zerujemy zmienne

Readeeprom L : Print L

Readeeprom S : Print S

Readeeprom S2 : Print S2

End


Wstawki asemblerowe

Rozkazy asemblera jako linie programu języka BASCOM BASIC.

Instrukcje mnemoniczne są rozpoznawane przez kompilator automatycznie. Jedynym wyjątkiem jest instrukcja SWAP, która także występuje w składni języka BASCOM BASIC. Aby kompilator wiedział o tym, że używany jest skrót mnemoniczny, należy ją poprzedzić znakiem wykrzyknika (!). Można go także umieszczać przed innymi instrukcjami asemblera.

Uwaga! W rozkazach rejestr ACC jest oznaczony jako A (z wyłączeniem operacji na bitach!).

Przykład:

Mov A,#10     'ok.

Mov Acc,#10   'także ok. choć zajmie o 1 bajt więcej

Setb Acc.0    'ok.

Setb A.0      'BŁĘDNIE!

Można także łączyć program w języku asemblera za pomocą dyrektywy $INCLUDE <plik.ASM>. Ma to tą zaletę, że wstawki w asemblerze mogą zostać ukryte.

Asembler pracuje w oparciu o standardowe mnemoniki zdefiniowane przez Intel-a. Pełna lista tych rozkazów znajduje się tutaj.

Dostęp do etykiet z poziomu asemblera.

Każda etykieta pojawiająca się w programie języka BASCOM BASIC jest zmieniana w taki sposób, że przed jej nazwą dodawana jest kropka.

Przykład:

Goto Test

Test:

zostanie przetłumaczony na kod:

LJMP .Test

.Test:

Gdy etykiety używane są tylko we fragmencie w asemblerze, można je poprzedzić znakiem wykrzyknika. Nie będą one wtedy zamieniane na te z kropką:

Jb P1.0, Test         ;brak kropki

!test:                ;określa etykietę w ASM

Można także samemu umieścić kropkę przed nazwą etykiety.

Inna godną polecenia alternatywą jest umieszczenie kodu programu w asemblerze stosując dyrektywy $ASM..$END ASM.

Przykład:

$asm

  Mov A , #1

 Test:

  Sjmp Test

$end asm

Sposób przechowywania zmiennych.

Zmienne typu Bit są umieszczone w bajtach. Zajmują one adresy 20h -2Fh, gdzie można umieścić 16 * 8 = 128 zmiennych. Żeby mieć dostęp do nich można używać:

Dim var As Bit      'dim variable

Setb {var}          ;ustaw bit

Clr {var}           ;skasuj bit

Print var           ;wydrukuj

End

lub też normalnych instrukcji języka BASCOM BASIC: SET oraz RESET, które robią dokładnie to samo.

Zmienne typu Byte umieszczane są tuż za zmiennymi bitowymi. Począwszy od adresu 20h + (ilość bajtów zajmowanych przez zmienne bitowe).

Zmienne typu Integer/Word są zapisywane według standardu Intela, najpierw bajt LSB, potem MSB. To samo dotyczy zmiennych typu Long – które zajmują 4 bajty.

Uwaga! Jest to inny sposób zapisu niż stosowany w BASCOM LT, w którym najpierw zapisywany jest bajt MSB. (standard Motoroli).

Można uzyskać dostęp do zmiennej umieszczając jej nazwę w nawiasach klamrowych { }. By mieć dostęp do bajtu MSB zmiennych Integer/Word, należy użyć formy: {zmienna+1}, dla zmiennych typu Long należy dodać trzy: {zmienna + 3}. Ilustrują to poniższe przykłady:

Dim t As Byte , c As Integer

Clr A               ;zerowanie rejestru ACC

Mov {t} , A         ;zerowanie zmiennej t

Inc {t}             ;t=t + 1

Mov {c} , {t}       ;c = t

Mov {c+0}, {t}      ;LSB zmiennej C = t  (nie trzeba podawać +0)

Mov {c+1}, {t}      ;MSB zmiennej C = t

Mov {c},#10         ;przypisanie wartości

Można zmieniać także zawartość rejestrów w przestrzeni SFR z poziomu języka BASIC.

P1 = 12             'to jest chyba jasne

Acc = 5             'to jest ok.

B = 3               'B to także rejestr SFR

Mul AB              'Acc = Acc * B

Print B; Acc

Zmienne w pamięci XRAM są umieszczane podobnie. Zmienne typu String zapisywane są w kolejnych bajtach i zakończone bajtem o wartości zero.

Przykład:

$ramstart = 0

Dim s As String * 10                 'rezerwacja 11 bajtów (10 + 1 na znak końca)

s = "abcde"                          'jakiś ciąg znaków

komórka ram 0 = a     (pierwsza komórka pamięci)

komórka ram 1 = b

komórka ram 2 = c

komórka ram 3 = d

komórka ram 4 = e

komórka ram 5 = #0

Zmienne umieszczone w pamięci XRAM są dostępne w trochę inny sposób:

Dim T As XRAM Byte

Mov DPTR,#{T}            ;adres zmiennej T do wskaźnika

Mov A,#65                ;umieść “A” w Acc

Movx @DPTR,A             ;wpisz do pamięci

Print T                  ;wydrukuj z BASIC-a

Dim T1 As XRAM Integer

Mov DPTR,#{T1}           ;ustaw wskaźnik

Mov A,#65                ;wpisz “A” w Acc (LSB)

Movx @DPTR,A             ;wpisz do pamięci

Inc DPTR                 ;przesuń wskaźnik

Mov A,#1                 ;1 do MSB

Movx @DPTR,A             ;wpisz do pamięci

Print T1                 ;wydrukuj z BASIC-a

Procedury pomocnicze.

Istnieją dwie nowe procedury pomocnicze, użyteczne podczas tworzenia kodu w asemblerze:

PLACEVALUE zmienna , SFR

PLACEADRES zmienna , SFR

PLACEVALUE przepisuje wartość zmiennej do określonego rejestru w przestrzeni SFR.

Placevalue 1 , ACC

wygeneruje kod:

Mov A,#1

A ten fragment:

Dim x As Byte

Placevalue x , R0

wygeneruje kod:

Mov A, h'3A              ;oczywiście tylko w tym przykładzie

Instrukcja może być przydatna w połączeniu z zmiennymi będącymi tablicami:

Placevalue a(x), RO

wygeneruje kod:

Mov R0,#h'3A

Mov A,@R0

Rl A

Add A,#h'1F

Mov R0,A

Mov A,@R0

Powyższe fragmenty kodu są przykładowe. Wygenerowany kod może odbiegać od tego schematu, gdyż w programie mogą być użyte innego typu zmienne.

Można przypisać tylko jeden SFR za pomocą instrukcji PLACEVALUE. Z pomocą przychodzi jednak instrukcja PLACEADRES, która umieszcza adres zmiennej w pamięci do podanego rejestru.

Placeadres ar(x) , ACC

Placeadres z , R0

Jeśli używane są zmienne, które umieszczono w pamięci XRAM, nie jest potrzebne podawanie rejestru gdzie adres ma trafić, gdyż używany jest zawsze rejestr DPTR.

Dim X As Xram Integer

Placeadres x , DPTR                  ‘lub PLACEADRES x

Wygeneruje kod:

Mov DPTR,#2

lub dla tablic::

Placeadres ar(x)

Mov DPTR,#2

Mov R0,#h'37

Mov A,@R0

Mov R2,A

Inc R0

Mov A,@R0

Mov R3,A

Mov R1,#1

Acall _AddIndex

Oczywiście to tylko przykłady, rzeczywista postać kodu zależy od typu i miejsca gdzie umieszczono zmienną (IRAM, XRAM).

Notacja szesnastkowa i binarna.

Aby używać zapisu liczb w postaci szesnastkowej, to można to zrobić w ten sposób:

Mov A,#h'AA

Jest to dość zawiły sposób, lecz można używać także notacji przyjętej przez BASIC:

Mov A,#&HAA

W instrukcjach asemblera można także używać zapisu binarnego.

Przykład:

Mov A,#&B10001000

Skoki z wykorzystaniem offsetu

Można określić o ile bajtów do przodu lub tyłu ma skoczyć program, bez używania etykiet.

Jb P1.0 , *+12           ;skok do przodu

Jb P1.0 , *-12           ;skok do tyłu

Jnb P1.0 , *+0           ;pętla powtarzana dopóki P1.0 pozostanie

                         ;w stanie wysokim

Rozwiązanie to jest dostępne także dla instrukcji, które zwykle skaczą pod podaną etykietę: SJMP, LJMP, DJNZ itd.

Wewnętrzny bufor przy konwersji liczb na ciąg znaków.

Podczas drukowania liczb instrukcją PRINT, czy konwersji liczb za pomocą funkcji STR() lub VAL(), używany jest wewnętrzny bufor o wielkości 16 bajtów. Zaletą tego rozwiązania jest zmniejszenie zapotrzebowania na stos, lecz wadą jest użycie zawsze 16 bajtów z puli pamięci RAM.

Oczywiście, jest on dostępny dla programu i posiada nazwę: ___TMP_S1. Jeśli więc w programie będzie potrzebny tymczasowy ciąg znaków można go użyć.

Uwaga! Bufor jest dostępny tylko gdy w programie występują powyższe instrukcje!

Przykład:

Dim s As Single

s = 1.1

Print s                              'używany jest bufor

___TMP_S1 = "Użyjemy go tu"

Print ___TMP_S1

Komentarze

Jako znaku rozpoczynającego komentarz można używać znaku ; lub też apostrofu - jak w programie w języku BASCOM BASIC:

Mov A,#1                             ;komentarz

Mov A,#2                             'komentarz


Lista rozkazów 8051
Lista rozkazów procesorów 8051

BASCOM BASIC rozpoznaje tylko te mnemoniki (rozkazy), które zdefiniowane zostały oficjalnie przez firmę Intel.

Mnemonik	Operand	Opis działania	Operacja	Zmieniane flagi	Ilość cykli
INSTRUKCJE PRZESYŁANIA DANYCH
MOV	A, Rr	Copy Register	ACC = Rr		1
MOV	A, ad	Copy Indirect	ACC = (ad)		1
MOV	A, @Ri	Copy Indexed	ACC = (Ri)		1
MOV	A, #n	Copy Direct	ACC = n		1
MOV	Rr, A	Copy Register	Rr = ACC		1
MOV	Rr, ad	Copy Indirect	Rr = (ad)		2
MOV	Rr, @Ri	Copy Indexed	Rr = (Ri)		1
MOV	Rr, n	Copy Direct	Rr = n		1
MOV	ad, A	Copy Indirect	(ad) = ACC		2
MOV	ad, Rr	Copy Register To Adres	(ad) = Rr		2
MOV	ad, @Ri	Copy Indexed To Adres	(ad) = (Ri)		2
MOV	ad, #n	Copy Direct To Adres	(ad) = n		2
MOV	@Ri, A	Copy Accumulatro To Indexed	(Ri) = ACC		1
MOV	@Ri, ad	Copy Indirect To Indexed	(Ri) = (ad)		2
MOV	@Ri, #n	Copy Direct To Indexed	(Ri) = n		1
MOV	DPTR, nn	Store Direct To Data Pointer	DPTR = nn		2
XCH	A, Rr	Exchange Registers	ACC <-> Rr		1
XCH	A, ad	Exchange Indirect	ACC <-> (ad)		1
XCH	A, @Ri	Exchange Indexed	ACC <-> (Ri)		1
XCHD	A, @Ri	Exchange Nibble Indexed	ACC3-0 <-> (Ri)3-0		1
MOVX	A, @Ri	Store From External RAM	ACC = (Ri)		2
MOVX	@Ri, A	Store To External RAM	(Ri) = ACC		2
MOVX	A, @DPTR	Store From External RAM 16-bit Adress	ACC = (DPTR)		2
MOVX	@DPTR, A	Store To External RAM 16-bit Adress	(DPTR) = ACC		2
MOVC	A, @A+DPTR	Store From Code Memory	ACC = (DPTR + ACC)		2
MOVC	A, @A+PC	Store From Code Memory	ACC = (PC + ACC)		2
OPERACJE ARYTHMETYCZNE I LOGICZNE
ADD	A, Rr	Add Register Without Carry	ACC = ACC + Rr	CY, AC, OV	1
ADD	A, ad	Add Indirect Without Carry	ACC = ACC + (ad)	CY, AC, OV	1
ADD	A, @Ri	Add Indexed Without Carry	ACC = ACC + (Ri)	CY, AC, OV	1
ADD	A, #n	Add Without Carry	ACC = ACC + n	CY, AC, OV	1
ADDC	A, Rr	Add Direct With Carry	ACC = ACC + Rr + CY	CY, AC, OV	1
ADDC	A, ad	Add Indirect With Carry	ACC = ACC + (ad) + CY	CY, AC, OV	1
ADDC	A, @Ri	Add Indexed With Carry	ACC = ACC + (Ri) + CY	CY, AC, OV	1
ADDC	A, #n	Add With Carry	ACC = ACC + n + CY	CY, AC, OV	1
SUBB	A, Rr	Substract Direct With Carry	ACC = ACC – Rr - CY	CY, AC, OV	1
SUBB	A, ad	Substract Indirect With Carry	ACC = ACC – (ad) – CY	CY, AC, OV	1
SUBB	A, @Ri	Substract Indexed With Carry	ACC = ACC – (Ri) – CY	CY, AC, OV	1
SUBB	A, #n	Substract With Carry	ACC = ACC – n  - CY	CY, AC, OV	1
INC	A	Increment Accumulator	ACC = ACC + 1		1
INC	Rr	Increment Register	Rr = Rr + 1		1
INC	ad	Increment Idirect	(ad) = (ad) + 1		1
INC	@Ri	Increment Indexed	(Ri) = (Ri) + 1		1
INC	DPTR	Increment Data Pointer	DPTR = DPTR + 1		2
DEC	A	Decrement Accumulator	ACC = ACC - 1		1
DEC	Rr	Decrement Register	Rr = Rr – 1		1
DEC	ad	Decrement Indirect	(ad) = (ad) - 1		1
DEC	@Ri	Decrement Indexed	(Ri) = (Ri) - 1		1
MUL	AB	Multilpy A With B	B.ACC = ACC x B	CY, OV	4
DIV	AB	Divide A With B	ACC = [ACC / B]	CY, OV	4
DA	A	Decimal Correction			1
ANL	A, Rr	Logical AND	ACC = ACC ^ Rr		1
ANL	A, ad	Logical AND	ACC = ACC ^ (ad)		1
ANL	A, @Ri	Logical AND	ACC = ACC ^ (Ri)		1
ANL	A, #n	Logical AND	ACC = ACC ^ n		1
ANL	ad, A	Logical AND	(ad) = (ad) ^ ACC		1
ANL	ad, #n	Logical AND	(ad) = (ad) ^ n		2
ORL	A, Rr	Logical OR	ACC = ACC v Rr		1
ORL	A, ad	Logical OR	ACC = ACC v (ad)		1
ORL	A, @Ri	Logical OR	ACC = ACC v (Ri)		1
ORL	A, #n	Logical OR	ACC = ACC v n		1
ORL	ad, A	Logical OR	(ad) = (ad) v A		1
ORL	ad, #n	Logical OR	(ad) = (ad) v n		2
XRL	A, Rr	Logical Exclusive OR	ACC = ACC (+) Rr		1
XRL	A, ad	Logical Exclusive OR	ACC = ACC (+) (ad)		1
XRL	A, @Ri	Logical Exclusive OR	ACC = ACC (+) (Ri)		1
XRL	A, #n	Logical Exclusive OR	ACC = ACC (+) n		1
XRL	ad, A	Logical Exclusive OR	(ad) = (ad) (+) A		1
XRL	ad, #n	Logical Exclusive OR	(ad) = (ad) (+) n		2
CLR	A	Clear Accumulator	ACC = 0		1
CPL	A	Complement Accumulator	ACC = NOT ACC		1
SWAP	A	Swap Nibbles	ACC.3-ACC.0 <-> ACC.7-ACC.4		1
RL	A	Rotate Left Accumulator	ACC.(n+1) = ACC.n, n=0..6		1
RLC	A	Rotate Left Accumulator Through Carry	ACC.(n+1) = ACC.n, ACC.0=CY, CY=ACC.7	CY	1
RR	A	Rotate Right Accumulator	ACC.n = ACC.(n+1), n = 0..6		1
RRC	A	Rotate Right Accumulator Through Carry	ACC.n = ACC.(n+1), A.7 = CY, CY = A.0	CY	1
OPERACJE NA BITACH
CLR	C	Clear Carry	CY = 0	CY	1
CLR	bit	Clear Bit	(bit) = 0		1
SETB	C	Set Carry	CY = 1	CY	1
SETB	bit	Set Bit	(bit) = 1		1
CPL	C	Complement Carry	CY = NOT CY	CY	1
CPL	bit	Complement Bit	(bit) = (bit) NOT (bit)		1
ANL	C, bit	Logical AND Carry with Bit	CY = CY ^ (bit)	CY	2
ANL	C, /bit	Logical AND Carry with Complement Bit	CY = CY ^ NOT (bit)	CY	2
ORL	C, bit	Logical OR Carry with Bit	CY = CY v (bit)	CY	2
ORL	C, /bit	Logical OR Carry with Complement Bit	CY = CY v NOT (bit)	CY	2
MOV	C, bit	Move Bit To Carry	CY = (bit)	CY	1
MOV	bit , C	Move Carry To Bit	(bit) = CY		1
INSTRUKCJE STERUJĄCE I SKOKÓW
NOP		No Operate	Do nothing		1
AJMP	adr11	Jump On Page	PC10-0 = adr11		2
LJMP	adr16	Long Jump	PC = adr16		2
SJMP	d	Relative Jump	PC = PC + d		2
JMP	@A+DPTR	Jump To Point Of Data Pointer With Index In Accumulator	PC = ACC + DPTR		2
JC	d	Jump If Carry Set	if CY=1 then PC = PC + d		2
JNC	d	Jump If Carry Not Set	if CY = 0 then PC = PC + d		2
JZ	d	Jump If Zero	if ACC = 0 then PC = PC + d		2
JNZ	d	Jump If Not Zero	if ACC <> 0 then PC = PC + d		2
JB	bit, d	Jump If Bit Set	if (bit) = 1 then PC = PC + d		2
JNB	bit, d	Jump If Bit Not Set	if (bit) = 0 then PC = PC + d		2
JBC	bit, d	Jump If Bit Set And Clear Bit	if (bit) = 1 then PC = PC + d  (bit) = 0		2
CJNE	A, ad, d	Compare Jump If Not Equal	If ACC <> (ad) then PC = PC + d	CY	2
CJNE	A, #n, d	Compare Jump If Not Equal	If ACC <> n then PC = PC + d	CY	2
CJNE	Rr, #n, d	Compare Jump If Not Equal	if Rr <> n then PC = PC + d	CY	2
CJNE	@Ri, #n, d	Compare Jump If Not Equal	If (Ri) <> n then PC = PC + d	CY	2
DJNZ	Rr, d	Decrement And Jump If Not Zero	Rr = Rr – 1 If Rr <> 0 Then PC = PC + d		2
DJNZ	ad, d	Decrement And Jump If Not Zero	(ad) = (ad) – 1 If Rr <> 0 Then PC = PC + d		2
PODPROGRAMY I OPERACJE NA STOSIE
ACALL	adr11	Subroutine Call On Page	SP = SP + 1  (SP) = PC7-0  SP = SP + 1  (SP) = PC15-8  PC10-0 = adr11		2
LCALL	adr16	Long Subroutine Call	SP = SP + 1  (SP) = PC7-0  SP = SP + 1  (SP) = PC15-8  PC = adr16		2
RET		Return From Subroutine	PC15-8 = (SP) SP = SP – 1 PC7-0 = (SP) SP = SP – 1		2
RETI		Return From Interrupt Handle Routine	PC15-8 = (SP) SP = SP – 1 PC7-0 = (SP) SP = SP – 1		2
PUSH	ad	Push On Stack	SP = SP + 1 (SP) = (ad)		2
POP	ad	Pop From Stack	(ad) = (SP) SP = SP - 1		2
Asembler nie rozróżnia wielkich i małych liter.

Skróty w opisie operandów oznaczają:

Rr	rejestr roboczy R0-R7
Ri	rejestr roboczy R0-R1 jako indeks
n	stała (0-255)
nn	stała (0-65535)
bit	adres bitu w pamięci adresowanej bitowo
ad	8 bitowy adres bezpośredni
adr 11	11 bitowy adres (na stronie)
adr 16	16 bitowy adres
d	przesunięcie (-128 – 127)
@	poprzedza adres pośredni
#	poprzedza argument bezpośredni

Od tłumacza:

Pozostawiłem angielskie opisy rozkazów, gdyż po przetłumaczeniu ich na polski nie będą kojarzyć się ze skrótami mnemonicznymi. Niektóre z nich mogą odbiegać od przyjętej nomenklatury.


Rejestry specjalne procesorów 8051
Rejestry specjalne

Poniżej znajduje się tabela adresów wszystkich rejestrów specjalnych procesorów 8051. Wszystkie nazwy rejestrów są rozpoznawane przez język BASCOM BASIC.

Adres bajtu	Nazwa rejestru	Bit 7	Bit 6	Bit 5	Bit 4	Bit 3	Bit 2	Bit 1	Bit 0
		$FF	$FE	$FD	$FC	$FB	$FA	$F9	$F8
$FF		-	-	-	-	-	-	-	-
		$F7	$F6	$F5	$F4	$F3	$F2	$F1	$F0
$F0	B	B.7	B.6	B.5	B.4	B.3	B.2	B.1	B.0
		$EF	$EE	$ED	$EC	$EB	$EA	$E9	$E8
$EF		-	-	-	-	-	-	-	-
		$E7	$E6	$E5	$E4	$E3	$E2	$E1	$E0
$E0	ACC	ACC.7	ACC.6	ACC.5	ACC.4	ACC.3	ACC.2	ACC.1	ACC.0
		$DF	$DE	$DD	$DC	$DB	$DA	$D9	$D8
$D8		-	-	-	-	-	-	-	-
		$D7	$D6	$D5	$D4	$D3	$D2	$D1	$D0
$D0	PSW	CY	AC	F0	RS1	RS0	OV	-	P
$CD	TH2	Bajt MSB licznika TIMER2
$CC	TL2	Bajt LSB licznika TIMER2
$CB	RCAP2H	Bajt MSB rejestru przechwytywania licznika TIMER2
$CA	RCAP2L	Bajt LSB rejestru przechwytywania licznika TIMER2
		$CF	$CE	$CD	$CC	$CB	$CA	$C9	$C8
$C8	T2CON	TF2	EXF2	RCLK	TCLK	EXEN2	TR2	C/T2	CP/RL2
		$C7	$C6	$C5	$C4	$C3	$C2	$C1	$C0
$C0		-	-	-	-	-	-	-	-
		$BF	$BE	$BD	$BC	$BB	$BA	$B9	$B8
$B8	IP	-	-	PT2	PS	PT1	PX1	PT0	PX0
		$B7	$B6	$B5	$B4	$B3	$B2	$B1	$B0
$B0	P3	P3.7	P3.6	P3.5	P3.4	P3.3	P3.2	P3.1	P3.0
		$AF	$AE	$AD	$AC	$AB	$AA	$A9	$A8
$A8	IE	EA	-	ET2	ES	ET1	EX1	ET0	EX0
		$A7F	$A6	$A5	$A4	$A3	$A2	$A1	$A0
$A0	P2	P2.7	P2.6	P2.5	P2.4	P2.3	P2.2	P2.1	P2.0
$99	SBUF	Bufor transmisji układu UART
		$9F	$9E	$9D	$9C	$9B	$9A	$99	$98
$98	SCON	SM0	SM1	SM2	REN	TB8	RB8	TI	RI
		$97	$96	$95	$94	$93	$92	$91	$90
$90	P1	P1.7	P1.6	P1.5	P1.4	P1.3	P1.2	P1.1	P1.0
$8D	TH1	Bajt MSB licznika TIMER1
$8C	TH0	Bajt MSB licznika TIMER0
$8B	TL1	Bajt LSB licznika TIMER1
$8A	TL0	Bajt LSB licznika TIMER0
$89	TMOD	Bajt sterujący trybem pracy liczników TIMER0 i TIMER1
		$8F	$8E	$8D	$8C	$8B	$8A	$89	$88
$88	TCON	TF1	TR1	TF0	TR0	IE1	IT1	IE0	IT0
$87	PCON	SMOD	-	-	-	GF1	GF0	PD	IDL
$83	DPH	Rejestr DPTR część MSB
$82	DPL	Rejestr DPTR cześć LSB
$81	SP	Wskaźnik stosu
		$87	$86	$85	$84	$83	$82	$81	$80
$80	P0	P0.7	P0.6	P0.5	P0.4	P0.3	P0.2	P0.1	P0.0
1. Cztery młodsze bity w rejestrze PCON są dostępne tylko dla układów CHMOS.

2. Kursywą zaznaczono adresy bitów w rejestrach, które mogą być adresowane bitowo.

Nazwy rejestrów i niektórych bitów, oraz ich adresy w przestrzeni adresowej SFR, są zdefiniowane w poszczególnych plikach DAT. Pliki te znajdują się w katalogu głównym programu BASCOM 8051.

Rejestry mogą być używane jako normalne zmienne typu Byte. Na przykład:

   P1 = 40

spowoduje umieszczenie liczby 40 w rejestrze portu P1.

Aby jednak mieć dostęp do konkretnego bitu rejestru należy używać:

   P1.3 = 1

spowoduje to ustawienie bitu 3 w rejestrze P1.

Uwaga! Adresowanie bitów dotyczy tylko tych rejestrów które to umożliwiają. Dlatego próba umieszczenia w programie instrukcji TMOD.1 = 1 nie powiedzie się.

Uwaga! Nazwy rejestrów są zastrzeżone, zatem nie mogą stać się nazwą jakiejkolwiek zmiennej definiowanej przez użytkownika! Na przykład:

   Dim ACC As Byte