include "p16f627a.inc
SDOH equ 0
SCK equ 1
BUZ equ 2
SDOL equ 3
GREEN equ 5
YELLOW equ 6
RED equ 7
PAUSE equ 0
DIAG equ 1
STOP equ 2
SETT equ 3
GO equ 4
cblock 20h
MINUTE:1, SECOND:1, JIFFY:1, NUMBER:1, NEW_SEC:1
DATA_OUT_L:1, DATA_OUT_H, COUNT:1, TEMP:1, TIME_OUT:1
Pause:1, _work:1, _status:1
endc
__config _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF & _LVP_OFF & _MCLRE_ON
org 2100h; Область EEPROM
de d’10’; Значение по умолчанию — 10 мин
RESET org 0; Вектор сброса
Преобразование двоичного кода в код 7-сегментного индикатора
Подпрограмма SVN_SEG преобразует младший полубайт содержимого регистра W в соответствующий код 7-сегментного индикатора. Код подпрограммы полностью эквивалентен приведенному в Программе 6.6 (стр. 184).
Вывод по SPI
Подпрограмма SPI_WRITE похожа на свою тезку, реализованную в Программе 12.1 на стр. 371, но формирует два потока последовательных данных. Число, находящееся в регистре DATA_OUT_L, передается по линии RA3, тогда как число, находящееся в регистре DATA_OUT_H, — по линии RA0. Оба канала используют общий тактовый сигнал.
Прежде чем перейти к кодированию процессов, составляющих программу, вкратце рассмотрим используемую конфигурацию микроконтроллера, задаваемую при его программировании, а также инициализационный код, выполняемый после сброса микроконтроллера (см. Программу 17.3).
include "p16f627a.inc
SDOH equ 0
SCK equ 1
BUZ equ 2
SDOL equ 3
GREEN equ 5
YELLOW equ 6
RED equ 7
PAUSE equ 0
DIAG equ 1
STOP equ 2
SETT equ 3
GO equ 4
cblock 20h
MINUTE:1, SECOND:1, JIFFY:1, NUMBER:1, NEW_SEC:1
DATA_OUT_L:1, DATA_OUT_H, COUNT:1, TEMP:1, TIME_OUT:1
Pause:1, _work:1, _status:1
endc
__config _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF & _LVP_OFF & _MCLRE_ON
org 2100h; Область EEPROM
de d’10’; Значение по умолчанию — 10 мин
RESET org 0; Вектор сброса
goto MAIN
org 4; Вектор прерывания
goto ISR
MAIN bsf STATUS,RP0; Переключаемся в 1-й банк
movlw b’11100000’; RA4:0 — выходы
movwf TRISA
movlw Ь’11100000’; RB7:5 — выходы; RB4:0 — входы
movwf TRISB
movlw b’00000101’; Таймер 0: внутр. такт. сигнал,
movwf OPTION_REG; предделитель 1:64. Подтяжка вкл.
bcf STATUS,RP0; Возвращаемся в 0-й банк
clrf Pause; Обнуляем флаги паузы
clrf NEW_SEC; и секунды
clrf TMR0
bcf INTCON,T0IF
bsf INTCON,T0IE;Разрешаем прерывание от Таймера 0
bsf INTCON,GIE;Разрешаем все прерывания
btfss PORTB,SETT;Проверяем кнопку УСТ.
call SET_TIME;ЕСЛИ нажата, ТО устанавливаем интервал
btfss PORTB,DIAG;Проверяем кнопку ДИАГ.
call DIAGNOSTIC;ЕСЛИ нажата, ТО выполняем самодиагностику
С помощью директивы __config задается состояние конфигурационных ячеек в слове конфигурации кристалла. Сторожевой таймер отключен, генератор работает с внешним кварцевым резонатором, также задействован вход внешнего сброса
При прошивке микроконтроллера в ячейку EEPROM с адресом h’00’ заносится число 10. Это означает, что интервал счета только что запрограммированного микроконтроллера составляет 10 мин. Данное значение впоследствии можно изменять посредством процедуры установки интервала.