;***********************************************************************************************
; Контроллер освітлення.
; PIC16F84A      Кварц 4 мГц.
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;!!!!!!!! При прошивці - записати '00' в EEPROM !!!!!!!!!!!!!!
;!!!!!!!!  у адреси 10, 11, 12, 13, 14, 15, 16  !!!!!!!!!!!!!!
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;
;===============================================================================================
            LIST        p=16F84A  			  	; контроллер.
            __CONFIG    b'0011111111110001'		
;===============================================================================================
; Визначення регістрів.
;===============================================================================================
Status      equ         03h         ; Вибір банку.
OptReg		equ			01h
IntCon		equ			0bh
PortA		equ			05h			; Порт А
TrisA       equ         05h         ; Напрямок порта В.
PortB       equ         06h         ; Порт В.
TrisB       equ         06h         ; Напрямок порта В.
Fsr			equ			04h

TicH		equ			0Ch			; Періодичний лічильник
TicM		equ			0Dh			; Періодичний лічильник
TicL		equ			0Eh			; Періодичний лічильник

TmSBH		equ			10h			; Час утримув.кнопки Salon
DrTm		equ			11h			; Таймер відкр.дверей
SlTm		equ			12h			; Таймер закритих дверей
FlashTm		equ			13h			; Таймер запису у Flash
BrSync		equ			14h			; Опорний сигнал яскравості
DoorBr		equ			15h			; Поточна яскр.дверей
SalBr		equ			16h			; Поточна яскр.салону
BrFtD		equ			17h			; Задача яскр.педалей при відкр.дверях
BrFt		equ			18h			; Задача яскр.педалей при закр.дверях
BrS			equ			19h			; Задача яскр.салону
ColFtD		equ			1Ah			; Задача колір педалей при відкр.дверях
ColFt		equ			1Bh			; Задача колір педалей при закр.дверях
ColS		equ			1Ch			; Задача колір салону
AntiJit		equ			1Dh			; Таймер антидребезгу
Bits		equ			1Eh			; Службові біти

BitsFlash	equ			20h			; Біти для роботи з FLASH
EECON1		equ			08h
EECON2		equ			09h
EEDATA		equ			08h
EEADR		equ			09h

W_temp		equ			21h			; для обробки переривання
Status_temp	equ			22h
Fsr_temp	equ			23h
;===============================================================================================
            org         0           ; Початок програми з адреси 0 PC.
            goto        Init		; Перехід в ПП Start.

            org         4           ; Обробка переривання.
            goto        Int

