	 list      p=PIC16F628A
     #include  P16F628A.inc ;	; 4.000 MHz
	__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON& _XT_OSC  &_LVP_OFF&_MCLRE_OFF
	errorlevel -302
;	
	CBLOCK 0x20
	kb1
	kb		;резултата от клавиатурата след премахване на трептенето на контакта
	cnt		;брояч на поредния изход
	next_CCP:2	;променлива за следващия цикъл на CCP
	endc

	org 0x0000
start 
	nop 
	goto main
	nop


main
	bcf		STATUS, RP1
	bsf	  	 STATUS, RP0
	movlw		b'11111101'
	movwf		TRISA
	movlw		b'11111111'
	movwf		TRISB		;всички като входове заради клавиатурата
	movlw		b'00100111'	; Предделитель 1:256, включение резисторов
			;TMR0 от външен източник
	movwf		OPTION_REG
	bcf		STATUS, RP0
	movlw   	b'00000111'
    	movwf   	CMCON        ; компараторите - изключени
	movlw 		b'00001010'		;compare mode,CCP1IF - set, no output
	movwf		CCP1CON
	movlw 		b'00000000'		;без прескалер, internal clock = 1MHz
	movwf		T1CON	
	
	movlw		0x0c		;подготовка за СИ
	movwf		next_CCP
	movlw		0xc0
	movwf		next_CCP+1
	bcf		PIR1,CCP1IF	;изключваме евентуално сработване на CCP1

main_loop
Si_Start		;стартиране на синхро импулс 0xCC0	3.264 mS
	movf		next_CCP,w
	movwf		CCPR1H
	movf		next_CCP+1,w
	movwf		CCPR1L

	bsf		T1CON,TMR1ON	;старт на TMR1

	movf		PORTB,w
	movwf		kb1		;запазваме състоянието на клавиатурата 

	movlw		0xc0		;подготовка за СП
	addwf		next_CCP+1,f
	btfsc		STATUS,C	;ако има пренос
	incf		next_CCP,f
	movlw		0x0a		;подготовка за СП
	addwf		next_CCP,f

si_loop
	btfss		PIR1,CCP1IF
	goto		si_loop
	bcf		PIR1,CCP1IF	;подготвяме за следвашо сработване на CCP1
	movlw		0x02
	xorwf		PORTA,f	;превключване на изхода

	movf		next_CCP,w
	movwf		CCPR1H
	movf		next_CCP+1,w
	movwf		CCPR1L
	
	comf		PORTB,w
	andwf		kb1,w
	xorwf		kb1,w		;клавиатурата 
	movwf		kb	;тук се съдържа информация за натиснати бутони
	
	movlw		0xc0		;подготовка за първия изход
	addwf		next_CCP+1,f
	btfsc		STATUS,C	;ако има пренос
	incf		next_CCP,f
	movlw		0x02		;подготовка за първия изход
	addwf		next_CCP,f

	bcf		STATUS,C
	rrf		kb,f
	btfsc		STATUS,C
	incf		next_CCP,f	;ако е натиснат клавиш увеличаваме
	btfsc		STATUS,C
	incf		next_CCP,f	;ако е натиснат клавиш увеличаваме
	clrf		cnt	;нулиране на брояча
sp_loop
	btfss		PIR1,CCP1IF
	goto		sp_loop
	bcf		PIR1,CCP1IF	;подготвяме за следвашо сработване на CCP1
	movlw		0x02
	xorwf		PORTA,f	;превключване на изхода
data_loop
	movf		next_CCP,w
	movwf		CCPR1H
	movf		next_CCP+1,w
	movwf		CCPR1L

	
	movlw		0xc0		;подготовка за следващ изход
	addwf		next_CCP+1,f
	btfsc		STATUS,C	;ако има пренос
	incf		next_CCP,f
	
	movlw		0x07
	xorwf		cnt,w		;ако cnt е 7 
	movlw		0x02		;подготовка за следващ изход
	btfsc		STATUS,Z	;
	movlw		0x0c		;подготовка за  СИ
	addwf		next_CCP,f

	bcf		STATUS,C
	rrf		kb,f
	btfsc		STATUS,C
	incf		next_CCP,f	;ако е натиснат клавиш увеличаваме
	btfsc		STATUS,C
	incf		next_CCP,f	;ако е натиснат клавиш увеличаваме
out_loop
	btfss		PIR1,CCP1IF
	goto		out_loop
	bcf		PIR1,CCP1IF	;подготвяме за следвашо сработване на CCP1
	movlw		0x02
	xorwf		PORTA,f	;превключване на изхода

	incf		cnt,f
	btfss		cnt,3
	goto		data_loop
	goto		Si_Start

;EEPROM данни
	ORG 0X2100

	end