; *************************
; * ФУНКЦИЯ: Выводит на индикаторы 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
; Преобразовываем в BCDmovwf NUMBER
; Сохраняем результат в NUMBERmovf 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_SECreturn
; *************************
; * ФУНКЦИЯ: Одновременно передает два байта по последовательному каналу *
; * ВХОД: Значения в DATA_OUT_L (младший разряд) *
; * ВХОД: и DATA_OUT_H (старший разряд) *
; * ВЫХОД DATA_OUT_L и DATA_OUT_H изменяются *
; *************************
SPI_WRITE
bcf PORTA,SCK
; Выставляем НИЗКИЙ уровень на SCKmovlw 8
; Инициализируем счетчик циклаmovwf COUNT
LOOP bcf PORTA,SDOH
; Выставляем 0 на линию данных старшего разрядаrlf DATA_OUT_H,f
; Выдвигаем младший бит в бит переносаbtfsc STATUS,С
; ЕСЛИ С == 0, ТО пропускаемbsf PORTA,SDOH
; ИНАЧЕ выставляем на линию данных 1bcf PORTA,SDOL
; Выставляем 0 на линию данных младшего разрядаrlf DATA_OUT_L,f
; Выдвигаем младший бит в бит переносаbtfsc STATUS,С
; ЕСЛИ С == 0, ТО пропускаемbsf PORTA,SDOL
; ИНАЧЕ выставляем на линию данных 1bsf 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).