|
|
View previous topic :: View next topic |
Author |
Message |
The Puma
Joined: 23 Apr 2004 Posts: 227 Location: The Netherlands
|
How to convert a string and set 5 bytes to an array |
Posted: Tue May 09, 2006 12:42 pm |
|
|
I have following segment data array (char Font[])
If i have a string with let say Input_string = "TESTING"
then the corresponding 5 bytes must be placed in an new string
This string has 50 bytes (Output_string[50])
The first bytes must be filled with 0x01, 0x01, 0x7F, 0x01, 0x01
= Char T
The next bytes must filled with 0x7F, 0x49, 0x49, 0x49, 0x41
= Char E
and so on
How can i made that
Please give me a source code
Code: |
// Declare and Init the font array data
char Font[] = {
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, $
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
};
|
|
|
|
The Puma
Joined: 23 Apr 2004 Posts: 227 Location: The Netherlands
|
|
Posted: Tue May 09, 2006 3:17 pm |
|
|
If i have only 5 data packets write to the string, the problem is that there are byte filled with crap
How can i fill the unused with 0x00? |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Tue May 09, 2006 4:04 pm |
|
|
I don't have time to give you a complete example program, but let me suggest you to study the chapter on multi dimensional arrays in your C language book. |
|
|
The Puma
Joined: 23 Apr 2004 Posts: 227 Location: The Netherlands
|
|
Posted: Thu May 11, 2006 2:16 pm |
|
|
This is my code so far.
But i have a problem
If have will display the letters "ABCDEFGHIJK"
then dot matrix for the I remains blank
Is there an error in the
void max7221_fill_buffer(char *buffer) routine
Please HELP
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_LEFT 0x00
#define DOT_MATRIX_DISPLAY_RIGHT 0x09
// Declare and Init the font array data
char Font[] = {
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, $
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
};
char message[];
char *text;
int messptr=0;
void max7221_fill_buffer(char *buffer) {
int txtptr;
for(txtptr=0;buffer[txtptr];txtptr++) {
strncpy(message+messptr,font+((buffer[txtptr]-0x20)*5),5);
message[messptr+5]=0;
messptr+=5;
}
while(messptr<50)
message[messptr++]=0;
}
void max7221_display_message() {
int column,matrix,index;
for(column=DIGIT_0;column<=DIGIT_4;column++) {
index=column-1;
output_low(MAX7221_CS);
for(matrix=DOT_MATRIX_DISPLAY_LEFT;matrix<=DOT_MATRIX_DISPLAY_RIGHT;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_LEFT;matrix<=DOT_MATRIX_DISPLAY_RIGHT;matrix++) {
spi_write(addr);
spi_write(data);
}
output_high(MAX7221_CS);
}
void max7221_clear() {
int column,matrix;
for(column=DIGIT_0;column<=DIGIT_4;column++) {
output_low(MAX7221_CS);
for(matrix=DOT_MATRIX_DISPLAY_LEFT;matrix<=DOT_MATRIX_DISPLAY_RIGHT;matrix++) {
spi_write(column);
spi_write(0x00);
}
output_high(MAX7221_CS);
}
}
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);
}
|
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();
max7221_clear();
strcpy(text,"ABCDEFGHIJK");
max7221_fill_buffer(text);
max7221_display_message();
}
|
|
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Fri May 12, 2006 3:12 am |
|
|
strncpy() will copy all data until the specified number of characters is reached or a null character (0x00) is found. In your string 'ABCDEFGHIJK', the character 'I' is the first character to contain a 0x00 byte in the 5 bytes to be copied and that is where the copy stops.
Also your variable messptr is now a global and only set to 0 at program startup, after that is never reset to 0 again.
Try the replacement below and tell us the results: Code: | void max7221_fill_buffer(char *Buffer)
{
char CurrentChar;
char *MsgPtr;
// Clear message
memset(message, 0x00, 50);
// Copy font for each character
MsgPtr = &message[0];
CurrentChar = *Buffer;
while (CurrentChar)
{
memcpy(MsgPtr, font[CurrentChar - 0x20], 5);
MsgPtr += 5;
CurrentChar = *(++Buffer);
}
} |
Another tip: make your font array a constant array by adding the 'const' keyword: Code: | const char Font[] = { | This will save a lot of your program and RAM memory space as it keeps the data in program area instead of copying all the data at program start to RAM also. |
|
|
The Puma
Joined: 23 Apr 2004 Posts: 227 Location: The Netherlands
|
|
Posted: Sat May 20, 2006 6:52 am |
|
|
Ok, this works now, but how can i move the text by one column each from left to right?
@ckielstra
I have sent a mail |
|
|
|
|
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
|