STATUS equ 3; Регистр STATUS расположен по адресу h'03'
MULTIPLICAND equ h’22’; Множимое
PRODUCT_H equ h’23’; Старший байт произведения
PRODUCT_L equ h’24’; Младший байт произведения
С equ 0; Флаг переноса — 0-й бит регистра STATUS
; Задача 1: Умножить множимое на восемь
MUL_9 movf MULTIPLICAND,w; Берем множимое, которое
movwf PRODUCT_L; становится младшим байтом произведения,
clrf PRODUCT_H; расширенным до 16 бит
bcf STATUS,С; Сбрасываем флаг переноса
rlf PRODUCT_L,f; Теперь сдвигаем 16-битное значение на три разряда влево
rlf PRODUCT_H,f
rlf PRODUCT_L,f
rlf PRODUCT_H,f
rlf PRODUCT_L,f
rlf PRODUCT_H,f
; Задача 2: Сложить Х8 и X1
addwf PRODUCT_L,f;Прибавим множимое (еще в W!) к младшему байту произведения
btfsc STATUS,С;ЕСЛИ нет переноса, ТО пропускаем команду
incf PRODUCT_H,f; ИНАЧЕ увеличиваем старший байт произведения на 1
... ...; Следующая процедура
Некий температурный регистратор считывает значение температуры каждый час, и к концу дня в памяти данных накапливается 24 значения, расположенные по адресам h’30’…h’47’. Напишите программу, просматривающую этот массив и вычисляющую среднесуточную температуру.
Решение
Для вычисления среднего значения необходимо просмотреть весь массив, аналогично тому, как это было показано на Рис. 5.8, добавляя каждый его элемент к 2-байтной сумме. После прохода массива эта сумма делится на 24 для вычисления среднего значения:
Исходя из сказанного, составим перечень задач:
1. Обнулить среднее.
2. Установить указатель на Temp[0] (i = 0).
3. ВЫПОЛНЯТЬ:
а) Прибавить Temp[i] к общей 2-байтной сумме.
б) Инкрементировать i.
в) Повторять, ПОКА i < 24.
4. Разделить на 24.
Этот алгоритм реализован в Программе 5.10. Сумма элементов массива накапливается в регистрах h’48’:h’47’, которые перед входом в цикл сбрасываются. Деление реализовано циклическим вычитанием числа 24 из общей суммы. Это похоже на процедуру деления на 10, реализованную в Программе 5.7, только в данном случае однобайтная константа вычитается из двухбайтного значения. Число успешных вычитаний представляет собой частное, т. е. в нашем случае усеченное среднее значение. Разумеется, более правильно было бы округлять результат до ближайшего большего целого, если остаток больше половины делителя.