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

0

определяющие частоту переполнения).

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

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 = Lookup(1, dta)            ‘b1=2 – первый элемент 0-й!!!

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 = Makebdc(var2) Var1 – переменная, принимающее двоично-десятичное  значение

(типа 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).

Синтаксис:    Varn = MAKEINT(LSB , MSB)  Varn –  беззнаковый  результат.  LSB –  имя  байтовой переменной или константы, помещаемой в младшие разряды. MSB –  имя байтовой переменной или   константы,   помещаемой   в   старшие   разряда   результата.   Математический   эквивалент операции:  varn = (256 * MSB) + LSB

Пример:        Dim a As Integer , I As Integer

a = 2 : I = Makeint(a , 1) ‘I = (1 * 256) + 2  = 258

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

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

‘считать обратно

‘код операции: старт бит 1 + (10). Число байт: (1) Mwread Dta , &B110 , Adr , 1

‘запретить запись и стирание

‘старт-бит (1), код операции (00) и (00) + адрес (любой, обычно 0)

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

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

Intt1:

Intt2: Intt3:

Intte:

$end Asm

Push Psw          ;обработка интегратора термодатчика

Push Acc          ;сохранить используемые регистры

Jb   {B_ctmp} , Intt2   ;есть перегрев?

Mov A , {R_ot}    ;да – датчик температуры сработал Cjne A , #{Cit} , Intt1 ;интегратор достиг максимума? Sjmp Intte        ;да – просто выйти

Inc A             ;нет – нарастить знач. Интегратора Cjne A , #{cit} , Intt3 ;он сейчас достиг максимума Setb {b_ot}       ;да – поставить бит «Перегрев»

Sjmp Intt3

Mov A , {R_ot}    ;перегрева нет

Jz  Intte         ;интегратор пуст?

Dec A             ;не пуст – уменьшить значение

Mov {R_ot} , A    ;изменился – сохр. Новое значение

Pop Acc           ;восстановить регистры

Pop Psw

Reti

ON Interrupt

Действие:      Запускать подпрограмму, когда случается указанное прерывание. При компиляции директива ON Interrupt производится назначение прерывания – записывается  команда перехода на программу обработки   (вектор   прерывания)   на   место   в   начале   программы,   соответствующее   типу прерывания.

Синтаксис:    ON interrupt label [NOSAVE]

Interrupt – имя прерывания: INT0, INT1, SERIAL, TIMER0 ,TIMER1, TIMER2  или PCA.

Выбор используемого прерывания определяется конфигурацией системы и моделью процессора.

Список используемых прерываний может быть расширен.

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

если случилось соответствующее прерывание.

NOSAVE –  необязательная  опция.  Она  запрещает  компилятору  включать  в  программу  блоки сохранения и восстановления регистров на время обработки прерывания.  Программа обработки прерывания должна завершаться только одной   командой RETURN, т.к. компилятор генерирует код команды RETI только один  раз. Когда вы используете входы INT0 или INT1 вы должны указать и условия  возникновения этих прерываний, установкой или сбросом соответствующих битов:

SET TCON.0    ‘INT0 запускается падающим фронтом.

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

Label2:     PRINT «An hardware interrupt occurred!» ‘печатать это

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

ON x GOTO lbl4, lbl5          ‘переход на метку lbl4

END

Lbl1: PRINT « lbl1» : RETURN

Lbl2: PRINT « lbl2» : RETURN

lbl3: PRINT « lbl3» : RETURN Lbl4: PRINT « lbl4» : STOP Lbl5: PRINT « lbl5» : STOP

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       ‘перечислим все символы слева направо

‘берем очередной символ

‘запишем его в com-порт

Next Do

Get #2 , A            ‘возмем символ из com-порта

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                                    ‘закроем порт

PEEK()

Действие:      Возвращает значение переменной (байтовой), расположенной во внутренней памяти.

Синтаксис:    var = PEEK( address ) var – имя переменной, принимающей считываемое  значение.

Address – числовая переменная или константа с адресом считываемых данных в диапазоне от 0

до 255.

Пример:        DIM a As Byte

a = Peek( 0 ) ‘считать значение R0

POKE

Действие:      Записать байт в ячейку внутренней памяти.

Синтаксис:    POKE  address , value Address – адрес записи. Числовая переменная или  константа в диапазоне от 0 до 255. Value – записываемое значение (0-255).  Будьте внимательны с POKE потому, что можете изменить переменные, которые  нужны программе для правильной работы. Имеются в виду, в первую очередь, не явно используемые регистры BASCOM. Для этой команды они особенно легко доступны.

Пример:        POKE 127, 1 ‘записать 1 по адресу 127

POWERDOWN

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

Пример:        P0 = 0 : P1 = 0 : P2 = 0 : P3 = 0 : POWERDOWN

PRINT, PRINTHEX

Действие:      Послать данные в виде текстовой строки в последовательный интерфейс (RS-232 port). PRINT – преобразует все виды числовых данных в десятичный вид. При выводе отрицательных значений перед печатаемым числом ставит знак минус (« –  »). PRINTHEX – выводит числовые данные в шестнадцатеричном виде (HEX – коде). Для работы этих функций в системе должен быть иметься и быть настроен последовательный интерфейс. Если этого не сделать, компилятор произведет их сам, воспользовавшись параметрами меню “Options”.

Синтаксис:    PRINT var ; «constant» PRINTHEX var

Var – имя переменной или константы или непосредственные данные, которые будут выводиться в последовательный порт. Числовые переменные при выводе  преобразуются в удобочитаемый текстовый вид. В одной строке, разделяя точкой  с  запятой (« ; ») можно выводить несколько переменных  или  констант,  совершенно  разного  типа.  Оператор  PRINTHEX  может  выводить данные  переменных только типа: Byte, Word, Integer, Long. Выводимые данные  завершаются разделителем (ВК, ПС). Применение оператора PRINT без  параметров  вызывает вывод только одного разделителя (ВК, ПС).

Пример:        Dim A As Byte , B1 As Byte , C As Integer A = 1

Print «print variable a=» ; A

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

Print «Text to print.»      ‘печать текстовой константы

B1 = 10 : Printhex B1       ‘печать в шестнадцатеричном виде

C = &HA000 : Printhex C     ‘аналогично в HEX-формате

Print C                     ‘а теперь в десятичном виде

C = -32000

Print C                     ‘выведется -32000!

Printhex C                  ‘выведется 8300

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)

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

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

X – номер выхода от 1 до 16.  NN – число, равное длительности генерируемых импульсов.

Пример:        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

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”

Print S ; Spc(3) ; S         ‘получим ”123   123” 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          ‘послать байт

 
START TIMER, STOP TIMER

End            Rem обработка прерывания Timer0

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) ‘можно применять при суммировании

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)

Call test5 (a)                   ‘вызов с параметром A

Test5 a                          ‘альтернативная запись с параметром A End

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

‘переменные были объявлены только один раз и были глобальными

Sub Test(a As Byte , B1 As Byte) ’начало sub

Print A ; « » ; B1          ‘отпечатать встреченную перем.

B1 = 3

End Sub

Sub Test2                       ‘sub без параметров * Print «No parameters»

End Sub

Sub Test3(bl As Bit)            ‘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

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

WHILE a <= 10  ‘цикл будет повторяться, пока a не достигнет 11

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           ‘включить

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

По теме:

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