;*********************************************************************
;
;	4 bit KEY
;
;	uPD78F0501 KB2
;
;
; 4 линий ввода  4 bit.
;
;--------------
; (KeyS_Data)  переменная
; 7 bit - факт  нажатия кнопки.
; 6 bit - LONG1 удержание нажатой кнопки.
; 5 bit - LONG2 удержание нажатой кнопки.
; 4 бит - Кнопка нажата/отжата.
; 3 бит -\
; 2 бит -|
; 1 бит -| code KEY
; 0 бит -/
;--------------
; (KeyS_Cnt_Long_Press) - Счётчик длительности нажатия кнопок.   
; (KeyS_Cmp)            - Кол-во  сравнений состояний кнопок.
; (KeyS_Tmp)		- 
;*********************************************************************
#define   Key_Port_in       P2		; Порт ввода
;*********************************************************************
Const_Long1_Press:	EQU     50	; 
Const_Long2_Press:	EQU    100	; 
;==========================================================
; Определение состояний 4 линий ввода
; Устранение ложных состояний (дребезг) 4 линий ввода
; (4 кратная проверка)
;
Line_scan:
;
      CALL    _delay_scan_line
;
	MOV	X,#00001111B		; 
        MOV     A,Key_Port_in
        AND     A,#00001100B		;#00001111B
	OR	A,#00000011B
	XCH	A,X
;
	SUB	A,X
;
        CMP     A,#0			;
        BNZ     _line_detect
;
        MOV     (KeyS_Cmp),#0
;--
; Сбрасываем 4бит - Кнопка нажата/отжата
	CLR1    (KeyS_Data).4
;--
	MOV	(KeyS_Cnt_Long_Press),#0 ;Счётчик длительности нажатия кнопок.
        BR      _line_no_detect
;------------
_line_detect:
;
        CMP     A,(KeyS_Tmp)
        BZ      _no_line_error_detect1
	BR	_line_error_detect
;
_no_line_error_detect1
;
        INC     (KeyS_Cmp)
        CMP     (KeyS_Cmp),#4		; Кол-во сравнений состояний кнопок.
        BZ      _no_line_error_detect2
	BR	_line_error_detect
;
_no_line_error_detect2
;--------
	BT	(KeyS_Data).4,_bip_pez
	CALL	Biper_pezo
;****************************************
	BF	(KeyS_Data).5,_bip_pez
	MOVW	(Cnt_Prog_off),#Const_Cnt_Prog_off
;****************************************
_bip_pez:
;
        MOV     (KeyS_Cmp),#0
	SET1	A.7			; Устанавливаем 7бит - факт нажатия кнопки
	SET1	A.4			; Устанавливаем 4бит - Кнопка нажата/отжата
	MOV	X,A
	MOV	A,(KeyS_Data)
	AND	A,#11110000B
	OR	A,X
        MOV     (KeyS_Data),A		; Достоверные данные 4 линий ввода.
;----------------------------------------
	CMP	A,#0x94			; 0x94 - Код Кнопки KEY4
	BZ	_Long_Key
;-
	CMP	A,#0x98			; 0x98 - Код Кнопки KEY5
	BZ	_Long_Key
;------------------------
	CMP	A,#0xD4			; 0xD4 - Код Кнопки KEY4
	BZ	_Long_Key
;-
	CMP	A,#0xD8			; 0xD8 - Код Кнопки KEY5
	BZ	_Long_Key
;------------------------
	CMP	A,#0xF4			; 0xF4 - Код Кнопки KEY4
	BZ	_Long_Key
;-
	CMP	A,#0xF8			; 0xF8 - Код Кнопки KEY5
	BZ	_Long_Key
;-
	CMP	A,#0xFC			; 0xFC - Код Кнопки KEY5+KEY4
	BZ	_Long_Key
;
	CMP	A,#0xDC			; 0xdC - Код Кнопки KEY5+KEY4
	BZ	_Long_Key
;
	CMP	A,#0xBC			; 0xbC - Код Кнопки KEY5+KEY4
	BZ	_Long_Key
;
	CMP	A,#0x9C			; 0x9C - Код Кнопки KEY5+KEY4
	BZ	_Long_Key
;------------------------
	CMP	A,#0xB4			; 0xB4 - Код Кнопки KEY4
	BZ	_Long_Key
;-
	CMP	A,#0xB8			; 0xB8 - Код Кнопки KEY5
	BZ	_Long_Key
;------------------------
	BR	_no_Long_Press
_Long_Key:
;
	INC	(KeyS_Cnt_Long_Press)
	CMP	(KeyS_Cnt_Long_Press),#Const_Long1_Press ; Длительность Long1 нажатие кнопок.
	BNZ	_no_Long1_Press
;-
	SET1	(KeyS_Data).6				 ; Устанавливаем 6бит - LONG1 нажатие кнопки.
;
	CALL	Biper_pezo1		;
;---------------
_no_Long1_Press:
;
	CMP	A,#0xFC			; 0xFC - Код Кнопки KEY5+KEY4
	BZ	_Long2_Press
	CMP	A,#0xDC			; 0xDC - Код Кнопки KEY5+KEY4
	BZ	_Long2_Press
	BR	_no_Long2_Press
;
_Long2_Press:
;
	CMP	(KeyS_Cnt_Long_Press),#Const_Long2_Press ; Длительность Long2 нажатие кнопок.
	BNZ	_no_Long2_Press
;-
	PUSH	AX
	MOV	A,(KeyS_Data)
	XOR	A,#00100000B
	MOV	(KeyS_Data),A		 		; Инверсия 5бит - LONG2 нажатие кнопки.
	POP	AX
;
	CLR1	(KeyS_Data).6
;
	CALL	Biper_pezo2		;
;
;---------------
_no_Long_Press:
_no_Long2_Press:
;------------------
_line_error_detect:
        MOV     (KeyS_Tmp),A
;---------------
_line_no_detect:
;
        RET
;-----------------------------------------
;
_delay_scan_line:
;
        PUSH    AX
        mov     A,#5		  
_del:
        DEC     A
        BNZ     _del
;
        POP     AX
;
        RET
;
;==========================================================
;//////////////////////////////////////////////////////////