@Mr.Richard : Tried to figure out how your soft work ... But in Proteus nothing happens.
I do something wrong ? I "addapted" the "elseif" command, since is not present in PBP 2.6 (?).
Thanks in advance for support !
Code:
;pic12f683

DEFINE OSC  8
include "dt_ints-14.bas"
include "REENTERPBP.bas"

@timer1 =TMR1L
wsave   VAR BYTE    $20     SYSTEM      ' location for W if in bank0
wsave1  VAR BYTE    $A0     SYSTEM      ' location for W if in bank1

ASM
INT_LIST  macro    ; IntSource,        Label,           Type,   ResetFlag?
        INT_Handler   TMR1_INT,   _chk_sw,      PBP,  yes
     endm
    INT_CREATE      
ENDASM     

long_press_threshold   con 200   ;1 sec       200*5( time const)=1000mS
short_press_threshold  con 5 
btn_tol                con 25   ;ADC READING TOLORACE
number_of_buttons      con 3    ;MAX 7       
;4K7 TO 5V                                         
'                               3k3            /  
'                         ___  /\  /\  /\  ___/ ^____ btn1
'                        |   \/  \/  \/  \/          |
'   5v     4k7           |       2k2           /     |
'    ___  /\  /\  /\  ___!___  /\  /\  /\  ___/ ^____!btn2
'       \/  \/  \/  \/   |   \/  \/  \/  \/          |
'                        |       1k            /     |
'    ____________________!___  /\  /\  /\  ___/ ^____!btn3
'    an3  gpio4              \/  \/  \/  \/          |
'                                                    |
'    ________________________________________________! 
'    gnd                                             |
'    ___________|\|__led_____________________________|
'    gpio2      |/|

OSCCON=$70
CMCON0    = 7
TRISIO   = %111011
ANSEL    = %01011000        ;fosc/16 ,an3
btn_adc var word[number_of_buttons]
b_cnt   var byte[number_of_buttons]
b_state var byte[number_of_buttons]     ;0 not pressed ,1 short ,2 long
button_index  var byte      ;which button
led           var gpio.2    ;led
btn_flg       var byte 
abp           var BIT  
adcr          var WORD 	    ;adc reading
timer1        VAR WORD EXT
tmp           var word     
FLASH_ON      VAR WORD      ;led
FLASH_OFF     VAR WORD      ;led
FLASH_DUTY    VAR WORD      ;led
led = 0 
clear

btn_adc[0]=209           ;adc read for buttons
btn_adc[1]=327           ;adc read for buttons
btn_adc[2]=422           ;adc read for buttons

timer1=55543             ;5mS  time const
T1CON=1
@ INT_ENABLE  TMR1_INT

FLASH_OFF=200
FLASH_On=0
ADCON0 = %10001101     ;warm up the adc  ,right shift   ,an3
ADCON0.1 = 1            ' Start a conversion

Main:
   Pause 5   ;loop time const  
    IF ABP THEN 
       button_index= 0
       tmp=20
      
       while abp     
           if  B_STATE[button_index]=2 then
               FLASH_OFF= tmp
               abp=0
               led=0
               FLASH_DUTY=0
           else 
               if   B_STATE[button_index]=1 then
               FLASH_On=tmp
               abp=0
               led=0
               FLASH_DUTY=0   
               endif
           endif
           tmp=tmp+100
           B_STATE[button_index]=0
           button_index=button_index+1
           if  button_index= number_of_buttons then abp=0  ;clr error  if req 
        wend          
    ENDIF  
     IF  FLASH_ON THEN
       IF FLASH_DUTY=0 THEN
       led = ! LED     ; flash led
        	IF LED THEN
         	FLASH_DUTY = FLASH_ON
        	ELSE
         	FLASH_DUTY = FLASH_OFF
        	ENDIF
       ELSE
       FLASH_DUTY=FLASH_DUTY-1
       ENDIF       
     ENDIF        
    
Goto Main     
   
chk_sw:
    T1CON.0=0
    timer1=timer1+55543 
    T1CON.0=1
    ;ADCON0 = %10001101 ; NO NEED since ch never changes and ADC is left ON 
    ;Pauseus 50		'  aqusition  time  if req
    ;ADCON0.1 = 1		' Start conversion
    ;While ADCON0.1=1:Wend	' Wait for conversion
    adcr.HighByte = ADRESH	' Read variable from ADC 
    adcr.LowByte  = ADRESL
    FOR button_index = 0 TO 2
          if ! B_STATE[button_index] then
              IF    abs (adcr- btn_adc[button_index] )< btn_tol  then
                   if  btn_flg.0[button_index]  THEN
                        IF b_cnt[button_index] < 250 THEN  b_cnt[button_index]=b_cnt[button_index]+1   
                        ELSE   ;FIRST PRESS  FOR  THIS BUTTON 
                        b_cnt[button_index]=0
                        btn_flg.0[button_index]=1
                        ENDIF            
                   ELSE
                   IF   btn_flg.0[button_index]  THEN    ;  HAD   THIS BUTTON  BEEN PRESSED  ?
                       IF   b_cnt[button_index] > long_press_threshold THEN                                           
                       B_STATE[button_index]=2
                       abp=1 
                       ELSE
                       IF   b_cnt[button_index] > short_press_threshold THEN  
                       B_STATE[button_index] =1
                       abp=1
                       ENDIF 
                   endif
                   btn_flg.0[button_index]=0   
              ENDIF
          ENDIF
          endif
    next 
    ADCON0.1 = 1     ' Start conversion  for next pass
@ INT_RETURN
Name:  TEST.jpg
Views: 7145
Size:  119.3 KB