Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Справочник по программировани BASCOM-8051 (М.Л. Кулиш, 2001).pdf
Скачиваний:
421
Добавлен:
12.08.2013
Размер:
6.93 Mб
Скачать

===================================== Справочник по программированию «Bascom-8051» ==

 

3. Системные соглашения

 

 

Элементы

Назначение и применение элементов языка Bascom

 

0…9, @, #, $, %, !, &, (, ), {, }, _, A…Z (строчные a…z равноценны прописным)

Символы

Знаки

Пробел (blank or space)

Апростроф (Single quotation mark или apostrophe)

*Звездочка или знак умножения (asterisks)

+Плюс или знак сложения (plus sign)

,Запятая - разделитель операндов (comma)

-Тире или минус или знак вычитания (minus sign)

. Точка разделитель или десятичная точка (period or decimal point)

/Дробная черта или знак деления (slash or division symbol)

:Двоеточие - разделитель операций, определяет метки (colon)

«Двойные кавычки - определитель текстовых констант (double quotation mark)

;Точка с запятой (semicolon) - разделитель данных, знак комментариев в ассемблере

<Знак отношения значений - меньше чем (less than)

=Знак равенства и присвоения значения (equal sign)

>Знак отношения значений - больше чем (greater than)

\

Обратная дробь (backslash) - знак деления целых чисел

Переменные

 

 

 

Bit

Один двоичный разряд, расположенный в битовой области процессора (все биты от 0 до

 

255). Принимают значения 0 или 1.В некоторых случаях доступны, как биты, отдельные

 

разряды 8-, 16- и 32-битных переменных. Однако, биты регистров, находящихся вне зона

 

битовой адресации, не могут быть именованы, как полноценные битовые переменные (их

Byte

адрес не может быть определен как число).

8 битное число - диапазон значений от 0 до 255 (00 – FFh)

Word

16 битное число - диапазон значений от 0 до 65535 (0000 – FFFFh)

Integer

16 битное число (переменная со знаком) – диапазон значений от 0 до 32767 (0000 – 7FFFh) и

Long

от минус 1 до минус 32768 (FFFFh – 8000h)

32 битное число (переменная со знаком) – диапазон значений от 0 до 2147483647 (00000000 -

String

7FFFFFFFh) и от минус 1 до минус 2147483648 (FFFFFFFFh – 80000000h)

Текстовая строка с разделителем 00h, удлиняющим ее на единицу. Длина строки может

Single

достигать 254 байт символов. Пустая строка читается как 00h – только разделитель.

Число с плавающей точкой в стандарте IEEE. Порядок от минус 127 до +127. Три байта

 

нормализованной мантиссы длиной в 24 бита. Старший бит мантиссы не записывается, так

 

как предполагается, что он всегда равен 1, т.е. число считается нормализованным.

 

31 30________23 22______________________________0

Array

знак

порядок

мантисса.

Массив переменных содержит последовательность элементов одного типа. Каждый элемент

 

массива имеет,

определяющий

его, собственный порядковый номер - индекс (index).

 

Изменения (действия) могут производиться с любым элементом массива независимо от

 

остальных. Индекс может числовой константой, байтом или словом (integer или word).

 

Массив может содержать до 65535 элементом. Нумерация элементов массива начинается с

 

первого номера, например, массив Ar из десяти элементов содержит элементы от Ar(1) до

 

Ar(10). Внимание! Не все операторы могут работать с переменными из массива.

Константы

Числовые значения, используемые в программе, могут быть определены с использованием

 

символьного имени и указанием типа. Задаваемые константы должны иметь все те же типы,

 

что и переменные. При использовании такой константы в дальнейшем используется только

 

имя. Можно записывать числовое значение константы и непосредственно в качестве

 

операнда, как значение бита, двоичное число, шестнадцатеричное число, десятичное целое

 

число, число с десятичной точкой. Формат записываемого числа должен соответствовать

 

типу переменной, с которой производится операция. Строковые константы записываются в

 

виде текстовой строки в двойных кавычках.

Числа

1, 23, 4567 – десятичные, в естественном виде. Обычно так записываются целые числа.

 

&HA, &HFEE, &H001023F0 – шестнадцатеричные с префиксом &H. &B0001, &10111101-

 

двоичные с префиксом &B 12.34 – с десятичной точкой. Эти числа преобразуются в формат

 

с плавающей точкой. -123, -10000 – целые отрицательные числа. Эти числа преобразуются в

 

отрицательные двоичные целые числа и записываются в дополнительном коде. Если

 

десятичному числу соответствует переменная типа Single, число преобразуется в формат с

============================================================================= 3-1

===================================== Справочник по программированию «Bascom-8051» ==

плавающей точкой. Для тех случаев, когда компилятор не может определить тип задаваемой константы, например, при заполнении полей непосредственных данных с помощью оператора Data, следует добавлять к числу суффикс. 0 , 1 , 2 , 3 , 4 , 20, &HFF, &B00101111 - данные, записанные без суффикса, воспринимаются как байтовые константы. 1000% , 2000% , &hAD1C%. - двухбайтовые константы (word и integer). 1000& , 20000000& -

четырехбайтовые константы (long). 1111! , 10000000! - константы в формате с плавающей точкой (single).

Имена Любые имена, за исключением зарезервированных слов Bascom, длиной от одного до 32 переменных, символов и начинающиеся с буквы. Можно применять символы только латинского алфавита констант от A до Z, цифры и символ _ (подчеркиватель как псевдопробел). Различий между и меток прописными и строчными символами не делается. Общепринятые имена всех внутренних служебных регистров (SFR) также входят в состав применяемых переменных, если они определены в момент компиляции. SFR определяются содержанием действующего файла type.dat, в котором указаны их имена и соответствующие им адреса. Общепринятые имена

битов необходимо определять в программе Бейсика как части байтовых регистров.

Знак действия Знак действия: присвоения переменной цифрового или символьного значения (загрузка

=переменной), выравнивания значений правой и левой части выражений (арифметические или логические действия), выравнивание значений переменных (перезапись или преобразование формата данных). Каждый знак « = » должен соответствовать только одному действию! Преобразование форматов – это тоже действие!

Знаки отношения Соответствуют следующим операциям сравнения (применимы с переменными типа):

=Равенство (Equality) - X = Y. (Const, Bit, Byte, Word, Integer, Long, String, Single)

<>

Неравенство (Inequality) - X <> Y. (Const, Bit, Byte, Word, Integer, Long, String, Single)

<Меньше чем (Less than) - X < Y. (Const, Byte, Word, Integer, Long, Single)

>Больше чем (Greater than) - X > Y. (Const, Byte, Word, Integer, Long, Single)

<=

Меньше или равно (Less than or equal) - X <= Y. (Const, Byte, Word, Integer, Long, Single)

>=

Больше или равно (Greater than or equal) - X >= Y. (Const, Byte, Word, Integer, Long, Single)

Знаки

 

логических

Соответствуют следующим логическим операциям (с переменными типа Сonst, Bit, Byte,

операций

Word, Integer, Long):

NOT

Инверсия (complement): 0 = NOT 1, 1 = NOT 0

AND

И (Conjunction) : 1 = 1 AND 1, 0 = 1 AND 0 = 0 AND 0

OR

ИЛИ (Disjunction): 1 = 1 OR 1 = 0 OR 0, 0 = 0 OR 0

XOR

Исключающее ИЛИ (Exclusive or): 1 = 1 XOR 0, 0 = 0 XOR 0 = 1 XOR 1

Знаки

 

арифметических

Соответствуют следующим арифметическим операциям (с переменными типа):

операций

 

+Сложение. (Const, Byte, Word, Integer, Long, String*, Single).

-Вычитание. (Const, Byte, Word, Integer, Long, Single)

*Умножение. (Const, Byte, Word, Integer, Long, Single)

/ или \

Деление (Const, Byte, Word, Integer, Long, Single)

 

* - строковые переменные складываются не арифметически.

============================================================================= 3-2

===================================== Справочник по программированию «Bascom-8051» ==

 

4. Директивы, операторы и функции Bascom-8051

 

$ASM - $END ASM

 

 

 

 

 

Действие:

Обозначают начало и конец блока на языке ассемблера, вставляемого в текст программы на

 

Бейсике. Использование $ASM допускается только вместе с $END ASM.

 

Пример:

$asm Mer:

 

 

 

 

 

 

Mov r0,#{C} ;address of c

 

 

 

 

Mov a,#1

;store 1 into var c

 

 

 

Mov @r0,a

 

 

 

$end Asm

 

 

 

 

 

 

Примечание. Смотри раздел «Правила оформления ассемблерных вставок»

 

$BAUD, $CRYSTAL

 

 

 

 

 

Действие:

$BAUD – устанавливает скорость обмена асинхронного интерфейса (UART). Данная директива

 

активизируется только при использовании команд PRINT, INPUT и обычно используется в

 

блоке инициализации микроконтроллера. Также необходимо указывать и частоту кварцевого

 

генератора (резонатора)

с помощью директивы

$CRYSTAL (иначе значение будет взято из

 

панели параметров компилятора).

Внимание!

Если в тексте программы не применяются

 

операторы типа PRINT

и INPUT,

то инициализация автоматически не выполняется - в таймер

 

не загружается значение коэффициента деления и не устанавливается режим последевательного

 

интерфейса, Для этого нужно добавить дополнительные операторы инициализации таймера и

Синтаксис:

запустить таймер (см. пример).

 

var1, var2 – константы,

 

$BAUD = var1 ; $CRYSTAL = var2

численно равные

 

соответственно скорости в бодах и тактовой частоте в герцах (частоте кварца).

 

Пример:

$Baud = 2400

$Crystal = 12000000

‘ 12 MHz crystal

 

Config Timer2 = Timer , Gate = Internal , Mode = 2 ‘для Timer2

 

Scon = &h52 : Rcap2h = &hff : Rcap2l = &h64 : Start Timer2 '*

 

‘вариант для Timer1

 

 

 

 

Config Timer1 = Timer , Gate = Internal , Mode = 2 ‘для Timer1

 

Scon = &h52 : Pcon = &H80 : Th1 = &he6 : Start Timer1

'*

 

'* - эти строки добавляются, если в программе отсутствуют

 

 

'операторы типа Print и Input, но послед. интерфейс используется

 

'другим способом

 

 

 

 

$DEFAULT XRAM

 

 

 

 

 

Действие:

После этой директивы компилятор начинает располагать каждую переменную во внешней

 

памяти. Если какую-либо переменную после этого нужно расположить во внутренней памяти, к

 

ней необходимо дополнительно применить указание IRAM

 

Пример:

$default Xram

 

‘во внешней памяти XRAM

 

 

Dim X As byte

 

 

 

Dim Y As Integer

‘тоже в XRAM

 

 

 

Dim Z As IRAM Integer ‘эта переменная определена в памяти IRAM

$EXTERNAL

 

 

 

 

 

 

Действие:

Директива, определяющая используемую ассемблерную подпрограмму или подпрограммы

 

пользователя. Это позволяет включать с процесс ассемблирования только необходимые для

 

данного случая подпрограммы из всех, содержащихся в библиотеке. Однако, последнее в данной

Синтаксис:

версии пока не работает – включается вся библиотека.

 

$EXTERNAL myrout

[, other] myrout – имя подпрограммы.

 

Пример:

$LIB "mylib.lib"

 

 

 

 

 

$EXTERNAL _dec76

 

 

 

 

$INCLUDE

Действие: Включить в процесс компиляции данной программы ASCII (текстовый) файл с текущей позиции. В подключаемом файле должны содержаться только определения, предусмотренные BASCOM.

Синтаксис: $INCLUDE <имя файла>

Пример: $include [c:\bascom\]123.bas ‘[полный путь] и имя

============================================================================= 4-1

===================================== Справочник по программированию «Bascom-8051» ==

$IRAMSTART

Действие:

Синтаксис: Пример:

$LARGE

Действие:

Пример:

$LCD

Действие:

Синтаксис: Пример:

$LIB

Действие:

Синтаксис: Пример:

$MAP

Действие:

Пример:

$NOBREAK

Действие:

Пример:

Устанавливает начальное значение распределения переменных во внутренней памяти. Применяется совместно с директивами $NOINIT и $NOSP, отменяющими автоматичекую инициализацию микроконтроллера и установку стека.

$IRAMSTART = constant Constant - начальное значение (0-255)

$NOINIT

‘отменяет

инициализацию процессора

$NOSP

‘отменяет

инициализацию стека

$IRAMSTART = &H60 ‘начальное

значение распределения памяти

SP = 80

‘назначить

стек

Устанавливает модель большой памяти (более 2 КБайт). При этом компилятор начинает использовать команды Lcall и Ljmp.

$LARGE ‘при компиляции появляется сообщение об ошибке 148, ‘когда требуется эта директива

Устанавливает адрес и режим обращения к символьному индикатору в 8-битном режиме, и подключенном к шине данных процессора D0…D7 (при использовании дополнительной команды LCDBUS = 4 в 4-битном режиме с подключение к D4…D7). Линия «E» индикатора подключается через инвертор к линии процессора «Wr»(P3.6). Линия «RS» подключается к формирователю адреса A0 (регистру, защелкиваемому сигналом ALE). Линия «RW» индикатора заземляется, т.к. чтение из индикатора не производится

$LCD = [&H] address address - 16-разрядный.

$LCD = &ha000 ‘обращение к индикатору по адресу a000h,a001h LCD «Hello world»

Директива, указывающая имя файла (в директории /LIB), содержащего необходимые подпрограммы. Это прием позволяет не включать каждый раз ассемблерные подпрограммы в текст программы Бейсика и держать их в отдельном файле.

$LIB myfile.lib myfile.lib – имя файла.

$LIB "mylib.lib" ‘указать имя файла библиотеки $EXTERNAL _dec76 ‘указать используемую подпрограмму

Указывает компилятору на необходимость записывать в файле сообщений шестнадцатеричный адрес начала исполняемого кода каждой строки исходного текста программы. Применяется для облегчения отладки программы.

$MAP

A = A – F Print "Hello" Print "Test"

Будет записано в соответствующей секции файла сообщений :

Code map

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

Line Address(hex)

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

2

152

3

169

5

180

Указывает компилятору на необходимость пропускать операторы Break», имеющиеся в тексте

программы,

и таким образом позволяет не убирать их из окончательного текста программы.

$Nobreak

‘пропускать все команды останова отладчика

============================================================================= 4-2

===================================== Справочник по программированию «Bascom-8051» ==

$NOINIT

Действие:

Пример:

$NOLCDINIT

Действие: Синтаксис:

$NONAN

Действие:

Пример:

$NONULL

Действие:

Пример:

$NOSP

Действие:

Пример:

$OBJ

Действие: Синтаксис: Пример:

$RAMSIZE

Действие: Синтаксис: Пример:

$RAMSTART

Действие: Синтаксис: Пример:

$REGFILE

Действие:

Синтаксис: Пример:

Отменяет автоматическую инициализацию процессора параметрами, установленными в меню «Options» - «Compiler» программы «Bascom». Так как данная директива отменяет все виды инициализации, то при ее использовании необходимо полностью сконфигурировать систему, включая установку начального адреса внутренней памяти (директивой Iramstart). Задаваемые в тексте программы параметры внутреннего и внешнего оборудования (директивы Config) имеют более высокий приоритет и обычно не требуют применения директивы $Noinit. $NOINIT ‘отменяет инициализацию процессора

$IRAMSTART = &H60 ‘начальное значение распределения памяти

Директива, запрещающая инициализацию LCD. $NOLCDINIT

Заменяет вывод сообщения “NAN” на сообщение “0.0” в тех случаях, когда выводимое значение переменной в формате с плавающей точкой при преобразовании в строковую переменную не может быть представлено как число (выходит за пределы формата отображения, т.к. очень маленькое или очень большое или при вычислениях произошло произошло переполнение). $NONAN 'отменяет сообщение “NAN”

$NONULL = 0 - устанавливает обычный формат записи в программе полей текстовых данных (с завершающим нулем). $NONULL = -1 - устанавливает формат записи полей текстовых данных

без завершающего нуля.

'отменяет завершающий нуль

$NONULL = -1

DATA “эта строка и следующая строка ”

$NONULL = 0$

'разрешает установку завершающего нуля

DATA “являются одной текстовой константой”

Отменяет автоматическую инициализацию стека после блока переменных. При использовании данной директивы необходимо включить в программу оператор инициализации регистра стека (SP). Если этого не сделать, то указатель стека останется на 07h.

$NOSP ‘отменяет инициализацию стека SP = 80 ‘назначить стек

Включить в программу объектный код

$OBJ obj obj - включаемый объектный код в шестнадцатеричном виде $obj D29122 ‘КОМАНДЫ SETB P1.1, RET

Сообщает компилятору размер внешней памяти $RAMSIZE = [&H] size size - константа.

$Ramsize = &h4000 ‘размер внешнего ОЗУ 16 кБ

Устанавливает начало распределения внешней памяти. $RAMSTART = [&H] adress adress - константа.

$Ramstart = &h1000 ‘начало распределения переменных с 1000h

Указать имя файла для определения имен используемых регистров. Применяется для установки модели применяемого микроконтроллера. Указываемый файл должен быть в директории компилятора. ВНИМАНИЕ! Эта директива должна записывается первой исполняемой строкой в тексте программы.

$REGFILE = [File]

'перед этой директивой могут быть строки комменариев $REFILE = "8052.DAT"

============================================================================= 4-3

===================================== Справочник по программированию «Bascom-8051» ==

$ROMSTART

Действие: Устанавливает начало распределения программной памяти. Эта директива не похожа на привычный оператор ORG, применяемый при программировании на ассемблере. Директива $Romstart, независимо от места расположения, указывает начало исполняемого кода всей программы! Ее применение для установки начала последующей части программы с желаемого адреса невозможно.

Синтаксис:

$ROMSTART = [&H] adress

adress - константа.

Пример:

$Romstart = &h8000 ‘начало распределения ПЗУ с 8000h

$SERIALINPUT

 

Действие:

Перенаправляет действие функции INPUT на считывание данных из другого устройства.

Синтаксис:

$SERIALINPUT = label label - имя подпрограммы, размещающей вводимые данные из

 

произвольного устройства в аккумуляторе.

Пример:

$Serialinput = Myinput

‘определим имя программы ввода данных

 

!myinput:

 

;здесь проводим необходимые действия

Mov A , Sbuf ;посл. ввод в Acc от устройства Sbuf Ret

$SERIALOUTPUT

Действие: Перенаправляет действие функции PRINT на запись данных в другое устройство

Синтаксис: $SERIALOUTPUT = label label - имя подпрограммы, выводящей данные из аккумулятора в произвольное устройство.

Пример: $SERIALOUTPUT = Myioutput ‘опр. имя программы вывода данных !myoutput: ;здесь проводим необходимые действия Mov Sbuf , A ;посл. вывод из Acc в устройства Sbuf

Ret

$SERIALINPUT2LCD

Действие:

Перенаправляет данные из последовательного порта в LCD-индикатор, обеспечивая режим эха.

Синтаксис:

$SERIALINPUT2LCD

Пример:

$SERIALINPUT2LCD ’показывать вводимые данные

$SIM

При наличии этой директивы компилятор генерирует код, исключающий циклы ожидания

Действие:

 

(программные задержки операторов WAIT, WAITMS, DELAY), чтобы ускорить процесс отладки.

Синтаксис:

$SIM

Пример:

$SIM ‘пропускать при отладке все задержки

$TIMEOUT

При наличии этой директивы компилятор генерирует код, включающий использавание опции

Действие:

 

TIMEOUT в операторах INPUT, INPUTHEX

Синтаксис:

$TIMEOUT

Пример:

$TIMEOUT ‘будет использована опция TIMEOUT

============================================================================= 4-4

===================================== Справочник по программированию «Bascom-8051» ==

1WRESET, 1WREAD, 1WWRITE

Действие: Эти операторы обеспечивают пользователю связь с микросхемами «Dallas Semiconductors», имеющими 1-проводный интерфейс (1Wire-devices).

1WRESET – сбросить 1w-шину.

1WWRITE var1 – послать значение переменной var1 в шину.

Синтаксис: 1WRESET 1WWRITE var1

var2 = 1WREAD()

var2 = 1WREAD() - считать в переменную var2 данные из шины.

var1 - Byte, Integer, Word, Long, Constant. var2 - Byte, Integer, Word, Long.

Пример: ‘--------------------------------------------------

демонстрация 1wreset, 1wwrite and 1wread()

Подтянуть резистором 4K7 шину DS2401 на +5 V

 

‘--------------------------------------------------

 

 

 

Config 1wire = P1.1 ‘использовать этот вывод

 

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

 

1wreset

 

‘сбросить интерфейс

 

Print Err

 

‘вывести сообщение об ошибке, если не отзовется

 

1wwrite &H33

‘команда считывания памяти

 

For I = 1 To 8

‘считать 8 байт в переменную Ar

 

Ar(I) = 1wread()

 

Next

 

 

 

For I = 1 To 8

‘показать считанное

 

Printhex Ar(I);

 

Next

‘пустая строка

 

Print

 

End

 

 

ABS(x)

Возвращает абсолютное значение знаковой целой переменной. Не работает с числами в формате с

Действие:

Синтаксис:

плавающей точкой.

 

var = ABS(var2) var - Byte, Integer, Word, Long. var2 – Integer, Long.

Пример:

Dim a as Integer, c as Integer , e as Single

 

a = -1000 : c = Abs(a) ‘c=1000

 

e = -1000

 

 

 

$asm

 

‘для Single достаточно стереть знак e=1000

 

Anl {e + 3} , &H7f

 

$end Asm

 

 

ALIAS

Осуществляет переименование переменных. Обычно применяется для определения имен битов и

Действие:

Синтаксис:

линий портов.

Oldvar - старое имя. Newvar - новое имя.

Newvar ALIAS Oldvar

Пример:

In_dir Alias P1.1

‘линия «Ввод направления»

 

Ri Alias Scon.0

‘только так можно определить привычное имя бита

ASC(s)

Преобразует строку в ее ASCII значение (код символа). Преобразуется только значение первого

Действие:

Синтаксис:

символа. При отсутствии строки возвращается нулевое значение

var = ASC(string) var - Byte, Integer, Word, Long. String - String, Constant.

