Example by Bruce
7-Aug-2010
PIC16F690
@ __CONFIG _FCMEN_OFF & _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_OFF & _CP_OFF & _IESO_OFF & _BOR_OFF & _PWRTE_OFF DEFINE OSC 8 DEFINE NO_CLRWDT 1 ' PBP doesn't clear WDT automatically LED VAR PORTA.4 ' LED on RA4 LED = 0 ' LED off at POR PORTA = 0 PORTB = 0 TRISB = %01110000 ' RB6/RB5 SW1/SW2 switch inputs, RB4 input TRISA = %00000100 ' RA2 SW3 switch input SW1 VAR PORTB.6 ' Alias switch input pins SW2 VAR PORTB.5 SW3 VAR PORTA.2 IOC_FLAG VAR INTCON.0 ' Alias RABIF interrupt flag bit SwitchVal VAR BYTE ' Holds value of all switches Mode VAR BYTE ' Holds current mode GP VAR BYTE ' GP var BlinkTime VAR BYTE ' Blink LED this number of times S1 CON %00000110 ' Value when SW1 is pressed S2 CON %00000101 ' SW2 pressed S3 CON %00000011 ' SW3 pressed ANSEL = 0 ' A/D disabled ANSELH = 0 CM1CON0 = 0 ' Comparators disabled CM2CON0 = 0 OPTION_REG.7 = 0 ' enable weak pullups WPUA = %00000100 ' weak pullups on RA2 WPUB = %01100000 ' weak pullups on RB5 & RB6 OSCCON = %01110000 ' 8MHz internal osc ' Setup individual IOC bits for pins used IOCA = %00000100 ' RA2 int-on-change enabled IOCB = %01100000 ' RB6 and RB5 int-on-change enabled Mode = 0 INCLUDE "DT_INTS-14.bas" ' Base Interrupt System INCLUDE "ReEnterPBP.bas" ' Include if using PBP interrupts ASM INT_LIST macro ; IntSource, Label, Type, ResetFlag? INT_Handler RABC_INT, _Switch_Interrupt, PBP, no endm INT_CREATE ; Creates the interrupt processor ENDASM GOSUB Switch ' Check switches before enabling IOC @ INT_ENABLE RABC_INT ; Enable 'Int On Change' interrupts Main: IF IOC_FLAG THEN ' Has a switch been pressed? GOSUB Switch ' Yes. Wait for it to be released GOTO Process ' Then process switch ENDIF GOTO Main ' Else loop to Main until switch-press Process: ' Get current mode SELECT CASE SwitchVal CASE S1 Mode = 1 ' SW1 pressed CASE S2 Mode = 2 ' SW2 pressed CASE S3 Mode = 3 ' SW3 pressed CASE ELSE Mode = 0 ' Non-supported switch pattern END SELECT ' Get BlinkTime for LED to show current mode SELECT CASE Mode CASE 0 BlinkTime = 0 CASE 1 BlinkTime = 1 CASE 2 BlinkTime = 2 CASE 3 BlinkTime = 3 END SELECT Blink: IF BlinkTime != 0 Then FOR GP = 1 TO BlinkTime HIGH LED PAUSE 250 LOW LED PAUSE 250 NEXT ENDIF GOSUB Switch ' Check for a switch being held down before enabling IOC ' Re-enable interrupts after previous switch has been processed @ INT_ENABLE RABC_INT GOTO Main ' Loop forever Switch: ' Wait for all switches up WHILE SW1 = 0 : WEND ' Wait until all switch inputs = 1 WHILE SW2 = 0 : WEND ' and read ports to clear mismatch WHILE SW3 = 0 : WEND IOC_FLAG = 0 ' Clear the int-on-change flag bit RETURN ' Return Switch_Interrupt: SwitchVal = 0 ' Clear previous switch state SwitchVal.0 = SW1 ' Get new switch states SwitchVal.1 = SW2 SwitchVal.2 = SW3 @ INT_DISABLE RABC_INT ' Disable further IOC interrupts @ INT_RETURN ' until switch has been processed END
Page last modified on March 08, 2018, at 11:24 PM