CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

Need some starting help for cascading multiple max7221
Goto page 1, 2  Next
 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
The Puma



Joined: 23 Apr 2004
Posts: 227
Location: The Netherlands

View user's profile Send private message

Need some starting help for cascading multiple max7221
PostPosted: Sun Apr 30, 2006 2:50 am     Reply with quote

I have made a pcb with 6 max7221 connectec on 5x7 dot matrix led displays

The hardware is as follow connected
CLK and CS signal lines are connected together
The first max7221 DIN line is connected to the uC

the DOUT line of the first max7221 is connected to the DIN of the secound MAX7221 and so on

How can i now drive these max7221?
Please give me a starting point
Charlie U



Joined: 09 Sep 2003
Posts: 183
Location: Somewhere under water in the Great Lakes

View user's profile Send private message

PostPosted: Sun Apr 30, 2006 7:24 am     Reply with quote

Since you have a board with the devices on it, I will assume that you have a data sheet. There is plenty of information on driving the device there. Look through some recent posts on this forum for information on spi and find the one on setting up the PIC. The next thing that I'd work on is just getting the first one to display information. These displays have a 16 bit command, so you will need to send 2 bytes in your send function. Start by creating an initialization function that you call once in the beginning of your program to set the intensity, etc. Then create a function that sends a value to display on a specific digit.

This should get you started. When you have some results let us know how it worked. If you have any questions, just reply to this thread.
The Puma



Joined: 23 Apr 2004
Posts: 227
Location: The Netherlands

View user's profile Send private message

PostPosted: Sun Apr 30, 2006 8:03 am     Reply with quote

This is the initialize code so far, and puts all 'A' on all ten 5x7 dot matrix displays.
But i would have that a text is rotation from left to right
How can i do that?

Code:
#include <18F4620.h>
#use delay(clock=20000000)
#fuses HS,NOWDT,NOBROWNOUT,NOPUT,NOLVP,DEBUG,NOSTVREN,NOPROTECT

#include <string.h>
#include <max7221 (5x7 dot matrix).h>

void main() {

   setup_spi(SPI_MASTER | SPI_H_TO_L | SPI_CLK_DIV_16);

   max7221_init();

   while(true) {
      max7221_display_message();

   }
}


Code:
#ifndef MAX7221_CS

#define MAX7221_CS    PIN_C0
#define MAX7221_CLK   PIN_C3
#define MAX7221_DIN   PIN_C5

#endif

// Register address map
#define NO_OP                     0x00  // Used when cascading max7221s
#define DIGIT_0                   0x01  // Digit 0 register
#define DIGIT_1                   0x02  // Digit 1 register
#define DIGIT_2                   0x03  // Digit 2 register
#define DIGIT_3                   0x04  // Digit 3 register
#define DIGIT_4                   0x05  // Digit 4 register
#define DIGIT_5                   0x06  // Digit 5 register
#define DIGIT_6                   0x07  // Digit 6 register
#define DIGIT_7                   0x08  // Digit 7 register
#define DECODE_MODE               0x09  // Decode mode register
#define INTENSITY                 0x0A  // Intensity register
#define SCAN_LIMIT                0x0B  // Scan-limit register
#define SHUT_DOWN                 0x0C  // Shutdown register
#define DISPLAY_TEST              0x0F  // Display-test register

// Shutdown register
#define SHUTDOWN_MODE             0x00  // Shutdown mode
#define NORMAL_MODE               0x01  // Normal mode

// Decode-mode register
#define NO_DECODE_DIGITS_7_0      0x00  // No decode for digits 7-0
#define CODE_B_DECODE_DIGIT_0     0x01  // Code B decode for digit 0
#define CODE_B_DECODE_DIGITS_3_0  0x0F  // Code B decode for digits 3-0
#define CODE_B_DECODE_DIGITS_7_0  0xFF  // Code B decode for digits 7-0

// Intensity register
#define DUTY_CYCLE_1              0x00  // Intensity min
#define DUTY_CYCLE_2              0x01
#define DUTY_CYCLE_3              0x02
#define DUTY_CYCLE_4              0x03
#define DUTY_CYCLE_5              0x04
#define DUTY_CYCLE_6              0x05
#define DUTY_CYCLE_7              0x06
#define DUTY_CYCLE_8              0x07
#define DUTY_CYCLE_9              0x08
#define DUTY_CYCLE_10             0x09
#define DUTY_CYCLE_11             0x0A
#define DUTY_CYCLE_12             0x0B
#define DUTY_CYCLE_13             0x0C
#define DUTY_CYCLE_14             0x0D
#define DUTY_CYCLE_15             0x0E
#define DUTY_CYCLE_16             0x0F  // Intensity full