Пример:

Dim a as byte, s as String * 10

 

s = «ABC» : a = Asc(s)

 

Print a

‘выводится 65 (41h) - код первого символа

============================================================================= 4-5

===================================== Справочник по программированию «Bascom-8051» ==

AND, OR, XOR, NOT

 

 

 

 

Действие:

Производят логические операции: AND-операция «И» (1 And 0 = 0, 1 And 1 = 1), OR-операция

 

«ИЛИ» (1 Or 0 =1, 0 Or 0 =0), XOR-операция «исключающего ИЛИ» (1 Xor 1 = 0, 0 Xor 1 = 1, 0

 

Xor 0 = 0), NOT – инвертирование

Синтаксис:

Var3 =

var

AND

var2, var3 = var OR var2 Var3 = var XOR var2, var3 =

 

var NOT var2 var, var2 – переменные или константы типа Bit, Byte, Integer, Word, Long

 

Constant

var3 – только переменные типа Bit, Byte, Integer, Word, Long

Пример:

Dim d As Byte , e As Byte Dim c As Const &B10011001

 

e = 12 : e = Not e : d = e Or c : d = d And &b00001000

BDC()

Показывает (выводит) число в двоично-десятичном виде.

Действие:

Синтаксис:

Bcd(var) Var - отбражаемая переменная (типа Byte, Word, Integer, Long или Constant).

Пример:

Print arb

 

‘значения 10h, 21h, 40h показывает как 16, 33, 64

 

Print Bcd(arb) ‘значения 10h, 21h, 40h выводятся как 10, 21, 40

BITWAIT

Ждет, пока бит не установится или не сбросится

Действие:

Синтаксис:

BITWAIT x

SET/RESET x - имя бита

Пример:

Bitwaim a , Set

 

‘ждем, пока в прерыв. Установится Бит a

 

Bitwait P1.7, Reset ‘ждем, пока в порт не придет «0»

BREAK

Остановиться при отладке. Компилятор устанавливает в месте расположения оператора Break код

Действие:

 

A5h, служащий отладчику командой останова.

Пример:

Break

‘остановиться здесь при отладке

Bit, Byte, Integer, Long, Word, Single, String()

Действие:

Типы переменных, применяемые в BASCOM. Тип переменной необходимо указывать перед

 

использованием при объявлении имени с помощью директивы Dim.

Пример:

Dim B1 As Bit , A As Byte , C As Integer

 

Dim D As Word , E As Long , G As Single

 

Dim S As string * 16 ‘на 16 символов

 

Dim F(10) As Byte

‘массив из десяти байт

CALL

Вызывает процедуру или подпрограмму. В процедуру может входить до 10 параметров.

Действие:

 

Допускается вызывать процедуру вообще без параметров (даже если их наличие было

 

объявлено).

 

 

 

Синтаксис:

CALL Test [(var1, var-n)] или Test var1 , var-n

 

Var1, var-n - любая переменная или константа. Test

Пример:

Dim A as byte, B1 as byte

 

Declare Sub Test(b1 as byte)

 

A = 65

 

 

 

‘вызов п/п test с параметром A

 

Call test (a)

 

 

Test a

 

 

 

‘альтернативный вариант записи вызова

 

End

 

 

 

 

 

SUB Test(b1 as byte) ‘использовать некоторую переменную

 

LCD b1

 

 

 

‘поместить на индикатор

 

Lowerline : LCD BCD(b1)

 

End SUB

 

 

 

============================================================================= 4-6

===================================== Справочник по программированию «Bascom-8051» ==

CASE, SELECT CASE, CASE IS ..

Действие:

Запустить исполнение одного из последовательных блоков действий в зависимости от значения

 

переменной

 

- объявление выбора

Синтаксис:

SELECT CASE var

 

CASE test1 : statements

- первое условие: var=test1?

 

[CASE test2 : statements ] - второе условие: var=test2?

 

CASE ELSE : statements – остальные значения?

 

END SELECT

 

 

 

Test1, Test2 – значения переменной, при

 

Var

тестируемая переменная

типа Byte.

 

котором происходит выполнение соответствующего блока. Statements – выполняемый

 

оператор (операторы). В последних версиях Bascom поддерживаются операторы проверки

 

условия «больше или равно» (“IS >=”) и диапазона «от - до» (“TO”). Проверяйте, поддерживает

 

ли ваша версия компилятора такие определения.

Оператор

Dim b2 as byte

 

 

'начать проверку и выбор

 

SELECT CASE b2

 

 

 

CASE 2 : PRINT «2»

 

 

 

CASE 4 : PRINT «4»

'для проверки условия требуется

 

CASE IS >=5 : PRINT «>5»

 

 

 

 

 

'ключевое слово IS.

 

CASE 6 TO 19 : PRINT “6-19” 'проверка диапазона. Ключевое слово TO

 

CASE ELSE : PRINT “Other”

'необязательная составляющая

 

END SELECT

 

 

'закончить

 

END

 

 

 

 

 

CHR()

Преобразует значение переменных типа Byte, Integer/Word или константы в символ. Применяется

Действие:

 

при выводе данных на индикатор, в последовательных порт, для записи в строковую переменную

 

или для преобразования кода в символ. Фактически, данным оператором число преобразуется в

 

байт и записывается в строку.

 

 

Синтаксис:

PRINT CHR(var) : LCD CHR(var) S = CHR(var) : S = «Date=» + CHR(var)

 

var – переменная типа Byte, Integer/Word или числовая константа. s - строковая переменная.

Пример:

Dim a as byte, s as string * 10

 

 

a = 110 : LCD a ‘отпечатается «110»

 

LCDHEX a

 

‘отпечатается «6E»

 

LCD Chr(a)

 

‘отпечатается «n»

 

 

LCD Bdc(a)

 

‘отпечат «6>» - некорректная операция

 

S = «Byte=» : S = S + Chr(a) ‘можно добавить к строке!!!

 

Print S

 

‘отпечатается «Byte=n»

 

End

 

 

 

 

 

CLS

Очищает поле LCD и ставит курсор в первую позицию

Действие:

Пример:

CLS

 

‘очистить индикатор

 

LCD «Hello»

‘вывести сообщение

 

CONFIG 1WIRE

 

 

 

 

 

Действие:

Определение вывода, подключенного к 1-проводной шине

Синтаксис:

CONFIG

1WIRE = pin pin - имя любого битово адресуемого порта.

Пример:

Config 1WIRE = P1.0 ‘P1.0 is used for the 1-wire bus

 

1WRESET

 

‘reset the bus

CONFIG DEBOUNCE

 

 

 

 

 

Действие:

Установить задержку для оператора DEBOUNCE. По умолчанию, если не применено данное

Синтаксис:

определение, задержка устанавливается равной 25 мс.

CONFIG

DEBOUNCE

= time

time

– константа, задающая в миллисекундах значение

 

задержки (при кварце 12 МГц).

 

 

Пример:

Config Debounce = 50 ’50 mS

 

============================================================================= 4-7

===================================== Справочник по программированию «Bascom-8051» ==

CONFIG I2CDELAY

 

 

 

 

 

 

Действие:

Установить задержку между тактами синхронизации по линии SCL интерфейса I2C. По

Синтаксис:

умолчанию задержка устанавливается равной 5 мкс.

 

 

CONFIG

I2CDELAY

= 0 или 1 0

без задержки (получается скорость обмена около

 

400 кГц при частоте кварцевого генератора 12 МГц). 1 - с дополнительной задержкой 5 мкс (это

 

стандартная скорость -

100 кГц).

 

 

 

Пример:

CONFIG

I2CDELAY = 0 ‘без задержки

 

 

CONFIG LCD, CONFIG LCDBUS, CONFIG LCDPIN

 

 

 

Действие:

CONFIG LCD – установить тип индикатора

 

 

 

 

CONFIG

LCDBUS

установить количество линий управления в шинном режиме (при

 

использовании установки «$LCD»). В 4-битном режиме индикатор должен подключаться к

 

линиям D4-D7 шины. Запись в индикатор в шинном режиме ведется командой MOVX A,@DPTR.

Синтаксис:

CONFIG LCDPIN – определить линии управления индикатором (не шинный режим).

 

 

CONFIG

LCD =

LCDtype LCDtype

– один из параметров в соответствии

с

типом

 

используемого индикатора (символов * строк). Можно применять: 40 * 4, 16 * 1, 16 * 2, 16 * 4, 16

 

* 4, 20 * 2 или 20 * 4. По умолчанию устанавливается - 16 * 2.

 

 

 

CONFIG LCDBUS = 4 - при использовании 4-битной шины.

 

 

 

CONFIG LCDBUS = 8 - при использовании 8-битной шины (по умолчанию).

RS=pin

 

CONFIG

LCDPIN=PIN

, DB4=pin, DB5=pin, DB6=pin, DB7=pin, E=pin,

 

– при использовании побитного режима управления индикатором (самого медленного).

 

 

 

pin - перечисленние имен портов подключенных к индикатору. Для управления индикатором

 

могут использоваться любые линии, адресуемые как биты. Или “CONFIG LCDPIN, …

– в

 

старой версии синтаксис был таким.

 

 

 

Пример 1:

‘Побитное управление индикатором

 

 

 

 

'ВНИМАНИЕ! Добавлен символ, дающий возможность переносить длинные

 

 

‘строки с помощью символа «_» (подчеркивателя):

 

 

 

CONFIG LCDPIN = PIN , DB4 = P1.1 , DB5 = P1.2 , DB6 = P1.3, _

 

 

 

DB7 = P1.4 , E=P1.5 , RS=P1.6

 

 

 

 

‘опред. подключение индикатора. Линия RW-Gnd

 

 

 

CONFIG LCD = 40 * 4 ’40 символов, 4 строки

 

 

Пример 2:

‘Подк. Индикатора на шину. RW-Gnd. RS-A0. E-инв. Wr(P3.6)

 

 

 

$LCD = &ha000

 

‘использовать адреса A000h и A001h

 

 

 

CONFIG

LCDBUS = 8 ‘шина 8-бит (подкл. D0-D7 соот. P0.0-Po.7)

 

 

CONFIG MICROWIRE

Действие: Установить конфигурацию 4-проводного интерфейса Microwire

Синтаксис: Config Microwire=Pin, Cs=pin, Din=pin, Dout=pin, Clock=pin, Al=7

Pin - перечисленние имен портов, подключенных к Microwire. Могут использоваться любые линии, адресуемые как биты. DIN – ввод данных. DOUT - вывод данных. CS - выбор кристалла. CLK – тактирование данных. AL – число используемых адресных линий. Указываемое значение зависит от выбранного размера записываемых данных (bytes or words). Выбор размерности осуществляется установкой уровня на линии “Org” микросхемы памяти.

Chip (модель кристалла)

 

93C46

 

93C56

 

93C57

 

93C66

Data bits (длина данных)

8

16

8

16

8

16

8

16

AL (параметр)

7

6

9

8

8

7

9

8

Пример: 'ВНИМАНИЕ! Добавлен символ, дающий возможность переносить длинные ‘строки с помощью символа «_» (подчеркивателя):

Config Microwire = Pin , Cs = P1.1 , Din = P1.2 , Dout = P1.4 , _ Clock = P1.5 , Al = 7

============================================================================= 4-8

===================================== Справочник по программированию «Bascom-8051» ==

CONFIG PRINT, PRINTMODE

Действие: Установить конфигурацию выхода оператором Print при использовании интерфейса RS-485, требующего дополнительного порта для управления драйвером

Синтаксис: Config Print = Pin Pin - имя порта, на котором формируется управляющий сигнал. Printmode = Set (Reset) Определяется уровень (1 или 0 соответственно), устанавливающийся на линии управления при выводе данных

Пример: Config Print = P1.7 : Printmode = Reset

CONFIG SERVOS

Действие:

Установить количество сервомоторов и их выводы управления

Синтаксис: Config SERVOS=number, SERVO1=pin, SERVO2=pin, SERVO3=pin

 

Number – число сервомоторов. Максимальное количество – 16

 

servo 1, servo2, servo 2, servo3 – имена выходов, присваемые выводам.

 

При использовании этой функции таймер 0 уже не может быть использован для других целей.

Пример:

Config SERVOS = 3, SERVO1 = P1.1 , SERVO2 = P1.2 , SERVO3 = P1.4

CONFIG SDA, CONFIG SCL

Действие: Определить выводы, подключенные к 2-проводной шине интерфейса I2C.

Синтаксис: CONFIG SCL = pin pin - имя любого битово адресуемого порта. CONFIG SDA = pin

Пример: CONFIG SDA = P1.7 : CONFIG SCL = P1.6 ‘P1.7 – SDA, P1.6 is the SDA

CONFIG SPI

Действие: Определить выводы, подключенные к 4-проводной шине SPI. Bascom реализует только программный интерфейс, и поэтому работает с любыми линиями. Аппаратный SPI модели AT89S8252 компилятором не поддерживается.

Синтаксис: CONFIG SPI = SOFT, DIN = Pin, DOUT = Pin , CS = Pin, CLK = Pin , Nocs=1

 

Pin - перечисленние имен портов подключенных к SPI. Могут использоваться любые линии,

 

адресуемые как биты. DIN – ввод данных. DOUT - вывод данных. CS - выбор кристалла. CLK

 

– тактирование данных. При Nocs =

0 – вывод CS не управляется после каждого байта – это

 

нужно делать вручную. При Nocs = 1 – привычное использование вывода CS.

Пример:

Config SPI=SOFT , DIN=P1.0 , DOUT=P1.1 , CS=P1.2 , CLK=P1.3

 

SPIOUT var , 1

‘send 1 byte

CONFIG TIMER0, TIMER1

 

Действие:

Установить следующие режимы таймера 0 или 1:

 

CONFIG

TIMERx = COUNTER – внешний генератор C/Tx=1

 

CONFIG

TIMERx = TIMER – внутренний генератор (Fкв/12) C/Tx=0

 

GATE = INTERNAL - внутреннее разрешение счета GATEx=0

 

GATE = EXTERNAL - внешнее разрешение счета GATEx=1

 

GATE = MODE=0,1,2 или 3 – режим таймера (соответственно описанию 8051)

Пример:

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

 

Counter0 = 0 ‘сброс счетчика (Tl0 и Th0)

 

Start Counte ‘разрешим счет

 

============================================================================= 4-9

===================================== Справочник по программированию «Bascom-8051» ==

CONFIG TIMER2

 

Действие:

Установить следующие режимы таймера 2:

 

 

CONFIG TIMER2 = COUNTER – внешний генератор C/T2=1

 

CONFIG TIMER2 = TIMER – внутренний генератор (Fкв/12 или Fкв/2) C/T2=0

 

]GATE = INTERNAL - внутреннее разрешение счета EXEN2=0

 

GATE = EXTERNAL - внешнее разрешение счета EXEN2=1

 

MODE = 0 - режим самозагрузки CP/RL2=0

 

 

MODE = 1 - режим захвата CP/RL2=1

 

 

MODE = 2 - режим генератора бодовой скорости RCLK=1 TCLK=1

 

MODE = 3 - генератор бод. только приемника RCLK=1 TCLK=0

 

MODE = 4 - генератор бод. только передатчика RCLK=0 TCLK=1

 

MODE = 5 - режим выдачи частоты T2OE=1

 

 

DIRECTION=UP - считать вперед (увеличивать) DCEN=1

 

DIRECTION=DOWN - считать назад (уменьшать) DCEN=0

Пример:

CONFIG TIMER2=COUNTER , GATE=INTERNAL , MODE=0 ‘Режим самозагрузки

 

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

 

CONFIG TIMER2 = COUNTER , GATE = INTERNAL , MODE = 1 ‘Режим захвата

 

CONFIG TIMER2=TIMER , GATE=INTERNAL , MODE=2 ‘Бодовый генератор CONFIG

 

TIMER2=TIMER , GATE=INTERNAL , MODE=3 ‘Бод. генер. на прием CONFIG

 

TIMER2=TIMER , GATE=INTERNAL , MODE=4 ‘Бод.генер. на передачу CONFIG

 

TIMER2=TIMER , MODE=5

‘Выход частоты

CONFIG WATCHDOG

Действие: Установка времени срабатывания будильника модели AT89S8252

Синтаксис: Config Watchdog = Time Time – время в мс из ряда: 16 , 32, 64 , 128 , 256 , 512 , 1024 и 2048.

Пример: Config Watchdog = 1024 ‘время срабатывания 1024 мс

CONST

Действие: Объявить символьное имя числа (константы). Определенное символьное имя в дальнейшем можно использовать в тексте программы в качестве цифрового значения (константы). Символьное имя нельзя использовать в блоке определения непосредственных данных с помощью оператора DATA. Неприятности при символьном определении чисел возникают в случаях, когда компилятор не понимает определения. В результате, вместо числа записывается нулевой код без указания ошибки.

Синтаксис: DIM Symbol AS Const Value

Symbol - имя константы. Value - цифровое значение

 

Const Symbol = Value

‘Ar = 5

Пример:

Dim Ar As Const 5

 

Dim Br As Const &B1001

‘Br =

9

 

Dim Cr As Const &hab00

‘Cr =

AB00H

'Новая возможность определения имен констант (начиная с вер.1.0.0.19) Const Cbyte = &HF

Const Cint = -1000

Const Csingle = 1.1 Const Cstring = "test"

============================================================================= 4-10

===================================== Справочник по программированию «Bascom-8051» ==

COUNTERx

Записать значение непосредственно в счетчик таймера. При загрузке счетчик останавливается

Действие:

 

(записывается TRx=0), а затем счет разрешается снова (устанавливается TRx=1).

Синтаксис:

COUNTERX = var или var = COUNTERX

 

Var - переменная типа byte, Integer/Word variable или константа (последняя только при загрузке).

 

CounterX

- COUNTER0 , COUNTER1 или COUNTER2. Используйте СounterX = 0 для сброса

 

счетчика.. Счетчик может считать от 0 до 255 в режиме 2 (8-битный с самозагрузкой) и до 65535

 

в режиме 1 (16-битный).

 

 

 

Пример:

Dim A As Byte , C As Integer

 

 

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

 

Counter0 = 0

‘очистить

 

 

Start Counter0

‘начать счет

 

 

Do

 

‘цикл

 

 

 

A = Inkey

‘прочитаем введеное

 

C = Counter0

‘считаем таймер

 

Print C

 

‘отпечатаем значение таймера

 

Loop Until A = 27 ‘пока не пришел символ escape продолжаем

 

End

 

 

 

 

 

Оператор:

 

 

 

 

 

COUNTER0 = 1000

 

 

 

 

Компилируется:

 

 

 

 

Clr TCON.4

 

 

 

 

Mov tl0,#232

 

 

 

 

Mov th0,#3

 

 

 

 

Setb TCON.4

 

 

 

CPEEK()

Возвращает значение кода по указанному адресу из памяти команд. Т.к. запись в память

Действие:

 

программ процессора модели 8051 невозможна, то операция и соответственно команда CPOKE,

Синтаксис:

имеющаяся в стандартном Бейсике, невозможна.

var = CPEEK( address )

Var -

переменная (байтовая), которая будет содержать

 

считанное значение. Address - переменная или константа (типа Word или Integer).

Пример:

Dim I As Integer , B1 As Byte

 

 

For I = 0 To 127

‘взять байт из памяти

 

B1 = Сpeek(i)

 

Printhex B1 ; «

« ; ‘показать

 

Next

 

 

 

 

DATA

Объявить блок непосредственных данных

 

Действие:

var , var2, var3[, varn] - числовые или

Синтаксис:

DATA var

, var2,

var3[,

varn]

 

строковые константы. Байтовые константы в любом виде, предусмотренном Bascom. Константы

 

типа Integer и Word должны быть со значком - %. Константы типа Long - со знаком &. Константы

 

с плавающей точкой - со знаком !. Компилятор позволяет размещить в одной строке разные типы

 

данных. Их разделение при считывании является задачей программиста.

Пример:

tab_byte:

 

 

 

‘byte data

 

Data 0 , 1 , 2 , 20 , &hFF , &b000101010

 

_tab_word:

 

 

‘integer

 

data Data 100% , 200% , 32345% , &ha0df , &b0001010001010101

 

_tab_long:

 

 

‘long data

 

Data 1000& , 22222222& , &h125690bc

 

_tab_sing:

 

 

‘single data

 

Data 1000! , 2000! , 3000! , 4000! , 5000!

 

_tab_string:

 

 

‘string data

 

Data «0123456789» , $35

 

‘and new format of the string data

 

_tab_mix:

‘mix of constant types on one line DATA «TEST» , 5 ,

1000% , -1& , 1.1!

============================================================================= 4-11

Print «P1.0 was/is low» : Return

===================================== Справочник по программированию «Bascom-8051» ==

DATA EEPROM: WRITEEEPROM , READEEPROM

Действие: Модель микроконтроллера AT89S8252 имеет встроенную EEPROM объемом 2 кБайта. Для ее использования предусмотрены директивы: WRITEEEPROM - записать данные и READEEPROM

– считать данные.

Синтаксис:

WRITEEEPROM var [,

address ]

READEEPROM

var

[, address ] Var - любая

 

переменная BASCOM. Address - адрес EEPROM в диапазоне от 0 до 2047. Адрес можно не

 

указывать, он будет устанавливаться автоматически в порядке следования записей при

 

компиляции. При считывании переменной значение адреса будет вставляться компилятором

 

также автоматически, используя значение, полученное (вычисленное) ранее при ее записи.

 

Естественно, записи в этом случае будут производиться с адреса 000 или после последнего

 

указанного. Кроме того, при автоматическом выборе адреса данные можно вернуть только в тот

 

регистр, из которого они были записаны, и, соответственно, нельзя записать данные из одной

 

ячейки внутренней памяти в разные ячейки EEPROM.

 

 

 

Пример:

Dim S As String * 15 , S2 As String * 10

 

 

 

 

S = «Hello» : S2 = «test»

 

 

 

 

 

 

 

Dim L As Long

 

 

 

 

 

 

 

‘записать строки

 

L = 12345678 Writeeeprom S : Writeeeprom S2

 

Writeeeprom L

 

 

 

 

‘записать длинную переменную

 

S = «» : S2 = «» : L = 0

 

‘очистить переменные

 

 

Readeeprom L : Print L

 

 

 

 

 

 

 

 

