2015-01-26 4 views
0

Так что, в основном, я пишу код для управления ЖК-дисплеем через микроконтроллер. (ATmega 32) У меня есть следующий в моем основном методе:Как преобразовать символ ASCII в шестнадцатеричный эквивалентный в C?

unsigned char str1[9] = "It Works!"; 
sendString(str1); 

и вот мой метод sendString:

// Converts each char to hex and sends to LCD 
void sendString(unsigned char *string){ 


    sendCommand(0x01); // Clear screen 0x01 = 00000001 
    _delay_ms(2); 
    sendCommand(0x38); // Put in 8-bit mode 
    _delay_us(50); 
    sendCommand(0b0001110); // LCD on and set cursor off 
    _delay_us(50); 

    //For each char in string, write to the LCD 
    for(int i = 0; i < sizeof(string); i++){ 
     convertASCIIToHex(string[i]); 
    } 
} 

Тогда метод sendString должен преобразовать каждый символ. Вот что у меня есть до сих пор:

unsigned int convertASCIIToHex(unsigned char *ch) 
{ 
    int hexEquivilent[sizeof(ch)] = {0}; 

    for(int i = 0; i < sizeof(ch); i++){ 
     // TODO - HOW DO I CONVERT FROM CHAR TO HEX???? 
    } 

    return hexEquivilent; 
} 

Так как же я буду делать перевод? Я совершенно не знаком с C и медленно учусь. У меня такое чувство, что я все это делаю неправильно, поскольку где-то я читал, что char на самом деле хранится как 8-битный int. Как я могу заставить мой метод возвращать значение HEX для каждого входного символа?

+0

ASCII-символ ARE alredy представлен численно внутри, поэтому вам не нужно их преобразовывать, если только вы не хотите выводить свои шестнадцатеричные значения вместо себя. (иногда мне очень сложно объяснить эту простую идею людям, которые вначале не понимают ее). –

+2

Что такое «шестнадцатеричное значение»? – Michael

+1

в порядке, поэтому в основном моя функция sendChar работает следующим образом: sendChar (0x54); и на ЖК-дисплее появляется связанный символ для ascii hex 0x54. Итак, если я понимаю вас, Евгений, я должен просто сделать следующее: sendChar (ch [i]) в цикле for для отправки каждого символа в моей «строке» на ЖК-дисплей? Нет необходимости конвертировать, поскольку char фактически представлен численно в 8 бит? –

ответ

3

В C символ char представляет собой 8-разрядное целое число со знаком, вы можете просто использовать шестнадцатеричное выражение для его представления. В следующих строках a, b и c имеют одно и то же значение, 8-битное целое число.

char a = 0x30; //Hexadecimal representation 
char b = 48; //Decimal representation 
char c = '0'; //ASCII representation 

Я думаю, что вам нужно просто отправить символы строки без преобразования в шестнадцатеричный. Одна из проблем заключается в том, что вы не можете использовать sizeof() для получения длины строки. В C строки заканчиваются NULL, поэтому вы можете повторять ее до тех пор, пока не найдете ее. Попробуйте следующее:

// Converts each char to hex and sends to LCD 
void sendString(unsigned char *string){ 


    sendCommand(0x01); // Clear screen 0x01 = 00000001 
    _delay_ms(2); 
    sendCommand(0x38); // Put in 8-bit mode 
    _delay_us(50); 
    sendCommand(0b0001110); // LCD on and set cursor off 
    _delay_us(50); 

    //For each char in string, write to the LCD 
    for(int i = 0; string[i]; i++){ 
     sendCommand(string[i]); 
    } 
} 
+0

Спасибо! Мне нужно много узнать о C. Кажется, что немного сложнее, чем C# и Java, к которым я привык. Я получил его после добавления небольшой задержки. \t \t \t \t _delay_us (50); –

Смежные вопросы