;-- http://radiohlam.ru - собери сам, помоги собрать другу
;------------------------------------------------------------------
 list    p = 12f629
 __config 01FE4h          ;  01111 11 1 1 0 0 100 - (7,8)защиты памяти нет, (6)сброс по питанию разрешен,
                          ;  (5)GP3/-MCLR работает как -MCLR, (4)PWRT включен, (3)сторожевой таймер - выключен, (2-0)генератор - внутренний
;********* Переменные ************************************
         CBLOCK 0x20      ; Начальный адрес блока констант
         MBC              ; старший байт посылки (полбита - 889uS)
         LBC              ; младший байт посылки
         Counter2         ; счетчики для пауз
         Counter1         ; 
         Counter3         ;
         ENDC             ;
;******** Константы ***************************************
T1         equ         .212        ; задержка 1
T2         equ         .2          ; определяет задержку между приемом посылок
TP         equ         .200        ; определяет задержку между приемом посылок
Tn         equ         .50         ; начальная задержка (ближе к середине полубита)
Sys        equ         .253        ; номер системы (29) + 2SB=1 + TB=1
CMD_1      equ         .1          ; код команды 1
CMD_2      equ         .2          ; код команды 2
CMD_3      equ         .3          ; код команды 3
CMD_4      equ         .4          ; код команды 4
Status     equ         03h         ; Регистр выбора банка.
GPIO       equ         05h         ; Регистр управления защелками порта.
Cmcon      equ         19h         ; Регистр Cmcon - компаратора
TrisIO     equ         05h         ; Регистр выбора направления работы выводов порта.
INTCON     equ         0Bh         ; Регистр разрешения(1)/запрета(0) прерываний
OSCCAL     equ         10h         ; Регистр хранения калибровочной константы
F          equ         1           ; Результат направить в регистр.
;********************************************************
; Пусть у нас GP0 (1-й кр), GP1(2-й кр), GP2(жел), GP4(зел) - выходы на транзисторы управления светодиодов, GP5 - вход ИК-приемника
;********************************************************

          org 0
;******** КОНФИГУРИРОВАНИЕ КОНТРОЛЛЕРА ********************************************************
;*** Необходимо помнить, что калибровочные константы стираются при программировании, **********
;*** поэтому их надо сохранять, OSCCAL хранится по адресу 03FFh,  биты калибровки схемы BOR - *
;*** 12-й,13-й биты слова конфигурации (в моем случае BOR - 01, OSCCAL - 346C)*****************
;****** Калибровка Генератора *****************************************************************
;****** Запрет прерываний *****************************************************
start       bsf         Status,5         ;
            Call        3FFh             ; Загрузить калибровочную константу в w
            movwf       OSCCAL           ;
;******** Установка направления работы GP5 - на вход, а GP4-GP0 - на выход ********************
            bcf         Status,5         ; перейти в банк 0
            clrf        GPIO             ; инициализация защелок
            movlw       .7               ; биты 0..2 поднять
            movwf       Cmcon            ; компаратор выключен, GP0, GP1, GP2 - цифровые вх/вых
            bsf         Status,5         ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status).
            movlw       .40              ; Записать конфигурацию GPIO в аккумулятор (W)    .40=00 101000 GP0, GP1, GP2, GP4 - выходы, остальные - входы
            movwf       TrisIO           ; Скопировать конфигурацию GPIO из W в регистр TrisIO.
            bcf         Status,5         ; перейти в банк 0
;****** Сканирование наличия принятой информации ***********************************************
Scan       btfss   GPIO,5              ; если 5-й бит равен единице - данных нет, пропускаем
           call    priem
           btfsc   MBC,7               ; если start бит (7-й) в регистре MBC = 1, то была принята информация
           call    rab_chast           ;
           goto Scan                   ;

;***** ПРИЕМ ДАННЫХ ***************************************************************
priem         clrf MBC
              clrf LBC
;***********************************************************************************
              movlw Tn
              movwf Counter3
wait_n        nop
              decfsz Counter3,1
              goto wait_n
;********* Первый полубит ***********************************************************
              btfss  GPIO,5          ; если на входе GP5 единица - пропускаем
              bsf MBC,7
              call wait
;********* Третий полубит ***********************************************************
              btfss GPIO,5          ; если на входе GP5 единица - пропускаем
              bsf MBC,6
              call wait
;********* Пятый полубит ***********************************************************
              btfss GPIO,5          ; если на входе GP5 единица - пропускаем
              bsf MBC,5
              call wait