Readeeprom S : Print S

 

 

 

 

 

 

 

 

Readeeprom S2 : Print S2

 

 

 

 

 

 

 

End

 

 

 

 

 

 

 

 

 

 

 

DEBOUNCE

 

 

 

 

 

 

 

 

 

 

 

 

Действие:

Производить периодическую проверку состояние битового порта, и когда ожидаемое изменение

 

уровня происходит, то осуществлять переход на указанную метку или вызывать указанную

 

подпрограмму. В последнем случае после исполнения подпрограммы производится возврат к

 

оператору контроля уровня. Периодичность проверки уровня определяется директивой CONFIG

 

DEBOUNCE = ms.

 

 

[ , SUB]

 

 

 

Синтаксис:

DEBOUNCE Px.y , state , label

 

 

 

 

Px.y

имя

порта. При

state

=

0

переход происходит при установлении на

 

контролируемой линии низкого уровня и

при

state

=

1 оператор

ждет установления

 

высокого

уровня.

Label

-

адрес перехода (GOTO)

или

вызываемой

подпрограммы, если

 

имеется дополнительное указание SUB. Чтобы все работало правильно, необходимо к моменту

 

возврата из подпрограммы вернуть порт в исходное (неактивное) состоянии. Это же правило,

 

кстати, действует и при вызове внешних прерываний.

 

 

 

Пример:

CONFIG DEBOUNCE = 30

‘30mS

 

 

 

 

 

 

 

Do

‘Debounce P1.1 , 1 , Pr ‘здесь ждем поступления выс. уровня

 

Debounce P1.0 , 0 , Pr , SUB

 

 

 

 

 

 

 

 

 

 

 

^----- вызывать как подпрограмму

 

 

 

 

^----- метка перехода

 

 

 

 

 

^---------- что ждем (здесь «0»)

 

 

 

^---------------- имя порта, где ждем

 

 

Loop

 

 

 

 

 

 

 

 

 

 

 

End

Pr:

============================================================================= 4-12

===================================== Справочник по программированию «Bascom-8051» ==

DECLARE SUB

Действие: Объявить процедуру (новую функцию). Определение процедур дает возможность расширить язык введением новых функций. В простейшем случае обьявленную процедуру можно использовать как обычную подпрограмму. Полное использование преимуществ процедуры заключается в возможности ее вызова с различными переменными, подставляемыми в месте использования. Важно, чтобы заменяющие переменные были такого же типа, что и объявленные. Перед использованием процедуры директивой DIM должны быть объявлены используемые переменные с указанием имени и типа. Описание процедуры должно производится только после ее объявления.

Синтаксис:

DECLARE SUB Test[(var as type, var1 as type)] Test – имя процедуры.

 

Var, var1 - имена используемых переменных. Число переменных не должно превышать 10.

 

Тип переменных - Bit, Byte, Word/Integer, Long или String.

 

 

Пример:

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

‘Test b1 – можно записывать и так

 

Call Test(b1)

 

Print a ;b1 ; c

 

 

 

 

End

 

‘описание процедуры

 

 

Sub Test(a as byte)

 

 

A = b1 ; b1 = c ; c = a + b1

 

 

 

End Sub

 

 

 

 

DECR, INCR

Уменьшить или

увеличить переменную на единицу. Исполняется быстрее, чем оператор:

Действие:

Синтаксис:

var = var - 1. При воздействии на знаковые переменные эти операторы действуют с учетом знака.

DECR var INCR var Var – переменная типа: Byte, Integer, Word, Long, Single.

Пример:

Dim A As Byte A = 5

‘беззнаковое значение

 

Decr A : Print A

‘4

 

 

 

Incr A : Print A

‘5

 

 

DefBit, DefByte, Defint, DefWord

 

 

 

Действие:

Определить тип переменных. Равноценно определению с использование оператора Dim, однако,

Синтаксис:

возможности немного уже.

 

 

DEFBIT b1 – определить b1 как битовую переменную.

 

 

 

DEFBYTE c – C как однобайтовую

 

 

 

DEFINT I – I как типа Integer (двухбайтовая со знаком).

 

 

 

DEFWORD x – X как слово

 

 

Пример:

Defbit b : DefInt c ‘определить тип как бит и слово (integer)

 

Set b1

‘set bit to 1

 

 

 

C = 10

‘let c = 10

 

 

DEFLCDCHAR

 

 

 

 

Действие:

Определить изображение дополнительных символов с кодом от 0 до 7 или от 8 до 15 (те же

 

самые). Для того, чтобы новые символы начали действовать, необходимо выполнить команду

Синтаксис:

CLS. Для вывода дополнительных символов нужно применять функцию Chr().

DEFLCDCHAR

char,r1,r2,r3,r4,r5,r6,r7,r8

Char - код

(номер) определяемого

 

символа (0-7). r1-r8

 

 

 

Пример:

Deflcdchar 0,1,2,3,4,5,6,7,8 ‘определить спец. символ

 

Cls

‘очистка приводит в действие

 

 

Lcd Chr(0)

‘показать изображение

 

 

 

End

 

 

 

 

DELAY, WAIT , WAITMS

 

 

Delay - короткая на 100 мкс. WAIT -

Действие:

Ждать. Программные временные задержки (при 12 МГц):

 

на указанное число секунд. WAITMS - на указанное число миллисекунд

(значение в сек)

Синтаксис:

DELAY , WAIT time

(значение в мсек) , WAITMS time

 

Значение time может быть задано как константой, так и переменной.

 

Пример:

WAIT 3

‘ждать 3 сек

 

 

 

WAITMS 200

‘ждать 200 мс

 

 

============================================================================= 4-13

===================================== Справочник по программированию «Bascom-8051» ==

DIM

Определить размерность переменных

 

 

Действие:

 

 

Синтаксис:

DIM var AS [XRAM/IRAM] type

 

 

 

Var

- любое имя, короткое или длинное. Переменная может быть

объявлена как

массив

 

переменных с индексом, например ar(n), и будет занимать n последовательных элементов.

 

Type

- тип переменной. Предусмотрены следующие значения:

Bit, Byte,

Word,

 

Integer, Long, Single

и String

 

 

 

XRAM – указывает, что переменная будет расположена во внешней памяти.

 

 

IRAM – располагает переменную во внетренней памяти (по умолчанию).

 

 

Для строковых переменных нужно обязательно указывать длину, например:

 

 

Dim s As XRAM String * n.

 

 

 

Строковая переменная займет в памяти n+1 байт. Еще одна особенность определения строковой

 

переменной в том, что здесь назначается только длина буфера, в который будут помещаться

 

строки различной длины. Истинная длина переменной, носящей имя буфера, зависит от ее

 

содержания, но не может (и не должна) превышать назначенной длины. Битовые переменные

 

могут располагаться только во внутренней памяти. Переменные могут определяться перед

 

использованием, т.е. могут располагаться по всему тексту программы, однако, компилятор сразу

 

зарезервирует место для переменных объявляемых позже.

 

 

Пример:

Dim B1 As Bit

‘бит может быть: 0 или 1

 

 

 

Dim A As Byte

‘байт от 0 до 255

 

 

 

Dim C As Integer

‘integer -32768 - +32767

 

 

 

Dim D As String * 10

‘строка длиной 10 символов

 

 

 

Dim ar(10) As Byte

‘массив из 10 байтовых переменных

 

 

Dim E As Const 5

‘константы

 

 

 

Dim F As Const &B1001B1

 

 

 

B1 = 1 : Set B1

‘назначить биты (assign bits)

 

 

 

A = 12 : A = A + 1

‘байты

 

 

 

C = -12 : C = C + 100

‘слова

 

 

 

Waitms E

‘ждать 5 мс

 

 

 

Print F : Print B1

 

 

 

 

End

 

 

 

 

DISABLE, ENABLE

Действие: Запретить или разрешить прерывание. Фактически, эти операторы только устанавливают или сбрасывают соответствующие биты регистра IE

Синтаксис:

DISABLE interrupt ,

ENABLE interrupt Interrupt - одно из имен источников

 

прерываний: INTERRUPTS, INT0, INT1, SERIAL, TIMER0, TIMER1, TIMER2 или

 

PCA.

‘enable the setting of interrupts

Пример:

ENABLE INTERRUPTS

 

ENABLE TIMER0

‘enable TIMER0

 

DISABLE SERIAL

‘disables the serial interrupt.

 

DISABLE INTERRUPTS

‘disable all interrupts

DO .. LOOP

Определить цикл. Операторы цикла DO и LOOP устанавливают необходимость безусловного

Действие:

 

повторения выполнения операторов, расположенных между ними. Прекращение цикла

 

происходит только при выполнении условий, заданных с помощью ключевого слова UNTIL. Из

 

цикла также можно выйти, с помощью операторов GOTO или EXIT из конструкции проверки

 

условий IF … END IF.

 

Синтаксис:

DO

 

 

Тело цикла

 

 

LOOP [ UNTIL expression ]

 

Expression - выражение условия прекращения цикла. Из цикла можно также выйти, применив

 

в теле циклической программы директиву EXIT DO или оператор GOTO.

Пример:

Dim A As Byte

‘начало цикла

 

DO

 

A = A + 1 : PRINT A ‘действия внутри цикла

 

LOOP UNTIL A = 10

‘повторять до A = 10

 

Print A

‘печатать, что получилось – 10

============================================================================= 4-14

===================================== Справочник по программированию «Bascom-8051» ==

END

Остановить исполнение программы. Аналогично команде Stop. Компилятор запрещает все

Действие:

 

прерывания и ставит команду JMP саму на себя.

 

 

Синтаксис:

END

 

 

 

 

ERASE

Уничтожить переменную и освободить память. Перед уничтожением переменная должна быть

Действие:

 

определена. Этот прием используется для создания временных (локальных) переменных, не

 

занимающих память. Уничтожать можно только последние переменные, расположенные в памяти

 

выше всего. Этот оператор нужно применять с осторожностью, т.к. стек автоматически

 

устанавливается выше блока переменных, и при переопределении не меняет своего положения

 

(автоматически). Возможно, в некоторых случаях, чтобы программа работала правильно,

 

придется вычислять значение стека и устанавливать его «вручную». При переопределении

 

переменных внешней памяти, естественно, таких проблем не существует.

 

Синтаксис:

ERASE var

Var - имя переменной

 

 

Пример:

Dim a1 as byte,a2 as byte,a3 as byte,a4 as byte,

 

 

F(var3,var4)

 

‘использование переменных

 

 

ERASE a3 : ERASE a4

‘теперь эти можно уничтожать.

 

Dim a5 as Byte

‘определение новой переменной на их место

 

 

 

‘теперь vars a1 and a2 нельзя уничтожать

EXIT

Выйти из одной из указанных программных конструкций: FOR..NEXT, DO..LOOP, WHILE

Действие:

 

..WEND или SUB..END SUB. Выход обычно осуществляется при проверке каких-либо условий.

 

Оператор EXIT отличается от оператора GOTO только тем, что адрес перехода устанавливается

Синтаксис:

автоматически на строку, следующую за последним оператором цикла.

EXIT [FOR] [DO]

В соответствии

с применяемой конструкцией цикла выбирается:

 

[WHILE] [SUB]

 

 

 

Пример:

DO

‘начать DO..LOOP

 

 

 

A = A + 1

‘некоторые действия

 

 

 

IF A = 100 THEN ‘проверить a = 100?

 

 

 

EXIT DO

‘выход из цикла DO..LOOP

 

 

 

END IF

‘конец условия IF..THEN

 

 

 

LOOP

‘конец цикла DO

 

 

FOR .. TO/DOWNTO .. STEP, NEXT

 

 

 

Действие:

Выполнить некоторые действия заданное число раз. Основой управления конструкцией

 

FOR…NEXT служит изменение указанной переменной от начального до конечного значения.

Синтаксис:

FOR var = start TO/DOWNTO end [STEP value]

 

 

 

Повторяемый блок

 

 

 

 

NEXT

 

 

 

 

 

Var - переменная счетчик. Start - начальное значение переменной. End - конечное значение

 

переменной. Value - значение шага изменения переменной.

Значение шага не должно быть

 

отрицательным. Переменная может увеличиваться или уменьшаться, в соответствии с

 

применяемой опцией TO или

DOWNTO. NEXT - оператор

замыкания цикла - переход к

 

следующему значению переменной. При шаге изменения переменной, равном единице, опция

 

STEP может опускаться. Типы допустимых переменных: var :

Byte, Integer, Word, Long, Single.

 

start: Byte, Integer, Word, Long, Single, Constant. end : Byte, Integer, Word, Long, Single, Constant.

 

step : Byte, Integer, Word, Long, Single, Constant.

 

 

Пример 1:

y = 10

 

‘сделать y=10

 

 

 

FOR a = 1 TO 10

‘делать 10 раз

 

 

 

FOR x = y DOWNTO 1 ‘вложенный цикл

 

 

 

PRINT x ; a

‘показывать

 

 

 

NEXT

 

‘следующее x (считаем обратно)

 

 

NEXT

 

‘следующее a (считаем вперед)

 

Пример 2:

Dim S as Single

‘другой пример

 

 

 

For S = 1 To 2 Step 0.1

 

 

 

Print S

Next

END

============================================================================= 4-15

===================================== Справочник по программированию «Bascom-8051» ==

FUSING()

Преобразовать значение переменной в формате с плавающей точкой в форматированную строку.

Действие:

 

При выводе значения с плавающей точкой формат отображения может существенно изменяться.

 

Чтобы зафиксировать положение десятичной точки при индикации и улучшить восприятие

 

данных, применяется настоящая функция. Работает в большой модели памяти! Функция Fusing

 

имеет недостатки, главный из которых включение в форматированное число знака минус при

 

преобразовании отрицательных чисел. В последних версиях компилятора возможности этой

 

функции расширены.

 

 

Синтаксис:

var = Fusing( source, mask)

 

 

var – строка, которая будет беззнаковым результатом.

 

 

Source – переменная типа типа single, которая должна быть отформатирована.

 

Mask – маска результата . Например, ###.##, где знак есть цифра и указано положение

 

десятичной точки. Максимальное число цифр – семь (значащих). При использовании знака #

 

значение округляется. Чтобы округление не производилось, используйте после точки знаки &.

 

Если хотите выводить лидирующие нули, используйте перед точкой вместо # знак 0 (но похоже

 

нужно указывать на один нуль больше)

 

Пример:

$large

 

 

 

Dim X As Single , Y As Single , Result As Single

 

Dim I As Integer, Buf As String * 16

 

 

Input «Enter x» , X

‘эапрос двух значений

 

Input «Enter y» , Y

 

‘вычисления

 

Print «X+Y=» ; : Result = X + Y : Print Result

 

Print «X-Y=» ; : Result = X - Y : Print Result

 

 

Print «X/Y=» ; : Result = X / Y : Print Result

 

 

Print «X*Y=» ; : Result = X * Y : Print Result

 

 

