Справочник по программировани BASCOM-8051 (М.Л. Кулиш, 2001). Справочник по программированию bascom8051 Краснодар 2001
Скачать 6.61 Mb.
|
Пример: CONFIG DEBOUNCE = 30 ‘30mS Do ‘Debounce P1.1 , 1 , Pr ‘здесь ждем поступления выс. уровня Debounce P1.0 , 0 , Pr , SUB ‘ ^----- вызывать как подпрограмму ‘ ^----- метка перехода ‘ ^---------- что ждем (здесь «0») ‘ ^---------------- имя порта, где ждем Loop End Pr: Print «P1.0 was/is low» : Return ============================================================================= 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 Call Test(b1) ‘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 Действие: Ждать. Программные временные задержки (при 12 МГц): Delay - короткая на 100 мкс. WAIT - на указанное число секунд. 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 INTERRUPTS ‘enable the setting of 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 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” ============================================================================= 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 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 ============================================================================= 4-18 |