// Scan-limit register
#define DISPLAY_DIGIT_0           0x00  // Display digit 0
#define DISPLAY_DIGITS_01         0x01  // Display digits 0 & 1
#define DISPLAY_DIGITS_012        0x02  // Display digits 0 1 2
#define DISPLAY_DIGITS_0123       0x03  // Display digits 0 1 2 3
#define DISPLAY_DIGITS_01234      0x04  // Display digits 0 1 2 3 4
#define DISPLAY_DIGITS_012345     0x05  // Display digits 0 1 2 3 4 5
#define DISPLAY_DIGITS_0123456    0x06  // Display digits 0 1 2 3 4 5 6
#define DISPLAY_DIGITS_01234567   0x07  // Display digits 0 1 2 3 4 5 6 7

// Display-test register
#define NORMAL_OPERATION          0x00  // Normal operation
#define DISPLAY_TEST_MODE         0x01  // Display-test mode, all leds on


#define MAX_DOT_MATRIX_DISPLAY    0x0A

// Declare and Init the font array data
int const Font[96][5] = {
   {0x00, 0x00, 0x00, 0x00, 0x00 ,}   // 0x20, Space
   {0x00, 0x00, 0x5F, 0x00, 0x00 ,}   // 0x21, !
   {0x00, 0x07, 0x00, 0x07, 0x00 ,}   // 0x22, "
   {0x14, 0x7F, 0x14, 0x7F, 0x14 ,}   // 0x23, #
   {0x24, 0x2A, 0x7F, 0x2A, 0x12 ,}   // 0x24, 0x
   {0x23, 0x13, 0x08, 0x64, 0x62 ,}   // 0x25, %
   {0x36, 0x49, 0x55, 0x22, 0x50 ,}   // 0x26, &
   {0x00, 0x05, 0x03, 0x00, 0x00 ,}   // 0x27, '
   {0x00, 0x1C, 0x22, 0x41, 0x00 ,}   // 0x28, (
   {0x00, 0x41, 0x22, 0x1C, 0x00 ,}   // 0x29, )
   {0x08, 0x2A, 0x1C, 0x2A, 0x08 ,}   // 0x2a, *
   {0x08, 0x08, 0x3E, 0x08, 0x08 ,}   // 0x2b, +
   {0x00, 0x50, 0x30, 0x00, 0x00 ,}   // 0x2c, ,
   {0x08, 0x08, 0x08, 0x08, 0x08 ,}   // 0x2d, -
   {0x00, 0x60, 0x60, 0x00, 0x00 ,}   // 0x2e, .
   {0x20, 0x10, 0x08, 0x04, 0x02 ,}   // 0x2f, /
   {0x3E, 0x51, 0x49, 0x45, 0x3E ,}   // 0x30, 0
   {0x00, 0x42, 0x7F, 0x40, 0x00 ,}   // 0x31, 1
   {0x42, 0x61, 0x51, 0x49, 0x46 ,}   // 0x32, 2
   {0x21, 0x41, 0x45, 0x4B, 0x31 ,}   // 0x33, 3
   {0x18, 0x14, 0x12, 0x7F, 0x10 ,}   // 0x34, 4
   {0x27, 0x45, 0x45, 0x45, 0x39 ,}   // 0x35, 5
   {0x3C, 0x4A, 0x49, 0x49, 0x30 ,}   // 0x36, 6
   {0x01, 0x71, 0x09, 0x05, 0x03 ,}   // 0x37, 7
   {0x36, 0x49, 0x49, 0x49, 0x36 ,}   // 0x38, 8
   {0x06, 0x49, 0x49, 0x29, 0x1E ,}   // 0x39, 9
   {0x00, 0x36, 0x36, 0x00, 0x00 ,}   // 0x3a, :
   {0x00, 0x56, 0x36, 0x00, 0x00 ,}   // 0x3b, ;
   {0x00, 0x08, 0x14, 0x22, 0x41 ,}   // 0x3c, <
   {0x14, 0x14, 0x14, 0x14, 0x14 ,}   // 0x3d, =
   {0x41, 0x22, 0x14, 0x08, 0x00 ,}   // 0x3e, >
   {0x02, 0x01, 0x51, 0x09, 0x06 ,}   // 0x3f, ?
   {0x32, 0x49, 0x79, 0x41, 0x3E ,}   // 0x40, @
   {0x7E, 0x11, 0x11, 0x11, 0x7E ,}   // 0x41, A
   {0x7F, 0x49, 0x49, 0x49, 0x36 ,}   // 0x42, B
   {0x3E, 0x41, 0x41, 0x41, 0x22 ,}   // 0x43, C
   {0x7F, 0x41, 0x41, 0x22, 0x1C ,}   // 0x44, D
   {0x7F, 0x49, 0x49, 0x49, 0x41 ,}   // 0x45, E
   {0x7F, 0x09, 0x09, 0x01, 0x01 ,}   // 0x46, F
   {0x3E, 0x41, 0x41, 0x51, 0x32 ,}   // 0x37, G
   {0x7F, 0x08, 0x08, 0x08, 0x7F ,}   // 0x48, H
   {0x00, 0x41, 0x7F, 0x41, 0x00 ,}   // 0x49, I
   {0x20, 0x40, 0x41, 0x3F, 0x01 ,}   // 0x4a, J
   {0x7F, 0x08, 0x14, 0x22, 0x41 ,}   // 0x4b, K
   {0x7F, 0x40, 0x40, 0x40, 0x40 ,}   // 0x4c, L
   {0x7F, 0x02, 0x04, 0x02, 0x7F ,}   // 0x4d, M
   {0x7F, 0x04, 0x08, 0x10, 0x7F ,}   // 0x4e, N
   {0x3E, 0x41, 0x41, 0x41, 0x3E ,}   // 0x4f, O
   {0x7F, 0x09, 0x09, 0x09, 0x06 ,}   // 0x50, P
   {0x3E, 0x41, 0x51, 0x21, 0x5E ,}   // 0x51, Q
   {0x7F, 0x09, 0x19, 0x29, 0x46 ,}   // 0x52, R
   {0x46, 0x49, 0x49, 0x49, 0x31 ,}   // 0x53, S
   {0x01, 0x01, 0x7F, 0x01, 0x01 ,}   // 0x54, T
   {0x3F, 0x40, 0x40, 0x40, 0x3F ,}   // 0x55, U
   {0x1F, 0x20, 0x40, 0x20, 0x1F ,}   // 0x56, V
   {0x7F, 0x20, 0x18, 0x20, 0x7F ,}   // 0x57, W
   {0x63, 0x14, 0x08, 0x14, 0x63 ,}   // 0x58, X
   {0x03, 0x04, 0x78, 0x04, 0x03 ,}   // 0x59, Y
   {0x61, 0x51, 0x49, 0x45, 0x43 ,}   // 0x5a, Z
   {0x00, 0x00, 0x7F, 0x41, 0x41 ,}   // 0x5b, [
   {0x02, 0x04, 0x08, 0x10, 0x20 ,}   // 0x5c, \
   {0x41, 0x41, 0x7F, 0x00, 0x00 ,}   // 0x5d, ]
   {0x04, 0x02, 0x01, 0x02, 0x04 ,}   // 0x5e, ^
   {0x40, 0x40, 0x40, 0x40, 0x40 ,}   // 0x5f, _
   {0x00, 0x01, 0x02, 0x04, 0x00 ,}   // 0x60, `
   {0x20, 0x54, 0x54, 0x54, 0x78 ,}   // 0x61, a
   {0x7F, 0x48, 0x44, 0x44, 0x38 ,}   // 0x62, b
   {0x38, 0x44, 0x44, 0x44, 0x20 ,}   // 0x63, c
   {0x38, 0x44, 0x44, 0x48, 0x7F ,}   // 0x64, d
   {0x38, 0x54, 0x54, 0x54, 0x18 ,}   // 0x65, e
   {0x08, 0x7E, 0x09, 0x01, 0x02 ,}   // 0x66, f
   {0x08, 0x14, 0x54, 0x54, 0x3C ,}   // 0x67, g
   {0x7F, 0x08, 0x04, 0x04, 0x78 ,}   // 0x68, h
   {0x00, 0x44, 0x7D, 0x40, 0x00 ,}   // 0x69, i
   {0x20, 0x40, 0x44, 0x3D, 0x00 ,}   // 0x6a, j
   {0x00, 0x7F, 0x10, 0x28, 0x44 ,}   // 0x6b, k
   {0x00, 0x41, 0x7F, 0x40, 0x00 ,}   // 0x6c, l
   {0x7C, 0x04, 0x18, 0x04, 0x78 ,}   // 0x6d, m
   {0x7C, 0x08, 0x04, 0x04, 0x78 ,}   // 0x6e, n
   {0x38, 0x44, 0x44, 0x44, 0x38 ,}   // 0x6f, o
   {0x7C, 0x14, 0x14, 0x14, 0x08 ,}   // 0x70, p
   {0x08, 0x14, 0x14, 0x18, 0x7C ,}   // 0x71, q
   {0x7C, 0x08, 0x04, 0x04, 0x08 ,}   // 0x72, r
   {0x48, 0x54, 0x54, 0x54, 0x20 ,}   // 0x73, s
   {0x04, 0x3F, 0x44, 0x40, 0x20 ,}   // 0x74, t
   {0x3C, 0x40, 0x40, 0x20, 0x7C ,}   // 0x75, u
   {0x1C, 0x20, 0x40, 0x20, 0x1C ,}   // 0x76, v
   {0x3C, 0x40, 0x30, 0x40, 0x3C ,}   // 0x77, w
   {0x44, 0x28, 0x10, 0x28, 0x44 ,}   // 0x78, x
   {0x0C, 0x50, 0x50, 0x50, 0x3C ,}   // 0x79, y
   {0x44, 0x64, 0x54, 0x4C, 0x44 ,}   // 0x7a, z
   {0x00, 0x08, 0x36, 0x41, 0x00 ,}   // 0x7b, {
   {0x00, 0x00, 0x7F, 0x00, 0x00 ,}   // 0x7c, |
   {0x00, 0x41, 0x36, 0x08, 0x00 ,}   // 0x7d, }
   {0x08, 0x08, 0x2A, 0x1C, 0x08 ,}   // 0x7e, ~
   {0x08, 0x1C, 0x2A, 0x08, 0x08 ,}   // 0x7f, DEL
    };