Buf = Fusing(result , ##.##) ‘форматирование строки

 

‘Buf = Fusing(result , 000.##)‘форматирование строки c лидир. нулями

 

‘Buf = Fusing(result , ##.&&) ‘форматирование строки без округления

 

‘Buf = Fusing(result , 000.&&)‘и то и другое

 

 

Print Buf

‘печать строки

 

GETRC()

Getrc – определение времени заряда (до порога срабатывания) RC-цепочки, подключенной к

Действие:

 

любой линии порта. Функция использует таймер 0, который нужно инициализировать

 

соответствующим образом. Последовательная RC-цепочка включается между землей и питанием.

 

Линия порта включается между резистором и конденсатором. Время измеряется от момента

 

отпускания линии (отключения от земли) до достижения уровня «1». При использовании более

 

сложной схемы с внешним компаратором и аналоговым ключом можно получить более высокую

 

точность. Практическое применение: аналоговая клавиатура и АЦП, где порог срабатывания

 

определяется уровнем измеряемого сигнала.

 

Синтаксис:

Var = GETRC( pin )

 

 

 

Var – переменная (двухбайтовая), принимающая значение задержки. pin - имя любого битово

 

адресуемого порта.

 

 

Пример:

'функция GETRC() требует таймер 0 - конфигурируем его

 

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

 

$baud = 9600

'указываем скорость и кварц

 

 

$crystal = 11059200

'место для приема

 

 

Dim W As Word

 

 

Do

'цикл

 

 

W = Getrc(p1.7)

'определили задержку

 

 

Print W : Wait 1

'показали ее, ждем и снова повторим

 

Loop 'С конденсатором C=10nF получим: 250 при

10K9, 198 - 9K02 '182 -

 

8K04, 166 - 7K, 154 - 6K02, 138 - 5K04, 122 - 4K04 '106 - 3K06, 86 -

 

2K16, 54 - 1K00 - все в одном байте. 'при увеличении величины емкости

 

задержка станет двухбайтовой

 

============================================================================= 4-16

===================================== Справочник по программированию «Bascom-8051» ==

GETRC5

Прием сигналов с пульта дистанционного управления, поступающих с ИК-приемника в формате

Действие:

 

RC5. Интерфейс использует внешнее прерывание INT0 и поэтому может подключаться только к

 

порту P3.2. При использовании этого оператора необходимо позаботится об инициализации

Синтаксис:

прерывания INT0 (смотри пример).

Getrc5(Subaddress, command) Subaddress – переменная, принимающая адрес

 

команды. Сommand – переменная принимающая код принятой команды.

Пример:

Dim New As Bit Dim Command As Byte , Subaddress As Byte

 

clr tcon.0

 

 

 

On Int0 Receiverc5 Nosave ‘Nosave - только в этой программе!!!

 

Enable Int0 E

 

 

 

nable Interrupts

 

 

 

Do

 

'”1” если приняли

 

If New = 1 Then

 

Print Command ; "

" ; Subaddress

 

New = 0

 

'сбросим и ждем новый

 

End If

 

 

 

Loop

 

 

 

Receiverc5:

 

 

 

'подпрограмма обработки прерываний Int0

 

Getrc5(Subaddress, command) : New = 1 'приняли - уст. бит

 

Return

 

 

GOSUB

Выполнить подпрограмму или процедуру.

Действие:

Синтаксис:

GOSUB label label - имя (адрес) подпрограммы или процедуры

Пример:

GOSUB Routine

‘вызов подпрограммы

 

Routine:

‘Это подпрограмма

 

x = x + 2

‘производим действие

 

RETURN

‘возврат

 

GOTO

Перейти в другую точку программы.

Действие:

Синтаксис:

GOTO label label - имя (адрес) точки перехода.

Пример:

GOTO Exec

‘переход

 

 

Exec:

‘точка перехода

 

X = x + 2

‘производим действие

 

 

‘возврата нет

HEX(), STR()

Действие:

Синтаксис:

Пример:

Hex() – возвращает в строковую переменную с записью числа в шестнадцатеричном виде. Str() – возвращает строку со значением числа, записанного в указанной переменной.

S = Hex( var )

Var – числовая переменная типа: Byte, Integer, Word. S - строковая переменная.

S = Str(x)

X – числовая переменная типа: Byte, Integer, Word, Long, Single.

Dim a as byte, s As string * 10

a = &h6d : s = Hex(a)

‘преобразовать

Print s

: s = Str(a) : Print s

‘выведется

“6D”

a = 123

‘выведется

“123”

============================================================================= 4-17

‘получили 16

===================================== Справочник по программированию «Bascom-8051» ==

HEXVAL(), VAL()

Действие: Преобразовать строку в цифровое значение:

VAL(x) – строки, в которой символами записано десятичное число;

HEXVAL(x) – строки, содержащей шестнадцатиричное значение. В последнем случае цифровое значение должно быть беззнаковым и число символов соответствовать типу переменной, в которую должно записываться.

Синтаксис: var = HEXVAL(x) Var – цифровая переменная типа Byte, Integer, Word, Long. x – строковая переменная.

 

var = VAL(s). Var – цифровая переменная типа Byte, Integer, Word, Long, Single. S –

 

строковая переменная.

 

 

Пример:

Dim Ar As Integer, S As String * 10

‘получили

10

 

S = «000A» : Ar = Hexval(s) : Print Ar

 

S = «123» : Ar = Val(s) : Print Ar

‘получили

123

HIGH(), LOW()

Действие: Считать старший или младший байт двухбайтной переменной. Применение для разделения байтов двубайтового числа.

Синтаксис: Var = HIGH(s) Var = LOW(s)

Var – имя байтовой переменной результата. S – имя двухбайтовой переменной.

Пример: Dim I As Integer , Z As Byte I = &H1001

Z = High(I)

HIGHW(), LOWW()

Действие: Эти функции обеспечивают разделение четырехбайтовых переменных. HIHGW – возвращает два старших байта четырехбайтовой переменной LOWW - возвращает два младших байта четырехбайтовой переменной

Синтаксис: Var = LOWW( s ) var = HIGHW( s )

 

var – переменная, которая примает значения двух байт из четырех имеющихся в переменной S.

 

S – источник данных

 

Пример:

Dim L As Integer , Z As Long

 

L = &H101001

‘Z = 1001h

 

Z = LowW(L)

 

Z = HighW(L)

‘Z = 0010h

============================================================================= 4-18

===================================== Справочник по программированию «Bascom-8051» ==

I2C: I2CRECEIVE, I2CSEND

Действие: I2CRECEIVE - принять данные из устройства I2C. I2CSEND - послать данные в устройство I2C.

Это готовые процедуры, больше пригодные для работы с простыми устройствами, адресуемыми одним байтом. Для более сложных устройств протокол обмена необходимо формировать с помощью операторов: I2CSTART, I2CSTOP, I2CRBYTE, I2CWBYTE.

Синтаксис: I2CRECEIVE slave, var I2CRECEIVE slave, var ,b2W, b2R

2CSEND slave, var

I2CSEND slave, var , bytes

 

Slave - адрес I2C записанный в переменой типа byte, Word/Integer или в виде константы.

 

Var - переменная, куда будут помещены считанные данные из устройства I2C.

 

b2W - число записываемых байт. Не задавать очень много!

 

b2R - число считываемых байт. Также не задавать очень много!

 

Bytes - число байт для передачи.

‘reset variable

Пример:

x = 0

 

slave = &H40

‘адрес расширителя PCF8574

 

I2CRECEIVE slave, x

‘считали его порт

 

PRINT x

‘посмотрели

 

‘------------

‘10-местный буфер

 

Dim buf(10) as String

 

buf(1) = 1 : buf(2) = 2

‘2 ячейки иниц.

 

I2CRECEIVE slave , buf() , 2 , 1

‘запишем из и счит. Одну

 

Print buf(1)

‘посмотрим, что считали

 

‘------------

 

 

x = 5

‘запишем 5

 

I2CSEND slave , x

 

‘------------

 

 

Dim ax(10) As Byte

 

 

For a = 1 to 10

‘заполним пространство от 1 до 10

 

ax(a) = a

 

Next

‘? - резерв. переменная BASCOM

 

Bytes = 10

 

I2CSEND slave , ax() , bytes

‘запишем 10 байт

============================================================================= 4-19

===================================== Справочник по программированию «Bascom-8051» ==

I2C: I2START, I2CSTOP, I2CRBYTE, I2CWBYTE

Действие: I2CSTART - генерировать условия старта.

I2CSTOP - генерировать стоп-условия для окончания сессии обмена. I2CRBYTE - принять один байт из I2C-устройства.

I2CWBYTE – послать байт в I2C-устройство.

Синтаксис: I2CSTART I2CSTOP

I2CRBYTE var, 8/9 I2CWBYTE val

 

Var – переменная-приемник данных I2C-устройства. 8/9 - опция типа считывания. 8 - (ACK),

 

когда считывается не последний байт, т.е. считывание еще будет продолжаться. 9 - (NACK), если

 

это последний байт считываемой последовательности. Val - переменная-источник данных или

 

константа. Функции записи и считывания работают через аккумулятор, поэтому для экономии

 

переменных его можно использовать как источник и приемник данных.

Пример:

Dim Addressw As Const 160 ‘адрес микросхем типа 24Cxx

 

Dim Wadr As Word

‘адрес считываемой переменной

 

Dim Fld As Single

‘приемник данных

‘п/п считывания 4-байт. числа из AT24с01A,AT24c02 - AT24c16

Rds_24c: $asm

mov A , {wadr + 1} ;готовим старший байт, cодержащий

Rl A

 

;старшие разряды адреса

Orl A , #{Addressw}

;добавим код микросхемы

Mov B , A

 

 

$end Asm

 

‘старт

I2cstart

 

I2cwbyte B

 

‘первый байт режима

$asm

 

 

mov A , {wadr + 0}

 

$end Asm

 

‘младший адрес в EEPROM

I2cwbyte Acc

 

Set B.0

 

‘переключим в режим считывания

I2cstart

 

‘повторим старт

I2cwbyte B

 

‘байт режима

I2crbyte Acc , 8

‘считали 1-й байт с опцией ACK (8)

$asm

 

 

mov {Fld + 0} , A

 

$end Asm

 

‘2-й байт

I2crbyte Acc , 8

$asm

 

 

mov {Fld + 1} , A

 

$end Asm

 

‘3-й байт

I2crbyte Acc , 8

$asm

 

 

mov {Fld + 2} , A

 

$end Asm

 

‘последний байт с опцией NOACK (9)

I2crbyte Acc , 9

$asm

 

 

mov {Fld + 3} , A

 

$end Asm

 

‘стоп

I2cstop

 

Return

 

 

============================================================================= 4-20

===================================== Справочник по программированию «Bascom-8051» ==

IDLE

Переводит процессор в режим останова (IDLE), выход из которого происходит только в случае

Действие:

Синтаксис:

любого прерывания или системного сброса.

IDLE

Пример:

Mc: ‘цикл ожидание бита, устанавливаемого в прерывании

 

Do

 

Idle ‘останов для снижения энергопотребления

 

If Bit_a=1 Then ‘проснулся и проверяет: есть событие?

 

Bit_a=0 : Goto Wba ‘да – отработать

 

End If

 

Loop

 

Wba:

 

Set P1.1 ‘действие, вызванное событием в прерывании

 

Goto Mc ‘обратно в цикл ожидания

IF, ELSE , ELSEIF, END IF

Действие: Проверить условия, в результате которых выполняются или пропускаются указанные действия. Производится проверка значений и сравнение всех типов переменных, включая значения отдельных битов одно-, двух- и четырехбайтных переменных!!!

Синтаксис: 1-я конструкция. Исполняется действие Action 1 если выполнено условие expression 1:

IF expression 1 THEN ‘Action 1

END IF

2-я конструкция. Исполняется действие Action 1 если выполнено условие expression 1 и Action 2 если не выполнено:

IF expression 1 THEN ‘Action 1

ELSE

‘Action 2 END IF

3-я конструкция. Исполняется Action 1, если выполнено условие expression 1, Action 2 если не выполнено, однако при условии выполнения expression 2, и Action 3, если не выполнено ни одно из предыдущих условий. Может быть задано несколько проверок дополнительных условий:

IF expression 1 THEN ‘Action 1

ELSEIF expression 2 THEN ‘Action 2

ELSE

‘Action 3 END IF

Пример 1: DIM A AS INTEGER

A = 10

 

IF A = 10 THEN

‘проверка

 

PRINT « This part is executed.»

‘это отпечатается

 

ELSE

PRINT « This will never be executed.»

 

THEN

 

 

 

PRINT «BIT 15 IS SET»

 

 

END IF

 

 

 

REM Пример использования в одной строке

 

 

IF THEN IF A.15 = 0 THEN PRINT «BIT 15=0»

 

ELSE PRINT «BIT 15=1»

 

 

END IF

 

 

Пример 2:

Dim X As Integer

 

 

‘новая возможность проверки – сравнение со значением символа

 

If X = "A" Then 'when X = 65 the test will pass

Пример 3:

‘новая возможность проверки – запись опертора в одну строку

 

If X = 10 Then Goto M1 Else Goto M2

 

============================================================================= 4-21

===================================== Справочник по программированию «Bascom-8051» ==

INP(), OUT

Действие: Первая функция возвращает переменной значение из ячейки во внешней памяти, вторая - записывает значение переменной в ячейку внешней памяти. Функции перемещают только байтовые данные.

Синтаксис: var = INP(address) OUT address, value

Var - числовая переменная. Address - адрес ячейки. Адрес может задаваться одноили двухбайтной переменной. Value - записываемое значение или переменная, содержащая записываемые данные.

Пример:

Dim a As Byte

‘считать по адресу 8000h

a = INP(&H8000)

PRINT a

‘записать 1 по адресу 8000h

OUT &H8000,1

‘Будет следующий

генериться код последнего оператора:

Mov A,#1

Mov dptr,#h’8000

Movx @dptr,a

INSTR ()

Возвращает значение позиции в строке, указанной для поиска подстроки (включения). Пока

Действие:

 

работает только во внутренней памяти.

 

Синтаксис: var = INSTR( start , string , substr )

 

var = INSTR( string , substr )

 

Var – числовая переменная, принимающая значение позиции типа byte и

 

возвращающая 0, если заданное включение не найдено. Start – параметр,

 

который может отсутствовать и задает первую позицию, с которой

 

начнется поиск. Если параметр не указан, поиск начинается с позиции 1.

 

String – имя строки, в которой ищется включение.

 

Substr – имя строки, содержащей искомое включение.

Пример:

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

 

Dim bP as Byte

'строка, в которой ищем

 

s = "This is a test"

 

Z = "is"

‘эту строку

 

BP = Instr(s,z) : Print bP

'если ищем сначала – это позиция 6

bP = Instr(4,s,z) : Print bP 'если ищем с четвертой позиции это – 3 End

============================================================================= 4-22

Синтаксис:

===================================== Справочник по программированию «Bascom-8051» ==

INPUT, INPUTHEX, INPUTBIN

Действие: Функция INPUT может быть использована, когда в системе имеется интерфейс RS-232. При подключении к нему компьютера с программой эмулятора терминала (или другой программой, воспроизводящей аналогичные функции) имеется возможность ввода значений переменных в текстовом виде (числовых и символьных). BASCOM также поддерживает с помощью функция INPUTHEX ввод переменных в HEX-коде, записанном символами (каждый байт записывается двумя символами). Прием заканчивается при поступлении символа <RETURN> (0dh).

Функция INPUTBIN записывает принятые последовательным портом значения «как есть». Ввод заканчивается, как только переменная заполнится, т.е. будет принято необходимое число байт (один для байтовой переменной, два для слова).

INPUT [“prompt”] , var [, varn] [NOECHO] [ TIMEOUT = xx] INPUTHEX [“prompt”] , var [, varn] [NOECHO] [ TIMEOUT = xx]

 

INPUTBIN var1 [,varn] Prompt - приглашение (сообщение, которое будет выводится на

 

терминал перед вводом переменной).

 

 

Var, varn - переменные (их может быть несколько), значения которых вводятся.

 

NOECHO - опция, запрещающая эхо (передачи обратно введенных символов).

 

TIMEOUT – опция, указывающая на необходимость проверки времени ввода. В версии

 

компилятора старше 2.01 эту опцию перед использованием необходимо объявить директивой

 

$TIMEOUT

 

 

XX – параметр задержки до 2^31, по истечению которой произойдет возврат даже при отсутствии

 

ввода данных. Единица времени ожидания приблизительно равна 100 мкс(при 12 МГц). При

 

использовании этой опции компилятор занимает в памяти четыре байта для счетчика времени.

Пример:

$baud = 1200

‘порт должен быть настроен

 

$crystal = 12000000

‘будет применяться ввод с тайм-аутом!

 

$timeout

 

Dim V As Byte , B1 As Byte

 

 

Dim C As Integer , D As Byte

 

Dim S As String * 15

‘только если поддерживается XRAM

 

Input «Введите V» , V

‘вводить только десятичные цифры

 

Input B1

‘без запроса

 

Inputhex «Enter hex number (4 bytes)» , C ‘только шестнадц.

 

Print C

 

 

Inputhex «Enter hex byte (2 bytes)» , D ‘2 байта шестнадцатер.

 

Print D Input «More variables» , C , D ‘несколько переменных

 

Print C ; « » ; D

‘без эха

 

Input C Noecho

 

Input «Enter your name» , S

 

Print «Hello» ; S

Input S Noecho Timeout = 10000 ‘без эха символьную строку

‘на ввод строки 400 мс

Print S

============================================================================= 4-23

Синтаксис:
Пример:
LCD, LCDHEX
Действие:
Синтаксис:

===================================== Справочник по программированию «Bascom-8051» ==

INKEY, WAITKEY

Действие: Функция INKEY возвращает ASCII значение первого символа в последовательном входном буфере. Если буфер пуст, возвращается нуль.

Функция WAITKEY действует почти также, но возврат происходит только после приема символа.

var = INKEY var = WAITKEY

 

var – переменная

типа Byte, Integer, Word, Long или String. Если символ не введен,

 

возвращается нулевое значение

Пример:

DO

‘начать цикл

 

A = INKEY

‘проверить буфер

 

IF A > 0 THEN

‘есть символ? (>0)

 

PRINT A

‘да, показать его

 

END IF

‘замкнуть петлю

 

LOOP

 

A = Waitkey

‘здесь просто ждать символа

LCASE(), UCASE()

Действие: Возвращает строки строчных и прописных символов (преобразует соответственно строчные из приписных и прописные из строчных). Преобразует символы только латинского алфавита. Цифры и другие знаки не изменяет.

dest = LCASE(source) и dest = UCASE(source) dest строка-приемник. Source строка-источник.

Dim S as string * 12 , Z as string * 12

S = “asDFv”

'assign string

Z = LCASE(s)

'convert to lowercase

Print Z

'”asdfv”

Z = UCASE(s)

'convert to upper case

Print Z

'”ASDFV”

Послать константу или переменную на индикатор LCD.

Функция LCD очень похожа на функцию PRINT. Имеется внутренняя подпрограмма – вывод символа на индикатор в позицию курсора из аккумулятора. Например:

 

Acc = $h33

‘«3» в ACC

 

 

Call Write_lcd

‘на индикатор

 

 

Функция LCDHEX посылает значение переменной на индикатор в шестнадцатеричном виде

 

(каждый байт в виде двух символов от 00 - FF).

 

Синтаксис:

LCD var

 

 

 

LCDHEX var

 

 

 

Var – выводимая переменная или константа. Тип:

Byte, Integer, Word, Long, Single, Constant.

 

Можно показывать несколько переменных, отделяя их знаком « ; » :

 

LCD a ; b1 ; «constant»

‘поставить курсор

Пример:

Ar = 65 : Locate 2 , 1

 

Lcd «*» : Lcd « = » ; Ar

‘увидим «* = A»

 

Ar = &HBF : Clr : LCDHEX Ar

‘увидим «BF»

============================================================================= 4-24

===================================== Справочник по программированию «Bascom-8051» ==

LCD: CURSOR, DISPLAY, HOME, LOCATE, SHIFTLCD, SHIFTCURSOR

FOURTHLINE, LOWERLINE, THIRDLINE, UPPERLINE

FOURTH, LOWER, THIRD, UPPER

Действие: Управлять курсором LCD:

CURSOR ON - включить курсор (сделать видимым) CURSOR OFF - выключить курсор (сделать невидимым)

CURSOR BLINK - сделать курсор мигающим (в виде блока или прямоугольника) CURSOR NOBLINK - сделать курсор немигающим (в виде подчеркивателя) HOME - поставить курсор в начало первой строки

HOME LOWER или HOME L – поставить курсор в начало строки ниже

HOME UPPER или HOME U – поставить курсор в начало строки выше

HOME THIRD или HOME T – поставить курсор в начало третьей строки

HOME FOURTH или HOME F – поставить курсор в начало четвертой строки LOCATE y,x – расположить курсор в строке y, в знакоместе x SHIFTCURSOR LEFT – сдвинуть курсор влево на одну позицию SHIFTCURSOR RIGHT – сдвинуть курсор вправо на одну позицию LOWERLINE – поставить курсор на нижнюю строку (на одну строку ниже) UPPERLINE – поставить курсор на верхнюю строку (на одну строку выше) THIRDLINE – поставить курсор на третью строку (если она есть) FOURTHLINE – поставить курсор на четвертую строку (если она есть)

При включении питания курсор видимый (OFF)и не мигает (NOBLINK). Управление изображением на LCD:

DISPLAY ON – включить индикацию (сделать изображение видимым) DISPLAY OFF – выключить индикацию (сделать изображение невидимым)

SHIFTLCD LEFT – сдвинуть изображение влево на одну позицию (во всех строках) SHIFTLCD RIGHT – сдвинуть изображение вправо на одну позицию

Синтаксис: CURSOR ON/OFF, CURSOR BLINK/NOBLINK

CURSOR ON/OFF, DISPLAY ON/OFF , LOCATE y , x

X- константа или переменная со значением позиции (1-64*)

Y- константа или переменная со значением строки (1-4*)

 

* определяется типом индикатора

 

 

Пример:

Dim a As Byte

‘мигать курсором

 

Cursor Blink

 

a = 255 : Lcd a : Cursor Off

‘невидимый курсор

 

Display Off : Wait 1 : DISPLAY On

‘выключить индикацию на 1 с

 

Locate 1 , 10 : LCD «Hello» ‘начиная с 10

позиции вывести сообщение

 

Cls : LCD «Very long text» ‘очистить и написать снова

 

Shiftlcd Left : Wait 1 : Shiftlcd Right :

LCD a : Lowerline ‘сдвигать

 

CD a : Upperline

 

 

============================================================================= 4-25

===================================== Справочник по программированию «Bascom-8051» ==

LEFT(), MID(), RIGHT()

 

 

 

 

Действие:

Функции разделения строковых (текстовых) переменных: LEFT() - возвращает значение самого

 

левого символа (или несколько символов cлева). MID() - возвращает значение символа из

 

середины строки (или несколько средних символов). Может заменить часть строки символами

 

другой переменной. RIGHT - возвращает значение самого правого символа (или несколько

 

правых символов). Строковые переменные, применяемые в этих операциях, должны быть одного

 

типа, т.е. располагаться или во внутренней памяти или во внешней. Длина переменных,

Синтаксис:

используемых при этих операциях, может быть различной.

 

var = Left(var1 , n ) – взять символы слева

 

 

var = RIGHT(var1 ,st ) – взять символы справо

 

 

var = MID(var1 ,st [,l] ) – взять символы из середины

 

MID(var ,st [, l] ) = var1 – вставить символы в середину строки

 

var – строка результата операции. Var1 – исходная строка. N – число забираемых символов.

 

Тип n : Byte, Integer, Word, Long, Constant.

St – стартовая позиция (с слева. Крайний слева

 

символ – первый). L – число извлекаемых или вставляемых символов.

Пример:

Dim s As XRAM String * 15, z As XRAM String * 15

 

S = «ABCDEFG» : z = Left(s,5) : Print z

‘ABCDE

 

S = «ABCDEFG» : z = Right(s,2) : Print z

‘FG

 

S = «ABCDEFG» : z = Mid(s,2,3): Print z

‘BCD

 

Z = «12345» : Mid(s,2,2) = z : Print s

‘A12DEFG

LEN()

Функция возвращает длину строки. Под длиной строки имеется в виду число символов,

Действие:

 

загруженной строки, а не длина буфера, определенного как строковая переменная. Применяется

Синтаксис:

совместно в операциях преобразования строк.

 

 

Var = LEN( string )

Var – цифровая переменная, принимающая значение длины

 

строки. String – строка, длина которой вычисляется.

 

Пример:

Dim S As String * 12 , A As Byte

‘буфер на 12 символов

 

S = «test» : A = Len(s) : Print A ‘а длина переменной только 4

LOAD TIMER

Записывает значение в таймер, работающий в режиме самозагрузки (записывает в регистры,

Действие:

 

определяющие частоту переполнения).

 

 

Синтаксис:

LOAD TIMER , value

 

 

 

 

TIMER – имя одного из таймеров: TIMER0, TIMER1 или TIMER2.

 

Value – переменная

или

константа. Задаваемое значение определяет интервал времени (в

 

режиме ON TIMERx и MODE 2), по истечении которого наступит прерывание. Диапазон

 

значений – от 1 до 255 для TIMER0, TIMER1 и от 1 до 65535 для TIMER2. Директива LOAD

 

корректирует загружаемое значение: TLx = THx = (256 - value) – внимание! записывает

 

одинаковые значения! RCAP2L , RCAP2H = (65536 - value) Для загрузки непосредственно

 

задаваемого значения (без корректировки) применять оператор COUNTERx .

Пример:

LOAD TIMER0, 100

‘загрузить 100

 

 

Будет сгенерирован код: Mov tl0,#h’9C

Mov th0,#h’9C LOAD TIMER2, 1000

Будет сгенерирован код: Mov RCAP2L,#24

Mov RCAP2H,#252

============================================================================= 4-26

===================================== Справочник по программированию «Bascom-8051» ==

LOOKUP, LOOKUPSTR

 

 

Действие:

LOOKUP - возвращает числовое значение, считанное из таблицы.

 

LOOKUPSTR - возвращает строку из таблицы, содержащей строковые данные (разной длины).

Синтаксис:

Var = LOOKUP(value , label)

 

 

Var = LOOKUPSTR(value , label)

 

 

Var – имя переменой, в которую помещается значение из таблицы. Типы переменных var: Byte,

 

Integer, Word, Long, Single

 

 

Value – имя переменной, содержащей индекс (смещение по таблице). Первый элемент имеет

 

индекс (базу) = 0 (без смещения). Все элементы таблицы должны быть одинакового размера! И

 

соответствовать типу принимающей переменной! Иначе произойдет ошибка - нарушение

 

синхронизации. BASCOM не проверяет это соответствие! Для функции LOOKUPSTR количество

 

строк в таблице не должно превышать 256, а длина самих строковых констант может быть

 

различной. Типы переменных: value: Byte, Integer, Word, Long, Constant.

 

Label – метка начала таблицы (адрес).

 

Пример:

DIM b1 As Byte , I as Integer

‘b1=2 - первый элемент 0-й!!!

 

b1 = Lookup(1, dta)

 

I = Lookup(0,DTA2)

‘I=1000

 

Dim s as string, idx as Byte

 

 

Idx = 0 : s = LookupStr(idx,Sdata)

 

Print s

 

‘S=»This»

 

DTA:

 

 

 

Data 1,2,3,4,5

 

 

DTA2:

‘integer data

 

Data 1000% , 2000%

Sdata:

Data «This» , is» , «a test»

MAKEBCD(x)

 

 

 

 

Действие:

Преобразовать переменную двоичную (с числом, записанным в двоичном виде) в переменную в

Синтаксис:

двоично-десятичном формате.

Var1 - переменная, принимающее двоично-десятичное значение

Var1 = Makebdc(var2)

 

(типа Byte, Word, Integer, Long или Constant). Var2 - переменная, содержащая двоичное значение.

Пример:

Arb = Makebdc(arb)

‘10h, 21h, 40h преобр. в 16h, 33h, 64h

MAKEDEC(x)

 

 

 

 

Действие:

Преобразовать переменную, выраженную в двоично-десятичном виде, в двоичное число.

Синтаксис:

Var1 = Makedec(var2)

var1 -

переменная, принимающее двоичное значение. Var2

 

переменная, содержацая двоичнодесятичное значение (только типа Byte, Word или Integer).

Пример:

Arb = Makedec(arb)

‘10h, 21h, 40h преобр. в 0ah, 15h, 2ah

MAKEINT()

Скомпоновать из двух байтов слово ( word или integer).

 

Действие:

результат. LSB - имя байтовой

Синтаксис:

Varn = MAKEINT(LSB ,

MSB)

Varn – беззнаковый

 

переменной или константы, помещаемой в младшие разряды. MSB - имя байтовой переменной

 

или константы, помещаемой в старшие разряда результата. Математический эквивалент

 

операции: varn = (256 * MSB) + LSB

 

Пример:

Dim a As Integer , I As Integer

= 258

 

a = 2 : I = Makeint(a , 1) ‘I = (1 * 256) + 2

============================================================================= 4-27

===================================== Справочник по программированию «Bascom-8051» ==

MAX(), MIN()

Действие: MAX() – выбирает из указанного массива наибольшее значение.

MIN() – выбирает из указанного массива наменьшее значение. Пока эта функции работают только с массивами байтовых переменных.

Синтаксис: var = MAX( ar(1) ) var = MIN( ar(1) )

var – переменная, принимающее запрашиваемое значение. ar(1) – имя массива (в скобках всегда указывается единица).

Пример: Dim ar(10) As Byte Dim Bp as Byte For Bp = 1 to 10

ar(Bp) = Bp Next

Bp = Max(ar(1)) : Print Bp 'отпечатается 10

Bp = Min(ar(1)) : Print Bp 'отпечатается 1 End

MOD

Функция возвращает остаток от деления двух переменных

Действие:

Синтаксис:

ret = var1

MOD var2 ret - переменная, принимающая значение остатка. var1 -

 

переменная-делимое (variable to divide). var2 - переменная-делитель (The divisor). Работает с

 

переменными типа Byte, Word, Integer, Long.

Пример:

a = 10 MOD 3 ‘10/3

 

PRINT a

‘a=1

============================================================================= 4-28

===================================== Справочник по программированию «Bascom-8051» ==

MWINIT, MWREAD, MWWRITE, MWWOPCODE

Действие: MWINIT - установить выводы, предназначенные для интерфейса Microwire в исходное состояние. MWREAD - считать в переменную значение из интерфейса Microwire.

MWWRITE – записать значение переменной в интерфейс Microwire. MWWOPCODE – записать код операции в устройство с интерфейсом Microwire.

Синтаксис: MWINIT

MWREAD variable , opcode , address, bytes MWWRITE variable , opcode , address, bytes MWWOPCODE opcode , bits

Variable – переменная, принимающая считанное значение. Opcode – код операции. Может включать в себя и дополнительные биты операций. В операторе MWWOPCODE включает и фиктивные биты адреса (см. Примеры и описание микросхем). Address – адрес на шине. Может задаваться переменной типа Byte или Word.. Bytes – число пересылаемых байт. Зависит от выбранной длины данных (1 или 2). Bits – суммарное число посылаемых бит (определяется типом микросхемы и длиной данных).

Пример 1: Dim Dta As Byte, Adr As Byte ‘определим переменные 'использовать EEPROM 93C46 (“Org” = 0), пересылать байты (AL=7)

Config Microwire=Pin, Cs=P1.1, Din=P1.2, Dout= P1.4, Clock=P1.5, Al=7 Mwinit 'инициализировать линии

'разрешить запись в EEPROM и стирание

'требуется включить в код операции, записанный в двоичном виде:

старт-бит (1), код операции (00) и (11) + адрес (любой, обычно 0) Mwwopcode &B1001100000 , 10 ‘также добавим получившееся число бит

Dta = 10 : Adr = 8 'значения данных и адреса

 

 

 

Mwwopcode &B1001000000 , 10

'проведем общее стирание

 

'запишем значение из Dta в ячейку EEPROM по адресу, указанному Adr

'код операции: старт бит 1 +

(01). Число байт: (1)

 

 

Mwwrite Dta , &B101 , Adr , 1

операция

на

шине

Micriwire

'если

далее

вскоре

последует

'обязательно ждем завершения

записи 2 – 5 мс, т.к. компилятор не ждет

'появления аппаратного сигнала готовности

 

 

 

Waitms 10 : Dta = 0

 

 

 

 

 

 

'считать обратно

 

 

(10). Число байт: (1)

 

 

'код операции: старт бит 1 +

 

 

Mwread Dta , &B110 , Adr ,

1

 

 

 

 

'запретить запись и стирание

(00) и (00) + адрес (любой, обычно 0)

'старт-бит (1), код операции

Mwwopcode &B1000000000 , 10

 

 

 

 

 

End

 

 

 

 

 

 

 

 

Пример 2: ‘аналогичный пример для 16-разрядных данных

Dim Dta As Word, Adr As Byte ‘определим переменные 'использовать EEPROM 93C46 (“Org” = 1), пересылать слова (AL=6)

Config Microwire=Pin, Cs=P1.1, Din=P1.2, Dout= P1.4, Clock=P1.5, Al=6 Mwinit 'инициализировать линии

'разрешить запись в EEPROM и стирание

'требуется включить в код операции, записанный в двоичном виде: Mwwopcode &B100110000 , 9 'также добавим получившееся число бит

Dta = &h1000 : Adr = 8

'значения

данных и адреса

Mwwopcode &B100100000 , 9 'проведем

общее стирание

'запишем значение из Dta в ячейку EEPROM по адресу, указанному Adr 'код операции: старт бит 1 + (01). Число байт: (2)

Mwwrite Dta , &B101 , Adr , 2 Waitms 10 : Dta = 0

'код операции: старт бит 1 + (10). Число байт: (2) Mwread Dta , &B110 , Adr , 2 'считать обратно

'запретить запись и стирание

Mwwopcode &B100000000 , 9 End

============================================================================= 4-29

===================================== Справочник по программированию «Bascom-8051» ==

NOSAVE

Действие:

Пример:

Опция NOSAVE директивы ON Interrupt запрещает компилятору автоматически включать в программу блоки сохранения и восстановления регистров на время обработки прерывания. Необходимость этой опции очевидна, т.к. при ее отсутствии BASCOM производит сохранение в стеке регистров с адресами от 0 до 11h, Acc, B, PSW, DPL и DPH (всего 21 регистр). Т.е. считается, что при обработке прерываний можно применять все команды BASCOM (или почти все). Это не только нерационально, но иногда и недопустимо, например, при наличии вложенных прерываний. Существуют два способа решения этой проблемы: а) с помощью дисассемблера определить регистры, действительно используемые при обработке каждого прерывания, и обеспечить их сохранение «вручную», применив ассемблерные команды Push и Pop; б) написать процедуру обработки прерывания на ассемблере.

Config Timer0 = Timer, Gate = Internal, Mode = 1 : Start Timer0 ‘назначение режимов прерываний

On Timer0 Timer_0_int Nosave

‘вектор прерывания

Enable Interrupts

‘вообще разрешить прерывания

Enable Timer0

‘разрешить прерывания таймера 0

‘------------------------------------------

‘обработка прерывания таймера 0 Timer_0_int:

Counter0 = &HD8FD

‘D8fdh - период прерыв. 10 мс

$asm

 

;обработка интегратора термодатчика

Push Psw

Push Acc

;сохранить используемые регистры

Jb

{B_ctmp} , Intt2 ;есть перегрев?

Mov A , {R_ot}

;да - датчик температуры сработал

Cjne A , #{Cit} , Intt1 ;интегратор достиг максимума?

Sjmp Intte

;да - просто выйти

Intt1:

 

;нет - нарастить знач. Интегратора

Inc A

Cjne A , #{cit} , Intt3 ;он сейчас достиг максимума

Setb {b_ot}

;да - поставить бит «Перегрев»

Sjmp Intt3

 

Intt2:

 

;перегрева нет

Mov A , {R_ot}

Jz

Intte

;интегратор пуст?

Dec A

;не пуст - уменьшить значение

Intt3:

 

;изменился - сохр. Новое значение

Mov {R_ot} , A

Intte:

 

;восстановить регистры

Pop Acc

Pop Psw

 

Reti

 

 

$end Asm

 

 

============================================================================= 4-30

===================================== Справочник по программированию «Bascom-8051» ==

ON Interrupt

Запускать подпрограмму, когда случается указанное прерывание. При компиляции директива ON

Действие:

 

Interrupt производится назначение прерывания - записывается команда перехода на программу

 

обработки (вектор прерывания) на место в начале программы, соответствующее типу

 

прерывания.

 

 

 

 

Синтаксис:

ON interrupt label [NOSAVE]

 

 

Interrupt

- имя прерывания: INT0, INT1, SERIAL, TIMER0 ,TIMER1, TIMER2 или PCA.

 

Выбор используемого прерывания определяется конфигурацией системы и моделью процессора.

 

Список используемых прерываний может быть расширен.

 

Label - метка начала программы обработки прерывания, куда должен происходить переход,

 

если случилось соответствующее прерывание.

 

NOSAVE - необязательная опция. Она запрещает компилятору включать в программу блоки

 

сохранения и восстановления регистров на время обработки прерывания. Программа обработки

 

прерывания должна завершаться только одной командой RETURN, т.к. компилятор генерирует

 

код команды RETI только один раз. Когда вы используете входы INT0 или INT1 вы должны

 

указать и условия возникновения этих прерываний, установкой или сбросом соответствующих

 

битов:

 

‘INT0 запускается падающим фронтом.

 

SET TCON.0

 

 

RESET TCON.0

‘INT0 низким уровнем.

 

SET TCON.2

 

‘INT1 запускается падающим фронтом.

 

RESET TCON.2

‘INT1 низким уровнем.

Пример:

ENABLE INTERRUPTS

‘разрешить все прерывания

 

ENABLE INT0

 

‘разрешить прерывание INT0

 

ON INT0 Label2

 

‘обработка начинается с label2

 

SET TCON.0

 

 

‘INT0 запускать падающим фронтом

 

DO

 

 

‘пустой цикл

 

LOOP

 

 

 

 

 

END

PRINT «An hardware interrupt occurred!» ‘печатать это

 

Label2:

 

RETURN

 

 

 

 

ON Value

Перейти к одной из последовательных меток, в зависимости от значения переменной. Возможны

Действие:

 

варианты: простого перехода (GOTO) или вызова подпрограммы (GOSUB). В последнем случае,

Синтаксис:

происходит возврат к следующему оператору – его адрес запоминается в стеке.

ON var [GOTO]

[GOSUB] label1

[, label2] Var - числовая переменная или даже

 

регистр SFR, например порт P1. Label1, label2 - метки, к которым происходит переход. База

 

первой метки равна нулю.

 

‘переменная без знака

Пример:

X = 2

 

 

 

 

ON x GOSUB lbl1, lbl2,lbl3

‘выбор п/п lbl3

 

X = 0

 

 

 

‘переход на метку lbl4

 

ON x GOTO lbl4, lbl5

 

 

END

 

 

 

 

 

Lbl1: PRINT « lbl1» : RETURN

 

 

Lbl2: PRINT « lbl2» : RETURN

 

lbl3: PRINT « lbl3» : RETURN Lbl4: PRINT « lbl4» : STOP Lbl5: PRINT « lbl5» : STOP

============================================================================= 4-31

===================================== Справочник по программированию «Bascom-8051» ==

OPEN - CLOSE , GET, PUT

Действие: Открыть и закрыть устройство (канал) ввода или вывода

Синтаксис: OPEN «device,[Inverted]» for Mode As #channel CLOSE #channel

 

Device - имя порта. Для аппаратных портов предусмотрены имена: COM1 (стандартный) и

 

COM2 (только для моделей с 80517 или 80537 со вторым UART). Программные порты должны

 

специфицироваться по имени и скорости, например, COM3.0:9600 (линия P3.0 при 9600 бод).

 

Mode - режим. Можно использовать опции BINARY (двунаправленный), INPUT (только на ввод)

 

или OUTPUT (только на вывод) для COM1 и COM2. Для программных портов можно назначать

 

только опции INPUT или OUTPUT. Опция Inverted применяется только для программных

 

портов, когда необходимо скомпенсировать инверсию драйвера.

 

Channel -

номер открытого канала (только положительное число). Каждый открытый канал

 

должен быть закрыт с помощью команды CLOSE #channel. Аппаратные порты поддерживают

 

использование команд PRINT, PRINTHEX, INPUT и NPUTHEX. Программные порты могут

 

работать только с операторами GET и PUT (в 1-й версии компилятора) для приема и посылки

 

данных.

 

 

 

GET #channel , var и PUT #channel , var - записать данные из канала в

 

переменную и соответственно поместить в канал данные из переменной. Скорее всего,

 

перемещать можно только байтовые данные, по крайней мере, через программные порты.

Пример 1:

‘применение аппаратного порта

 

CONFIG BAUD = 9600

‘определим скорость

 

OPEN «COM1:» FOR BINARY AS #1 ‘откроем канал

 

PRINT #1, «Hello»

‘послать как в канал 1

 

PRINT «Hello»

‘послать как обычно

 

CLOSE #1

 

‘закрыть канал

Пример 2:

‘применение программного порта. Работает с любым выводом!

 

‘программный порт именуется по имени линии порта

 

‘для P3.0

будет «COM3.0:»(P упускается)

 

‘также должна указываться бодовая скорость. Для 9600 baud

 

‘имя устройства будет «COM3.0:9600»

 

‘чтобы посылать данные указывает режим OUTPUT

 

‘чтобы принимать указываем INPUT

 

‘можно использовать только PUT и GET.

 

‘PRINT в данной версии не поддерживается.

 

‘линии взяты p3.0 и p3.1, чтобы было удобно контролировать

 

‘как работают программные порты

 

Dim A As Byte , S As String * 16 , I As Byte , Dum As Byte

 

Open «com3.1:9600» For Output As #1

 

Open «com3.0:9600» For Input As #2

 

S = «test this»

‘назначить строку

 

Dum = Len(s)

‘вычислим ее длину

 

For I = 1 To Dum

‘перечислим все символы слева направо

 

A = Mid(s , I , 1) ‘берем очередной символ

 

Put #1 , A

‘запишем его в com-порт

 

Next

 

 

 

Do

 

‘возмем символ из com-порта

 

Get #2 , A

 

Put #1 , A

‘запишем обратно

 

Print A

 

‘используем нормальный канал

 

Loop

 

‘закроем порты

 

Close #1

 

Close #2

 

 

End

 

 

Пример 2:

Open "com1.2:9600 , Inverted" For Input As #1 'порт p1.2 с инверсией

 

Print #1, «Hello»

'послать как в канал 1

 

Close #1

'закроем порт

============================================================================= 4-32

Синтаксис:
Пример:

===================================== Справочник по программированию «Bascom-8051» ==

PEEK()

Возвращает значение переменной (байтовой), расположенной во внутренней памяти.

Действие:

Синтаксис:

var =

PEEK( address ) var - имя переменной, принимающей считываемое значение.

 

Address - числовая переменная или константа с адресом считываемых данных в диапазоне от 0

 

до 255.

 

Пример:

DIM a As Byte

 

a = Peek( 0 ) ‘считать значение R0

POKE

Записать байт в ячейку внутренней памяти.

Действие:

Синтаксис:

POKE

address , value Address - адрес записи. Числовая переменная или константа в

 

диапазоне от 0 до 255. Value - записываемое значение (0-255). Будьте внимательны с POKE

 

потому, что можете изменить переменные, которые нужны программе для правильной работы.

 

Имеются в виду, в первую очередь, не явно используемые регистры BASCOM. Для этой команды

 

они особенно легко доступны.

Пример:

POKE 127, 1 ‘записать 1 по адресу 127

POWERDOWN

Действие: Выключить генератор и остановить процессор. Это полный финиш - выход только по сбросу или по внешнему прерыванию INT0. Последнее предусмотрено только у некоторых моделей микроконтроллеров (i87c51fa и др.). После выключения порты и регистры внутренней памяти сохраняют свое значение, но таймеры останавливаются. Процессор переходит в режим микропотребления. Данный режим актуален для аппаратуры с автономным питанием, где предусмотрена возможность активизации внешним сигналом (вывод сброса). Общее замечание – чтобы обеспечить минимальное потребление, порты должны быть установлены в низкий уровень.

Пример: P0 = 0 : P1 = 0 : P2 = 0 : P3 = 0 : POWERDOWN

PRINT, PRINTHEX

Действие: Послать данные в виде текстовой строки в последовательный интерфейс (RS-232 port). PRINT - преобразует все виды числовых данных в десятичный вид. При выводе отрицательных значений перед печатаемым числом ставит знак минус (« - »). PRINTHEX - выводит числовые данные в шестнадцатеричном виде (HEX - коде). Для работы этих функций в системе должен быть иметься и быть настроен последовательный интерфейс. Если этого не сделать, компилятор произведет их сам, воспользовавшись параметрами меню “Options”.

PRINT var ; «constant» PRINTHEX var

Var - имя переменной или константы или непосредственные данные, которые будут выводиться в последовательный порт. Числовые переменные при выводе преобразуются в удобочитаемый текстовый вид. В одной строке, разделяя точкой с запятой (« ; ») можно выводить несколько переменных или констант, совершенно разного типа. Оператор PRINTHEX может выводить данные переменных только типа: Byte, Word, Integer, Long. Выводимые данные завершаются разделителем (ВК, ПС). Применение оператора PRINT без параметров вызывает вывод только одного разделителя (ВК, ПС).

Dim A As Byte , B1 As Byte , C As Integer A = 1

Print «print variable a=» ; A

Print

‘пустая строка

Print «Text to print.»

‘печать текстовой константы

B1 = 10 : Printhex B1

‘печать в шестнадцатеричном виде

C = &HA000 : Printhex C

‘аналогично в HEX-формате

Print C

‘а теперь в десятичном виде

C = -32000

‘выведется -32000!

Print C

Printhex C

‘выведется 8300

============================================================================= 4-33

===================================== Справочник по программированию «Bascom-8051» ==

PRINTBIN

Послать данные в последовательный порт, содержащиеся в переменных, без преобразования в

Действие:

 

текст и без символов разделителя строк (0Dh, 0Ah). PRINTBIN почти эквивалент оператора

 

PRINT CHR(var), но с тем отличием, что может выводить индексированные переменные (из

Синтаксис:

массивов).

 

PRINTBIN var [,varn] Var – имя переменной, данные которой будут передаваться. Varn -

 

можно посылать несколько переменных в одной строке. Количество посылаемых байт

 

определяется длиной переменной. В одной строке, разделяя запятой (« , »), можно выводить

 

несколько переменных.

Пример:

Dim a(10) as Byte, c as Byte

 

‘это самый важный пример

 

For c = 1 To 10

 

A(с) = с

‘заполним массив

 

Next

‘пошлем первый элемент массива

 

PRINTBIN a(1)

PRIORITY

Установить или снять высший уровень приоритета прерывания. Применяется в тех случая, когда

Действие:

 

нужно изменить естественный или установленный ранее порядок приоритетов. Исходный

 

порядок приоритетов: INT0 - 1 (самый высокий); TIMER0 - 2; INT1 - 3; TIMER1

 

- 4; PCA – 5;

SERIAL – 6; TIMER2 – 7 (самый низкий). Смысл приоритетов в

 

том, что прерывание более высокого уровня может прервать исполнение прерывания более

 

низкого уровня. Прерывание наивысшего уровня (приоритет установлен) не может быть прервано

 

другим прерыванием и обеспечивает наивысшую скорость реакции на событие, вызвавшее его.

 

Фактически, эта команда устанавливает и сбрасывает биты в регистры IP.

Синтаксис:

PRIORITY SET / RESET interrupt

 

SET – установить приоритет выше.

 

RESET - сбросить (отменить) высший уровень приоритета.

 

Interrupt - прерывание, с которым производится операция. Это может быть: INT0, INT1,

 

SERIAL, TIMER0, TIMER1 and TIMER2.

Пример:

PRIORITY SET SERIAL ‘посл. порт - наивысший уровень

READ, RESTORE

 

Действие:

RESTORE разрешает оператору READ прочитать значение, объявленное как непосредственные

 

данные (оператором DATA). По сути, оператор RESTORE устанавливает указатель считываемых

 

данных. READ записывает в указанную переменную значение константы, указываемое

 

оператором RESTORE. При повторном использовании оператора READ считывается следующая

 

константа, т.е. происходит последовательный доступ к непосредственным данным. Для

 

произвольного доступа к данным (как к таблице) следует применять более совершенный

 

оператор LOOKUP.

 

Синтаксис:

READ var

 

 

var – переменная, принимающая данные. Важно, чтобы переменная и тип данных были

 

одинаковыми.

 

 

RESTORE label

 

 

Label - метка блока DATA, которая будет использоваться последующим оператором READ.

Пример:

Dim a As Byte, I As Integer

 

Restore Dta1

 

 

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% ‘Integers с % (Integer : <0 или >255)

============================================================================= 4-34

===================================== Справочник по программированию «Bascom-8051» ==

REM или ‘

Начало строки комментариев. Текст в строке комментария пропускается компилятором.

Действие:

 

Не рекомендуется применение третьего способа создания многострочных комментариев –

 

‘( это комментарии ‘).

REPLACE

Заменить в сроковой переменной один символ другим

Действие:

Синтаксис:

REPLACESET String , Old , New String – имя обрабатываемой переменной. Old

 

строковая или байтовая константа, указывающая на заменяемый символ. New –строковая или

 

байтовая константа, указывающая на заменяющий символ.

Пример:

Dim S1 as String

 

S1 = “123.456”

 

Replace S1 , “.” , “,”

 

Print S1

‘получим “123,456”

RESET, SET

 

 

Действие:

Reset – сбросить (записать «0») и Set – установить (записать «1») битовую переменную. Оператор

 

работает как с битово адресуемыми регистрами и портами, так и битами одно-, двух- и

Синтаксис:

четырехбайтовых переменных во внутренней памяти.

RESET bit , RESET var.x , SET bit , SET var.x Bit - имя физического бита или

 

переменной в битовой области процессора. X – константа – место бита в байте (x=0-7), в слове

 

(x=0-15) или двойном слове (x=0-31). Var – имя переменной, в которой находится изменяемый

 

бит. Типы переменных: Byte, Integer, Word и Long.

Пример:

Dim b1 as bit, b2 as byte, I as Integer

 

RESET P1.3

‘сброс бита 3 порта 1

 

RESET b1

‘битовая переменная

 

RESET b2.0 ‘сброс бита 0 байтовой переменной b2

 

RESET I.15

‘сброс MS (старшего) бита I

RETURN

Возврат из подпрограммы (компилируется как RET) или из подпрограммы обработки прерывания

Действие:

 

(компилируется RETI). В последнем случае компилятор сам заменяет RET на RETI. Причем

 

команда RETI устанавливается только один раз вместо первого оператора Return, встреченного

 

после метки вызова данной подпрограммы. Если у программы обработки прерываний несколько

 

выходов, то все последующие должны оформляться ассемблерной вставкой с командой RETI. И

 

наоборот, если подпрограмма прерывания написана на ассемблере, то она должна завершаться,

 

хотя бы одним оператором RETURN.

Синтаксис:

RETURN

‘вызвать подпрограмму

Пример:

GOSUB Pr

 

PRINT result

‘что-то печатать

 

END

‘конец программы

 

Pr:

‘подпрограмма

 

result = 5 * y : result = result + 100 ‘делать что-нибудь

 

RETURN ‘возврат из подпрограммы

RND()

Возвращает случайное число

Действие:

Синтаксис:

Var = RND(Lim) Var – имя переменной типа Word, принимающей результат.

 

Lim – максимальное число, которое может принимать случайное значение переменной

Пример:

Dim Ar As Word

 

Do

 

 

Ar = Rnd(1000) : Print Br

 

Loop

 

============================================================================= 4-35

===================================== Справочник по программированию «Bascom-8051» ==

ROTATE

Сдвиг по кругу всех битов переменной на одну или несколько позиций

Действие:

Синтаксис:

ROTATE var , LEFT/RIGHT [,

Shifts] Var – имя преобразуемой переменной типа

 

Byte, Integer/Word or Long. Shifts

- число сдвигов, которое нужно произвести. Замечательно,

 

что значение флага С (carry) принимает старший или младший бит сдвигаемой переменной. Т.е.

 

ROTATE работает также как команды RLC и RRC. Когда эта возможность не требуется,

 

очищайте С (carry) перед сдвигом командой CLR C.

Пример:

Dim a as Byte

 

 

 

 

 

a = 128 : ROTATE a, LEFT , 2 : Print a ‘1

 

;генерируемый код

;число сдвигов

 

Mov R7,#2

 

Mov R0,#h’21

;адрес сдвигаемой переменной

 

Mov a,@r0

 

 

 

 

M1: Rlc a

 

 

 

 

 

Djnz r7,M1

 

 

 

 

Mov @r0,a

 

 

 

SERVOx

Загрузка значения, определяющего длительность генерируемого импульса в 100 мкс. Период

Действие:

 

повторения импульсов 20 мс, т.е. с частотой 50 Гц.

Синтаксис:

ServoX = NN

 

NN – число, равное длительности генерируемых импульсов.

 

X – номер выхода от 1 до 16.

Пример:

Servo1 = 8

' 800 uS

 

 

 

 

Servo2 = 12

'1200 uS

 

 

 

SHIFTIN. SHIFTOUT

 

 

 

 

Действие:

Побитный вывод или ввод данных для записи в сдвиговый регистр или для считывания из

 

сдвигового регистра

 

 

 

Синтаксис:

SHIFTIN pin , pclock , var , option [PRE}

 

SHIFTOUT pin , pclock , var , option

 

Pin - имя порта, используемого для ввода или вывода данных.

 

Pclock - имя порта, используемого для генерации сигнала синхронизации.

 

Var – приемник или источник сдвигаемых данных.

 

Option – дополнительный параметр (режим). Может иметь следующие значения:

 

0 - старший бит переменной выдвигается первым и используется положительная полярность

 

импульсов синхронизации (0 - 1 - 0).

 

 

 

1 - старший бит первый при отрицательных импульсах синхронизации (1 - 0 - 1).

 

2 - младший бит выдвигается первым при положительных импульсах (0 - 1 - 0).

 

3 - младший бит первый при отрицательных импульсах синхронизации (1 - 0 - 1).

 

Для SHIFTIN вы можете использовать также параметры 4 – 7 при использовании внешнего

 

сигнала синхронизации сдвига, соответствующие фазам считывания режимов 0 – 3. . Длина

 

переменной определяет количество сдвигаемых бит.

 

PRE – еще один дополнительный параметр, указывающий на необходимость считывания

 

состояния порта данных перед импульсом синхронизации (применимо в режимах 0 – 3).

 

Можно работать с переменными типа Byte, Word, Integer или Long.

Пример:

Dim Temp as byte , R_bd As Long

 

 

‘подключение синтезатора

 

 

 

B_data Alias P1.5 : B_clk Alias P1.3

 

B_fqud Alias P1.4 : B_res Alias P1.7

 

‘---------------------

 

 

 

 

‘подпрограмма загрузки данных в синтезатор

 

Sload_9850:

 

 

 

‘сбросить интерфейс

 

Set B_fqud : Reset B_fqud

 

Set B_clk : Reset B_clk

‘защелкнуть код посл. режима

 

Set B_fqud : Reset B_fqud

‘разрешить посл. режим

‘выдвинуть данные из R_bd в режиме 3 (мл. сначала , /\) Shiftout B_data , B_clk , R_bd , 3

‘выдвинуть последний байт с режимом и фазой

Temp = 0 : Shiftout B_data , B_clk , Temp , 3

Set B_fqud : Reset B_fqud ‘исполнять заруженные данные

Return

============================================================================= 4-36

===================================== Справочник по программированию «Bascom-8051» ==

SOUND

Действие: Послать импульсы в порт. Можно для генерации звуков, если каким-то образом подключить к порту громкоговоритель.

Синтаксис: SOUND pin, duration, frequency [,NOINT] Pin - имя любого порта ввода-вывода.

Duration - число посылаемых импульсов (по сути, это длительность). Может быть задано имя переменной типа: Byte, integer, word или константа. Диапазон задаваемых значений от 1 до 32768. Frequency – время в микросекундах, в течении которого вывод находится в низком и высоком уровне.

NOINT – необязательная опция. При ее применении на время генерации звука запрещаются прерывания и звук получается чистым.

Пример: SOUND P1.1 , 10000, 10 ‘BEEP

SPACE(), STRING(), SPC()

Действие: Space() – возвращает строку, заполненную пробелами.

String() – возвращает строку, заполненную одинаковыми символами.

Spc() – вставляется в операторы Print или Lcd для вывода даданного числа пробелов

Главное достоинство этих функции перед строкой A = « » или A = «11111» в том, что они работаю намного быстрее, более компактны, дают возможность в процессе работы гибко изменять число пробелов, задавая его с помощью переменной. Применяются при форматировании выводимых данных.

Синтаксис: var = SPACE(x) x - число пробелов. Число пробелов может быть задано константой и переменной. Var – строковая переменная. Использование значения x=0 приведет к появлению строки из 255 байт.

 

 

var = STRING(m,n) m – число записываемых символов.

n – код символа (десятичный)

 

 

SPC(x) x – число выводимых пробелов.

 

Пример:

Dim s as XRAM String * 15, z as XRAM String * 15

 

 

S = Space(5)

‘пять пробелов

 

 

 

S = String(5,65) ‘пять символов “A”

 

 

 

S = “123”

 

 

‘получим ”123

123”

 

 

Print S ; Spc(3) ; S

 

 

 

Lcd “{“; S ; Spc(2) ; “}”

‘получим ”{123

}”

 

 

Acall _sStr_String ; ---- библиотечная подпрограмма -----

 

 

_sStr_String:

 

 

 

 

 

 

Mov @r1 , a

 

 

 

 

 

 

Inc r1

 

 

 

 

 

 

Djnz r2 ,_sStr_String

 

 

 

 

 

Clr a

 

 

 

 

 

 

Mov @r1 , a

 

 

 

 

 

 

Ret

 

 

 

 

SPIIN, SPIOUT

Считать значение переменной из SPI-шины (устройства) или послать содержимое переменной в

Действие:

 

 

 

SPI-шину (устройство). Интерфейс программный.

 

Синтаксис:

SPIIN var, bytes

 

 

 

 

 

 

SPIOUT var , bytes

 

 

 

 

 

Var - переменная, содержащая данные для посылки или принимающая данные.

 

 

Bytes - число байт обмена.

 

 

 

Пример:

Dim a(10) as Byte , X As Byte

 

 

 

 

CONFIG SPI=SOFT , DIN=P1.0 , DOUT=P1.1 , CS=P1.2 , CLK=P1.3

 

 

SPIIN a(1) , 4

 

‘считать 4 байта

 

 

 

SPIOUT a(1) , 5

 

‘послать 5 байтов

 

 

 

SPIOUT X , 1

 

‘послать байт

 

============================================================================= 4-37

===================================== Справочник по программированию «Bascom-8051» ==

START TIMER, STOP TIMER

Действие: Разрешить или запретить счет указанного таймера (0, 1 или 2):

Start Timer - разрешить счет TRx=1. Stop Timer – остановить счет TRx=0

Синтаксис: START timer, STOP timer

 

Timer – имена объекта управления TIMER0, TIMER1, TIMER2, COUNTER0 или

 

COUNTER1.

 

 

Пример:

Dim Count As Byte , Gt As Byte

 

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

 

On Timer0 Timer_0_int ‘назначить вектор прерывания

 

Load Timer0 , 100

‘зададим периодичность прерываний

 

Enable Interrupts

‘разрешим использовать прерывания

 

Enable Timer0

‘разрешим прерывание таймера

 

Priority Set Timer0

‘дадим ему высший приоритет

 

Start Timer0

‘разрешим счет

 

Count = 0

 

‘сбросит счетчик

 

Do

 

 

 

Input «Number « , Gt

 

Print «You entered : « ; Gt

 

Loop Until Gt = 1 ‘ждем, в цикле пока не появится символ ESC

 

Stop Timer0

Rem обработка прерывания Timer0

 

End

 

Timer_0_int:

 

 

Inc Count

 

 

If Count = 2 Then

 

 

Print «Timer0 Interrupt occured»

 

Count = 0

 

 

End If

 

 

 

Return

 

 

STOP

Остановить исполнение программы

Действие:

Пример:

PRINT var

‘печатать нечто

 

STOP

‘остановиться здесь

STR()

Возвращает строку со значением числа, записанного в указанной переменной. Этя функция

Действие:

 

производит действия обратное, выполняемое функцией Val(). Применяется при выводе цифровых

Синтаксис:

данных в последовательный порт или при формировании строки дла индикации.

var = Str(x) var -

строковая переменная с длиной, достаточной для запоминания

 

полученной строки. X – числовая переменная типа: Byte, Integer, Word, Long, Single.

Пример:

Dim a as Byte, S as XRAM String * 10

 

A = 123 : S

= Str(a) : Print S

S = “S=” + Str(a) ‘можно применять при суммировании

============================================================================= 4-38

===================================== Справочник по программированию «Bascom-8051» ==

SUB

Определить подпрограмму или процедуру, оформленную как подпрограмма. Вы должны

Действие:

 

объявить процедуру с помощью Declare

Sub перед ее определением. Имена параметров и

 

типы указываются и при объявлении, и при определении самой процедуры. Определенные

 

параметры имеют глобальной значение и должны быть объявлены оператором DIM. Смысл

 

такого сложного способа определения процедуры - возможность вызова ее с другими

 

переменными, но и того же типа, с которыми процедура была объявлена. В этом ее главное

 

достоинство и отличие от простой подпрограммы.

 

Синтаксис:

SUB Name[(var1)]

 

 

 

Тело процедуры, описывающие необходимые действия.

 

 

END SUB

 

 

 

Name - имя процедуры, любое нерезервированное слово. var1 - имя параметра (переменной,

 

функциональная зависимость, от которой задается). Параметров может не быть, а может быть

 

заявлено больше (до 10 параметров). Параметры должны разделяться запятой (« , »). Оператор

 

Return при описании процедуры не применяется, т.к. компилятор вставляет его сам. Если точек

 

выхода несколько, и они обусловлены какими-то параметрами, то для выхода может применяться

 

оператор EXIT SUB.

 

‘объявить процедуры

Пример:

Declare Sub Test(a As Byte , B1 As Byte)

 

Declare Sub Test2

 

 

 

Declare Sub Test3(cl As Bit)

 

 

 

Declare Sub Test4(x As Xram Byte)

 

 

Declare Sub Test5(a as byte)

 

‘объвить перем.

 

Dim A As Byte , B1 As Byte , Cl As Bit

 

Dim X As Xram Byte , Xa(10) As Xram Byte

 

 

B1 = 3 : Call Test2

‘вызов sub без параметров

 

Call Test(1 , B1) : Print B1

‘вызов sub с параметрами

 

Call Test3(p1.1)

‘вызов с другой перем.

 

Xa(1) = 1 : Call

 

 

 

Test4 Xa(1)

‘вызов с параметром A

 

Call test5 (a)

 

Test5 a

‘альтернативная запись с параметром A

 

End

 

 

 

‘определение процедур. важно, чтобы указанные здесь

 

‘переменные были объявлены только один раз и были глобальными

 

Sub Test(a As Byte , B1 As Byte) ’начало sub

 

Print A ; « » ; B1

‘отпечатать встреченную перем.

 

B1 = 3

 

 

 

End Sub

‘sub без параметров *

 

Sub Test2

 

Print «No parameters»

 

 

 

End Sub

‘bit как параметр

 

Sub Test3(bl As Bit)

 

Print Bl

 

 

 

End Sub

‘с параметром во внешней памяти

 

Sub Test4(x As Xram Byte)

 

Print X

 

 

 

End Sub

‘используем такую же, по размеру,

 

SUB Test5(b1 as byte)

 

LCD b1 : LCD BCD(b1)

‘что и объявленная

 

’что-то индицировать на LCD

 

End SUB

 

 

============================================================================= 4-39

===================================== Справочник по программированию «Bascom-8051» ==

SWAP

Поменять местами значения двух переменных одного типа. С индексированными переменными

Действие:

Синтаксис:

этот оператор не работает!

SWAP var1, var2

var1 и var2 - переменные типа: bit, byte, integer/word

Пример:

Dim a as integer,b1 as integer

 

a = 1 : b1 = 2 ‘assign two integers

 

SWAP a , b1

‘swap them

VAL()

Преобразовать строку, содержащую числовое значение в числовую переменную (число).

Действие:

Синтаксис:

var = Val( s )

 

 

Var - числовая переменная типа: Byte, Integer, Word, Long, Single. S – строковая переменная.

Пример:

Dim a as byte, s As XRAM string * 10

 

s = «123» : a = Val(s) ‘преобразовать

 

Print a

‘выведется 123

VARPTR()

Функция возвращает адрес переменной, расположенной во внутренней памяти (0-255). Очень

Действие:

 

удобная функция для установки значения индексных регистров (указателей).

Синтаксис:

var = VARPTR( var2 )

 

var – переменная, которая принимает значение адреса var2.

 

var2 – переменная, адрес которой запрашивается

Пример:

Dim I As Integer , B1 As Byte

 

B1 = Varptr(I)

 

 

Генерируемый код:

 

Mov h’23 , #h’21 ;23h - переменная b1, 21h - переменная I

WHILE .. WEND

 

Действие:

Конструкция в виде цикла, выполняемого, пока некоторые условия выполняются. Как только

 

заданное условие нарушается, то выполняется оператор (действие) следующий за оператором

Синтаксис:

WEND. Данная конструкция цикла обратна конструкции сила DO...LOOP UNTIL.

WHILE condition

Condition - условия повторения цикла.

Пример:

a=0

‘цикл будет повторяться, пока a не достигнет 11

 

WHILE a <= 10

 

PRINT a : INC a

 

WEND

 

WATCHDOG AT898252: START WATCHDOG, STOP WATCHDOG, RESET WATCHDOG

Действие:

CONFIG WATCHDOG - установить время срабатывания будильника

 

START WATCHDOG - включить будильник (начать сторожить систему)

 

STOP WATCHDOG - выключить будильник (закончить сторожить)

 

RESET WATCHDOG - запустить будильник сначала

Синтаксис: Config Watchdog = Time

 

Time - время в мс из ряда: 16 , 32, 64 , 128 , 256 , 512 , 1024 и 2048.

 

START WATCHDOG

 

 

STOP WATCHDOG

 

 

RESET WATCHDOG

 

Пример:

Config Watchdog = 2048 ‘сбросить после 2048 мс

 

Start Watchdog

‘включить

============================================================================= 4-40

===================================== Справочник по программированию «Bascom-8051» ==

5.Правила оформления ассемблерных вставок

втексте программ для компилятора «Bascom-8051»

1Текст ассемблерных вставок должен содержать только стандартные команды микроконтроллера 8051. Исключение составляет командва SWAP, совпадающая с похожей командой Bascom. Ассемблерную команду SWAP необходимо применять с префиксом «!» (таким образом - !Swap) В мнемонику команд без дополнительных определений входят: регистры R0-R7, @R0, @R1, A, DPTR; бит C; символ указания непосредственных данных -

#.Имена остальных прямо адресуемых регистров можно использовать только в том случае, если они определены, действующим в момент компиляции файлом (type.dat), устанавливающим тип микроконтроллера. Общепринятые имена битов можно применять только, если они определены как переменные Бейсика.

2Числовые значение должны быть записаны способом, предусмотренным Бейсиком, а не так, как делается в стандартном ассемблере.

3Не допускается применение директив стандартного ассемблера, в том числе резервирование областей оперативной памяти (директивой DS) и определение полей данных (директивой DW). Исключением является директива DB, которая может применяться внутри ассемблерного блока:

T_asd:

$asm

Db #&hfd , 23 , 5 , 6 $end Asm

4 Лучше не допускать включения комментариев Bascom между командами $Asm и $End Asm. Хотя иногда компилятор пропускает это. В любом случае компилятор указывает на эту ошибку. Между командами $Asm и $End Asm можно применять стандартные ассемблерные комментарии. Комментарии не должны располагаться в строке с меткой. В строке с командами $Asm и $End Asm также нельзя помещать комментарии.

'обработка прерывания таймера 0 Timer_0_int:

 

$asm

Tl0 , #&hfd

'd8fdh - это неправильно

 

Mov

мс - это правильно

Mov

Th0 , #&hd8

;уст. периода прерыв. 10

$end Asm

 

 

 

Return

 

 

 

5 В ассемблерном тексте допускается применение меток. Они должны быть оформлены также как и Бейсике (требования совпадают со стандартным ассемблером). Не допускается размещение команды ассемблера и тем более комментариев в строке с меткой.

'обработка прерывания последовательного интерфейса

Ser_int: $asm

Jbc {Ri} , Intsr

Jbc {Ti} , Intst Reti

Intsr:

Mov {rbuf} , Sbuf

Setb {B_enrx}

;прерывание приемника

Reti

 

Intst:

;прерывание передатчика

Setb {B_entx}

Reti

 

$end Asm

 

Если в ассемблерной вставке применяется ссылка на метку, то существует два варианта оформления таких

меток:

а) если ссылка на метку осуществляется внутри ассемблерного блока, то метка оформляется обычным образом (смотри пример выше);

