а потом постоянно надо возвращаться в начало программы и смотреть чему равен define... бред полный !
по нормальному объявляешь переменную по имени которой понятно за что отвечает эта переменная.
Код:
unsigned char port_B = 0;
а потом записывает в переменную состояние порта "B"
Код:
port_B = PINB;
далее... в программе мы знаем что в переменно "port_B" записано состояние порта "B". это понятно по имени переменной. и далее спокойно работаем с переменно "port_B". без всяких define...
а потом постоянно надо возвращаться в начало программы и смотреть чему равен define...
Зачем? В самом дефайне отражено его предназначение. Конструкция типа if (VHODNOY_SIGNAL_PRIYOMNIKA == 1 ) {...} недостаточно отражает логику происходящего? Какая разница к какой конкретно ножке там за кулисами подключен этот сигнал?
Тяжелый случай.( Изменил ты подключение. И что будешь переписывать везде port_b на port_d? Даже, если ничего не меняешь, get_dtmf() уже говорит сам за себя. И даже комментарии излишни. И неважно как ты его получишь, какие биты к каким портам подключены. Это же не ассемблер. И даже там стараются отделять подключение и логику. Рома, удачи!
Ну классно. А если часть сигналов заведены на порт Б, а часть на порт А? Всё, переменную никак не назвать. Если ноги-порты задавать дефайнами, то можно сразу и их настройку проводить. То есть программа настраивается в одной точке.
а потом постоянно надо возвращаться в начало программы и смотреть чему равен define... бред полный !
Зачем? Все современные IDE выводят значения констант в контекстной подсказке просто после наведения на имя константы. А в режиме отладки так же можно смотреть и значения переменных...
_________________ Репозиторий STM32: https://cloud.mail.ru/public/2i19/Y4w8kKEiZ Актуальность репозитория: 6 декабря 2025 года Если чего-то не хватает с сайта st.com - пишите, докачаю.
Добрый вечер уважаемые ! Как в программе организовать рестарт МК ? Ну например в PIC CCS есть команда restart ( cpu ) точно не помню как она пишется но она есть. А в CV AVR такой нет как я понял.
asm("jmp 0"); или аналогично в выбранном компиляторе (периферия не сбрасывается), но лучше с WDT: wdt_enable(WDTO_15MS); и какая-то пауза или бесконечный цикл до перезапуска.
Ну то есть заставить собачий таймер отработать ? ...
Добавлено after 3 hours 15 minutes 49 seconds: Да ! Там одна кнопка , краткое нажатие меняет параметры отображения , длинное - процедура изменения параметров ... Всё на динамической индикации , и в ней же сброс сторожевого таймера ... Можно ещё сделать более длинное нажатие на кнопку , и тогда сделать бесконечный цикл без входа в индикацию , конечно тогда WDT сбросит МК.
size=sizeof(str)-1; // определяем длинну строки for(j=0;j<size;j++); // начинаем перекодировку символов из виндовых в китайские LCD { for(j1=0;j1<33;j1++) if (sim1[j1]==str[j]) lcd_putchar(sim[j1]); // выводим на LCD РУССКИЙ текст
} }
while (1) { lcd_gotoxy(0,3); pint_rus("ПРЕВЕД МЕДВЕД");
Ну вот кусок программы для часов-термометра которых уже несколько штук и работают 5 лет. Реализация бегущей строки для светодиодных матриц 8х8 , выкладывать коды функций нет смысла они работают. Ну и sizeof вполне работает .
Код:
char unsigned str2[]=" ТЕМПЕРАТУРА ВОЗДУХА ";// глобальная строковая переменная
while (1) // основной цикл программы { a=5; // скорость бегущей строки, не будем заморачиваться size=sizeof(str2)-1; // определяем размер строковой переменной for(k=1;k<size;k++) //выводим текст " ТЕМПЕРАТУРА ВОЗДУХА " { simv=(str2[k]) ; // определяем код очередного символа в выводимой строке obrzap (simv) ; // заполняем невидимую нуль-матрицу ( справа )для последующего сдвига в видимую область, из таблицы 8*8 для матрицы светодиодов sdvig(); //сдвиг 8 строк * 8 раз в лево } // далее повторяемся для следующего символа пока строка не кончится
В таком виде sizeof срабатывает. Но при передаче в функцию теряется размер строки (массива элементов char)/
Длину строки в функцию лучше передавать в явном виде, как показывал ранее. Это позволит выводить строку не полностью, а также не нуль-терминированные строки
Вот в том и вопрос... Хотелось бы не писать одно и тоже для вывода каждой строки, а сделать функцию в которую будет передаваться только строка.
Добавлено after 1 minute 13 seconds: Всмысле только содержимое строки
Добавлено after 22 minutes 19 seconds: Ну и допустим в стандартной библиотеке CV AVR #include <alcd.h> lcd_putsf("hello word"); работает же ! Почему я не могу написать библиотеку где будет просто print_rus (" привет мир ") просто со скобками и кавычками . Кстати для PIC CCS я переделал стандартную библиотеку , и она именно так работает как надо.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения