;//------------ --------------- ------------------------------ -
; 8 mS
IntKBD
; четене на текущото състояние
                clrf            KeyReadPins
                movFWF          Usr_IRQ_TEMP_00,PORTA
                bcf             Usr_IRQ_TEMP_00,5
                bsf             Usr_IRQ_TEMP_00,6
                bsf             Usr_IRQ_TEMP_00,7
                movFWF          PORTA,Usr_IRQ_TEMP_00
; група 1
                btfss           _kbInp0
                bsf             KeyReadPins,0
                btfss           _kbInp1
                bsf             KeyReadPins,1
                btfss           _kbInp2
                bsf             KeyReadPins,2
                btfss           _kbInp3
                bsf             KeyReadPins,3
                movf            KeyReadPins,F
                bsf             KeyReadPins,4
                btfss           _Z
                goto            IntKBD_Get_E	; ако има натиснат от група 1
; група 2
                clrf            KeyReadPins
                bsf             Usr_IRQ_TEMP_00,5
                bcf             Usr_IRQ_TEMP_00,6
                bsf             Usr_IRQ_TEMP_00,7
                movFWF          PORTA,Usr_IRQ_TEMP_00
                btfss           _kbInp0
                bsf             KeyReadPins,0
                btfss           _kbInp1
                bsf             KeyReadPins,1
                btfss           _kbInp2
                bsf             KeyReadPins,2
                btfss           _kbInp3
                bsf             KeyReadPins,3
                movf            KeyReadPins,F
                bsf             KeyReadPins,5
                btfss           _Z
                goto            IntKBD_Get_E	; ако има натиснат от група 2
; група 3
                clrf            KeyReadPins
                bsf             Usr_IRQ_TEMP_00,5
                bsf             Usr_IRQ_TEMP_00,6
                bcf             Usr_IRQ_TEMP_00,7
                movFWF          PORTA,Usr_IRQ_TEMP_00
                btfss           _kbInp0
                bsf             KeyReadPins,0
                btfss           _kbInp1
                bsf             KeyReadPins,1
                btfss           _kbInp2
                bsf             KeyReadPins,2
                btfss           _kbInp3
                bsf             KeyReadPins,3
                movf            KeyReadPins,F
                bsf             KeyReadPins,6
                btfss           _Z
                goto            IntKBD_Get_E	; ако има натиснат от група 3
                clrf            KeyReadPins     ; ако няма натиснат
                clrf            KeyReadOld
IntKBD_Get_E
                bsf             Usr_IRQ_TEMP_00,5
                bsf             Usr_IRQ_TEMP_00,6
                bsf             Usr_IRQ_TEMP_00,7
                movFWF          PORTA,Usr_IRQ_TEMP_00
                movf            KeyReadPins,W
                btfsc           _Z
                goto            IntKb_Copy		; ако няма натизнат бутон: KRAЙ
; Тук вече знаем, че има натиснат бутон
; Проверка дали до сега е имало натиснат бутон
                movf            KeyReadOld,W
                btfsc           _Z
                goto            IntKb_Ch		; Ако не е имало натиснат до сега
; Ако е имало натиснат бутон - сравнява стария и новия
                xorwf           KeyReadPins,W	
                btfss           _Z              ; скип, ако са еднакви 
                goto            IntKb_Ch		; ако са различни - нов натиснат бутон
; Ако са еднакви: 1) проверяваме дали бутонът е задържан за първо натискане
IntKb_Press_or_Repete
                movf            KeyTimePress,W
                btfsc           _Z              ; скип, ако още не е дочакал първо натискане
                goto            IntKb_Repete    ; вече е устанпвено натискане - ще проверява за повторение
IntKb_Press
                decfsz          KeyTimePress,F
                goto            IntKb_End
                movlw           125             ; ~500mS
                goto            IntKb_SetKey
; Проверка за повторение (Repete)
IntKb_Repete
                decfsz          KeyTimeRepete,F
                goto            IntKb_End
                movlw           25              ; ~100ms
IntKb_SetKey
                movwf           KeyTimeRepete
                movFWF          KeyPress,KeyReadPins
                bsf             fl_KBD			; натиснат бутон (от Repete)
                FlashHalt	    ; принудително спиране на мигане на поле на индикацията и LEDs(при натискане на бутон или завъртане на енкодера)
                goto            IntKb_End
IntKb_Ch
; ако преди не е имало, а сега има натиснат бутон
; ново състояние                
                movFWL          KeyTimePress,.20  ; 4*20mS
                clrf            KeyTimeRepete
IntKb_Copy
                movFWF          KeyReadOld,KeyReadPins	; копира текущото състояние в старото състояние
IntKb_End
;//------------ --------------- --------------- ------- -
