Системы счисления. Двоичная арифметика. Архитектура МП системы с 3 шинами. Система команд МП КР. Выполнение команд процессором. Запоминающие устройства. Программные логические контроллеры, страница 4

Для микроконтроллеров AVR существуют различные языки программирования, но, пожалуй, наиболее подходящими являются ассемблер и Си, поскольку в этих языках в наилучшей степени реализованы все необходимые возможности по управлению аппаратными средствами микроконтроллеров.

Ассемблер - это низкоуровневый язык программирования, использующий непосредственный набор инструкций микроконтроллера. Создание программы на этом языке требует хорошего знания системы команд программируемого чипа и достаточного времени на разработку программы. Ассемблер проигрывает Си в скорости и удобстве разработки программ, но имеет заметные преимущества в размере конечного исполняемого кода, а соответственно, и скорости его выполнения. Си позволяет создавать программы с гораздо большим комфортом, предоставляя разработчику все преимущества языка высокого уровня.

Основные преимущества Си перед ассемблером: высокая скорость разработки программ; универсальность, не требующая досконального изучения архитектуры микроконтроллера; лучшая документируемость и читаемость алгоритма; наличие библиотек функций; поддержка вычислений с плавающей точкой.

1.  Из исходного массива составить новый, содержащий элементы исходного, которые не превышают указанного числа.

LXI H,0083

LXI D,0084

MVI B,0x09

Retry:

MOV A,M

CPI 0xAA

JC skip

CALL _ADD

Skip:

INX H

DCR B

JNZ retry

HLT

_ADD:

XCHG

MOV M,A

INX H

XCHG

RET

2. Из исходного массива составить новый, содержащий элементы исходного массива, расположенные на четных местах.

LXI H,0083

LXI D,0084

MVI B,0x09

Retry:

MOV A,M

CALL _ADD

  INX H

  INX H

DCR B

DCR B

JNZ retry

HLT

_ADD:

XCHG

MOV M,A

INX H

XCHG

RET

3. Из исходного массива составить новый, путем замены всех элементов исходного массива, равных указанному числу на 0.

LXI H,0083

LXI D,0084

MVI B,0x09

Retry:

MOV A,M

CPI 0xAA

JNZ skip

MVI A,0x00

Skip:

CALL _ADD

  INX H

DCR B

JNZ retry

HLT

_ADD:

XCHG

MOV M,A

INX H

XCHG

RET

4. Из исходного массива составить новый, путем замены всех элементов исходного массива, меньших указанного числа на их квадрат.

LXI H,0083

LXI D,0084

MVI B,0x09

Retry:

MOV A,M

CPI 0xAA

JNC skip

MOV C,A

Sqr:

ADD M

DCR C

JNZ sqr

Skip:

CALL _ADD

  INX H

DCR B

JNZ retry

HLT

_ADD:

XCHG

MOV M,A

INX H

XCHG

RET

5. Из исходного массива составить новый, значения элементов которого соответствуют номерам элементов исходного массива, равных указанному числу.

LXI H,0083

LXI D,0084

MVI B,0x09

Retry:

MOV A,B

CPI 0xAA

JNZ skip

CALL _ADD

  Skip:

  INX H

DCR B

JNZ retry

HLT

_ADD:

XCHG

MOV M,A

INX H

XCHG

RET

6. В заданном массиве чисел, содержащих в двух указанных разрядах(1 и 2) двоичного кода 0, найти наименьшее.

                                                                        xxxxx00x -число

                                                                        00000110 - маска

                                                                        00000000 – то что должно быть при +

LXI H,0083

LXI D,0084

MVI С,0xff

Retry:

MOV A,M

ANI 0x06

JNZ skip

MOV A,M

CMP C

JNC skip

MOV C,M

Skip:

  INX H

DCR B

JNZ retry

HLT

7. Из исходного массива чисел составить новый путем замены всех элементов исходного массива на 1, если сумма всех элементов исходного массива больше заданного числа.

LXI H,0083

MVI B,0x09

MVI C,0x00

sum:

MOV A,M

ADD C

MOV C,A

INX H

DCR B

JNZ sum

MOV A,C

CPI 0xAA

JNC stop

MVI B,0x09

LXI H,0084

retry:

  MVI M,0x01

  INX H

DCR B

JNZ retry

Stop: HLT

8.Составить программу подсчета суммы чисел заданного массива,и данные записать в порт С.

LXI H,0083

MVI C,0x00

MVI B,0x09

Retry:

MOV A,C

MOV D,M

ADD D

MOV C,A

  INX H

DCR B

JNZ retry

OUT port C

HLT

9. Составить программу вычисления факториала заданного числа.

MVI B,0x09

MOV A,B

DCR B

retry: CALL MUL

DCR B

CPI 0x01

JNZ retru

HLT

MUL: MOV E,B

MOV A,C

_MUL: ADD A

MOV C,A

DCR E

MOV A,E

JNC_MUL

RET

10 Если в регистре С все разряды равны «1», то загрузить в регистр В данные из порта 0х8f исложить их с регистром С, иначе поместить в порт по адресу 0х55 результат операции OR(+) регистров В и С, сдвинутый вправо

MOV A,C

CPI 0xff

JZ M1

ORA B

RAR

OUT 0x55

HLT

M1: IN 0x8f

MOV B,A

MOV A,C

ADD B                                                                           

11. Найти сумму элементов кратных 3 заданного массива, если первый элемент массива больше заданного числа (10)

LXI H,0083

MVI B,0x09

MVI C,0x00

MVI D,0xAA

MOV A,M

CMP D

JNC skip

HLT

Skip:

Sum: MOV A,M

ADD C

MOV C,A

INX H

INX H

INX H

DCR B

DCR B

DCR B

JNZ sum

12 Поменять местами 1-ый и 4-ый элементы массива

LXI H,(0083+0x01)                              (0183)

LXI D,(0083+0x04)                              (0483)

MVI B,0x09

MOV A,M

XCHG

MOV C,M

XCHG

MOV M,C

XCHG

MOV M,A