Well looking at several code examples for Ardunio using two dismensional arrays and a scrolling module.
SF dosen't have two dimensional arrays but maybe someone has come up with an easy method to scroll.
I used this for a single 8 x 8 matrix directly driven off of port pins and it works rather well but the MAX7219 registers etc. do not seem to want to conform to this. Thinking of using the Display_reg as anodes and Data_out as cathodes as in my orginal code but??
here is my existing code for the MAX7219
Code: Select all
{
*****************************************************************************
* Name : UNTITLED.BAS *
* Author : [select VIEW...EDITOR OPTIONS] *
* Notice : Copyright (c) 2014 [select VIEW...EDITOR OPTIONS] *
* : All Rights Reserved *
* Date : 8/4/2014 *
* Version : 1.0 *
* Notes : new revision by starting over and addressing the registers. *
* : *
*****************************************************************************
}
DEVICE = 18F2420
CLOCK = 20
INCLUDE "shift.bas"
INCLUDE "utils.bas"
INCLUDE "convert.bas"
' INCLUDE "DS18B20.bas"
INCLUDE "Utils.bas"
INCLUDE "convert.bas"
//PIN DESCRIPTION
DIM Load_pin AS PORTC.5 // LATCH
DIM Data_pin AS PORTC.4 // DATA
DIM Clock_pin AS PORTC.3 // CLOCK
DIM y AS BYTE
DIM X AS BYTE
//DIM index AS WORD
DIM Display_Reg AS BYTE //register settings
DIM Display_Data AS BYTE // Data to be displayed
DIM Data_out AS WORD // Data for additional matrix (4)
CONST A_ray(8) AS BYTE =( %11100011, //k
%00000000,
%10000000,
%10000000,
%10010000,
%10010000,
%10010000,
%11111111)
SUB Write_Matrix ()
Load_pin = 0
Data_out =256*Display_Reg+ Display_Data
shift.out (MSB_first,Data_out,16)
Load_pin =1
END SUB
PUBLIC SUB InitLed()
Display_Reg = 9 // decode
Display_Data = 0 //all
Write_Matrix // write to matrix
Display_Reg = 10 //intensity
Display_Data = 8 //max
Write_Matrix
Display_Reg = 11 //scan limit
Display_Data = 7 // to scan entire matrix
Write_Matrix
Display_Reg = 12 //shut down
Display_Data = 1
Write_Matrix
END SUB
PUBLIC SUB clear_display()
DIM I AS INTEGER
FOR I = 1 TO 8 // for 8 colums
Display_Reg = I
Display_Data = 0
Write_Matrix
NEXT
END SUB
PUBLIC SUB TestMode(Test AS BOOLEAN)
IF test = true THEN
Display_Data = 1
Display_Reg = %1111
Write_Matrix
ELSE
Display_Data = 0
Display_Reg = %1111
Write_Matrix
END IF
END SUB
// PROGRAM CODE SET UP
setalldigital
shift.setoutput(Data_pin)
shift.setclock(Clock_pin)
OUTPUT(Load_pin)
Load_pin = 0
X = 1
y = 1
InitLed
Display_Data = 1
Display_Reg = %1111
Write_Matrix
DELAYMS(500)
Display_Data = 0
Display_Reg = %1111
Write_Matrix
//InitLED 'sets up the registers
WHILE 1 = 1
FOR X = 7TO 1 STEP - 1 // Y is the register
Display_Reg = x
Display_Data = A_ray(7)
Write_Matrix
delayms(300)
Display_Reg = x
Display_Data = A_ray(6)
Write_Matrix
delayms(300)
Display_Reg = x
Display_Data = A_ray(5)
Write_Matrix
delayms(300)
Display_Reg = x
Display_Data = A_ray(4)
Write_Matrix
delayms(300)
Display_Reg = x
Display_Data = A_ray(3)
Write_Matrix
delayms(300)
Display_Reg = x
Display_Data = A_ray(2)
Write_Matrix
delayms(300)
Display_Reg = x
Display_Data = A_ray(1)
Write_Matrix
{
Display_Reg = y
Display_Data = A_ray(1)
Write_Matrix
Display_Reg = y
Display_Data = A_ray(2)
Write_Matrix
Display_Reg = y
Display_Data = A_ray(3)
Write_Matrix
Display_Reg = y
Display_Data = A_ray(4)
Write_Matrix
Display_Reg = y
Display_Data = A_ray(5)
Write_Matrix
Display_Reg = y
Display_Data = A_ray(6)
Write_Matrix
Display_Reg = y
Display_Data = A_ray(6)
Write_Matrix
next
}
DELAYMS(100)
clear_display
Y = Y + 1
next
WEND
code for single 8 x 8 matrix
Code: Select all
{
*****************************************************************************
* Name : UNTITLED.BAS *
* Author : [select VIEW...EDITOR OPTIONS] *
* Notice : Copyright (c) 2014 [select VIEW...EDITOR OPTIONS] *
* : All Rights Reserved *
* Date : 3/9/2014 *
* Version : 1.0 *
* Notes : *
* : *
*****************************************************************************
}
DEVICE = 18F2420
CLOCK = 8
// import LCD library...
INCLUDE "convert.bas"
INCLUDE "InternalOscillator.bas"
INCLUDE "SetDigitalIO.bas" // Include this file when we compile so that we can use keywords like 'setalldigital'
INCLUDE "utils.bas"
// A
CONST A_data(210)AS BYTE = (%00000000,
%00000000,
%00000000,
%00111110,
%01001000,
%01001000,
%00111110,
%00000000,
%00000000,
%00000000,
//B
%00000000,
%00000000,
%00111100,
%01000010,
%01000010,
%01000010,
%00000000,
%00000000,
//C
%00000000,
%00000000,
%00111100,
%01000010,
%01000010,
%01000010,
%00000000,
%00000000,
//D
%00000000,
%00000000,
%01111110,
%01000010,
%01000010,
%00111100,
%00000000,
%00000000,
//E
%00000000,
%00000000,
%01111110,
%01001010,
%01000010,
%00000000,
%00000000,
%00000000,
//F
%00000000,
%00000000,
%01111110,
%01010000,
%01000000,
%00000000,
%00000000,
%00000000,
// G
%00000000,
%00000000,
%01111110,
%01001010,
%00001110,
%00000000,
%00000000,
%00000000,
//H
%00000000,
%00000000,
%01111110,
%00001000,
%00001000,
%01111110,
%00000000,
%00000000,
//I
%00000000,
%00000000,
%01000010,
%01111110,
%01000010,
%00000000,
%00000000,
%00000000,
//J
%00000000,
%00000000,
%00000110,
%00000010,
%01111110,
%00000000,
%00000000,
%00000000,
//K
%00000000,
%00000000,
%01111110,
%00011000,
%00100100,
%00000010,
%00000000,
%00000000,
//L
%00000000,
%00000000,
%01111110,
%00000010,
%00000010,
%00000000,
%00000000,
%00000000,
//M
%00000000,
%01111110,
%00100000,
%00010000,
%00100000,
%01111110,
%00000000,
%00000000,
//N
%00000000,
%00000000,
%01111110,
%00110000,
%00001100,
%01111110,
%00000000,
%00000000,
//O
%00000000,
%00000000,
%00111100,
%01000010,
%01000010,
%00111100,
%00000000,
%00000000,
//P
%00000000,
%00000000,
%01111110,
%01001000,
%00111000,
%00000000,
%00000000,
%00000000,
//Q
%00000000,
%00000000,
%00111100,
%01000010,
%01000010,
%00111100,
%00000010,
%00000000,
//R
%00000000,
%00000000,
%01111110,
%01001000,
%00111000,
%00000110,
%00000000,
%00000000,
//S
%00000000,
%00000000,
%00110010,
%01010010,
%01001100,
%00000000,
%00000000,
%00000000,
//T
%00000000,
%00000000,
%01000000,
%01111110,
%01000000,
%00000000,
%00000000,
%00000000,
//U
%00000000,
%00000000,
%01111100,
%00000010,
%00000010,
%01111100,
%00000000,
%00000000,
//v
%00000000,
%00000000,
%01111000,
%00000100,
%00000010,
%00000100,
%01111000,
%00000000,
//W
%00000000,
%01111100,
%00000010,
%00000100,
%00000010,
%01111100,
%00000000,
%00000000,
//X
%00000000,
%01000010,
%00100100,
%00011100,
%00100100,
%01000010,
%00000000,
%00000000,
//Y
%00000000,
%01000000,
%00100000,
%00011110,
%00100000,
%01000000,
%00000000,
%00000000,
//Z
%00000000,
%00000000,
%01001110,
%01010010,
%01100010,
%00000010,
%00000000,
%00000000)
CONST Cathodes_Data(8) AS BYTE = (%11111110, %11111101, %11111011, %11110111, %11101111, %11011111, %10111111, %01111111)
DIM Scroll_Speed AS INTEGER
DIM x AS BYTE
DIM y AS BYTE
SetAllDigital // Make all Pins digital I/O's
TRISC = %00000000 // Make PORTD all outputs
TRISB = %00000000
Scroll_Speed = 50
y = 0
WHILE true
FOR x = 0 TO 7
portc = %00000000
portc = A_data(x + y) //CONST array data Portc C is Anodes
portb = Cathodes_Data(x) // Cathodes on PortB
DELAYMS(1)
portc = %00000000
DELAYUS(100)
NEXT
IF y +x <210 THEN // number of byte data in CONST arrays
DELAYMS(Scroll_Speed)
y = y + 1 // next A_Data byte data
ELSE
y = 0
END IF
WEND