REM HUB75 LED matrix control for MachiKania type P REM Boxfill and Circlefill demonstration REM I/O bit0 A REM I/O bit1 B REM I/O bit2 C REM I/O bit3 D REM I/O bit4 E (HUB75E) REM I/O bit5 B1 REM I/O bit6 R1 REM I/O bit7 G1 REM I/O bit8 B2 REM I/O bit9 R2 REM I/O bit10 G2 (GP20) REM I/O bit11 CLK (GP21) REM I/O bit12 LAT (GP22) REM I/O bit13 OE (GP26) USEVAR SECTION,BRIGHT,VRAM USEVAR GPIOOUT,GPIOSET,GPIOCLR USEVAR R1,G1,B1,R2,G2,B2,LAT,CLK,OE USEVAR RGBMASK,SECTMASK USEVAR WIDTHX,WIDTHY,NUMSECT,INTERVAL GPIOOUT=$D0000010:REM GPIO output register GPIOSET=$D0000014:REM GPIO bit set register GPIOCLR=$D0000018:REM GPIO bit clear register B1=1<<5:R1=1<<6:G1=1<<7 B2=1<<8:R2=1<<9:G2=1<<20 CLK=1<<21 LAT=1<<22 OE =1<<26 RGBMASK=(R1+G1+B1+R2+G2+B2) XOR $FFFFFFFF SECTMASK=$FFFFFFE0 WIDTHX=64:WIDTHY=32 NUMSECT=16:REM The number of section INTERVAL=347:REM Interrupt interval (us) REM Initialize GPIO port for output OUT8L 0 OUT 8,0:OUT 9,0:OUT 10,0:OUT 11,0:OUT 12,0:OUT 13,0 DIM VRAM(WIDTHX*WIDTHY/4-1) SECTION=0:BRIGHT=0 CORETIMER CORETIMER()+INTERVAL INTERRUPT CORETIMER,LEDOUT DO FOR I=1 TO 500 GOSUB BOXF,RND()%WIDTHX,RND()%WIDTHY,RND()%WIDTHX,RND()%WIDTHY,RND()%63+1 IF I<30 THEN WAIT 20-I*2/3 NEXT FOR I=1 TO 500 GOSUB CIRF,RND()%WIDTHX,RND()%WIDTHY,RND()%(WIDTHY/2+2),RND()%63+1 IF I<30 THEN WAIT 20-I*2/3 NEXT LOOP END LABEL SETP REM Set point x,y,color REM color: IF ARGS(1)<0 OR ARGS(1)>=WIDTHX OR ARGS(2)<0 OR ARGS(2)>=WIDTHY THEN RETURN POKE VRAM+ARGS(2)*WIDTHX+ARGS(1),ARGS(3) RETURN LABEL HLINE REM Horizontal line x1,x2,y,color VAR A,B,C,D IF ARGS(1)<=ARGS(2) THEN A=ARGS(1):B=ARGS(2) ELSE A=ARGS(2):B=ARGS(1) C=ARGS(3):D=ARGS(4) IF A>=WIDTHX OR B<0 THEN RETURN IF A<0 THEN A=0 IF B>=WIDTHX THEN B=WIDTHX-1 IF C<0 OR C>=WIDTHY THEN RETURN WHILE A<=B GOSUB SETP,A,C,D A=A+1 WEND RETURN LABEL BOXF REM Boxfill x1,y1,x2,y2,color VAR A,B,C,D,E IF ARGS(1)<=ARGS(3) THEN A=ARGS(1):C=ARGS(3) ELSE A=ARGS(3):C=ARGS(1) IF ARGS(2)<=ARGS(4) THEN B=ARGS(2):D=ARGS(4) ELSE B=ARGS(4):D=ARGS(2) E=ARGS(5) IF A>=WIDTHX OR C<0 THEN RETURN IF A<0 THEN A=0 IF C>=WIDTHX THEN C=WIDTHX-1 IF B>=WIDTHY OR D<0 THEN RETURN IF B<0 THEN B=0 IF D>=WIDTHY THEN D=WIDTHY-1 WHILE B<=D GOSUB HLINE,A,C,B,E B=B+1 WEND RETURN LABEL CIR REM Circle x,y,r,color VAR X,Y,R,C,P,Q,F X=ARGS(1):Y=ARGS(2):R=ARGS(3):C=ARGS(4) P=R:Q=0:F=-2*R+3 WHILE P>=Q GOSUB SETP,X-P,Y-Q,C:GOSUB SETP,X+P,Y-Q,C GOSUB SETP,X-P,Y+Q,C:GOSUB SETP,X+P,Y+Q,C GOSUB SETP,X-Q,Y-P,C:GOSUB SETP,X+Q,Y-P,C GOSUB SETP,X-Q,Y+P,C:GOSUB SETP,X+Q,Y+P,C IF F>=0 THEN P=P-1:F=F-P*4 Q=Q+1:F=F+Q*4+2 WEND RETURN LABEL CIRF REM Circlefill x,y,r,color VAR X,Y,R,C,P,Q,F X=ARGS(1):Y=ARGS(2):R=ARGS(3):C=ARGS(4) P=R:Q=0:F=-2*R+3 WHILE P>=Q GOSUB HLINE,X-P,X+P,Y-Q,C GOSUB HLINE,X-P,X+P,Y+Q,C GOSUB HLINE,X-Q,X+Q,Y-P,C GOSUB HLINE,X-Q,X+Q,Y+P,C IF F>=0 THEN P=P-1:F=F-P*4 Q=Q+1:F=F+Q*4+2 WEND RETURN REM ------------------------------------------- REM Interrupt service routine for HUB75 output REM ------------------------------------------- LABEL LEDOUT CORETIMER CORETIMER()+INTERVAL VAR I,C,D,P,Q P=SECTION*WIDTHX+VRAM Q=P+WIDTHX*NUMSECT FOR I=1 TO WIDTHX D=0 C=PEEK(P) IF (C AND 3)>BRIGHT THEN D=B1 IF ((C>>2) AND 3)>BRIGHT THEN D=D+R1 IF ((C>>4) AND 3)>BRIGHT THEN D=D+G1 C=PEEK(Q) IF (C AND 3)>BRIGHT THEN D=D+B2 IF ((C>>2) AND 3)>BRIGHT THEN D=D+R2 IF ((C>>4) AND 3)>BRIGHT THEN D=D+G2 REM output port ,D (RGB OUTPUT) POKE32 GPIOOUT,PEEK32(GPIOOUT) AND RGBMASK OR D POKE32 GPIOSET,CLK:REM OUT clkbit,1 (CLK ON) POKE32 GPIOCLR,CLK:REM OUT clkbit,0 (CLK OFF) P=P+1:Q=Q+1 NEXT POKE32 GPIOSET,OE:REM OUT oebit,1 (OE OFF) REM output port <4:0>,SECTION POKE32 GPIOOUT,PEEK32(GPIOOUT) AND SECTMASK OR SECTION POKE32 GPIOSET,LAT:REM OUT latbit,1 (LAT ON) POKE32 GPIOCLR,LAT:REM OUT latbit,0 (LAT OFF) POKE32 GPIOCLR,OE :REM OUT oebit ,0 (OE ON) BRIGHT=BRIGHT+1 IF BRIGHT>=3 THEN BRIGHT=0 SECTION=SECTION+1 IF SECTION>=NUMSECT THEN SECTION=0 ENDIF RETURN