б) если применена ссылка на метку определенную в другом месте программы, то перед этой меткой необходимо поставить знак «!» и тогда она станет доступной. Причем, такая метка не должна находится внутри другого ассемблерного блока. Ниже представлен пример программы с метками вне ассемблерного текста:

'обработка прерывания последовательного интерфейса

Ser_int:

============================================================================= 5-1

===================================== Справочник по программированию «Bascom-8051» ==

$asm

Jbc {Ri} , Intsr

Jbc {Ti} , Intst

$end Asm

Goto Ser_Ret !Intsr:

Rbuf = Sbuf : Set B_enrx : Goto Ser_Ret 'прерывание

приемника

!Intst:

'прерывание

передатчика

Set B_entx :

Ser_Ret:

'!!! должен быть только один выход

Return

6 Имена переменных или констант, определенных в Бейсике, тем или иным способом, и используемые как прямо адресуемые регистры или непосредственные данные, следует записывать в фигурных скобках { }. Внимание! Разный тип скобок, например { ), иногда вызывает «зависание» компилятора. Имена регистров микроконтроллера, определенные в файле type.dat, не нужно помещать в фигурные скобки.

Mov {R_ch} , Sbuf

Setb {B_kl}

Запись частей переменных делать следующим образом

Mov {R_ch+3} , Sbuf