;********************************************************************************************
;                          Текст програми
;*******************************************************************************************
;-----------------------------------------------------------------------------------------------
Init		bsf         Status,5			; Перейти в 1-й банк (установити в 1 5-й бит рег-ра Status
            movlw       b'11110000'			; Записати константу 1 в акумулятор (W).
            movwf       TrisA				; Копіюєм 1 із W в регістр TrisB.
            movlw       b'00001111'			; Записати константу 0 в акумулятор (W).
            movwf       TrisB				; Копіюєм 0 із W в регістр TrisB.
			movlw		b'00000101'			; 256*64=16.384mkS
			movwf		OptReg
            bcf         Status,5			; Перейти в 0-й банк (установити в 0 5-й бит рег-ра Status
			movlw		b'10100000'			; Заборона переривань
			movwf		IntCon
			clrf		PortA				; Очищаєм порт А
			clrf		PortB				; Очищаєм порт Б
			clrf		TicL				; Очищаєм Молодший байт генератора інтервалів
			clrf		TicM				; Очищаєм Середній байт генератора інтервалів
			clrf		TicH				; Очищаєм Старший байт генератора інтервалів

			clrf		TmSBH
			clrf		DrTm
			movlw		b'00001111'
			movwf		SlTm
			movlw		b'00001011'
			movwf		FlashTm
			clrf		DoorBr
			clrf		SalBr
			movlw		b'00100000'
			movwf		Bits
			call		ReadFLASH
;-----------------------------------------------------------------------------------------------
Start
;-----------------------------------------------------------------------------------------------
;++++++++++++++++++++++++++++++++++++++++++++
; Керування бітом
;			btfss		PortB,1
;			goto		SalonLightOff
;			bsf			Bits,6
;			goto		EndSalonLight
;SalonLightOff
;			bcf			Bits,6
;EndSalonLight


; Керування бітом 
;			btfsc		PortB,1
;			goto		FootDoorOff
;			bsf			Bits,7
;			goto		EndFootDoor
;FootDoorOff
;			bcf			Bits,7
;EndFootDoor
;++++++++++++++++++++++++++++++++++++++++++++

; Обробка реакції на кнопку Salon
			btfsc		PortB,1
			goto		AntiJitRel
			movf		AntiJit,W
			xorlw		b'11111111'
			btfss		Status,2
			incf		AntiJit
			goto		AntiJitEnd
AntiJitRel	movf		AntiJit,W
			xorlw		b'00000000'
			btfss		Status,2
			decf		AntiJit
AntiJitEnd
			movf		AntiJit,W
			xorlw		b'11111111'
			btfsc		Status,2
			bsf			Bits,7
			movf		AntiJit,W
			xorlw		b'00000000'
			btfsc		Status,2
			bcf			Bits,7



			btfss		Bits,7
			clrf		TmSBH

			movf		TmSBH,W
			xorlw		b'01111111'
			btfss		Status,2
			goto		TmSBHNFull
			clrf		TmSBH
			bcf			Bits,5
			btfss		BitsFlash,0
			goto		SetDrMdOnMan
			bcf			BitsFlash,0
			goto		TmSBHNFull
SetDrMdOnMan
			bsf			BitsFlash,0
TmSBHNFull

			btfss		Bits,7
			goto		SalBtRel
			bsf			Bits,4
			goto		ScipAJRel
SalBtRel
			btfss		Bits,4
			goto		SalonBt
			btfss		Bits,5
			goto		LetSalonSw

			btfss		Bits,6
			goto		SetSalManOn
			bcf			Bits,6
			goto		SalonBt
SetSalManOn	bsf			Bits,6

LetSalonSw	bsf			Bits,5
SalonBt		bcf			Bits,4
ScipAJRel

; Обробка реакції на відкриття дверей
			btfss		PortA,4
			goto		DrReactOpen
			btfss		PortB,0
			goto		DrReactIgnOn
			movf		SlTm,W
			xorlw		b'00001110'
			btfss		Status,2
			goto		EndDoorReact
DrReactIgnOn
			bcf			Bits,3
			bcf			Bits,1
			goto		EndDoorReact
DrReactOpen
			btfss		BitsFlash,0
			goto		EndDoorReact
			bsf			Bits,3
			clrf		SlTm
			bsf			Bits,1
EndDoorReact

; Керування осв.дверей
			btfsc		PortA,4
			goto		DoorLightOff
			movf		DrTm,W
			xorlw		b'11111111'
			btfsc		Status,2
			goto		DoorLightOff
			bsf			Bits,2
			goto		EndDoorSw
DoorLightOff
			bcf			Bits,2
EndDoorSw

; Керування записом у Flash
			btfss		PortB,1
			clrf		FlashTm
			btfss		PortB,2
			clrf		FlashTm
			btfss		PortB,3
			clrf		FlashTm
			movf		FlashTm,W
			xorlw		b'00001010'
			btfss		Status,2
			goto		ScipWriteFLASH
			btfss		Bits,0
			goto		ScipWriteFLASH
			bcf			Bits,0
			call		WriteFLASH
ScipWriteFLASH


; Блок OutLight
			incf		BrSync
; Вмикаємо світло
			movf		BrSync,W
			xorlw		b'00000000'
			btfss		Status,2
			goto		ScipAllOn

			bsf			PortA,0			; Вкл. світло дверей

			movf		SalBr,W
			xorlw		b'00000000'
			btfsc		Status,2
			goto		ScipOnSalon
			btfss		ColS,0			; Вкл.салон R
			bsf			PortA,3
			btfss		ColS,1			; Вкл.салон G
			bsf			PortA,2
			btfss		ColS,2			; Вкл.салон B
			bsf			PortA,1
ScipOnSalon	
			
			btfss		Bits,1
			goto		FootColClDr		; На установки кольору педалей при закр.дверях
			btfss		ColFtD,0			; Вкл. R
			bsf			PortB,6
			btfss		ColFtD,1			; Вкл. G
			bsf			PortB,5
			btfss		ColFtD,2			; Вкл. B
			bsf			PortB,4
			goto		ScipAllOn
FootColClDr	btfss		ColFt,0			; Вкл. R
			bsf			PortB,6
			btfss		ColFt,1			; Вкл. G
			bsf			PortB,5
			btfss		ColFt,2			; Вкл. B
			bsf			PortB,4
ScipAllOn

; Гасимо світло дверей
			movf		BrSync,W
			xorwf		DoorBr,0
			btfsc		Status,2
			bcf			PortA,0
; Гасимо світло салону по обмеженню задачі
			movf		BrSync,W
			xorwf		BrS,0
			btfsc		Status,2
			call		OffSalonLight
; Гасимо світло салону по обмеженню діммера
			movf		BrSync,W
			xorwf		SalBr,0
			btfsc		Status,2
			call		OffSalonLight
; Гасимо світло педалей
			btfss		Bits,1
			goto		OffFootClDr
			movf		BrSync,W
			xorwf		BrFtD,0
			btfsc		Status,2
			call		OffFootLight
			goto		OffFoot
OffFootClDr	movf		BrSync,W
			xorwf		BrFt,0
			btfsc		Status,2
			call		OffFootLight
OffFoot



; Індикац.режиму реакції на відкр.двері
;;			btfss		Bits,6
;;			goto		ShowAutoMd
;;			
;;			btfss		PortB,7
;;			goto		ShSlMnOn
;;			bcf			PortB,7
;;			goto		ShSlMnEnd
;;ShSlMnOn	bsf			PortB,7
;;ShSlMnEnd
;;			goto		EndIndAuto
;;ShowAutoMd	btfsc		BitsFlash,0
;;			goto		SetAutoOn
;;			bcf			PortB,7
;;			goto		EndIndAuto
;;SetAutoOn	bsf			PortB,7
;;EndIndAuto


;Генератор часових міток
;			incf		TicL
;			movf		TicL,W
;			xorlw		b'11111111'
;			btfsc		Status,2
;;			incf		TicM
;;
;;			movf		TicM,W
;;			xorlw		b'01111111' ; Дільник коротких міток
;;			btfsc		Status,2
;;			call		Interval_01s
;;
;;			movf		TicH,W
;;			xorlw		b'01010000'	; Дільник довгих міток
;;			btfsc		Status,2	
;;			call		Interval_1s

;-----------------------------------------------------------------------------------------------
            goto        Start       ; Перехід на новий цикл програми.


;-----------------------------------------------------------------------------------------------
; Процедури
;-----------------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------------
; довгі мітки
Interval_1s
			clrf		TicH		; Очищуємо лічильник
; Кнопка Dimm	
			btfsc		PortB,3
			goto		WrkDimmBt
			btfsc		PortA,4
			goto		DoorClosedDimm
			movf		BrFtD,w
			addlw		d'32'
			movwf		BrFtD
			goto		WrkDimmBt
DoorClosedDimm
			btfss		Bits,6
			goto		SalLtOffDimm
			movf		BrS,w
			addlw		d'32'
			movwf		BrS
			goto		WrkDimmBt
SalLtOffDimm
			movf		BrFt,w
			addlw		d'32'
			movwf		BrFt
WrkDimmBt			
; Кнопка Color	
			btfsc		PortB,2
			goto		WrkColorBt
			btfsc		PortA,4
			goto		DoorClosedColor
			incf		ColFtD
			movf		ColFtD,W
			xorlw		b'00000111'
			btfsc		Status,2
			clrf		ColFtD
			goto		WrkColorBt
DoorClosedColor
			btfss		Bits,6
			goto		SalLtOffColor
			incf		ColS
			movf		ColS,W
			xorlw		b'00000111'
			btfsc		Status,2
			clrf		ColS
			goto		WrkColorBt
SalLtOffColor
			incf		ColFt
			movf		ColFt,W
			xorlw		b'00000111'
			btfsc		Status,2
			clrf		ColFt
WrkColorBt

			btfsc		PortA,4
			goto		DrTmDrCl
			movf		DrTm,W
			xorlw		b'11111111'
			btfss		Status,2
			incf		DrTm
			goto		DrTmEndWrk
DrTmDrCl	clrf		DrTm
DrTmEndWrk			

			movf		SlTm,W
			xorlw		b'00001111'
			btfss		Status,2
			incf		SlTm

			movf		FlashTm,W
			xorlw		b'00001011'
			btfss		Status,2
			incf		FlashTm
			movf		FlashTm,W
			xorlw		b'00001011'
			btfsc		Status,2
			bsf			Bits,0

EndProc1s	return
;-----------------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------------
; короткі мітки
Interval_01s
			incf		TicH
			clrf		TicM

			incf		TmSBH

;...........опорна яскравість дверей
			btfss		Bits,2
			goto		DrDimmOff
			movf		DoorBr,W
			xorlw		b'11111111'
			btfss		Status,2
			incf		DoorBr
			goto		ChDoorBr
DrDimmOff	movf		DoorBr,W
			xorlw		b'00000000'
			btfss		Status,2
			decf		DoorBr
ChDoorBr
;...........опорна яскравість салону
			btfsc		Bits,6
			goto		SlDimmOn
			btfsc		Bits,3
			goto		SlDimmOn
			movf		SalBr,W
			xorlw		b'00000000'
			btfss		Status,2
			decf		SalBr
			goto		ChSalBr
SlDimmOn	movf		SalBr,W
			xorlw		b'11111111'
			btfss		Status,2
			incf		SalBr
ChSalBr

EndProc01s	return
;-----------------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------------
; читаня памяті
ReadFLASH
			movlw		h'10'
			movwf		EEADR
			call		EE_Get
			movwf		ColFtD

			movlw		h'11'
			movwf		EEADR
			call		EE_Get
			movwf		ColFt

			movlw		h'12'
			movwf		EEADR
			call		EE_Get
			movwf		ColS

			movlw		h'13'
			movwf		EEADR
			call		EE_Get
			movwf		BrFtD

			movlw		h'14'
			movwf		EEADR
			call		EE_Get
			movwf		BrFt

			movlw		h'15'
			movwf		EEADR
			call		EE_Get
			movwf		BrS

			movlw		h'16'
			movwf		EEADR
			call		EE_Get
			movwf		BitsFlash

;			clrf		ColFtD
;			clrf		ColFt
;			clrf		ColS
;			clrf		BrFtD
;			clrf		BrFt
;			clrf		BrS
			return
;-----------------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------------
; запис памяті
WriteFLASH
			bcf			IntCon,7

			movf		ColFtD,w
			movwf		EEDATA
			movlw		h'10'
			movwf		EEADR
			call		EE_Put
			
			movf		ColFt,w
			movwf		EEDATA
			movlw		h'11'
			movwf		EEADR
			call		EE_Put

			movf		ColS,w
			movwf		EEDATA
			movlw		h'12'
			movwf		EEADR
			call		EE_Put
			
			movf		BrFtD,w
			movwf		EEDATA
			movlw		h'13'
			movwf		EEADR
			call		EE_Put
			
			movf		BrFt,w
			movwf		EEDATA
			movlw		h'14'
			movwf		EEADR
			call		EE_Put
			
			movf		BrS,w
			movwf		EEDATA
			movlw		h'15'
			movwf		EEADR
			call		EE_Put

			movf		BitsFlash,w
			movwf		EEDATA
			movlw		h'16'
			movwf		EEADR
			call		EE_Put

			bsf			IntCon,7

			return
;-----------------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------------
; Гасимо світло в салоні
OffSalonLight
			bcf			PortA,1
			bcf			PortA,2
			bcf			PortA,3
			return
;-----------------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------------
; Гасимо світло педалей
OffFootLight
			bcf			PortB,4
			bcf			PortB,5
			bcf			PortB,6
			return
;-----------------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------------
; Витягуємо данні із FLASH
EE_Get
			bsf			Status,5
			movlw		b'00000001'
			movwf		EECON1
			bcf			Status,5
			movf		EEDATA,w
			return
;-----------------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------------
; Заганяєм данні у FLASH
EE_Put
			bsf			Status,5
			bcf			Status,6
			bsf			EECON1,2

			movlw		h'55'
			movwf		EECON2			
			movlw		h'AA'
			movwf		EECON2			

			bsf			EECON1,1
			bcf			EECON1,2
EE_EXIT		btfsc		EECON1,1
			goto		EE_EXIT
			bcf			Status,5
			return

;-----------------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------------
Int
;			bcf			IntCon,7
			movwf		W_temp
			movfw		Status
			movwf		Status_temp
			movfw		Fsr
			movwf		Fsr_temp
			bcf			IntCon,2



;==================================================
			incf		TicH

;			movf		TicM,W
;			xorlw		b'01111111' ; Дільник коротких міток
;			btfsc		Status,2
			call		Interval_01s

			movf		TicH,W
			xorlw		b'01010000'	; Дільник довгих міток
			btfsc		Status,2	
			call		Interval_1s





			btfss		Bits,6
			goto		ShowAutoMd
			
			btfss		PortB,7
			goto		ShSlMnOn
			bcf			PortB,7
			goto		ShSlMnEnd
ShSlMnOn	bsf			PortB,7
ShSlMnEnd
			goto		EndIndAuto
ShowAutoMd	btfsc		BitsFlash,0
			goto		SetAutoOn
			bcf			PortB,7
			goto		EndIndAuto
SetAutoOn	bsf			PortB,7
EndIndAuto
;==================================================


			movfw		Status_temp
			movwf		Status
			movfw		Fsr_temp
			movwf		Fsr
			movfw		W_temp
			retfie
;***********************************************************************************************                        
            end                     ; Кінець.                              
