
#define	AddrDevice	0x7322
;=====================================;
;  	   	CODER 		      ;
;=====================================;

	LIST p=10F204
        __config b'00100'
	include <p10f204.inc>

;=======================================================================
#define		TimeSync		0xBB		; 0.008 * 187 = 1.5 ms 
#define		TimeOutSet		0x32		; 0.4 ms	
#define		TimeOutClear		0x64		; 0.8 ms

#define		LED_ON_OFF		d'4'

#define		TRIS_CODER		b'111011'
;=======================================================================
#define		BUS		GPIO, 2

;=======================================================================
DataBus		equ 0x10
Counter		equ 0x11
Key		equ 0x12
Led		equ 0x13
TmpOption	equ 0x14

	org 0x00
;=======================================================================
Start:
	andlw	0xFE
	movwf   OSCCAL          ; update register with factory cal value

   	movlw	b'01000010'	; d = 0.008 us
	OPTION

   	movlw	TRIS_CODER
	TRIS	GPIO

	movlw	0x00
	movwf	CMCON0

	clrf	GPIO
	movlw	d'50'
	call	Delay
	clrf	Led

;========================================================
;  Main CODER
;========================================================
Main:	clrwdt

   	movlw	b'00000010'	;  включили подтяжки
	OPTION
	nop			; пауза после включения подтяжек
	nop			; перед опросом клавиатуры
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop

	clrw
	btfss	GPIO, 0         ; кнопка 1
	iorlw	0x02		;

	btfss	GPIO, 1		; кнопка 2
	iorlw	0x04		; 
	movwf	Key

	incf	Led,f
	movlw	LED_ON_OFF
	xorwf	Led, w
	skpnz
	clrf	Led

	movlw	LED_ON_OFF / d'2'
	subwf	Led, w
	bc	LedOn
LedOff:
   	movlw	b'01000010'	;  выключили подтяжки
	OPTION
	goto	LedEnd
LedOn:
   	movlw	b'00000010'	;  включили подтяжки
	OPTION

LedEnd:
	movfw	Key
	xorlw	0x06
	bnz	Send
	movlw	0x16
	movwf	Key
Send:
	; выход передатчика
	movfw	GPIO
	xorlw	0x04
	movwf	GPIO

	clrf	TMR0
WaitSync: 
	clrwdt

	movlw	TimeSync
	subwf	TMR0, w
	bnc	WaitSync

	movlw	HIGH(AddrDevice)
	movwf	DataBus
	call	SendByte

	movlw	LOW(AddrDevice)
	movwf	DataBus
	call	SendByte	

	movfw	Key
	movwf	DataBus
	call	SendByte	

	goto	Main

;========================================================
SendByte:
	movlw	d'8'
	movwf	Counter

SendNextBit:
	clrwdt
	movfw	GPIO
	xorlw	0x04
	movwf	GPIO

	clrf	TMR0
	rrf	DataBus, f
	btfss	STATUS, C
	goto	WaitClearData

WaitSetData:
	movlw	TimeOutSet
	subwf	TMR0, w
	bnc	WaitSetData
        goto	Wait

WaitClearData:
	movlw	TimeOutClear
	subwf	TMR0, w
	bnc	WaitClearData


Wait:	decfsz	Counter, f
	goto	SendNextBit

	retlw	0

;========================================================
Delay:	; Counter * 2 ms
	movwf	Counter

Dela0:	movlw	d'5'		
	movwf	TMR0
	clrwdt
Dela:	movfw	TMR0
	bnz	Dela
	decfsz	Counter, f
	goto	Dela0
	movlw	(TimeSync * d'125' / d'100') + 5
	movwf	TMR0

	retlw	0

;========================================================
	org	0x100
	nop
	end

