The Puma
Joined: 23 Apr 2004 Posts: 227 Location: The Netherlands
|
Need some help with moving message with max7221 |
Posted: Wed Oct 04, 2006 10:21 am |
|
|
Hallo,
I open this topic already earler,
but i lose my source file for scrolling the text on the dotmatrix
I have 10 max7221 cascaded together, and each of this max are connected to a 5x7 dot matrix display
With this code on the right 4 dot matrix display the letters "TEST" are print
This is good.
But my question is now, how can i move the text one dot row to left?
Here is the code:
Code: |
#include <18F4620.h>
#use delay(clock=20000000)
#fuses HS,NOWDT,NOBROWNOUT,NOPUT,NOLVP,DEBUG,NOSTVREN,NOPROTECT
#include <programmable led scrolling message board.h>
void main() {
setup_spi(SPI_MASTER | SPI_H_TO_L | SPI_CLK_DIV_16);
max7221_init();
max7221_clear();
strcpy(text,"TSET");
max7221_fill_buffer(text);
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
// Dot-matrix displays
#define DOT_MATRIX_DISPLAY_MIN 0x00
#define DOT_MATRIX_DISPLAY_MAX 0x09
// Declare and Init the font array data
char const font5x7[96][6] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // 0x20, Space
0x00, 0x00, 0x5F, 0x00, 0x00, 0x00 // 0x21, !
0x00, 0x07, 0x00, 0x07, 0x00, 0x00 // 0x22, "
0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00 // 0x23, #
0x12, 0x2A, 0x7F, 0x2A, 0x24, 0x00 // 0x24, $
0x62, 0x64, 0x08, 0x13, 0x23, 0x00 // 0x25, %
0x50, 0x22, 0x55, 0x49, 0x36, 0x00 // 0x26, &
0x00, 0x00, 0x03, 0x05, 0x00, 0x00 // 0x27, '
0x00, 0x41, 0x22, 0x1C, 0x00, 0x00 // 0x28, (
0x00, 0x1C, 0x22, 0x41, 0x00, 0x00 // 0x29, )
0x08, 0x2A, 0x1C, 0x2A, 0x08, 0x00 // 0x2A, *
0x08, 0x08, 0x3E, 0x08, 0x08, 0x00 // 0x2B, +
0x00, 0x00, 0x30, 0x50, 0x00, 0x00 // 0x2C, ,
0x08, 0x08, 0x08, 0x08, 0x08, 0x00 // 0x2D, -
0x00, 0x00, 0x60, 0x60, 0x00, 0x00 // 0x2E, .
0x02, 0x04, 0x08, 0x10, 0x20, 0x00 // 0x2F, /
0x3E, 0x45, 0x49, 0x51, 0x3E, 0x00 // 0x30, 0
0x00, 0x40, 0x7F, 0x42, 0x00, 0x00 // 0x31, 1
0x46, 0x49, 0x51, 0x61, 0x42, 0x00 // 0x32, 2
0x31, 0x4B, 0x45, 0x41, 0x21, 0x00 // 0x33, 3
0x10, 0x7F, 0x12, 0x14, 0x18, 0x00 // 0x34, 4
0x39, 0x45, 0x45, 0x45, 0x27, 0x00 // 0x35, 5
0x30, 0x49, 0x49, 0x4A, 0x3C, 0x00 // 0x36, 6
0x03, 0x05, 0x09, 0x71, 0x01, 0x00 // 0x37, 7
0x36, 0x49, 0x49, 0x49, 0x36, 0x00 // 0x38, 8
0x1E, 0x29, 0x49, 0x49, 0x06, 0x00 // 0x39, 9
0x00, 0x00, 0x36, 0x36, 0x00, 0x00 // 0x3A, :
0x00, 0x00, 0x36, 0x56, 0x00, 0x00 // 0x3B, ;
0x41, 0x22, 0x14, 0x08, 0x00, 0x00 // 0x3C, <0x14>
0x06, 0x09, 0x51, 0x01, 0x02, 0x00 // 0x3F, ?
0x3E, 0x41, 0x79, 0x49, 0x32, 0x00 // 0x40, @
0x7E, 0x11, 0x11, 0x11, 0x7E, 0x00 // 0x41, A
0x36, 0x49, 0x49, 0x49, 0x7F, 0x00 // 0x42, B
0x22, 0x41, 0x41, 0x41, 0x3E, 0x00 // 0x43, C
0x1C, 0x22, 0x41, 0x41, 0x7F, 0x00 // 0x44, D
0x41, 0x49, 0x49, 0x49, 0x7F, 0x00 // 0x45, E
0x01, 0x01, 0x09, 0x09, 0x7F, 0x00 // 0x46, F
0x32, 0x51, 0x41, 0x41, 0x3E, 0x00 // 0x37, G
0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00 // 0x48, H
0x00, 0x41, 0x7F, 0x41, 0x00, 0x00 // 0x49, I
0x01, 0x3F, 0x41, 0x40, 0x20, 0x00 // 0x4A, J
0x41, 0x22, 0x14, 0x08, 0x7F, 0x00 // 0x4B, K
0x40, 0x40, 0x40, 0x40, 0x7F, 0x00 // 0x4C, L
0x7F, 0x02, 0x04, 0x02, 0x7F, 0x00 // 0x4D, M
0x7F, 0x10, 0x08, 0x04, 0x7F, 0x00 // 0x4E, N
0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00 // 0x4F, O
0x06, 0x09, 0x09, 0x09, 0x7F, 0x00 // 0x50, P
0x5E, 0x21, 0x51, 0x41, 0x3E, 0x00 // 0x51, Q
0x46, 0x29, 0x19, 0x09, 0x7F, 0x00 // 0x52, R
0x31, 0x49, 0x49, 0x49, 0x46, 0x00 // 0x53, S
0x01, 0x01, 0x7F, 0x01, 0x01, 0x00 // 0x54, T
0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00 // 0x55, U
0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00 // 0x56, V
0x7F, 0x20, 0x18, 0x20, 0x7F, 0x00 // 0x57, W
0x63, 0x14, 0x08, 0x14, 0x63, 0x00 // 0x58, X
0x03, 0x04, 0x78, 0x04, 0x03, 0x00 // 0x59, Y
0x43, 0x45, 0x49, 0x51, 0x61, 0x00 // 0x5A, Z
0x41, 0x41, 0x7F, 0x00, 0x00, 0x00 // 0x5B, [
0x20, 0x10, 0x08, 0x04, 0x02, 0x00 // 0x5C, \
0x00, 0x00, 0x7F, 0x41, 0x41, 0x00 // 0x5D, ]
0x04, 0x02, 0x01, 0x02, 0x04, 0x00 // 0x5E, ^
0x40, 0x40, 0x40, 0x40, 0x40, 0x00 // 0x5F, _
0x00, 0x04, 0x02, 0x01, 0x00, 0x00 // 0x60, `
0x78, 0x54, 0x54, 0x54, 0x20, 0x00 // 0x61, a
0x38, 0x44, 0x44, 0x48, 0x7F, 0x00 // 0x62, b
0x20, 0x44, 0x44, 0x44, 0x38, 0x00 // 0x63, c
0x7F, 0x48, 0x44, 0x44, 0x38, 0x00 // 0x64, d
0x18, 0x54, 0x54, 0x54, 0x38, 0x00 // 0x65, e
0x02, 0x01, 0x09, 0x7E, 0x08, 0x00 // 0x66, f
0x3C, 0x54, 0x54, 0x14, 0x08, 0x00 // 0x67, g
0x78, 0x04, 0x04, 0x08, 0x7F, 0x00 // 0x68, h
0x00, 0x40, 0x7D, 0x44, 0x00, 0x00 // 0x69, i
0x00, 0x3D, 0x44, 0x40, 0x20, 0x00 // 0x6A, j
0x44, 0x28, 0x10, 0x7F, 0x00, 0x00 // 0x6B, k
0x00, 0x40, 0x7F, 0x41, 0x00, 0x00 // 0x6C, l
0x78, 0x04, 0x18, 0x04, 0x7C, 0x00 // 0x6D, m
0x78, 0x04, 0x04, 0x08, 0x7C, 0x00 // 0x6E, n
0x38, 0x44, 0x44, 0x44, 0x38, 0x00 // 0x6F, o
0x08, 0x14, 0x14, 0x14, 0x7C, 0x00 // 0x70, p
0x7C, 0x18, 0x14, 0x14, 0x08, 0x00 // 0x71, q
0x08, 0x04, 0x04, 0x08, 0x7C, 0x00 // 0x72, r
0x20, 0x54, 0x54, 0x54, 0x48, 0x00 // 0x73, s
0x20, 0x40, 0x44, 0x3F, 0x04, 0x00 // 0x74, t
0x7C, 0x20, 0x40, 0x40, 0x3C, 0x00 // 0x75, u
0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00 // 0x76, v
0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00 // 0x77, w
0x44, 0x28, 0x10, 0x28, 0x44, 0x00 // 0x78, x
0x3C, 0x50, 0x50, 0x50, 0x0C, 0x00 // 0x79, y
0x44, 0x4C, 0x54, 0x64, 0x44, 0x00 // 0x7A, z
0x00, 0x41, 0x36, 0x08, 0x00, 0x00 // 0x7B, {
0x00, 0x00, 0x7F, 0x00, 0x00, 0x00 // 0x7C, |
0x00, 0x08, 0x36, 0x41, 0x00, 0x00 // 0x7D, }
0x08, 0x1C, 0x2A, 0x08, 0x08, 0x00 // 0x7E, ~
0x08, 0x08, 0x2A, 0x1C, 0x08, 0x00 // 0x7F, DEL
};
char message[50];
char text[10];
void max7221_fill_buffer(char *buffer) {
char currentchar;
char *msgptr;
memset(message,0x00,50);
msgptr=&message[0];
currentchar=*buffer;
while(currentchar) {
memcpy(msgptr,font5x7[currentchar-0x20],5);
msgptr+=5;
currentchar=*(++buffer);
}
}
void max7221_display_message() {
int column,matrix,index;
for(column=DIGIT_0;column<=DIGIT_4;column++) {
index=5-column;
output_low(MAX7221_CS);
for(matrix=DOT_MATRIX_DISPLAY_MIN;matrix<=DOT_MATRIX_DISPLAY_MAX;matrix++) {
spi_write(column);
spi_write(message[index]);
index+=5;
}
output_high(MAX7221_CS);
}
}
void max7221_put(int addr,int data) {
int matrix;
output_low(MAX7221_CS);
for(matrix=DOT_MATRIX_DISPLAY_MIN;matrix<=DOT_MATRIX_DISPLAY_MAX;matrix++) {
spi_write(addr);
spi_write(data);
}
output_high(MAX7221_CS);
}
void max7221_clear() {
int column;
for(column=DIGIT_0;column<=DIGIT_4;column++) {
max7221_put(column,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_2);
}
|
|
|