Напишите функцию, выполняющую сдвиг содержимого регистра h’20’ справа налево и выставляющую выдвигаемый бит на вывод RA0. При выдаче очередного бита на выход RA0 на выводе RA1 должен формироваться импульс
Решение
В Программе 9.5 для восьмикратного сдвига содержимого регистра h’20’ (названного DATUM) вправо используется оператор цикла for (). Сам сдвиг реализуется с помощью оператора Си «>>» (сдвиг вправо). Перед очередным сдвигом вывод RA0 (названный SER_OUT) устанавливается или сбрасывается в зависимости от значения 0-го бита (LSB) переменной DATUM с использованием условного оператора if-else. В любом случае на выводе RA1 (названном CLOCK) формируется одиночный импульс. Кстати, написанная нами функция реализует простейший последовательный канал синхронной передачи данных (см. главу 12).
#byte DATUM = 0x20 /* Регистр h’20’ */
#bit LSB = DATUM.0 /* 0-й бит регистра h’20’ */
#byte PORTA =5 /* Порт А — регистр h’05’ */
#bit SER_OUT = PORTA.0 /* 0-й бит порта */
#bit CLOCK = PORTA.1 /* 1-й бит порта */
void put_char (void) /* Параметры и возвращаемое значение отсутствуют (void) */
{
int i; /* Счетчик цикла */
for i=0; i<8; i++) /* ВЫПОЛНЯЕМ восемь раз */
{
if (LSB) /* ЕСЛИ 0-й бит равен 1,
SER_OUT = 1; /* выставляем на RA0 ВЫСОКИЙ уровень */
else
SER_OUT = 0; /* ИНАЧЕ выставляем на RA0 НИЗКИЙ уровень */
CLOCK = 1; /* Выдаем на RA1 ВЫСОКИЙ уровень, */
CLOCK = 0; /* а затем НИЗКИЙ */
DATUM = DATUM >> 1; /* Сдвигаем байт данных на один разряд вправо */
}
}
Напишите Си-программу для упаковщика консервных банок из Примера 7.1 (стр. 224), рассчитанную на компилятор CCS. В программе должны использоваться прерывания.
Решение
Как и в ассемблерном варианте, в Программе 9.6 имеется две функции. В основной функции main () сначала используется встроенная функция компилятора set_tris_a () для переключения 0-й линии порта А в режим выхода. Затем с помощью другой встроенной функции enable_interrupts () устанавливаются биты маски прерываний INTE и GIE (см. Рис. 7.3 на стр. 213). После этого сбрасывается 0-й бит порта А, гарантируя наличие НИЗКОГО уровня на выводе RA0 при старте программы.