Компилятор проверяет тип переменной. Переменная типа Integer не может применяться в ассемблерной вставке. По крайней мере, в первых версиях так было. Проверяйте сами!

7 Не допускается размещение пробела между знаком непосредственных данных (#) и данными. Ошибка в этом случае не показывается, а поле данных записывается нуль.

Mov {R_cch} , #{R_lin} - правильно

Mov {R_cch} , # {R_lin} - недопустимо

8 В командах, выполняющих операции с аккумулятором с непосредственной адресацией, необходимо указывать его имя как «A».

Cjne A , #&h0d , Ints3

Orl A , direct

Addc A , #&B00010001

В командах, использующих прямо адресуемый регистр, нужно указывать имя аккумулятора только как Acc.

Push Acc

Setb Acc.2

В командах, допускающих оба варианта адресации, допускается и оба варианта записи, но при которых компилятор будет генерировать и два варианта кода (короткой и длинный).

Mov

A

,

R0

или

Mov Acc , R0

Mov

A

,

direct или

Mov Acc , direct

9 Стиль исполнения текста любой - большие или маленькие буквы. Лучше придерживаться такого как в Бейсике - первая большая и пробелы между операторами. Для перехода в этот стиль применять следующую операцию:

а) поставить в начало редактируемой строки символ « : »; б) увести курсор на другую строку - произойдет переход к стилю Бейсика;

в) забить символ « : » и убрать лишние пробелы в редактируемой строке.

10 В последних версиях (2.хх) ассемблерные команды могут просто вставляться в текст программыбез команд $Asm и $End Asm. Но делать этого не рекомендуется.

============================================================================= 5-2

===================================== Справочник по программированию «Bascom-8051» ==

6. Встроенный текстовый редактор

Главное рабочее окно Bascom, в котором находится текст проекта, обеспечивает все минимально необходимые операции редактирования. Главное достоинство встроенного редактора это наличие режима автоматического форматирования и расцвечивание компонентов текста. Это обеспечивает ускорение ввода и текста и устранение грубых ошибок - они сразу видны. Можно, использую меню “Options – Environment”, установить цвет поля редактора, отличающийся от белого (рекомендуется бледно желтый) – приятней работать. Там же можно выбрать размер и тип шрифта, чтобы было лучше видно текст в рабочем окне. И наконец, рекомендуется задавать параметры автоматического форматирования, отвечающий сложности текста программы. Ниже приведено назначение клавиш рабочего окна Bascom.

LEFT ARROW

на один символ влево

RIGHT ARROW

на один символ вправо

UP ARROW

на строку вверх

DOWN ARROW

на строку вниз

HOME

в начало строки

END

в конец строки

PAGE UP

перейти выше на размер окна

PAGE DOWN

перейти ниже на размер одного окна

CTRL+LEFT

на одно слово влево

CTRL+RIGHT

на одно слово вправо

CTRL+HOME

в начало текста

CTRL+END

в конец текста

CTRL+ Y

