Here's another quick example that simulates a Cylon or Kitt car scanner.
It's running on a 16F887 with 8Mhz internal OSC. The PCB is the Microchip 44-pin Demo Board that comes with the PICkit2 Debug Express package.
It's not too bad with 8 LEDs, but 16 would be better. The sequence will automatically use however many LEDs you define.
By adjusting the constants, you can make it look like most of the different seasons of the shows. (Excluding the New "Knight Rider" 2009). 2009 can be done too, but it'll take a little modification.
The main difference is in the way the Duytcycle variables are declared. By grouping them in an Array, they can be used with FOR loops to control all the LEDs, instead of having to access each one individually like the RGB's.
;----[ MIBAM Setup ]-------------------------------------------------------- BAM_COUNT CON 8 ; How many BAM Pins are used? INCLUDE "MIBAM.pbp" ; Mirror Image BAM module BAM_DUTY VAR BYTE[BAM_COUNT] LED1 VAR BAM_DUTY[0] ; group them in an array for easy access LED2 VAR BAM_DUTY[1] ; with FOR loops etc. LED3 VAR BAM_DUTY[2] LED4 VAR BAM_DUTY[3] LED5 VAR BAM_DUTY[4] LED6 VAR BAM_DUTY[5] LED7 VAR BAM_DUTY[6] LED8 VAR BAM_DUTY[7] ASM BAM_LIST macro ; Define PIN's to use for BAM BAM_PIN (PORTD,0, LED1) ; and the associated Duty variables BAM_PIN (PORTD,1, LED2) BAM_PIN (PORTD,2, LED3) BAM_PIN (PORTD,3, LED4) BAM_PIN (PORTD,4, LED5) BAM_PIN (PORTD,5, LED6) BAM_PIN (PORTD,6, LED7) BAM_PIN (PORTD,7, LED8) endm BAM_INIT BAM_LIST ; Initialize the Pins ENDASM
Then with all the dutycycles in the array, you can do something like this.
Speed CON 6 ; Smaller=Faster TracerSpeed CON 15 ; Smaller=Faster Left/Right Brightness CON 200 ; Tracers DutyCycle DrainSpeed CON 30 ; Smaller=Shorter Trail Idx VAR BYTE LoopCount VAR BYTE NextLED VAR BYTE TraceDIR VAR BIT TraceDIR = 0 LoopCount = 0 NextLED = 0 Main: if LoopCount = TracerSpeed then ; __[ Cylon/Kitt Scanner ]__ LoopCount = 0 BAM_DUTY(NextLED)=Brightness if TraceDIR then ; if scanning left NextLED = NextLED - 1 if NextLED = 0 then TraceDIR = 0 else ; else scanning right NextLED = NextLED + 1 if NextLED = BAM_COUNT-1 then TraceDIR = 1 endif endif FOR Idx = 0 to BAM_COUNT - 1 ; Drain all dutycycles IF BAM_DUTY(Idx) > 0 then BAM_DUTY(Idx)=BAM_DUTY(Idx)*DrainSpeed/(DrainSpeed+1) ENDIF NEXT Idx pause Speed LoopCount = LoopCount + 1 GOTO Main
Attached is the full code and HEX file for the 887 on the Demo Board.