include "p16f627а. inc"
SDO equ 0
SCK equ 1
DISPLAY bcf PORTA,SCK; Инициализируем линию SCK
movf BINARY,w; Берем двоичное значение
call BIN_2_BCD; Преобразуем его в три BCD разряда
movf UNITS,w; Берем число единиц
call SVN_SEG; Преобразуем в 7-сегментный код
movwf DATA_OUT; Копируем в регистр последовательной передачи
call SPI_WRITE; Выдвигаем его
movf TENS,W; Берем число десятков
call SVN_SEG; Преобразуем в 7-сегментный код
movwf DATA_OUT; Копируем в регистр последовательной передачи
call SPI_WRITE; Выдвигаем его
movf HUNDREDS,w; Берем число сотен
call SVN_SEG; Преобразуем в 7-сегментный код
movwf DATA_OUT; Копируем в регистр последовательной передачи
call SPI_WRITE; Выдвигаем его
return
; ********************
; * ФУНКЦИЯ: Побитно передает байт данных, начиная со старшего бита *
; * ВХОД: Байт данных в DATA_OUT *
; * ВЫХОД: DATA_OUT обнуляется *
; ********************
; Задача 1
SPI_WRITE
bcf PORTA,SCK; В режиме ожидания на линии SCK — НИЗКИЙ
; Задача 2
movlw 8; Инициализируем счетчик цикла
movwf COUNT
; Задача 3,
LOOP bcf PORTA,SDO; Выставляем на линию данных 0
btfsc DATA_OUT,7; Пропускаем, ЕСЛИ старший бит = 0
bsf PORTA,SDO; ИНАЧЕ выставляем на линию данных 1
rlf DATA_OUT,f; Сдвигаем байт данных на один бит влево
; Задача 3,
bsf PORTA,SCK; Формируем тактовый импульс
bcf PORTA,SCK
;Задача 3,г
decfsz COUNT,f; Декрементируем счетчик
goto LOOP; и повторяем, пока он не станет равным 0
return
Собственно последовательная передача данных осуществляется подпрограммой SPI_WRITE, работающей по приведенному выше алгоритму. В подпрограмме проверяется 7-й бит содержимого регистра DATA_OUT и в соответствии с его значением на вывод RA0 выставляется ВЫСОКИЙ или НИЗКИЙ уровень. Затем на выводе RA1 формируется положительный импульс
В Программе 12.2 приведена одна из возможных реализаций данной подпрограммы на языке Си. Функция spi_write () 8 раз выдает 7-й бит переданного ей байта данных на вывод SDO и сдвигает значение этого байта влево. Предполагается, что оба вывода последовательного интерфейса SPI уже определены как соответствующие линии порта ввода/вывода микроконтроллера.
void spi_write(int datum)
{
int k;
for(k=0;k<8;k++)
{
if((datum & 0x80)) {SDO = 1;} /* Проверяем 7-й бит и ЕСЛИ TRUE, выставляем 1 */
else {SDO = 0;} /* ИНАЧЕ выставляем 0 */
SCK = 1; /* Загружаем бит в цепочку регистров */
SCK = 0;
datum = datum <<1; /* Сдвигаем байт данных влево и повторяем 8 раз */
}
}