Д. В. Андреев Программирование микроконтроллеров mcs-51
Вид материала | Учебное пособие |
DEC direct DJNZ direct,addr INC direct |
- Руководитель магистерской программы по направлению «Телекоммуникации» профессор, 75.17kb.
- Методика испытания на радиационную стойкость микроконтроллеров с архитектурой mcs-51, 32.31kb.
- Лабораторный комплекс на основе внутрисхемного эмулятора микроконтроллеров стандарта, 78.16kb.
- Семейство mcs-51 фирмы Intel как представитель 8-разрядных микроконтроллеров. Обобщенная, 64.27kb.
- Лекция № " Система команд микроконтроллеров семейства mcs-51.", 76.63kb.
- Методическое обеспечение базовой лабораторной работы практикума «Изучение работы, 244.09kb.
- Нию сроков активного существования микроконтроллеров atmega128 в условиях дозовых воздействий, 11.73kb.
- Комплекс средств для создания программного обеспечения процессорных модулей, реализованных, 22.6kb.
- Ходимы для реализации в составе «систем на кристалле» блоков управления, спроектированных, 48.74kb.
- Дипломная работа, 704.98kb.
CJNE Rn,#data8,addr | 1 0 1 1 1 r r r | data8 | rel |
где n=0-7 | где rrrB=000B-111B |
Команда "сравнение и переход, если не равно" сравнивает содержимое заданного регистра Rn выбранного банка с байтом данных data8, непосредственно указанным в команде, и выполняет переход по адресу addr, если содержимое Rn не равно data8, в противном случае выполняется следующая команда. Процедура вычисления адреса перехода и время выполнения такие же, как у рассмотренной выше команды с аналогичной мнемоникой. Флаг переноса C сбрасывается в "0", если содержимое Rn больше (равно) data8, в противном случае флаг устанавливается в "1". Команда не влияет на (Rn).
Алгоритм | Пример |
если data8(Rn), то (PC)(PC)+3+rel и (C)0 если data8(Rn), то (PC)(PC)+3+rel и (C)1 если data8=(Rn), то (PC)(PC)+3 и (C)0 | ;(R7)=80H, (C)=0, (PC)=300H, ;MT5 соответствует адресу ;30FH, rel=0CH CJNE R7,#81H,MT5 ;(C)=1, ;(R7)=80H, (PC)=30FH |
CJNE @Ri,#data8,addr | 1 0 1 1 0 1 1 i | data8 | rel |
где i{0,1} | |
Команда "сравнение и переход, если не равно" сравнивает содержимое ячейки резидентной памяти данных (РПД), адресуемой содержимым заданного регистра Ri выбранного банка, с байтом данных data8, непосредственно указанным в команде, и выполняет переход по адресу addr, если содержимое используемой ячейки не равно data8, в противном случае выполняется следующая команда. Процедура вычисления адреса перехода и время выполнения такие же, как у рассмотренной выше команды с аналогичной мнемоникой. Флаг переноса C сбрасывается в "0", если содержимое используемой ячейки больше (равно) data8, в противном случае флаг устанавливается в "1". Команда не влияет на ((Ri)).
Алгоритм | Пример |
если data8((Ri)), то (PC)(PC)+3+rel и (C)0 если data8((Ri)), то (PC)(PC)+3+rel и (C)1 если data8=((Ri)), то (PC)(PC)+3 и (C)0 | ;(R0)=41H, (C)=1, (PC)=200H, ;в РПД (41H)=57H, ;MT6 соответствует адресу ;22AH, rel=27H CJNE @R0,#29H,MT6 ;(C)=0, ;(PC)=22AH, ;в РПД (41H)=57H |
CLR A | 1 1 1 0 0 1 0 0 | |
Команда "сброс аккумулятора" сбрасывает (обнуляет) содержимое аккумулятора A, на состояние флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм | Пример |
(A)0 | ;(A)=6CH, (C)=0, (AC)=1 CLR A ;(A)=00H, (C)=0, (AC)=1 |
CLR C | 1 1 0 0 0 0 1 1 | |
Команда "сброс флага переноса" сбрасывает (обнуляет) содержимое флага переноса C, на состояние других флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм | Пример |
(C)0 | ;(C)=1 CLR C ;(C)=0 |
CLR bit | 1 1 0 0 0 0 1 0 | bit |
Команда "сброс бита" сбрасывает (обнуляет) содержимое бита, 8-разрядный адрес которого определяется символическим именем bit в области ячеек резидентной памяти данных (РПД) или регистров специальных функций, допускающей побитовое обращение. Команда на состояние не используемых флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм | Пример |
(bit)0 | ;(P1)=5EH=01011110B ;в РПД (28H)=31H CLR P1.3 ;(P1)=56H=01010110B CLR 40H ;(28H)=30H |
CPL A | 1 1 1 1 0 1 0 0 | |
Команда "инверсия аккумулятора" инвертирует содержимое каждого бита аккумулятора A, на состояние флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм | Пример |
(A) | ;(A)=65H=01100101B CPL A ;(A)=9AH=10011010B |
CPL C | 1 0 1 1 0 0 1 1 | |
Команда "инверсия флага переноса" инвертирует содержимое флага переноса C, на состояние других флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм | Пример |
(C) | ;(C)=1, (AC)=1, (OV)=0 CPL C ;(C)=0, (AC)=1, (OV)=0 |
CPL bit | 1 0 1 1 0 0 1 0 | bit |
Команда "инверсия бита" инвертирует содержимое бита, 8-разрядный адрес которого определяется символическим именем bit в области ячеек резидентной памяти данных или регистров специальных функций, допускающей побитовое обращение. Команда на состояние не используемых флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм | Пример |
(bit) | ;(P1)=39H=00111001B CPL P1.1 CPL P1.3 ;(P1)=33H=00110011B |
DA A | 1 1 0 1 0 1 0 0 | |
Команда "десятичная коррекция аккумулятора" упорядочивает 8-битовую величину в аккумуляторе A, полученную в результате выполненной ранее команды сложения двух переменных, представленных в двоично-десятичном формате. Для выполнения сложения может использоваться любая из типов команд ADD или ADDC. Если значение битов 3-0 аккумулятора превышает 9 (xxxx1010B-xxxx1111B) или, если содержимое флага AC установлено в "1", то к содержимому A прибавляется 06H, при этом получается соответствующая двоично-десятичная цифра в младшем полубайте A. Указанное сложение не изменяет содержимое флага AC, но устанавливает в "1" содержимое флага переноса C, если перенос из поля младших четырех бит распространяется через все старшие биты A, в противном случае - не изменяет (C). Далее, если содержимое флага C равно "1", или если значение битов 7-4 аккумулятора превышает 9 (1010xxxxB-1111xxxxB), то это значение увеличивается на 6, создавая соответствующую двоично-десятичную цифру в старшем полубайте A. При этом флаг C устанавливается (не изменяется), если имеется (отсутствует) перенос из бита 7 аккумулятора. Время выполнения команды 1 цикл.
Алгоритм | Пример |
если (A[3-0])9 или (AC)=1, то (A)(A)+6 если (A[7-4])9 или (C)=1, то (A[7-4])(A[7-4])+6 | ;(A)=30H, (R3)=99H ADD A,R3 ;(A)=0C9H, ;(AC)=0, (C)=0 DA A ;(C)=1, (A)=29H, (AC)=0 |
DEC A | 0 0 0 1 0 1 0 0 | |
Команда "декремент" производит вычитание "1" из содержимого аккумулятора A, на флаги не влияет и имеет время выполнения 1 цикл.
Алгоритм | Пример |
(A)(A)-1 | ;(A)=00H, (C)=1, (AC)=1 DEC A ;(A)=0FFH, (C)=1, (AC)=1 |
DEC Rn ;где n=0-7 | 0 0 0 1 1 r r r | где rrrB=000B-111B |
Команда "декремент" производит вычитание "1" из содержимого заданного регистра Rn выбранного банка, на флаги не влияет и имеет время выполнения 1 цикл.
Алгоритм | Пример |
(Rn)(Rn)-1, где n=0-7 | ;(R1)=35H, (C)=0, (AC)=1 DEC R1 ;(R1)=34H, (C)=0, (AC)=1 |
DEC direct | 0 0 0 1 0 1 0 1 | direct |
Команда "декремент" производит вычитание "1" из содержимого ячейки, 8-разрядный адрес которой определяется символическим именем direct в области резидентной памяти данных или в среде регистров специальных функций. Команда на флаги не влияет и имеет время выполнения 1 цикл.
Алгоритм | Пример |
(direct)(direct)-1 | ;(SCON)=0A0H, (C)=1, (AC)=0 DEC SCON ;(SCON)=9FH, ;(C)=1, (AC)=0 |
DEC @Ri ;где i{0,1} | 0 0 0 1 0 1 1 i | |
Команда "декремент" производит вычитание "1" из содержимого ячейки резидентной памяти данных (РПД), адресуемой содержимым заданного регистра Ri выбранного банка, на флаги не влияет и имеет время выполнения 1 цикл.
Алгоритм | Пример |
((Ri))((Ri))-1, где i{0,1} | ;(R1)=7FH, в РПД (7FH)=40H DEC @R1 ;(R1)=7FH, ;в РПД (7FH)=3FH |
DIV AB | 1 0 0 0 0 1 0 0 | |
Команда "деление" делит 8-битовую переменную из аккумулятора A на 8-битовую переменную из регистра B. Аккумулятору присваивается целая часть частного (старшие разряды), а регистру B - остаток. Содержимое флага переноса C сбрасывается в "0". Содержимое флага переполнения OV также сбрасывается, а в случае деления на нуль - устанавливается в "1". Содержимое флага AC не изменяется. Команда имеет время выполнения 4 цикла.
Алгоритм | Пример |
(A)(A):(B), (B)mod[(A):(B)], (C)0 если (В)0, то (OV)0 если (В)=0, то (OV)1 | ;(A)=0FBH=251, (B)=12H=18, ;(C)=1, (OV)=1 DIV AB ;(C)=0, (OV)=0, ;(A)=0DH=13, (B)=11H=17 |
DJNZ Rn,addr ;где n=0-7 | 1 1 0 1 1 r r r | rel | где rrrB=000-111B |
Команда "декремент и переход, если не равно нулю" выполняет вычитание "1" из содержимого заданного регистра Rn выбранного банка и осуществляет переход по адресу addr, если содержимое Rn не равно нулю, в противном случае выполняется следующая команда. Адрес перехода addr определяется при помощи сложения 8-битового числа rel (со знаком), размещенного в последнем байте команды, с содержимым счетчика команд PC после увеличения его на 2. Таким образом, указанный переход возможен в пределах от -128 до +127 относительно начального адреса следующей команды, при этом отрицательное значение rel представляется двоичным числом в дополнительном коде. Команда DJNZ Rn,addr на состояние флагов не влияет и имеет время выполнения 2 цикла.
Алгоритм | Пример |
(Rn)(Rn)-1, где n=0-7 если (Rn)0, то (PC)(PC)+2+rel если (Rn)0, то (PC)(PC)+2 | ;(R3)=0AH, rel=0FEH MT5: DJNZ R3,MT5 ;команда ;выполнится 10 раз |
DJNZ direct,addr | 1 1 0 1 0 1 0 1 | direct | rel |
Команда "декремент и переход, если не равно нулю" выполняет вычитание "1" из содержимого ячейки, 8-разрядный адрес которой определяется символическим именем direct в области резидентной памяти данных или в среде регистров специальных функций, и осуществляет переход по адресу addr, если содержимое используемой ячейки не равно нулю, в противном случае выполняется следующая команда. Адрес перехода addr определяется при помощи сложения 8-битового числа rel (со знаком), размещенного в последнем байте команды, с содержимым счетчика команд PC после увеличения его на 3. Команда на состояние флагов не влияет и имеет время выполнения 2 цикла.
Алгоритм | Пример |
(direct)(direct)-1 если (direct)0, то (PC)(PC)+3+rel если (direct)0, то (PC)(PC)+3 | ;(P1)=0AH, rel=0FDH MT5: DJNZ P1,MT5 ;команда ;выполнится 10 раз |
INC A | 0 0 0 0 0 1 0 0 | |
Команда "инкремент байта" производит прибавление "1" к содержимому аккумулятора A, на флаги не влияет и имеет время выполнения 1 цикл.
Алгоритм | Пример |
(A)(A)+1 | ;(A)=0FFH, (C)=1, (AC)=1 INC A ;(A)=00H, (C)=1, (AC)=1 |
INC Rn ;где n=0-7 | 0 0 0 0 1 r r r | где rrrB=000B-111B |
Команда "инкремент байта" производит прибавление "1" к содержимому заданного регистра Rn выбранного банка, на флаги не влияет и имеет время выполнения 1 цикл.
Алгоритм | Пример |
(Rn)(Rn)+1, где n=0-7 | ;(R1)=35H, (C)=0, (AC)=1 INC R1 ;(R1)=36H, (C)=0, (AC)=1 |
INC direct | 0 0 0 0 0 1 0 1 | direct |
Команда "инкремент байта" производит прибавление "1" к содержимому ячейки, 8-разрядный адрес которой определяется символическим именем direct в области резидентной памяти данных (РПД) или в среде регистров специальных функций. Команда на флаги не влияет и имеет время выполнения 1 цикл.
| Алгоритм | Пример | |||
---|---|---|---|---|---|
| (direct)(direct)+1 | ;(TMOD)=0A5H, (C)=1, (AC)=0 ;в РПД (23H)=0FFH INC TMOD ;(TMOD)=0A6H, ;(C)=1, (AC)=0 INC 23H ;в РПД (23H)=00H, ;(C)=1, (AC)=0 | |||
INC @Ri ;где i{0,1} | 0 0 0 0 0 1 1 i | | |