Справочник по программировани BASCOM-8051 (М.Л. Кулиш, 2001). Справочник по программированию bascom8051 Краснодар 2001
Скачать 6.61 Mb.
|
Пример: 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 = 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 ============================================================================= 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 'считать обратно 'код операции: старт бит 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 ============================================================================= 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 вы должны указать и условия возникновения этих прерываний, установкой или сбросом соответствующих битов: SET TCON.0 ‘INT0 запускается падающим фронтом. RESET TCON.0 ‘INT0 низким уровнем. SET TCON.2 ‘INT1 запускается падающим фронтом. RESET TCON.2 ‘INT1 низким уровнем. Пример:_DIM_a_As_Byte_a_=_Peek(_0_)_‘считать_значение_R0POKE_Действие:_Записать_байт_в_ячейку_внутренней_памяти.Синтаксис'>Пример: 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 ============================================================================= 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 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 'закроем порт ============================================================================= 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 без параметров вызывает вывод только одного разделителя (ВК, ПС). |