уничтожить текущую строку

INS

вставка или перезапись

F1

Помощь (контекстная - о слове, на котором установлен курсор)

F2

запустить симулятор

F3

искать следующий текст

F4

программировать кристалл

F5

запустить программу в симуляторе

F7

компилировать

CTRL+F7

проверить ошибки (пробная компиляция)

F8

исполнить один шаг программы (в симуляторе)

SHIFT + F8

исполнить шаг без останова в подпрограмме (в симуляторе)

F9

переключить точку останова (в симуляторе)

F10

запустить до курсора (в симуляторе)

CTRL+G

перейти к строке

CTRL+O

загрузить файл

CTRL+S

записать файл

CTRL+P

печатать файл

CTRL+T

запустить эмулятор терминала

CTRL+F

искать текст

CTRL+W

посмотреть результат компиляции (файл сообщений)

CTRL+L

LCD конструктор (новых символов)

CTRL+X

вырезать текст в Clipboard

CTRL+C

скопировать текст в Clipboard

CTRL+V

вставить текст из Clipboard

CTRL+Z

отмена

CTRL+SHIFT+Z

отмена отмены

CTRL+SHIFT+I

вставить блок текста

CTRL+SHIFT+U

вырезать блок текста

SHIFT+ движение

отметка (выделение) текста (блока)

курсора

 

В последних версиях редактора компилятора появилась поддержка длинных строк после некоторых операторов, требующих перечисления данных длинным списком в поле операнда. В этих случаях перенос осуществляется символом подчеркивателя (“_”). Обычно это указано при описании синтаксиса этих операторов.

============================================================================= 6-1

===================================== Справочник по программированию «Bascom-8051» ==

7. Распределение памяти при определении переменных, память программ и ограничения Bascom

Распределение оперативной памяти, предлагаемое Bascom-8051представлено в таблице.

Область

 

Адрес

Назначение

00 -

 

00 – 11h

Рабочие регистры программ Bascom, временно используемые при обработке и

1Fh

 

 

преобразовании данных. Сохраняются в стеке, если не применена директива

 

 

 

“$NOSP

 

 

12 – 1Fh

Неизвестно как используются, но в стеке при прерываниях не сохраняются.

 

 

 

Очевидно, некоторые из указанных регистров могут использоваться в качестве

 

 

 

переменных в ассемблерных вставках. Блок регистров 3 иногда можно

 

 

 

использовать в подпрограммах прерывания пользователя для прямой

 

 

 

адресации R0 - R7 (но только после проверки).

20 -

 

00 – 09h*

Битовые переменные Bascom.

2Fh

 

09 – 7Fh*

Битовые переменные пользователя. Они располагаются здесь независимо от

 

 

 

порядка объявления.

 

 

$ - ($+11h)

Глобальные переменные Bascom и буфер для формирования выводимой

30 -

 

 

строки.

7Fh

 

($+12h) – $$

Переменные пользователя в порядке объявления. Рекомендуемый порядок

 

 

 

определения переменных после переменных типа Bit: вначале типа Byte, затем

 

 

 

Word/Integer, далее Long, Single, String, Array (массивы). Такая

 

 

 

последовательность позволяет обеспечить доступ к переменным,

 

 

 

определенным ранее, как к прямо адресуемым регистрам, что почти всегда

 

 

 

требуется в ассемблерных программах, вставляемых в текст Бейсика (ради

 

 

 

такой возможности их и применяют). Кроме того, компилятор для одно- и

 

 

 

двухбайтных переменных тоже часто применяет библиотеки c прямой

 

 

 

адресацией регистров. Длинные переменные Long, Single, String, Array всегда

 

 

 

считываются и записываются с использованием косвенной адресации, и

80 –

 

 

 

 

поэтому могут располагаться выше 7Fh.

FFh

 

 

 

$$+1 – Стек процессора начинается после окончания последней переменной, записью 7F(FFh) в указатель стека адреса последней занятой ячейки

(Mov SP,#$$)

* - адреса битов. $ - адрес первой ячейки, не занятой битовыми переменными. $$ - адрес последней ячейки, занятой переменной.

Bascom использует такое расположение многобайтных переменных в памяти, при котором меньшему адресу соответствует младший байт (младшие разряды), хранимого числа. Это же относится и к числу в формате с плавающей точкой, у которого в ячейке с наименьшим адресом расположены младшие разряды мантиссы, а в ячейке с наибольшим адресом содержатся старшие разряды порядка и бит знака. Строковые переменные занимают в памяти на одну ячейку больше, чем были объявлены. Единственное назначение дополнительного байта – хранить знак конца строки (значение 00h) . Причем он используется только в случае, когда строковая переменная имеет максимально возможную длину. Если длина записанной строки меньше длины переменной, то знак конца строки переносится соответственно ближе к началу переменной, а в дополнительном байте так и остается нулевое значение. Информация о расположении переменных необходима при использовании ассемблерных команд, дающих возможность простого доступа к частям переменных. Особенно внимательно нужно производить заполнение строковых переменных, не забывая записать знак конца строки (00h) после последнего символа. Иначе работа многих операторов, использующих строковые данные, станет невозможной.

Внешняя оперативная память используется только программой пользователя, а представление переменных в ней такое же, как и во внутренней памяти. Только во внешней памяти возможно расположение длинных строковых переменных (до 254 символов).

============================================================================= 7-1

===================================== Справочник по программированию «Bascom-8051» ==

Распределение модулей в памяти программ, создаваемое компилятором Bascom представлено в следующей таблице.

Область

Адрес

Назначение

Стартовый вектор

0000h

Переход на блок начальной инициализации - LJMP $$

Векторы прерываний

0003h

Команды перехода на подпрограммы обработки прерываний (разрешенных),

 

 

расположенные в блоке программ пользователя. Вместо векторов

 

 

запрещенных прерываний ставится команда Reti.

Библиотечные

002E*

Все используемые в программе пользователя операции и функции (кроме

подпрограммы

 

самых простейших) оформлены в виде подпрограмм, вызываемых с

 

 

параметрами, заданными в программе пользователя.

Блок инициализации

$$

Программа начальной инициализации микроконтроллера и подключенных к

процессора

 

нему дополнительных устройств (в первую очередь, LCD). Перечень и

 

 

параметры команд инициализации определяется типом микроконтроллера,

 

 

количеством заданных для использования функций, средой компилятора

 

 

(параметры по умолчанию) и директивами конфигурации, записанными в

 

 

программе пользователя.

Скомпилированная

$$$

Компиляция текста программы пользователя в порядке возрастания номеров

программа

 

строк, т.е. первой компилируется первая строка и так далее.

пользователя

 

 

* - для модели 8052. Это значение определяется в файле type.dat вслед за последним вектором прерывания. $$ - начинается вслед за библиотекой программ Bascom. $$$ - первая строка программы исполняется вслед за последней командой инициализации.

Компилятор Bascom налагает некоторые ограничения на программу пользователя. В первую, очередь это количественные ограничения, обусловленные небольшими ресурсами микроконтроллеров семейства 8051, а также возможностями самого компилятора. Ограничения выражаются в следующем:

максимально допустимое число меток – 5000. Практически это число недостижимо.

максимально допустимое число имен переменных – 1000. Этого вполне достаточно даже для большой программы.

максимально допустимое число переименований (Alias) - 128.

максимально допустимое число битовых переменных – 120*. Это ограничение обусловлено только количеством битовых ячеек общего назначения процессора, за исключением собственных битовых переменных Bascom. Обычно такого количества битов и не требуется.

максимально допустимое число байтовых переменных – 20*. максимально допустимое число двухбайтовых переменных – 10*. максимально допустимое число четырехбайтовых переменных – 10*.

максимально допустимое число строковых переменных по десять символов – 5*.

* - указано приблизительно допустимое количество переменных, которые можно использовать в программе процессора 8052 (с внутренней памятью 256 байт). Практически количество переменных каждого типа может быть любым в пределах доступного пространства внутренней памяти. Для моделей типа 8051(128 байт) пользователю остается 60-70 байт. При использовании старших моделей типа 8052(256 байт) реально доступно 150-180 байт. Непропорциональное увеличение доступного пространства внутренней памяти приращению размера памяти обусловлено тем, что старшие модели используются для более сложных задач, требующих большего стека и больше ресурсов для программ Bascom.

Рекомендуемое максимальное количество используемых программных конструкций не должно

превышать:

 

 

FOR .. NEXT

-

50

IF .. THEN

-

50

DO .. LOOP

-

50

WHILE .. WEND -

50

SELECT .. CASE -

25

Последние ограничения упоминаются в оригинальной документации. Однако нарушений в работе компилятора даже при превышении указанного количества не замечено.

============================================================================= 7-2

===================================== Справочник по программированию «Bascom-8051» ==

8. Структура текста программы

Bascom не предъявляет строгих требований к расположению функциональных модулей в тексте программы. Единственное требование (во многих случаях тоже необязательное) заключается в следующем: объявление программного объекта должно предшествовать его использованию, т.е. быть выше по тексту. Для удобства программирования лучше применять одинаковую схему построения программ. Это очень удобно, так как позволяет сохранять преемственность и обеспечить более простую трансформацию одной программы в другую. Кроме того, необходимость дисассемблирования скомпилированных программ требует применения такой структуры расположения модулей, которая дает возможность облегчить поиск интересующего фрагмента. Ниже, в виде таблицы, приведена рекомендуемая схема, отвечающая этим критериям.

Назначение

Комментарии

 

Заголовок

Комментарии, содержащие идентифицирующие сведения о программе:

 

принадлежность изделию, номер версии, дату и место создания, имя автора, его

 

телефоны и местонахождение, версии компилятора, модель процессора, способ

 

отладки (и как это отражено в программе) и все то, что невозможно узнать из

 

последующего текста.

 

Определить модель

Записать имя файла, определяющего набор (имена) регистров с помощью

процессора

директивы $REFILE. Это можно и не делать

 

Модель памяти

Если используется процессор с памятью более 2 КБайт это место для директивы

 

“$large”.

 

Установка начального

При необходимости директивой $IRAMSTART=&H[adres] можно установить

значения распределения

начальное значение распределения внутренней памяти. Рекомендуется только для

памяти

очень опытных пользователей!!!

 

Определение

Блок определения переменных оформляется в порядке возрастания их длины: Bit,

переменных

Byte, Word, Integer, Long, Single, String, Array. Переменные, определяемые во

 

внешней памяти и EEPROM, оформляются отдельными блоками. Для удобства

 

рекомендуется применять имена переменных начинать с буквы, обозначающей ее

 

тип, например: B_art, B_ovr – битовые, R_dat, R_cnt – байтовые, W_adr –

 

двухбайтовые, I_data – двухбайтовые со знаком, L_bd – четырехбайтовые со знаком,

 

F_frq – числа с плавающей точкой, S_inbuf – символьные , A_mes -

массивы, P_clk,

 

P_osnd – порты.

 

Объявление процедур

Определение имен подпрограмм, которые будут использоваться

как процедуры

 

(новые функции).

 

Определение имен

Блок определения имен линий управления всеми физическими устройствами,

портов

подключенных к портам микроконтроллера. Здесь же должен быть объявлен тип и

 

способ подключения индикатора. Если, что-то из необходимых параметров

 

подключения не будет объявлено, то компилятор использует значения,

 

установленные в окнах меню “Options” - “Compiler”.

 

Определение стека

При необходимости директивой “$Nosp” запрещается автоматически

 

устанавливать стек вслед за блоком переменных. Применение это директивы

 

требует добавления оператора установки стека SP=&H[adress].

 

Отмена автоматической

При необходимости запретить автоматическую настройку внутренних устройств

настройки периферии

микроконтроллера следует применить директиву $NOINIT, после которой одним из

 

способов, предусмотренных Bascom, производится загрузка параметров всех

 

используемых управляющих регистров.

 

Настройка периферии

Объявление частоты кварцевого резонатора, скорости и режима последовательного

 

канала, режима счетчиков, режима и длительности сторожевого таймера. Если, что-

 

то из необходимых параметров конфигурации не будет объявлено, то компилятор

 

использует значения, установленные в окнах меню “Options” - “Compiler”.

 

Разрешить счетчик, тактирующий последовательный канал. При необходимости в

 

этом блоке осуществляют перенаправление ввода-вывода.

 

Настройка прерываний

Объявление используемых прерываний и имен программ обработки прерываний

 

(векторов). Задание типа прерываний и приоритетов. Разрешение отдельных

 

прерываний и общее разрешение. Инициализировать и разрешить счетчики,

 

вызывающие прерывания (задать начальное значение, период или частоту).

Установить порты

Установить выходные линии микроконтроллера, в исходное и безопасное состояние

 

для окружающей схемы. Привести подключенные устройства и исходное состояние.

 

Примерно в этом месте компилятор вставляет программу инициализации

 

символьного модуля (LCD). Чтобы завершить инициализацию индикатора, этот

============================================================================= 8-1

===================================== Справочник по программированию «Bascom-8051» ==

 

блок нужно завершить командой Cls. В этом же блоке можно произвести

 

определение изображения дополнительных символов (до оператора Cls).

Вывести первое

Индицировать стартовое приветствие, например, номер версии программы,

сообщение

сообщающее о том, что процессор успешно стартовал.

Произвести

Проводится проверка исправности чего-либо важного, например, данных EEPROM.

тестирование

В случае обнаружении ошибки выводится сообщение

Инициализировать

Установить значение регистров таким образом, чтобы основная программа начала

переменные

работать правильно. Т.к. исполнение предыдущих операций может занять

 

значительное время, то иногда разрешение некоторых (или всех) прерываний и

 

запуск счетчиков (или одного из счетчиков) переносится в конец данного блока.

 

Иногда полезно очистить всю память перед применением. Этой операцией

 

обнуляются все будующие переменные.

Основная программа

Главная программа и ее ветви. Описывается построение главного цикла программы,

 

в котором происходит ожидание событий, и ветви отработки поступающих событий

 

- приход данных их различных источников (АЦП, последовательного канала,

 

клавиатуры, срабатывании аварийных датчиков). По результатам обработки

 

поступающих данных в главной программе активизируются программы вывода

 

данных (на индикатор, в последовательный канал) и управления физическими

 

объектами (включение реле, загрузка ЦАП, запись данных). Чтобы придать главной

 

программе компактный вид, повторяющиеся и функционально законченные модули

 

оформляются в виде подпрограмм.

Подпрограммы

Обычно небольшой по объему модуль для быстрой реакции на события, и поэтому

обработки прерываний

критичный к времени исполнения и количеству используемых ресурсов.

 

Программы обработки прерываний, в первую очередь, пишутся на ассемблере.

 

Данные из программ прерывания передаются главной программе через общие

 

регистры.

Подпрограммы и

Небольшие автономные модули, в которых содержатся неоднократно

процедуры

повторяющиеся действия. Управление подпрограммами осуществляются их

 

вызовом с переменными параметрами. Процедуры оформляются почти также как и

 

подпрограммы. Добавляется лишь объявление подставляемых переменных, которые

 

определяют функциональная зависимость процедуры, и отличие от простой

 

подпрограммы.

Таблицы констант

Непосредственные данные, используемые для управления программой или

 

объектами, и для обработки данных. Они должны быть расположены после

 

исполняемого кода, чтобы не затруднять процесс возможного дисассемблирования.

Метка программы

Это также непосредственные данные, но в текстовом виде, содержащие номер

 

версии, дату создания, принадлежность изделию. Даже если в законченном изделии

 

программа закрывается битами секретности, то на этапе программирования очень

 

удобно иметь видимые идентификаторы внутри файла исполняемого кода.

============================================================================= 8-2

===================================== Справочник по программированию «Bascom-8051» ==

9. Выбор и установка типа процессора

Bascom позволяет создавать программы для всех моделей процессоров семейства 8051. Установка модели процессора, используемого компилятором, производится в окне меню ”Option” - “Compiler” – “Misc”. Выбираемое из списка значение является именем одного из файлов, находящихся в директории “/BASCOM-8051”. При отсутствии необходимой модели, она может быть создана описанием внутренней регистровой структуры в виде нового файла. Файл должен содержать имена регистров и их адреса, имеющиеся в описываемой модели. Регистровый файл должен иметь несколько секций.

[BIT] - битовая секция. Содержит имена и адреса специальных функциональных регистров (SFR), допускающих операции с отдельным битам.

[BYTE] – байтовая секция содержит все остальные регистры SFR, обращение к которым возможно только как к байтам.

[MISC] – смешанная секция содержит:

-короткое имя микроконтроллера (оно записывается в файл отчета о результате компиляции);

-имена дополнительных прерываний и адреса расположения их векторов. Прерывания процессора модели 8052 с именами INT0, INT1, TIMER0, TIMER1, SERIAL и TIMER2 считаются стандартными и не указываются;

-начальный адрес расположения скомпилированного кода, который обычно указывается вслед за расположением последнего вектора прерывания для описываемой модели микроконтроллера;

-указание о размере внутренней памяти (128 или 256 байт).

Все указываемые цифровые значения записываются в шестнадцатеричном виде. Нужно сказать, что только регистровые файлы являются для компилятора источником имен внутренних регистров, действующих наравне с другими именами, определяемыми в программе пользователя. При необходимости можно изменять стандартные имена, применять другие способы их определения, исключать ненужные. В Bascom отсутствует аналогичный механизм определения стандартных имен битов SFR. Для определения последних, тех которые понадобятся в программе, нужно применять директиву Alias.

Ниже приведен пример содержимого такого файла для микроконтроллера типа 87C51FA. В примере для сокращения места несколько параметров записано в одну строку, но в оригинале с одной строке должен быть

только один параметр. Файл 80c51fa.dat:

 

 

 

 

[BIT]

 

P1 = 90

SCON = 98

IE =

A8

P3 = B0 IP = B8 PSW = D0

TCON = 88

 

ACC = E0

B = F0

P0 = 80

P2

= A0

T2CON = C8

 

[BYTE]

DPL = 82

DPH = 83

PCON =

87

TMOD = 89

TL0 = 8A

SP = 81

TL1 = 8B

TH0 = 8C

TH1 =

8D

SBUF

= 99

T2MOD = C9

TL2 = CC

TH2 = CD

RCAP2L = CA RCAP2H = CB

IPH = BF CH = F9 CL = E9

CCAP0H =

FA

CCAP0L = EA

CCAP1H =

FB

CCAP1L = EB

CCAP2H = FC

CCAP2L =

EC

CCAP3H = FD

CCAP3L =

ED

CCAP4H = FE

CCAP4L = EE

CMOD = D9 CCAPM0 = DA CCAPM1 = DB CCAPM2 = DC CCAPM3 = DD CCAPM4 = DE SADEN = B9 SADDR = A9

[MISC]

up = 8051FA PCA = 33 org = 36 IRAM = 256

В новой версии компилятора (начиная с 2.01) изменен DAT-файл. Ранее прерывание 2B всегда использовалось для TIMER2. Однако есть новые микросхемы , которые отличаются от стандартного 8052. Теперь вектор 2B должен быть определен с в xxx.DAT файле в секции [MISC].

============================================================================= 9-1

===================================== Справочник по программированию «Bascom-8051» ==

10. Установка параметров Bascom

Особенность среды Bascom заключается в том, что многие параметры микропроцессорной системы, для которой создается программа, могут задаваться автоматически с помощью меню настройки компилятора:

-в меню “Options” – “Compiler” – “Communication” задается скорость последовательного канала и частота тактового кварцевого генератора. При этом для получения заданной скорости используется

TIMER1;

-в меню “Options” – “Compiler” – “I2C” определяются линии портов, подключенные к шине I2C. В этом же меню определяется порт приема сигналов интерфейса “RC5” (сигналов стандартного инфракрасного пульта дистанционного управления, например, телевизоров);

-в меню “Options” – “Compiler” – “LCD” определяется линии портов, подключенные к символьному жидкокристаллическому индикатору (LCD). Таким способом, устанавливается только один режим работы LCD – четырехпроводная шина с побитным управлением каждой линии. Всего, для работы с индикатором используются шесть линий микроконтроллера – еще две для формирования сигналов “RS” (выбор регистра – управляющего или данных) и “E” (разрешение). Bascom не читает данные из внутренней памяти индикатора и не пользуется сигналом готовности LCD, поэтому линия “RW” индикатора заземляется (данные всегда записываются);

-в меню “Options” – “Compiler” – “Misc” устанавливается тип модели процессора, размеры внутренней памяти и памяти программ. В этом меню может быть выбран и тип компилятора – установлен компилятор предыдущей версии “Bascom-LT”;

-в меню “Options” – “Compiler” – “Misc” устанавливается перечень типов выходных файлов создаваемых компилятора.

Сделанные настройки сохраняются между сессиями работы в программе до следующего изменения. Перечень настроек, предлагаемых Bascom, далеко не исчерпывает всех возможностей процессора, а только обеспечивает функционирования систем ввода-вывода, что облегчает процесс создания коротких испытательных программ. Так как директивы настройки параметров, содержащиеся в программе пользователя, имеют более высокий приоритет, то рекомендуется всегда включать в состав целевой программы блок инициализации конфигурации процессора.

============================================================================= 10-1

===================================== Справочник по программированию «Bascom-8051» ==

11. Распределение ресурсов микроконтроллера

На первом этапе создания микропроцессорной системы до начала программирования необходимо решить несколько важных задач:

а) разработать план использования ресурсов процессора, т.е. определить: как и какие внутренние устройства будут использоваться. Обычно, одновременно происходит и выбор устройств, с которыми будет работать микроконтроллер;

б) выбрать модель процессора, обеспечивающий внутренними ресурсами, разработанный план действий. Кажется, что первая и вторая задачи едины, но тут надо вспомнить о дополнительных требованиях к разрабатываемому устройству, которые могут стать приоритетными – экономичность, напряжение питания, способ программирования (записи программы), возможность перепрограммирования и т.п. Здесь необходимо заложить некоторую избыточность производительности и, особенно, размеров памяти, обусловленную не стопроцентной эффективностью компилированного кода;

в) выбрать средство аппаратной отладки, отвечающее задаче, решаемой отлаживаемой программой и ее параметрам. Если устройство отладки забирает у системы какие-либо аппаратные или программные ресурсы, то нужно попытааться обойтись без них, или, по крайней мере, использовать их наименьшей степени и в последнюю очередь. Например, порты процессора AT89C8252, используемые для последовательного программирования, не нужно без крайней необходимости использовать в схеме разрабатываемого устройства;

