jmaurin
Joined: 29 Mar 2008 Posts: 26 Location: Ribeirão Preto, SP, Brasil
|
Passing string as parameter and calculating parity bit |
Posted: Sat Mar 29, 2008 3:48 pm |
|
|
Hi.
I have a function to write some texts to my car's display. In this function, i need to receive a text (by parameter) and send char by char using i2c (+somethings).
My problem is: how can i pass a string by parameter?
Also, is there any easy way to calculate parity bit? I need to receive a string, get 10 chars from this string (is less, add a blank char) and send these 10 chars to my display using i2c_write() function.....but not only char, it's char + parity bit...so it's 9 bits.
Now, i'm using a global variable for string and then i call EscreveDisplay(), which scans the global variable and send char-by-char. The chars are pre-calculated by me (i have a chars table in switch).
This is how i call the function:
Code: |
sprintf(e,"Test string");
EscreveDisplay();
|
where 'e' is a global variable (char[20] e="").
This is the function:
Code: |
void EscreveDisplay(){
long i=0,t=0;
int bitcount=0;
#ifndef DEBUG
Initi2c();
#endif
MRQ = 0;
delay_ms(1);
MRQ = 1;
delay_us(200);
#ifndef DEBUG
Starti2c();
i2c_write(0x9b); // Endereço do display
#endif
MRQ = 0;
delay_us(250);
#ifndef DEBUG
// Display symbols
// Faz a contagem de bits=1 para calcular a paridade
for (i=1;i<7;i++) {
if (bit_test(b1,i)) {
bitcount++;
}
}
// Se o numero de bits for impar, o bit de paridade é 0
// Caso contrario, é 1
if (EvenOrOdd(bitcount)) {
bit_clear(b1,0);
} else {
bit_set(b1,0);
}
delay_ms(1);
// i2c_write(0x01);
i2c_write(b1);
delay_ms(1);
i2c_write(0x01);
delay_ms(1);
i2c_write(0x01);
delay_ms(1);
#endif
t = strlen(e);
#ifdef DEBUG
printf("Tamanho da string: %u\n\r",strlen(e));
#endif
for (i=0;i<t;i++) {
if (i<10) {
if (e[i]==NULL) {
#ifdef DEBUG
printf(" Achei nulo\n\r");
#endif
e[i]=" ";
}
#ifdef DEBUG
printf(" Escrevendo caracter %c\n\r",e[i]);
#endif
#ifndef DEBUG
switch( e[i] ) {
case ' ': i2c_write(0x40); break;
case '@': i2c_write(0x80); break;
case '~': i2c_write(0xFD); break;
case ',': i2c_write(0x58); break;
case '+': i2c_write(0x57); break;
case '/': i2c_write(0x5E); break;
case '\\': i2c_write(0xB9); break;
case '|': i2c_write(0xF8); break;
case '{': i2c_write(0xF7); break;
case '}': i2c_write(0xFB); break;
case '"': i2c_write(0x45); break;
case '#': i2c_write(0x46); break;
case '$': i2c_write(0x49); break;
case '&': i2c_write(0x4C); break;
case '\'': i2c_write(0x4F); break;
case ';': i2c_write(0x76); break;
case '<': i2c_write(0x79); break;
case '>': i2c_write(0x7C); break;
case '.': i2c_write(0x5D); break;
case ':': i2c_write(0x75); break;
case ')': i2c_write(0x52); break;
case '(': i2c_write(0x51); break;
case '%': i2c_write(0x4A); break;
case '=': i2c_write(0x7A); break;
case '?': i2c_write(0x7F); break;
case '-': i2c_write(0x5B); break;
case '*': i2c_write(0x54); break;
case '!': i2c_write(0x43); break;
case '0': i2c_write(0x61); break;
case '1': i2c_write(0x62); break;
case '2': i2c_write(0x64); break;
case '3': i2c_write(0x67); break;
case '4': i2c_write(0x68); break;
case '5': i2c_write(0x6B); break;
case '6': i2c_write(0x6D); break;
case '7': i2c_write(0x6E); break;
case '8': i2c_write(0x70); break;
case '9': i2c_write(0x73); break;
case 'a': i2c_write(0xC2); break;
case 'b': i2c_write(0xC4); break;
case 'c': i2c_write(0xC7); break;
case 'd': i2c_write(0xC8); break;
case 'e': i2c_write(0xCB); break;
case 'f': i2c_write(0xCD); break;
case 'g': i2c_write(0xCE); break;
case 'h': i2c_write(0xD0); break;
case 'i': i2c_write(0xD3); break;
case 'j': i2c_write(0xD5); break;
case 'k': i2c_write(0xD6); break;
case 'l': i2c_write(0xD9); break;
case 'm': i2c_write(0xDA); break;
case 'n': i2c_write(0xDC); break;
case 'o': i2c_write(0xDF); break;
case 'p': i2c_write(0xE0); break;
case 'q': i2c_write(0xE3); break;
case 'r': i2c_write(0xE5); break;
case 's': i2c_write(0xE6); break;
case 't': i2c_write(0xE9); break;
case 'u': i2c_write(0xEA); break;
case 'v': i2c_write(0xEC); break;
case 'w': i2c_write(0xEF); break;
case 'x': i2c_write(0xF1); break;
case 'y': i2c_write(0xF2); break;
case 'z': i2c_write(0xF4); break;
case 'A': i2c_write(0x83); break;
case 'B': i2c_write(0x85); break;
case 'C': i2c_write(0x86); break;
case 'D': i2c_write(0x89); break;
case 'E': i2c_write(0x8A); break;
case 'F': i2c_write(0x8C); break;
case 'G': i2c_write(0x8F); break;
case 'H': i2c_write(0x91); break;
case 'I': i2c_write(0x92); break;
case 'J': i2c_write(0x94); break;
case 'K': i2c_write(0x97); break;
case 'L': i2c_write(0x98); break;
case 'M': i2c_write(0x9B); break;
case 'N': i2c_write(0x9D); break;
case 'O': i2c_write(0x9E); break;
case 'P': i2c_write(0xA1); break;
case 'Q': i2c_write(0xA2); break;
case 'R': i2c_write(0xA4); break;
case 'S': i2c_write(0xA7); break;
case 'T': i2c_write(0xA8); break;
case 'U': i2c_write(0xAB); break;
case 'V': i2c_write(0xAD); break;
case 'W': i2c_write(0xAE); break;
case 'X': i2c_write(0xB0); break;
case 'Y': i2c_write(0xB3); break;
case 'Z': i2c_write(0xB5); break;
default: i2c_write(0x40); break;
}
#endif
delay_ms(2);
} else {
#ifdef DEBUG
printf("=> Passou do limite!Ignorando caracter %c\n\r",e[i]);
#endif
}
}
if (t<10) {
for (i=0;i<10-t;i++) {
#ifdef DEBUG
printf("----> Completando caracter %Lu\n\r",i);
#endif
#ifndef DEBUG
i2c_write(0x40);
#endif
delay_ms(2);
}
}
MRQ = 1; // MRQ = 1 // (Entrada?)
delay_us(200);
#ifndef DEBUG
// Stopi2c();
#endif
#ifdef DEBUG
printf("Fim da escrita no display!\n\r");
#endif
return;
}
|
If is possible, i like to just call: EscreveDisplay("My text");
Thanks! |
|