; *************************
; * ФУНКЦИЯ: Выводит на индикаторы 2-разрядное десят. число *
; * РЕСУРСЫ: П/п BIN_2_BCD, SPI_WRITE, SVN_SEG *
; * РЕСУРСЫ: Перем. DATA_OUT_L, DATA_OUT_H, NEW_SEC, NUMBER *
; * ВХОД: Число в W (от 0 до 99) *
; * ВЫХОД: Число выводится, NEW_SEC обнуляется *
; *************************
OUTPUT bcf PORTA,SCK; Инициализируем линию тактового сигнала
call BIN_2_BCD; Преобразовываем в BCD
movwf NUMBER; Сохраняем результат в NUMBER
movf NUMBER,w; Берем число, которое нужно вывести
andlw b’00001111’; Выделяем число единиц
call SVN_SEG; Преобразуем в 7-сегментный код
movwf DATA_OUT_L; Копируем в младший регистр
swapf NUMBER,w; Перегружаем число десятков в младший полубайт
andlw b’00001111’; Выделяем число десятков
call SVN_SEG; Преобразуем в 7-сегментный код
movwf DATA_OUT_H; Копируем в старший регистр
call SPI_WRITE; Передаем значение обоих разрядов
clrf NEW_SEC; Обнуляем флаг NEW_SEC
return
; *************************
; * ФУНКЦИЯ: Одновременно передает два байта по последовательному каналу *
; * ВХОД: Значения в DATA_OUT_L (младший разряд) *
; * ВХОД: и DATA_OUT_H (старший разряд) *
; * ВЫХОД DATA_OUT_L и DATA_OUT_H изменяются *
; *************************
SPI_WRITE
bcf PORTA,SCK; Выставляем НИЗКИЙ уровень на SCK
movlw 8; Инициализируем счетчик цикла
movwf COUNT
LOOP bcf PORTA,SDOH ; Выставляем 0 на линию данных старшего разряда
rlf DATA_OUT_H,f; Выдвигаем младший бит в бит переноса
btfsc STATUS,С; ЕСЛИ С == 0, ТО пропускаем
bsf PORTA,SDOH; ИНАЧЕ выставляем на линию данных 1
bcf PORTA,SDOL; Выставляем 0 на линию данных младшего разряда
rlf DATA_OUT_L,f; Выдвигаем младший бит в бит переноса
btfsc STATUS,С; ЕСЛИ С == 0, ТО пропускаем
bsf PORTA,SDOL; ИНАЧЕ выставляем на линию данных 1
bsf PORTA,SCK; Формируем тактовый импульс
bcf PORTA,SCK
Преобразование двоичного кода в код 7-сегментного индикатора
Подпрограмма SVN_SEG преобразует младший полубайт содержимого регистра W в соответствующий код 7-сегментного индикатора. Код подпрограммы полностью эквивалентен приведенному в Программе 6.6 (стр. 184).
Вывод по SPI
Подпрограмма SPI_WRITE похожа на свою тезку, реализованную в Программе 12.1 на стр. 371, но формирует два потока последовательных данных. Число, находящееся в регистре DATA_OUT_L, передается по линии RA3, тогда как число, находящееся в регистре DATA_OUT_H, — по линии RA0. Оба канала используют общий тактовый сигнал.
Прежде чем перейти к кодированию процессов, составляющих программу, вкратце рассмотрим используемую конфигурацию микроконтроллера, задаваемую при его программировании, а также инициализационный код, выполняемый после сброса микроконтроллера (см. Программу 17.3).