void max7221_put(int addr,int data) {
   output_low(MAX7221_CS);
   spi_write(addr);
   spi_write(data);
   output_high(MAX7221_CS);
}

void max7221_display_message() {
   
   int i,j;
   
   for(j=0;j<=4;j++) {
      for(i=1;i<=10;i++) {
         output_low(MAX7221_CS);
         spi_write(j+1);
         spi_write(font['A'-0x20][j]);
         output_high(MAX7221_CS);
      }
   }
}
   
void max7221_clear() {
   byte digit,display;
   
   for(digit=DIGIT_0;digit<=DIGIT_4;digit++)
      for(display=1;display<=MAX_DOT_MATRIX_DISPLAY;display++)
         max7221_put(digit,0x00);
}

void max7221_init() {
   max7221_put(DECODE_MODE,NO_DECODE_DIGITS_7_0);
   max7221_put(SCAN_LIMIT,DISPLAY_DIGITS_01234);
   max7221_put(SHUT_DOWN,NORMAL_MODE);
   max7221_put(DISPLAY_TEST,NORMAL_OPERATION);
   max7221_put(INTENSITY,DUTY_CYCLE_1);
   max7221_clear();
}
Charlie U



Joined: 09 Sep 2003
Posts: 183
Location: Somewhere under water in the Great Lakes

