Главная » Bascom-8051, Basic, Железо » Директивы, операторы и функции Bascom-8051 – ЧАСТЬ 4

0

Синтаксис:    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

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 только тем, что адрес перехода устанавливается автоматически на строку, следующую за последним оператором цикла.

Синтаксис:

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

[WHILE] [SUB]

EXIT  [FOR]  [DO]

Пример:

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

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 – все в одном байте. ‘при увеличении величины емкости задержка станет двухбайтовой

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

If New = 1 Then         ‘”1” если приняли

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                              ‘выведется “6D”

a = 123 : s  = Str(a) : Print s      ‘выведется “123”

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

S = «000A» : Ar = Hexval(s) : Print Ar    ‘получили 10

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)     ‘получили 16

HIGHW(), LOWW()

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

HIHGW – возвращает два старших байта четырехбайтовой переменной

LOWW – возвращает два младших байта четырехбайтовой переменной

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

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

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

Пример:        Dim L As Integer , Z As Long L = &H101001

Z = LowW(L)       ‘Z = 1001h Z = HighW(L)      ‘Z = 0010h

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 – число байт для передачи.

Пример:        x = 0                             ‘reset variable

slave = &H40                      ‘адрес расширителя PCF8574

I2CRECEIVE  slave, x              ‘считали его порт

PRINT x                           ‘посмотрели

‘————

Dim buf(10) as String             ‘10-местный буфер

buf(1) = 1 : buf(2) = 2           ‘2 ячейки иниц. I2CRECEIVE slave , buf() , 2 , 1  ‘запишем из и счит. Одну Print buf(1)                      ‘посмотрим, что считали

‘———— x = 5

I2CSEND slave , x                 ‘запишем 5 ‘————

Dim ax(10) As Byte For a = 1 to 10

ax(a) = a                     ‘заполним пространство от 1 до 10

Next

Bytes = 10                        ‘? – резерв. переменная BASCOM I2CSEND slave , ax() , bytes      ‘запишем 10 байт

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 – переменная-источник данных или константа. Функции  записи и считывания работают через аккумулятор, поэтому для экономии переменных его можно использовать как источник и приемник данных.

Источник: М.Л.Кулиш, СПРАВОЧНИК ПО ПРОГРАММИРОВАНИЮ BASCOM-8051, Краснодар 2001

По теме:

  • Комментарии