Code:
'****************************************************************
'* Name : ws2812.BAS *
'* Author : richard *
'* Notice : *
'* : *
'* Date : 1/11/2016 *
'* Version : 1.0 *
'* Notes : pic12f1822 @32 mhz 3v3 *
'* : porta.5 >>>> ws2821 Din *
'****************************************************************
#CONFIG
cfg1 = _FOSC_INTOSC
cfg1&= _WDTE_ON
cfg1&= _PWRTE_OFF
cfg1&= _MCLRE_ON
cfg1&= _CP_OFF
cfg1&= _CPD_OFF
cfg1&= _BOREN_ON
cfg1&= _CLKOUTEN_OFF
cfg1&= _IESO_ON
cfg1&= _FCMEN_ON
__CONFIG _CONFIG1, cfg1
cfg2 = _WRT_OFF
cfg2&= _PLLEN_ON
cfg2&= _STVREN_ON
cfg2&= _BORV_19
cfg2&= _LVP_OFF
__CONFIG _CONFIG2, cfg2
#ENDCONFIG
bt VAR byte bank0
px VAR byte bank0
pc var byte bank0 ; number of rgb led to write x3
pixels var byte[3] ; rgb led x3
DURATION var byte
palette var word ;address of pallet
TEMP VAR WORD
OFFSET VAR WORD ;pallet index
goto overpalette ; green,red,blue data
my_palette: ; note !!! inde read can only access the low byte of each stored word
@ dw 100,120,0 ;
@ dW 0,100,0 ; RED
@ dW 0,80,0 ;
@ dW 0,60,0 ;
@ dW 0,20,0 ;
@ dW 200,200,0 ;OR
@ dW 160,160,0 ;
@ dW 100,100,0 ;
@ dW 80,80,0 ;
@ dW 2,5,0 ;
@ dW 200,150,0 ;YEL
@ dW 160,120,0 ;
@ dW 100,75,0 ;
@ dW 80,60,0 ;
@ dW 40,30,0 ;
@ dW 150,200,0 ; ?
@ dW 120,160,0 ;
@ dW 75,100,0 ;
@ dW 60,80,0 ;
@ dW 30,40,0 ;
@ dW 120,100,0 ;
@ dW 160,160,160 ; WH
@ dW 100,100,100 ;
@ dW 80,80,80 ;
@ dW 30,30,30 ;
ASM
;---[Returns the Address of a Label as a Word]------------------------------
GetAddress macro Label, Wout
CHK?RP Wout
movlw low Label ; get low byte
movwf Wout
movlw Label >> 8 ; get high byte
movwf Wout + 1
endm
endasm
overpalette :
goto overasm
asm
_pram ;entry point to read from sram
movlw low _pixels
movwf FSR0L
movlw high _pixels
movwf FSR0H
goto _nxby
_prom ;entry point to read from flash
CHK?RP _OFFSET
MOVE?WW _OFFSET , FSR0
BSF FSR0H ,7
_nxby MOVIW FSR0 ++
movwf _px
MOVLW 8
movwf _bt
RLF _px,F
_nxbt BSF LATA ,5
BTFSS STATUS,C
GOTO XX
NOP
NOP
NOP
XX BCF LATA ,5
NOP
RLF _px,F
DECFSZ _bt,F
GOTO _nxbt
DECFSZ _pc,F
GOTO _nxby
RETURN
endasm
overasm:
CLEAR
define OSC 32
osccon=$f0
trisa=%011110
@ GetAddress _my_palette,_palette ;set pallet address
loopy:
GOSUB FLICKER
PC=3 ; value is number of rgb leds X 3
call prom
pause DURATION
goto loopy
FLICKER:
RANDOM TEMP
DURATION=TEMP&$7F
RANDOM TEMP
' temp=0
OFFSET =(TEMP //25)*3 + palette
RETURN
Bookmarks