View user's profile Send private message

PostPosted: Sun Apr 30, 2006 8:49 am     Reply with quote

Either I am a genius at describing the process (which I seriously doubt) and you can write a lot of code in 27 minutes, or you were much farther into this than you implied in your first post.

Anyway, it sounds like you want to scroll the message on the display. To do this, I would create a buffer in ram with the message that you want to display, then starting at the beginning of the buffer increment through the buffer and display the message. Then wait a sort period of time, maybe a few hundreds of milliseconds and redisplay the message but this time start at the second entry in the buffer and so on.
The Puma



Joined: 23 Apr 2004
Posts: 227
Location: The Netherlands

View user's profile Send private message

PostPosted: Sun Apr 30, 2006 8:57 am     Reply with quote

@Charlie U

This code have i already testen with.
But i can't get furhet Sad

The unit did i have build has ten 5x7 dot matrix leds displays.
Each one off these led matrixes has connected to a max7221 on the following mather:

MAX7221 LED MAXTRIX
DIG0 COLUMN1
DIG1 COLUMN2
DIG2 COLUMN3
DIG3 COLUMN4
DIG4 CLOUMN5

SEGA ROW7
SEGB ROW6
SEGC ROW5
SEGD ROW4
SEGE ROW3
SEGF ROW2
SEGG ROW1
Charlie U



Joined: 09 Sep 2003
Posts: 183
Location: Somewhere under water in the Great Lakes

View user's profile Send private message