г) провести моделирование и проверку самых важных алгоритмов обработки данных или управления физическими объектами с использование специализированных программ: “Micro-Cap”, “Mathcad”, “Quick-Basic” и

т.п.;

д) определить значения требуемой производительности систем ввода-вывода, вычислений, преобразований, реагирования на внешние события. Оценить возможность решения этих задач с необходимой скоростью, например, путем написания и запуска (даже в отладчике) тестовых программ с интересующими фрагментами. Рекомендуется испытать работу программ, управляющих реальными устройствами, особенно вновь применяемыми. Приблизительное время исполнения некоторых типовых операций указано в таблице.

 

Действие

Время исполнение, тактов

Сложение и вычитание чисел с плавающей точкой

470

Умножение чисел с плавающей точкой

2100

Деление чисел с плавающей точкой

2500

Считывание (загрузка) 12

разр. АЦП (ЦАП) с программ. послед. интерфейсом

250

Считывание (загрузка) 12

разр. АЦП (ЦАП) с аппартн. послед. интерфейсом

30

Запись (считывание) четырехбайтового числа в EEPROM с интерфейсом I2C

10000(500)

Запись байта в символьный модуль (4-битном/8-битной режиме)

300/150

Вывод сообщения длиной 10 символов со скоростью 9.6 Кбод

13 мс

При успешном решении перечисленных задач можно переходить к составлению полной схемы устройства, управляемого микроконтроллером, и разработке рабочей программы.

Если окажется, что производительность процессора недостаточна или задача слишком сложна, то следует разделить ее между несколькими процессорами или применить внешние устройства, например, расширить объем памяти или подключить дополнительный интерфейс. Очевидно, первый путь предпочтителен, по следующим соображения:

а) экономическим – применение дополнительных микросхем микроконтроллеров незначительно изменит стоимость электронного устройства, т.к. стоимость современного стандартного микроконтроллера (аналога 8751) приблизительно равна пяти обычным логическим микросхемам, половине стоимости стандартного ЦАП, одной третьей стоимости даже простого АЦП, цене одного хорошего операционного усилителя или пары оптронов. Таким образом, экономия количества процессоров за счет усложнения схемы совершенно неоправданна;

б) топологическим – малые размеры корпусов и отсутствие многочисленных линий связи между функциональными узлами, достигаемое применением локальных микроконтроллеров, будут даже способствовать снижению габаритов;

в) упрощается программирование, т.к. две-три программы половинного размера напишутся и отладятся намного легче и быстрее, чем одна сложная. Это актуально при использовании “Bascom-8051”, с помощью которого такжже трудно создавать очень большие или сложные программы.

Порядок подключения внешних устройства (приемников и источников управляющих сигналов и данных) к линиям микроконтроллера не имеет значения, если не используются уникальные свойства портов (альтернативные функции). Наличие альтернативных функций портов микроконтроллера, напротив, требует однозначной привязки внешних устройств к конкретным выводам процессора. Существует много вариантов использования и внутренних аппаратных средств. Ниже в таблице предлагается перечень аппаратных ресурсов микроконтроллера, которые предлагается для решения некоторых стандартных задач.

============================================================================= 11-1

===================================== Справочник по программированию «Bascom-8051» ==

Задача микро-

Рекомендуемые

Используемые ресурсы

контроллера

порты

 

Таймер 2 в режиме самозагрузки. Достоинства: широкий диапазон

Формирование

Только P1.0(T2)

частоты (вар.1)

 

 

 

частот и чистый сигнал. Процессор незагружен.

Формирование

Любой

 

 

Любой таймер, запрограммированный вызывать прерывание каждые

частоты (вар.2)

 

 

 

полпериода, генерируемой частоты. В прерывании производится

 

 

 

 

 

 

инверсия порта. Невозможно формировать частоту выше единиц

 

 

 

 

 

 

килогерц. Имеется шум периода. Загрузка процессора незначительная.

Формирование

Любой

 

 

С помощью программ задержки формировать длительности импульса

частоты (вар.3)

 

 

 

и паузы выходного сигнала. Полная загрузка процессора. Этот способ

 

 

 

 

 

 

используется в операторе “Sound” Bascom. Недостаток – прерывания

 

 

 

 

 

 

портят форму выходного сигнала.

Измерение

Только P3.5(T1)

Таймер 0 - формирует базу времени (интервал счета периодов

частоты (вар.1)

 

 

 

измеряемой частоты). Таймер 1 – счетчик числа периодов. В

 

 

 

 

 

 

прерывании таймера 0 запускает и останавливает таймер 1. В

 

 

 

 

 

 

прерывании таймера 1 считается число переполнений в программном

 

 

 

 

 

 

счетчике.

Измерение

Только P3.2(INT0)

Таймер 0 – запускается или останавливается по спаду измеряемого

периода (вар.1)

 

 

 

сигнала. Частота заполнения таймера 0 - Fкв/12.

Измерение

Только P1.0(T2)

Таймер 2 – предварительный делитель частоты. Таймер 0 счетчик

периода (вар.2)

 

 

 

длительности, который запускается или останавливается по

 

 

 

 

 

 

переполнению таймера 2. Частота заполнения таймера 0 - Fкв/12.

Клавиатура из

P0.0 – P0.3,

 

Организовать в виде матрицы 4 на 4. Для экономии портов возможно

16 кнопок

 

P0.4 – P0.7

 

использование шины данных индикатора для опроса клавиатуры.

Символьный

P2.0 – P2.3,

 

Индикатор используется в режиме управления по 4-разр. шине с

индикатор

 

P2.4, P2.5

 

побитным управлением портами, подключенными к индикатору.

АЦП

с

после-

Любые

и P3.3 -

Программный интерфейс SPI или Micro-Wire. Наличие у АЦП сигнала

довательным

для сигнала

го-

готовности позволяет организовать считывание по прерыванию. Могут

интерфейсом

товности

 

потребоваться еще какие-то линии.

АЦП

с

SPI

P1.5, P1.6, P1.7

Аппаратный интерфейс SPI, если используется модель AT89C8252.

интерфейсом

 

 

 

Соответственно для программного или аппаратного интерфейса. В

ЦАП

с

после-

Любые

или

P1.5,

довательным

P1.6, P1.7

 

некоторых случаях удается использовать UART в режиме 3 (если он не

интерфейсом

 

 

 

используется по основному назначению)

Светодиодный

P0.0 – P0.7,

 

В прерывании с частотой 300 – 1000 Гц производится программой

7-сегментный

P2.0 - P2.2

 

вывод данных в мультиплексном режиме из внутреннего буфера, в

индикатор

 

 

 

котором формируется код всех сегментов индикатора. Вывод кода

 

 

 

 

 

 

сегментов осуществляется через порт P0, номер знакоместа P2.0 - P2.2.

============================================================================= 11-2

===================================== Справочник по программированию «Bascom-8051» ==

12. Начальная инициализация системы

Под инициализацией системы следует понимать определение всех начальных условий, необходимых компилятору для полного понимания последующего текста программы и правильной установки всех, используемых устройств микроконтроллера. На примере программы рассмотрим шаги начальной инициализации системы в той последовательности, в которой они записываются в программе.Приведенный пример все возможные установки и поэтому явно избыточен.

Определить модель микроконтроллера указанием имени файла, содержащего имена и адреса используемых регистров. Можно не указывать, но тогда имя файла компилятор возмет из меню “Option”- “Compiler”-“Misc”.

$Regfile "8052.DAT "

В большинстве случаев требуется более 2 КБайт программной памяти.

$large

 

'определим модель большой памяти

'

Теперь нужно определить все символические имена, используемые в программе.

определение констант --------

'константа интегратора температуры *10 мс

Dim Cit As Const &H10

Const Cit = &H10

'так нужно записывать в последних версиях

'Переменные: определение битов --------

'бит "Есть новые данные"

Dim N_dat As Bit

Dim B_entx As Bit

'разрешен прием

Dim B_temp As Bit

'временные битовые данные

 

Таким образом, можно определить привычные имена битов SFR.

Ri Alias Scon.0

'бит RI

Ti Alias Scon.1

'бит TI

Ren Alias Scon.4

'бит Ren

'--------

определение байтов ----------

'временные данные

Dim Temp As Byte

Dim R_ch As Byte

'принятый символ

Dim R_cch As Byte

'указатель буфера

Dim Rang As Byte

'предел уровня (ослабление)

Dim Frng As Byte

'предел частоты

'--------

определение двухбайтовых ----

'16-разр. двоичный код загрузки

Dim R_bw As Integer

Dim R_rd As Integer

'16-разр. резервный код ЦАП

'--------

определение четырехбайтовых -

'32-разр. двоичный код загрузки

Dim R_bd As Long

Dim Tmpl As Long

'32-разр. временые данные

'--------

определение переменных в формате с плаваюшей точкой

Dim R_frq As Single

'регистр значения частоты

Dim R_fld As Single

'регистр кода загрузки

'--------

определение строковых переменных

Dim R_lin As String * 6

'введеная строка

Dim R_tmp As String * 5

'временая строка

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

При использовании в программе процедур их нужно объявить в этом месте.

 

'Declare Sub Wrb_24c01(badr As Byte , Value As Byte)

'Declare Sub Rdb_24c01(badr As Byte , Value As Byte)

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

Определим имена портов, подключенных к физическим устройствам.

 

'подключение синтезатора AD9850

 

B_data Alias P1.3 : B_clk Alias P1.4 : B_fqud Alias P1.5 : B_ress Alias P1.7

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

 

 

'подключение ЦАП опорного уровня AD766

 

B_datu Alias P1.0 : B_clku Alias P1.1 : B_ldu Alias P1.2

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

 

 

Далее предусмотрено два варианта подключения: первый для целевой программы (рабочий), второй – для отдадки в эмуляторе, построенном на процессоре с шестью портами - 80C51GB, где порт P5 замещает порт P0, а порт P4 используется вместо P2.

'подключение поляризованных реле с 87C52

'B_dar0 Alias P0.0 : B_dar1 Alias P0.1 : B_dar2 Alias P0.2 : B_dar3 Alias P0.3 'B_cor0 Alias P2.7 : B_cor1 Alias P0.4 : B_cor2 Alias P0.5 : B_cor3 Alias P0.6

============================================================================= 12-1

===================================== Справочник по программированию «Bascom-8051» ==

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

'!!! только в эмуляторе подключение поляризованных реле с 80C51GB

B_dar0 Alias P5.0 : B_dar1 Alias P5.1 : B_dar2 Alias P5.2 : B_dar3 Alias P5.3 B_cor0 Alias P4.7 : B_cor1 Alias P5.4 : B_cor2 Alias P5.5 : B_cor3 Alias P5.6 '---------------------

Начиная с этой строки, компилятор формирует исполняемый код – команды установки внутренних регистров. Первая команда в блоке инициализации компилятора - установка стека, вслед за массивом переменных, определенных выше. Если стек устанавливается “вручную”, это самое подходящее место для того, чтобы записать вставить директиву, запрещающую такой способ вычисления стека.

$Nosp

Sp = &h7f

'начало стека 80h

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

 

Вариант установки конфигурации внутренних устройств микроконтроллера без применения специальных

операторов Bascom.

'устанавливать конфигурацию будем “вручную“

'$Noinit

'Tcon = &h50 : Tmod = &h22 : T2con = &h34 : Scon = &h70 : Load Timer2 = &hffd9 '---------------------

Нормальная установка конфигурации внутренних устройств микроконтроллера.

'TIMER0 в режиме 16-бит. таймера с внутр. тактир. для часов реального времени

Config Timer0 = Timer , Gate = Internal , Mode = 1 : Start Timer0 '---------------------

Установка режима последовательного канала.

'TIMER2 в режиме 16-бит. таймера с внутр. тактир. для синхронизации UART

$baud = 9600

'скорость

9.6 кБ

$crystal = 12000000

'при кварце

12 МГц

Config Timer2 = Timer , Gate = Internal , Mode =

2

 

Если в тексте программы отсутствуют операторы Print и Input необходимо добавить следующие

строки.

' вариант с тактированием от таймера 1

'TIMER1 в режиме 8-бит. таймера с внутр. тактир. для синхронизации UART Config Timer1 = Timer , Gate = Internal , Mode = 2

Scon = &H52

'режим приемопередатчика

Th1 = 243

'константа скорости

Pcon = &H80 : Start Timer1

'выключить доп. делитель на 2 и стартовать

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

 

' вариант с тактированием от таймера 2

'Timer2 в режиме 16 -бит. таймера с внутр. тактир. для синхронизации Uart Config Timer2 = Timer , Gate = Internal , Mode = 2

Scon = &H52 'режим приемопередатчика

Rcap2h = &HFF : Rcap2l = &HA5 : Start Timer2 '---------------------

Объявление используемых прерываний. Указывается связь источника прерывания с именем соответствующей программы обработки, устанавливается приоритет, разрешаются отдельные виды прерываний и производится разрешение всех назначенных прерываний. Если используется прерывание от таймера, то иногда нужно перед этим установить счетчик в состояние, обеспечивающее своевременное наступление прерывания.

'назначение режимов прерываний

On Timer0 Timer_0_int Nosave

'вектор прерывания

On Serial Ser_int Nosave

'вектор прерывания послед. канала

Enable Timer0

'разрешить прерывание таймера 0

Enable Serial

'разрешить прерывание послед. канала

Priority Set Serial

'наивысший приоритет послед. канала

Enable Interrupts

'вообще разрешить прерывания

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

 

Производим действия, например, обеспечивающие работоспособность программы в эмуляторе, выполненном на другом типе процессора.

'!!! -----------------

'только в эмуляторе 80C51GB дополнительно инициализируем

Th0 = &HD8 : Tl0 = &HFD

'чтобы прерыв. наступила не позже 10 мс

Oscr = &HE1 : Oscr = &H1E

'выключить контроль частоты генератора

Wdtrst = &H1E : Wdtrst = &HE1

'сбросить будильник

P4 = &HFF : P5 = &HFF

'уст. эмулирующие порты как в эмулируемые

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

 

Производим очистку памяти и всех будующих переменных

============================================================================= 12-2

===================================== Справочник по программированию «Bascom-8051» ==

Clr_mem:

 

 

$asm

Mov R0 , #&hff

;от верхнего значения

;

Mov

R0 , Sp

;или от указателя стека (он уже установлен)

Clrmem:

 

 

 

Mov @r0 , #0

;до нуля

 

Djnz

R0 , Clrmem

$end Asm

 

 

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

 

 

 

Устанавливаем переменные в состояние, обеспечивающее правильное начало работы программы или ее переход в определенный режим. Если проводилась очистка памяти, то устанавливаются только пернеменные,

значение которых должно отличаться от нуля.

 

'инициализировать переменные

'бит "Новые данные"

N_dat = 1

R_cch = Varptr(r_lin)

'указатель буфера

R_ot = 0

'интегратор термодатчика - нет перегрева

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

 

Устанавливаем порты процессора в состояние, безопасное для внешних устройств или обеспечивающее их нормальное функционирование (еще лучше, если это состояние соответствует режиму сброса).

'подготовить линии управления к работе

Reset B_data : Reset B_clk : Reset B_fqud : Reset B_ress

'с синтезатором

Set B_datu : Set B_clku : Set B_ldu

'с опорным ЦАП

 

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

 

 

Настало время провести более глубокую инициализацию и проверку всей системы, управляемой микроконтроллером. Когда в системе используется символьный индикатор, то это лучшее место для его инициализации. Инициализация индикатора занимает около 100 мс и если это время критично для системы прерываний, то можно разрешать прерывания после окончания инициализации индикатора или всего блока инициализации.

'определим размер индикатора

Config Lcd = 16 * 2

'определим подключение линий управления индикатора к портам

Config Lcdpin, Db4 = P1.4, Db5 = P1.5, Db6 = P1.6, Db7 = P1.7, E = P3.2, Rs = P3.4 'определим изображение дополнительных символов

Deflcdchar

0

, 31 , 17

, 17 , 17

, 17 , 17

, 31 , 0

Deflcdchar

1

, 16 , 16

, 16 , 16

, 16 , 16

, 16 , 31

Deflcdchar

2

, 241 ,

234

, 228 ,

224

, 228

, 234 , 241 , 224

Deflcdchar

3

, 241 ,

234

, 228 ,

241

, 234

, 228 , 224 , 224

Deflcdchar

4

, 228

,

234

, 241 ,

228

, 234

, 241

, 224 , 224

Deflcdchar

5

, 228

,

234

, 241

,

234

, 228

, 224

, 224 , 224

Deflcdchar

6

, 228

,

234

, 241

,

234

, 245

, 241

, 241 , 224

Deflcdchar

7

, 238

,

234

, 234

,

234

, 255

, 241

, 241 , 224

Cls

'подготовим индикатор к работе

 

 

Lcd “V7-64 ver.3_7”

‘выдадим стартовое сообщение

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

 

 

 

 

 

 

 

При наличии последовательного канала, связанного с другой ЭВМ, сейчас необходимо послать

сообщение, устанавливающее логическое соединение.

 

 

Print “1_ON”

 

 

‘сообщим о включении

 

 

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

После этого начинаем тестирование подключенных устройств. В первую очередь, проверяем сохранность данных энергонезависимой памяти (вычислив контрольную сумму), хранящей переменные данные между сессиями работы микроконтроллера или блок калибровочных констант. При обнаружении ошибки сообщаем об этом, и при получении подтверждения о принятом сообщении переинициализируем память (записываем начальные значения, которые обеспечат правильную работоспособность системы). Если имеются еще какие-либо устройства, наличие и исправность которых нужно проверить, то производим соответствующие действия.

Gosub Test_CS_EEPROM

'Проверяем контрольную сумму

If b_ER = 1 Then

'Есть ошибка?

Print “Error_CS_Mem!” : Waitkey 'Да – вывести сообщение и ждать нажатия

Gosub Ini_EEP

'Переинициализировать память

End If

 

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

 

В системе, содержащей ЦАП, АЦП, цифровые синтезаторы, реле и т.п. производим загрузку в ЦАП и синтезаторы кодов начального значения напряжения и частоты, включаем самокалибровку АЦП, переключаем контакты реле в исходное положение.

============================================================================= 12-3

===================================== Справочник по программированию «Bascom-8051» ==

Gosub Self_Cal : Gosub Init_DAC : Gosub Reset_Relay 'иниц. аналог. часть схемы '---------------------

Система готова к работе, все устройства, подключенные к микроконтроллеру, ожидают приема или считывания данных, и далее начинается рабочая программа, которая также может содержать операторы установки конфигурации (изменение) в соответствии с алгоритмом программы. В дальнейшем, также могут устанавливаться и изменяться параметры системы прерывания.

============================================================================= 12-4

===================================== Справочник по программированию «Bascom-8051» ==

13. Конфигурирование внешних устройств

Библиотеки Bascom обеспечивают простой интерфейс с большинством устройств, обычно, подключаемых к микроконтроллеру. Bascom может работать: с последовательным портом (аппаратным и программным), с символьным индикатором (в трех вариантах подключения), устройствами с последовательными интерфейсами (SPI, Micro-Wire и т.п.), устройствами на шинах I2C и 1Wire, управлять серводвигателями, прием данных интерфейса RC5 из пультов дистанционного управления с ИК-приемником (инфракрасным), измерение времени заряда RC-цепочки (самого примитивного АЦП, подключенного в линии порта). Чтобы обеспечить работу операторов Bascom с перечисленными устройствами, необходимо сообщить компилятору конфигурацию этих устройств – объявить предназначение и имена портов. Иногда требуется объявить некоторые дополнительные параметры. Рассмотрим наиболее типичные примеры конфигурирования. Проще всего установить конфигурацию одно- и двухпроводных шин – нужно просто указать имена подключенных линии (портов):

Config 1wire = P1.1

'P1.1 – линия связи

Config Sda =

P1.5

'P1.5 -

линия SDA

Config Scl =

P1.4

'P1.4 –

линия SCL

Интерфейс SPI реализуется программно, для чего указываются только подключенные порты:

CONFIG SPI = SOFT, DIN = P1.0, DOUT = P1.1, CS = P1.2, CLK = P1.3

Предлагаемый Bascom, интерфейс SPI работает только в одном режиме и поэтому непригоден для всех устройств, имеющих сдвиговый регистр. Более широкие возможности обеспечивают операторы SHIFTIN и SHIFTOUT, позволяющие организовать все виды двух-, трех- и четырехпроводных интерфейсов (в том числе и SPI во всех режимах). Параметры конфигурации операторов SHIFTIN и SHIFTOUT задаются при их вызове.

При вызове функции Getrc необходимо объявлять только один порт, принимающий входной сигнал. Функция Getrc5 вообще может работать только с портом P3.2, т.к. использует прерывание Int0. Тем не менее, функции Getrc и Getrc5 требуют записи оператора конфигурирования системы. Для работы первой функции, необходимо установить в режим 1 таймера 0, который она использует для вычисления времени задержки. Вторая требует инициализации прерывания внешнего Int0 (смотри описание этих функций).

Чтобы настроить интерфейс для управления серводвигателями необходимо указать число двигателей (число выводов, используемых для формирования ШИМ-сигналов с частотой 50 Гц) и назначить имена используемых портов:

Config SERVOS = 3, SERVO1 = P1.1 , SERVO2 = P1.2 , SERVO3 = P1.4

Наиболее сложное подключение к микроконтроллеру имеет символьный индикатор, для которого нужно определить наибольшее число параметров:

CONFIG LCD = 40 * 4 'тип – число символов и строк

CONFIG LCDPIN=PIN ,DB4=P1.1,DB5=P1.2,DB6=P1.3,DB7=P1.4,E=P1.5,RS=P1.6 'подключение

Если индикатор подключен к порту P0, его можно использовать в шинном режиме и тогда нужно

определить:

 

$LCD = &H8000

'адрес расположения во внешней памяти

Config LCDBUS = 4

'и режим – 4-битная шина

‘Config LCDBUS = 8

'или 8-битная шина

Конфигурирование других устройств (таймеров, последовательного порта) вы можете найти в разделах, посвященных их программированию.

============================================================================= 13-1