;********* Седьмой полубит ***********************************************************
              btfss GPIO,5          ; если на входе GP5 ноль - пропускаем
              bsf MBC,4
              call wait
;********* Девятый полубит ***********************************************************
              btfss GPIO,5          ; если на входе GP5 ноль - пропускаем
              bsf MBC,3
              call wait
;********* Одиннадцатый полубит ***********************************************************
              btfss GPIO,5          ; если на входе GP5 ноль - пропускаем
              bsf MBC,2
              call wait
;********* Тринадцатый полубит ***********************************************************
              btfss GPIO,5          ; если на входе GP5 ноль - пропускаем
              bsf MBC,1
              call wait
;********* Пятнадцатый полубит ***********************************************************
              btfss GPIO,5          ; если на входе GP5 ноль - пропускаем
              bsf MBC,0
              call wait
;********* Семнадцатый полубит ***********************************************************
              btfss GPIO,5          ; если на входе GP5 ноль - пропускаем
              bsf LBC,5
              call wait
;********* Девятнадцатый полубит ***********************************************************
              btfss GPIO,5          ; если на входе GP5 ноль - пропускаем
              bsf LBC,4
              call wait
;********* Двадцать первый полубит ***********************************************************
              btfss GPIO,5          ; если на входе GP5 ноль - пропускаем
              bsf LBC,3
              call wait
;********* Двадцать третий полубит ***********************************************************
              btfss GPIO,5          ; если на входе GP5 ноль - пропускаем
              bsf LBC,2
              call wait
;********* Двадцать пятый полубит ***********************************************************
              btfss GPIO,5          ; если на входе GP5 ноль - пропускаем
              bsf LBC,1
              call wait
;********* Двадцать седьмой полубит ***********************************************************
              btfss GPIO,5          ; если на входе GP5 ноль - пропускаем
              bsf LBC,0
              call wait
         return

;******* Пауза ***********************************************************************
wait              movlw   T2
                  movwf   Counter2
pause2            movlw   T1
                  movwf   Counter1
pause1            nop
                  decfsz  Counter1,1
                  goto pause1
                  decfsz Counter2,1
                  goto pause2
                  return
;******************************************************************************************
;******** Гашение всех светодиодов *******************************************************
gasim             bcf   GPIO, 0        ; погасить первый светодиод
                  bcf   GPIO, 1        ; погасить второй светодиод
                  bcf   GPIO, 2        ; погасить третий красный светодиод
                  bcf   GPIO, 4        ; погасить четвертый светодиод
                  return

;******* РАБОЧАЯ ЧАСТЬ ********************************************************************
;******* Проверка номера системы **********************************************************
rab_chast         movlw     Sys
                  xorwf     MBC,0
                  btfss     Status,2        ; если бит 2 (Z) в регистре Status=1, то следующая инструкция не выполняется (номер совпадает с заданным)
                  goto      out             ;
;******* Проверка команды 1 *********************************************************
                  movlw     CMD_1
                  xorwf     LBC,0           ;
                  btfss     Status,2        ; если бит 2 (Z) в регистре Status=1, то следующая инструкция не выполняется
                  goto      com2            ;
                  call      gasim           ;
                  bsf       GPIO, 0         ; зажечь первый светодиод
                  goto  out
;****** Проверка команды 2 ***********************************************
com2              movlw     CMD_2
                  xorwf     LBC,0           ;
                  btfss     Status,2        ; если бит 2 (Z) в регистре Status=1, то следующая инструкция не выполняется
                  goto      com3            ;
                  call      gasim
                  bsf       GPIO, 1         ; зажечь второй светодиод
                  goto      out
;******* Проверка команды 3 ********************************************************
com3              movlw     CMD_3
                  xorwf     LBC,0           ;
                  btfss     Status,2        ; если бит 2 (Z) в регистре Status=1, то следующая инструкция не выполняется
                  goto      com4            ;
                  call      gasim
                  bsf       GPIO, 2         ; зажечь третий светодиод
                  goto      out
;******* Проверка команды 4 ********************************************************
com4              movlw     CMD_4
                  xorwf     LBC,0           ;
                  btfss     Status,2        ; если бит 2 (Z) в регистре Status=1, то следующая инструкция не выполняется
                  goto      out             ;
                  call      gasim
                  bsf       GPIO, 4         ; зажечь четвертый светодиод
;******* Сбросить признак принятия посылки ******************************
out         bcf           MBC,7          ; сбрасываем признак принятия посылки
;******* Пауза ****************************************************************************
                  movlw   TP
                  movwf   Counter3
pauset            call wait
                  decfsz Counter3,1
                  goto pauset
                  return
 end