PostPosted: Sun Apr 30, 2006 9:13 am     Reply with quote

Exactly how far have you progressed?

Have you put anyting on the display yet?
The Puma



Joined: 23 Apr 2004
Posts: 227
Location: The Netherlands

View user's profile Send private message

PostPosted: Sun Apr 30, 2006 9:50 am     Reply with quote

The above code display all 'A' of the displays

But i can't furher with it Crying or Very sad Sad Sad

Who can help me with the max7221
Charlie U



Joined: 09 Sep 2003
Posts: 183
Location: Somewhere under water in the Great Lakes

View user's profile Send private message

PostPosted: Sun Apr 30, 2006 3:08 pm     Reply with quote

I don't know where you got this code, but if you have gotten this far and you wrote it yourself, you should certainly be able to modify the part that writes out the character to the displays to change the message. I'll give you a hint: it's in the max7221_display_message() function.
The Puma



Joined: 23 Apr 2004
Posts: 227
Location: The Netherlands

View user's profile Send private message

PostPosted: Sun Apr 30, 2006 3:40 pm     Reply with quote

This code produced the following
the first dot matrix give a 'A'
the secound gives the four left colums of the A
the thirtt gives the three left colums of the A
the fourt gives the two left colums of the A
the fith gives the left column of the A

Why????

Her is the code
Code:
void max7221_display_message() {
   output_low(MAX7221_CS);
   spi_write(DIGIT_0);
   spi_write(0x7E);
   output_high(MAX7221_CS);
   
   output_low(MAX7221_CS);
   spi_write(DIGIT_1);
   spi_write(0x11);
   output_high(MAX7221_CS);
   
   output_low(MAX7221_CS);
   spi_write(DIGIT_2);
   spi_write(0x11);
   output_high(MAX7221_CS);
   
   output_low(MAX7221_CS);
   spi_write(DIGIT_3);
   spi_write(0x11);
   output_high(MAX7221_CS);
   
   output_low(MAX7221_CS);
   spi_write(DIGIT_4);
   spi_write(0x7E);
   output_high(MAX7221_CS);
}
Charlie U



Joined: 09 Sep 2003
Posts: 183
Location: Somewhere under water in the Great Lakes

View user's profile Send private message

PostPosted: Sun Apr 30, 2006 4:56 pm     Reply with quote

That's because the matrix drivers are connected serially. You send the first column data out and it will write the first column of the first matrix. This data is still held in the shift register of the first matrix driver. When you send the second column to the first matrix drive, the first column is clocked out of the first matrix driver and into the second matrix driver where the first column of that driver is written and so forth.

If you want to send data to a specific column in any of matrices, you will need to create a function that sends out no-op commands both before and after the column data. For example, to write column 1 on the third matrix you will need activate the chip select then send 3 no-op instructions, then the column data for the 3rd matrix, followed by 2 more no-ops. Then deactivate the chip select. You can also update a single column in all of the devices with a single command by doing the above, but sending the column data for the various matrices instead of the no-ops.
The Puma



Joined: 23 Apr 2004
Posts: 227
Location: The Netherlands

View user's profile Send private message

PostPosted: Mon May 01, 2006 9:06 am     Reply with quote

Whats must i do to display this
"0123456789" on the led display's

I can't get it to work.

Please can you give me a short code example how this can be done?


Last edited by The Puma on Mon May 01, 2006 9:19 am; edited 1 time in total
Charlie U



Joined: 09 Sep 2003
Posts: 183
Location: Somewhere under water in the Great Lakes

View user's profile Send private message

PostPosted: Mon May 01, 2006 9:14 am     Reply with quote

Study the data sheets and work hard.

The spoon feeding has ended.
The Puma



Joined: 23 Apr 2004
Posts: 227
Location: The Netherlands

View user's profile Send private message

PostPosted: Mon May 01, 2006 9:34 am     Reply with quote

I have reading and studying the datasheet, and work several days on it
But i can't get it to work correctly

Please give me a sample code
cmdrdan



Joined: 08 Apr 2005
Posts: 25
Location: Washington

View user's profile Send private message

PostPosted: Mon May 01, 2006 6:43 pm     Reply with quote

The MAX7221 is for seven segment displays, not dot-matrix....
The Puma



Joined: 23 Apr 2004
Posts: 227
Location: The Netherlands

View user's profile Send private message

PostPosted: Tue May 02, 2006 9:05 am     Reply with quote

cmdrdan wrote:
The MAX7221 is for seven segment displays, not dot-matrix....

This is not true, it can even be used the drive leds
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group