Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: символьные строки в MCC18
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Слесарь
Здравствуйте!
Чет мне как-то непривычно с компилятором MCC18, код:
Код
unsigned char buf[17];
buf[0] = 0X54;
buf[1] = 0x45;
buf[2] = 0X53;
buf[3] = 0X54;
buf[4] = 0;
lcd_puts( buf );

- работает и выводится на экран LCD текст, а вот код:
Код
lcd_puts( "Test" );

- неработает. Выводится мусор на экран.

Возможно причина в размерности строковых констант.

Подскажите, что нужно подкрутить?
Палыч
Цитата(Cлесарь @ Jun 26 2010, 14:35) *
Возможно причина в размерности строковых констант.
Нет, причина в типе памяти размещения констант: в первом случае - ОЗУ (процедура работает с данными размещенными в ОЗУ) , во втором - ПЗУ (процедура не умеет работать с этими данными).
Слесарь
Понятно.
Так это издержки компилятора? Это нельзя обойти чтоб использовать привычные lcd_puts( "Test" ); ?
PIC16 + HI-TECH компилятор, таких проблем небыло

Если обойти нельзя, подскажите более удобочитаемый вариант кода для символьных строк в программе?

CODE
void lcd_puts(unsigned char * s)
{
LCD_RS = 1; // write characters
while( *s )
{
lcd_write( *s );
s++;
}
}
msalov
Код
"Test"
иммет тип rom char *
Замените
Код
void lcd_puts(unsigned char * s)
на
Код
void lcd_puts(unsigned char rom * s)
и ваша функция будет работать только со строками из флешь-памяти.
И
Код
lcd_puts( "Test" );
будет работать как и ожидается.Как пример можете посмотреть библиотечные функции memcmp/memcmppgm2ram/memcmppgm2pgm. Эти функции выполняют одно и тоже только сравнивают они ОЗУ-ОЗУ/ПЗУ-ОЗУ/ПЗУ-ПЗУ соответственно.
_Bill
Цитата(Cлесарь @ Jun 26 2010, 15:47) *
Понятно.
Так это издержки компилятора?

Это не издержки компилятора. Это издержки Гарвардской архитектуры процессора.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.