
- •М.Л.Кулиш
- •Содержание разделов
- •Некоторые советы по созданию больших программ
- •Приложение A. Переменные Бейсика
- •Приложение B. Система команд микроконтроллера 8051
- •Приложение C. Коды команд MCS-51
- •Типы данных и переменных
- •DEBOUNCE
- •LCD, LCDBUS, LCDPIN
- •Операторы Bascom-8051
- •Функции Bascom-8051
- •Элементы
- •Назначение и применение элементов языка Bascom
- •14. Программирование прерываний
- •Числовые переменные
- •Строковые переменные
- •Система команд микроконтроллера 8051
- •Команды передачи данных
- •Команды перехода
- •Команды перехода (продолжение)
- •Логические операции
- •Логические операции (продолжение)
- •Очистка А
- •Инвертирование А
- •Сдвиг А влево
- •Сдвиг А влево через перенос
- •Сдвиг А вправо
- •Сдвиг А вправо через перенос
- •Перестановка полубайтов А
- •SWAP A
- •Установка переноса
- •SETB C
- •Установка бита
- •SETB bit
- •Сброс переноса
- •Сброс бита
- •Загрузка переноса битом
- •Загрузка бита переносом
- •Тестирование бита Z
- •Тестирование переноса
- •Тестирование битов
- •Если bit=C
- •Инверсия бита
- •Инверсия переноса
- •Команды арифметических операций
- •Сложение аккумулятора с РОН
- •ADD A, direct
- •ADD A, #data
- •ADDC A, R0
- •ADDC A, R1
- •ADDC A, R2
- •ADDC A, R3
- •ADDC A, R4
- •ADDC A, R5
- •ADDC A, R6
- •ADDC A, R7
- •ADDC A, direct
- •ADDC A, @R0
- •ADDC A, @R1
- •ADDC A, #data
- •SUBB A, R0
- •SUBB A, R1
- •SUBB A, R2
- •SUBB A, R3
- •SUBB A, R4
- •SUBB A, R5
- •SUBB A, R6
- •SUBB A, R7
- •SUBB A, direct
- •SUBB A, @R0
- •SUBB A, @R1
- •SUBB A, #data
- •Команды арифметических операций (продолжение)
- •Инкрементирование А
- •Инкрементирование РОН
- •INC direct
- •Инкрементирование DPTR
- •INC DPTR
- •Декрементирование А
- •Декрементирование РОН
- •DEC direct
- •Умножение
- •Деление
- •Десятичная коррекция

===================================== Справочник по программированию «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 |
‘пустая строка |
|
|
|||
|
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

===================================== Справочник по программированию «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

===================================== Справочник по программированию «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

===================================== Справочник по программированию «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 «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