a bit fancier
Code:#CONFIGcfg = _INTRC_OSC_NOCLKOUT cfg&= _WDT_ON cfg&= _PWRTE_OFF cfg&= _MCLRE_ON cfg&= _BODEN_ON cfg&= _CP_OFF cfg&= _CPD_OFF __CONFIG cfg #ENDCONFIG DEFINE INTHAND _TICK DEFINE DEBUG_REG GPIO DEFINE DEBUG_BIT 2 DEFINE DEBUG_BAUD 9600 DEFINE DEBUG_MODE 0 CMCON = 7 TRISIO = 111001 INTCON = $C0 PIE1.0 = 1 ANSEL = 110001 CLEAR ' Constante TimerReload CON 61637 ;3.906mS ' Variabile W_TEMP VAR BYTE BANK0 STATUS_TEMP VAR BYTE BANK0 MILLIES var word BANK0 b_level var byte b_state var byte NOW var word LEDT var word buttont var word duration var word DataW var word GPIO.2 = 0 ADCON0 = 000001 T1CON = 000001 'Prescaler 1:1,Timer1 ON Main: PIE1.0 = 0 NOW = MILLIES ;in 3.906mS ticks PIE1.0 = 1 IF NOW - LEDT > 250 THEN ;1 sec LEDT = NOW TOGGLE GPIO.1 ENDIF ADCON0.1 = 1 While ADCON0.1 = 1 : Wend DataW.HighByte = ADRESH DataW.LowByte = ADRESL if DataW < 805 then if DataW > 50 AND DataW < 160 THEN b_level = 1 if DataW > 180 AND DataW < 270 THEN b_level = 2 if DataW > 290 AND DataW < 380 THEN b_level = 3 if DataW > 400 AND DataW < 520 THEN b_level = 4 if DataW > 540 AND DataW < 650 THEN b_level = 5 if DataW > 690 AND DataW < 800 THEN b_level = 6 if b_state == 0 then b_state = 1 buttont = now else DEBUG "button ",#b_level, 13, 10 endif ELSE if b_state then ' duration = (now - buttont)<<2 duration = now - buttont buttont = duration.lowbyte */1000 b_state = 0 DEBUG "Pressed button ",#b_level," for : ", #duration.highbyte,".",#buttont, " S", 13, 10 ' DEBUG "Pressed button ",#b_level," for : ", #duration, "mS", 13, 10 b_level = 0 endif endif GOTO Main TICK: ;isr asm MOVWF _W_TEMP ;copy W to temp register,could be in either bank SWAPF STATUS,W ;swap status to be saved into W BCF STATUS,RP0 ;change to bank 0 regardless of current bank MOVWF _STATUS_TEMP MOVE?CT 0, T1CON, TMR1ON ; stop timer MOVLW LOW(_TimerReload) ; Add TimerReload ADDWF TMR1L,F BTFSC STATUS,C INCF TMR1H,F MOVLW HIGH(_TimerReload) ADDWF TMR1H,F MOVE?CT 1, T1CON, TMR1ON ; start timer MOVE?CT 0, PIR1, TMR1IF ; CLR timer FLAG INCF _MILLIES ,F BTFSC STATUS,Z INCF _MILLIES+1 ,F SWAPF _STATUS_TEMP,W;swap STATUS_TEMP register int W, sets bank to original state MOVWF STATUS ;move W into STATUS register SWAPF _W_TEMP,F ;swap W_TEMP SWAPF _W_TEMP,W ;swap W_TEMP into W RETFIE endASM




Bookmarks