Program for PIC 16F684 using PIC Basic Pro
'10-27-13 - IOC appears to be working --- needs more testing for ma draw
'10-16-13 PWN to P-Channel Mosfet connected to pin 5
include "modedefs.bas"
ansel=0 'use pins as digital rather than analog
define OSC 8 'use 8 mhz oscillator
OSCCON = $70 'set clock speed
cmcon0=7 'allows you to use pins as digital rather than analog
ansel=0
SerialOut var porta.0 'pin 13
LED7 var portc.0 'pin 10 ok 5 17
LED4 var portc.4 'pin 6 ok 3 44
LED3 var porta.4 'pin 3 ok 2 23
LED2 var porta.5 'pin 2 ok 1 32
LED1 var portc.3 'pin 7 ok 7 51
LED6 var portc.2 'pin 8 ok 6 66
LED5 var porta.1 'pin 12 ok 4 75
Trigger var porta.2 'pin 11
AllPWM var portc.5 'pin 5 PWM
SleepCounter var byte 'count times mode shown before sleep
MinMaxReptFlag var byte '0=temp, 1=min, 2=max- order of minmaxreport
y var word
Temp var byte
Temp2 var byte
ModeCount var byte
TPause con 300
BetweenPause con 300
PWMMax con 80
trisc = %00000000
trisa = %00000100
data @0,1 ' start /w brightdim
read 0, ModeCount 'read mode
serout SerialOut,n9600,[12,10,13,"Ver 16f684_v8-0-PWM-1SW-7-leds.bas ",10,13]
serout SerialOut,n9600,["(c) d. bodnar 10-27-13 - one switch- like helmet light",10,13]
gosub AllOff:
hpwm 1, PWMMax,0 'turn PWM full on - looks like it shoudl be off but NO
NewTop:
hpwm 1, PWMMax,0 'turn PWM full on - looks like it shoudl be off but NO
branch ModeCount, [PWMBrightdim, StarBurst, toptobottomtotopfast, all, corners, cornerscenter]
goto NewTop:
Changemode:
gosub AllOff
SleepCounter=0
serout SerialOut,n9600,["CMd",10,13]
low LED3
ModeCount=ModeCount+1:if ModeCount>5 then ModeCount=0
StayHere:
SleepCounter=SleepCounter+1 'count number of times reported
if SleepCounter >=6 then GoToSleep 'if held for 5 repeats goes to sleep
for y=1 to ModeCount+1 'flash mode
high LED3:pause 100:low LED3:pause 100
next y
pause 500
if Trigger=0 then StayHere: 'stay put till button released
serout SerialOut,n9600,["MD=",#modecount,10,13]
pause 300
write 0,ModeCount 'save current mode
goto newtop:
StarBurst:
SBpause con 200
serout 0,n9600,[10,13,"@StarBurst:",10,13]
gosub AllOff:pause 500
if Trigger = 0 then goto changemode
'for temp2 = 1 to 10
high LED4:pause SBpause
if Trigger = 0 then goto changemode
high LED3:high LED5:pause SBpause
if Trigger = 0 then goto changemode
high LED6:high LED7:high LED2:high LED1:pause SBpause
if Trigger = 0 then goto changemode
pause 500
if Trigger = 0 then goto changemode
pause 500
if Trigger = 0 then goto changemode
gosub AllOff
'next temp2
goto newtop
PWMBrightDim:
serout 0,n9600,[10,13,"@PWMBrightDim:",10,13]
high LED1:high LED2:high LED3:high LED4:high LED5:high LED6:high LED7
if Trigger = 0 then goto changemode
'for temp2 = 1 to 10
for Temp = PWMMax to 255 step 1
if Trigger = 0 then goto changemode
' serout serialout, n9600,["TEMP=",#temp,13,10]
hpwm 1, Temp , 2000
pauseus 1000
next Temp
for Temp = 255 to PWMMax step -1
if Trigger = 0 then goto changemode
' serout serialout, n9600,["TEMP=",#temp,13,10]
hpwm 1, Temp , 5500
pauseus 500
next Temp
if Trigger = 0 then goto changemode
pause 200
if Trigger = 0 then goto changemode
'next temp2
goto newtop
All: '(4)
if Trigger = 0 then goto changemode
serout SerialOut,n9600,["all",10,13]
if Trigger = 0 then goto changemode
'gosub alloff:
'for temp = 1 to 10
if Trigger = 0 then goto changemode
toggle LED1:toggle LED2:toggle LED3:toggle LED4:toggle LED5:toggle LED6:toggle LED7
if Trigger = 0 then goto changemode
pause 500
if Trigger = 0 then goto changemode
'next temp
goto newtop
Corners:
if Trigger = 0 then goto changemode
serout SerialOut,n9600,["Corners",10,13]
if Trigger = 0 then goto changemode
'for temp = 1 to 10
if Trigger = 0 then goto changemode
gosub AllOff:
if Trigger = 0 then goto changemode
high LED1:high LED2:
pause 500
if Trigger = 0 then goto changemode
low LED1:low LED2:
high LED6:high LED7:
pause 500
if Trigger = 0 then goto changemode
'next temp
goto newtop
TopToBottom:
if Trigger = 0 then goto changemode
serout SerialOut,n9600,["TopToBottom",10,13]
if Trigger = 0 then goto changemode
'for temp = 1 to 10
if Trigger = 0 then goto changemode
gosub AllOff:
if Trigger = 0 then goto changemode
pause 500
if Trigger = 0 then goto changemode
high LED1:high LED2:
pause 200
if Trigger = 0 then goto changemode
high LED3:
pause 200
if Trigger = 0 then goto changemode
high LED4:
pause 200
if Trigger = 0 then goto changemode
high LED5
pause 200
if Trigger = 0 then goto changemode
high LED6:high LED7
pause 500
if Trigger = 0 then goto changemode
'next temp
goto newtop
TopToBottomToTopFast:
PPause con 50
if Trigger = 0 then goto changemode
serout SerialOut,n9600,["TopToBottomToTopFast",10,13]
if Trigger = 0 then goto changemode
'for temp = 1 to 10
if Trigger = 0 then goto changemode
gosub AllOff:
if Trigger = 0 then goto changemode
pause PPause
if Trigger = 0 then goto changemode
high LED1:high LED2:
pause PPause
if Trigger = 0 then goto changemode
high LED3:
pause PPause
if Trigger = 0 then goto changemode
high LED4:
pause PPause
if Trigger = 0 then goto changemode
high LED5
pause PPause
if Trigger = 0 then goto changemode
high LED6:high LED7
pause PPause
if Trigger = 0 then goto changemode
if Trigger = 0 then goto changemode
if Trigger = 0 then goto changemode
pause PPause
if Trigger = 0 then goto changemode
low LED6:low LED7:
pause PPause
if Trigger = 0 then goto changemode
low LED5:
pause PPause
if Trigger = 0 then goto changemode
low LED4:
pause PPause
if Trigger = 0 then goto changemode
low LED3
pause PPause
if Trigger = 0 then goto changemode
low LED1:low LED2
pause PPause
if Trigger = 0 then goto changemode
'next temp
goto newtop
CornersCenter:
if Trigger = 0 then goto changemode
serout SerialOut,n9600,["CornersCenter",10,13]
if Trigger = 0 then goto changemode
'for temp = 1 to 10
if Trigger = 0 then goto changemode
gosub AllOff:
high LED1:high LED2:high LED6:high LED7
if Trigger = 0 then goto changemode
pause 500
if Trigger = 0 then goto changemode
gosub AllOff:
high LED3:high LED4:high LED5
pause 500
if Trigger = 0 then goto changemode
'next temp
goto newtop
GoToSleep:
gosub AllOff:
hpwm 1, 255, 5500 'turn PWM full off which turns LEDs on!
pause 50
if Trigger = 1 then goto newtop 'have to hold it for a time - filters bounce
ModeCount=ModeCount-1
write 0, ModeCount 'save current mode
'write 1, mode 'save current mode
serout 0,n9600,[10,13,"@Sleepzzzzzzzzzz",10,13]
hpwm 1, 0,0
for y= 100 to 0 step -7 'dim showing going to sleep
high LED1:high LED2:high LED3:high LED4
pause y
low LED1:low LED2:low LED3:low LED4
pause y
next y
hpwm 1, PWMMax, 0
low LED1:low LED2:low LED3:low LED4
INTCON = %00001100
'INTCON.0 = 0 'Reset the Port change bit
IOCA=0 'clear
IOCA.2=1 'set bit 2
LongSleep:
low LED1
serout 0, n9600, ["Z", 10,13]
pause 500
INTCON.0 = 0 'Reset the Port change bit
porta.2=0 'reset switch pin -was porta.3
IOCA = %00000100 'enable INTERRUPT ON CHANGE on a.2
sleep 65000
if intcon.0=0 then goto longsleep
hpwm 1, 0,0
high LED1
pause 100
INTCON.0 = 0 'Reset the Port change bit
'IOCA=0
if Trigger = 0 then longsleep
for y= 0 to 100 step 3 'dim showing going to sleep
high LED1:high LED2:high LED3:high LED4
pause y
low LED1:low LED2:low LED3:low LED4
pause y
next y
high LED1:high LED2:high LED3:high LED4
serout 0, n9600, ["xZ", 10,13]
INTCON.0 = 0 'Reset the Port change bit
pause 1000
goto Newtop:
AllOff:
low LED1:low LED2:low LED3:low LED4:low LED5:low LED6:low LED7
return
|