Как написать программу по алгоритму?

Обсуждаем контроллеры компании Atmel.
Андрей342432
Родился
Сообщения: 1
Зарегистрирован: Пн мар 11, 2019 15:46:22

Как написать программу по алгоритму?

Сообщение Андрей342432 »

Как написать программу по алгоритму:

1)При нажатии кнопки условно '1' - выводится 1-ый светодиод

2)После выполнения программы она останавливается и ждет следующее нажатие

2)При нажатии кнопки '2' - выводятся последовательно 1-ый и 2-ой и так до восьмой кнопки
Я новичок в этом :cry: :cry: :cry: :cry:
Последний раз редактировалось aen Пн мар 11, 2019 16:16:18, всего редактировалось 1 раз.
Причина: Исправил. Нарушение Правил форума п. 1.4
Аватара пользователя
radteh
Друг Кота
Сообщения: 3087
Зарегистрирован: Пт мар 09, 2007 15:01:52
Откуда: Биробиджан

Re: Нужна помощь

Сообщение radteh »

Ну для начала название темы должно быть более информативным. Обычно такие пропускают, это мне было нечем заняться и заглянул. Ты просишь помощи, но не написал ни для какого контроллера, ни на каком языке.
Нажатие кнопок 2, 3, 4 и так далее кроме светодиодов вызывают один и тот-же код программы или как? Или ты просто хочешь помигать лампочками по нажатии кнопок?
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Re: Как написать программу по алгоритму?

Сообщение Ivanoff-iv »

1) какой контроллер
2) какая среда (программа в которой код писать)
3) схема - сама схема и в чем она реализована железо/симулятор
4) текущий уровень знаний (как работать с портами хотябы известно?)
тады посмотрим (может и смогу помочь чем) :sleep:
ПС: Вы с Антон2342 не однокурсники?
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Аватара пользователя
GoldenAndy
Поставщик валерьянки для Кота
Сообщения: 1925
Зарегистрирован: Чт июл 28, 2016 07:58:37
Откуда: Kyiv, UA
Контактная информация:

Re: Как написать программу по алгоритму?

Сообщение GoldenAndy »

Ivanoff-iv писал(а):ПС: Вы с Антон2342 не однокурсники?
Если не один человек в двух ипостасях......


Андрей342432, попробуйте сначала написать для себя более подробный алгоритм....
Что должно происходить при нажатии каждой кнопки, что должно происходить при отпускании кнопки, как долго должен гореть светодиод, как быстро должны переключаться светодиоды.....
Просто, человеческими словами опишите...

СпойлерЕсли это контрольная/зачет в ВУЗе/техникуме..... Значит, теорию этого дела рассказывали минимум весь февраль......
ИзображениеИзображение
Изображение
 
Telegram               Лучшая благодарность ->
[+]
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Как написать программу по алгоритму?

Сообщение Demiurg »

Книги в зубы, и не появляться на форумах, до тех пор, пока не появятся настоящие вопросы. Когда будет видно, что вы соизволили хоть немного потрудиться. Из примата труд сделал человека. Лень превращает человека обратно в примата.
Аватара пользователя
7seg
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

Re: Как написать программу по алгоритму?

Сообщение 7seg »

Ну код пишется за 10ть минут. Ну а как работает надеюсь разберетесь.

Код: Выделить всё

#define F_CPU 8000000UL

#include <avr/io.h>
#include <avr/sfr_defs.h>
#include <avr/interrupt.h>
#include <util/delay.h>

/*********************************MACRO***********************************/
#define SET_BIT(port,bit)      port|=(1<<bit)
#define CLR_BIT(port,bit)      port&= ~(1<<bit)
#define INV_BIT(port,bit)      port ^=(1<<bit)
#define BIT_IS_CLEAR(sfr,bit)   (!(_SFR_BYTE(sfr) & _BV(bit)))
#define BIT_IS_SET(sfr,bit)      (_SFR_BYTE(sfr) & _BV(bit))
/*****************************GLOBAL_DEFINE******************************/
#define VALUE_TCNT0            130
#define LED_PORT            PORTB
/**************************SETING_DEFINE_BTN*****************************/
#define BTN_LOCK_TIME         10
#define BTN_LONG_TIME         200

#define BTN_PORT            PORTD
#define BTN_DDR               DDRD
#define BTN_PIN               PIND

#define BTN_LINE_8            (1<<7)
#define BTN_LINE_7            (1<<6)
#define BTN_LINE_6            (1<<5)
#define BTN_LINE_5            (1<<4)
#define BTN_LINE_4            (1<<3)
#define BTN_LINE_3            (1<<2)
#define BTN_LINE_2            (1<<1)
#define BTN_LINE_1            (1<<0)

#define BTN_SHRT_BT1         (1<<0)         
#define BTN_SHRT_BT2         (1<<1)         
#define BTN_SHRT_BT3         (1<<2)         
#define BTN_SHRT_BT4         (1<<3)         
#define BTN_SHRT_BT5         (1<<4)         
#define BTN_SHRT_BT6         (1<<5)
#define BTN_SHRT_BT7         (1<<6)
#define BTN_SHRT_BT8         (1<<7)
/************************************************************************/
struct UnionsBits
{
   uint8_t B0:1;
   uint8_t B1:1;
   uint8_t B2:1;
   uint8_t B3:1;
   uint8_t B4:1;
   uint8_t B5:1;
   uint8_t B6:1;
   uint8_t B7:1;
};
union Byte
{
   uint8_t Byte;
   struct UnionsBits Bits;
};
typedef struct {
   union Byte Flag;
}BitUnion;
/**************************GLOBAL VARIABLE*******************************/
volatile uint8_t BtnFlags;            
volatile uint8_t BtnMask = 0;
volatile BitUnion StatBt;
/************************************************************************/
void InitTimerZero()
{
   TCCR0=(1<<CS01)|(1<<CS00);         
   TIMSK=(1<<TOIE0);               
   TCNT0=VALUE_TCNT0;
}
void InitBtn(void)
{
   BTN_DDR &= ~(BTN_LINE_1|BTN_LINE_2|BTN_LINE_3|BTN_LINE_4|
             BTN_LINE_5|BTN_LINE_6|BTN_LINE_7|BTN_LINE_8);
   BTN_PORT |= (BTN_LINE_1|BTN_LINE_2|BTN_LINE_3|BTN_LINE_4|
             BTN_LINE_5|BTN_LINE_6|BTN_LINE_7|BTN_LINE_8);
}
void Btn()
{
   volatile uint8_t mask = 0;
   static uint8_t BtnLockBit;            
   static uint8_t BtnLockCoun;            
   static uint8_t BtnLongCoun;            
   static uint8_t BtnLastState;         
   
   if(!(BTN_PIN & BTN_LINE_1)) mask = BTN_SHRT_BT1;
   if(!(BTN_PIN & BTN_LINE_2)) mask = BTN_SHRT_BT2;
   if(!(BTN_PIN & BTN_LINE_3)) mask = BTN_SHRT_BT3;
   if(!(BTN_PIN & BTN_LINE_4)) mask = BTN_SHRT_BT4;
   if(!(BTN_PIN & BTN_LINE_5)) mask = BTN_SHRT_BT5;
   if(!(BTN_PIN & BTN_LINE_6)) mask = BTN_SHRT_BT6;
   if(!(BTN_PIN & BTN_LINE_7)) mask = BTN_SHRT_BT7;
   if(!(BTN_PIN & BTN_LINE_8)) mask = BTN_SHRT_BT8;
   if (mask)
   {
      if (BtnLockCoun < BTN_LOCK_TIME)         //клавиша нажата
      {
         BtnLockCoun++;
         return;                           //защелка еще не дощитала - возврат
      }
      BtnLastState = mask;
      BtnLockBit =1;                        //нажатие зафиксировано
      
      if (BtnLongCoun >= (BTN_LONG_TIME)) return;   //возврат, т.к. счетчик длинн нажат досчитал до максимума еще раньше
      if (++BtnLongCoun >= (BTN_LONG_TIME))
      {
         BtnFlags |= (BtnLastState<<8);      //счетчик досчитал до максимума - устанавливаем биты длинного нажатия
      }
   }
   else
   {                                 //клавиша отжата
      if (BtnLockCoun)
      {
         BtnLockCoun --;
         return;                        //защелка еще не обнулилась - возврат
      }
      if (! BtnLockBit) return;            //СТАТИЧЕСКИЙ ВОЗВРАТ
      BtnLockBit =0;                     //отжатие зафиксировано
      if (BtnLongCoun < (BTN_LONG_TIME))
      BtnFlags |= BtnLastState;            //установка бита короткого нажатия
      BtnLongCoun = 0;                  //сброс счетчика длительности нажатия
   }
   
}
uint8_t BtnGet(void)
{
   cli();
   uint8_t temp = BtnFlags;
   BtnFlags = 0;
   sei();
   return temp;
}
void BtnUpdate()
{   
   BtnMask=BtnGet();
   switch(BtnMask)
   {
      case BTN_SHRT_BT1:
         StatBt.Flag.Bits.B0=1;
      break;
      case BTN_SHRT_BT2:
         StatBt.Flag.Bits.B1=1;
      break;
      case BTN_SHRT_BT3:
         StatBt.Flag.Bits.B2=1;
      break;
      case BTN_SHRT_BT4:
         StatBt.Flag.Bits.B3=1;
      break;
      case BTN_SHRT_BT5:
         StatBt.Flag.Bits.B4=1;
      break;
      case BTN_SHRT_BT6:
         StatBt.Flag.Bits.B5=1;
      break;
      case BTN_SHRT_BT7:
         StatBt.Flag.Bits.B6=1;
      break;
      case BTN_SHRT_BT8:
         StatBt.Flag.Bits.B7=1;
      break;
      default:
      break;
   }
}
uint8_t CountMs=0;
ISR(TIMER0_OVF_vect)
{
   TCNT0=VALUE_TCNT0;
   if (++CountMs >= 10)
   {
      Btn();
      CountMs=0;
   }   
}
void Blink(uint8_t CountLed)
{
   cli();
   for(uint8_t temp=0;temp<CountLed;temp++)
   {
            
      SET_BIT(LED_PORT,temp);
      _delay_ms(500);
   }
   LED_PORT=0x00;
   StatBt.Flag.Byte=0;
   CountLed=0;
   sei();   
}
int main(void)
{
   DDRB=0xFF;
   InitBtn();
   InitTimerZero();
   sei();
    while(1)
    {
      BtnUpdate();
      if (StatBt.Flag.Bits.B0) Blink(1);
      if (StatBt.Flag.Bits.B1) Blink(2);
      if (StatBt.Flag.Bits.B2) Blink(3);
      if (StatBt.Flag.Bits.B3) Blink(4);
      if (StatBt.Flag.Bits.B4) Blink(5);
      if (StatBt.Flag.Bits.B5) Blink(6);
      if (StatBt.Flag.Bits.B6) Blink(7);
      if (StatBt.Flag.Bits.B7) Blink(8);
    }
}


PS: надеюсь я правильно понял вашу задачу, хотя на основе этого листинга думаю его легко под корректировать.
andrei23061996@gmail.com
.................................................................................................................
Аватара пользователя
Starichok51
Модератор
Сообщения: 19043
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: Как написать программу по алгоритму?

Сообщение Starichok51 »

если ТС задает такие вопросы, то из этого листинга он не поймет ровным счетом ничего...
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Аватара пользователя
7seg
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

Re: Как написать программу по алгоритму?

Сообщение 7seg »

Ну я вроде бы и так всю страсть вынес в дефайны, и сделал код максимально читаемый.
Максимум что еще можно поправить для более удобно читабельного вида так это проверку нажата ли кнопка.
Даже макрос уже описан ) выше BIT_IS_CLEAR.

Код: Выделить всё

   if(BIT_IS_CLEAR(BTN_PIN,0)) mask = BTN_SHRT_BT1;
   if(BIT_IS_CLEAR(BTN_PIN,1)) mask = BTN_SHRT_BT2;
   if(BIT_IS_CLEAR(BTN_PIN,2)) mask = BTN_SHRT_BT3;
   if(BIT_IS_CLEAR(BTN_PIN,3)) mask = BTN_SHRT_BT4;
   if(BIT_IS_CLEAR(BTN_PIN,4)) mask = BTN_SHRT_BT5;
   if(BIT_IS_CLEAR(BTN_PIN,5)) mask = BTN_SHRT_BT6;
   if(BIT_IS_CLEAR(BTN_PIN,6)) mask = BTN_SHRT_BT7;
   if(BIT_IS_CLEAR(BTN_PIN,7)) mask = BTN_SHRT_BT8;
andrei23061996@gmail.com
.................................................................................................................
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Как написать программу по алгоритму?

Сообщение ARV »

Код: Выделить всё

#include <avr/io.h>
#include <util/delay.h>

static uint8_t get_button_num(void){
   uint8_t btn;
   while(1){
      // опрашиваем кнопки
      btn = PIND;
      if(btn != 0xFF){
         // если хоть какая-то нажата
         _delay_ms(15);
         // после паузы для защиты от дребезга
         if(btn == PIND){
            // проверяем, что состояние кнопок не поменялось
            // а затем вычисляем номер кнопки
            switch(btn){
            case 0b11111110: return 1;
            case 0b11111101: return 2;
            case 0b11111011: return 3;
            case 0b11110111: return 4;
            case 0b11101111: return 5;
            case 0b11011111: return 6;
            case 0b10111111: return 7;
            case 0b01111111: return 8;
            default:
               // если нажато несколько кнопок - игнорируем
               break;
            }
         }
      }
   }
}

int main(void){
   uint8_t button;
   uint8_t mask;

   DDRB = 0xFF; // порт светодиодов, катоды на общий
   PORTD = 0xFF; // кнопки на PORTD (замыкают на общий)

   while(1){
      // получаем номер нажатой кнопки
      button = get_button_num();
      // зажигаем поочередно светодиоды
      mask = 1;
      for(uint8_t i=0; i<button; i++){
         PORTB = mask;
         // каждые 0,5 сек
         _delay_ms(500);
         mask = (mask << 1) | 1;
      }
      // светодиоды горят еще 1 секунду, потом гаснут
      _delay_ms(1000);
      PORTB = 0;
   }
}
топикстартер, выше - код, который по идее должен соответствовать вашему заданию.
куда перечислить 500 рублей - пишите в ЛС :)
Последний раз редактировалось ARV Ср мар 13, 2019 12:35:42, всего редактировалось 1 раз.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
7seg
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

Re: Как написать программу по алгоритму?

Сообщение 7seg »

@ARV, What the fuck, ну это же не читабельно, а вот за такое и по рукам надо "0b11111101" XD)
andrei23061996@gmail.com
.................................................................................................................
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Как написать программу по алгоритму?

Сообщение ARV »

7seg писал(а):ну это же не читабельно
что именно по-вашему нечитабельно?
ваш пример даже у меня, довольно привычного ко всему, вызвал некую оторопь... студьозус же, не способный реализовать алгоритм таблицы умножения, в вашем варианте сломает не только ногу, но и шею.
7seg писал(а):а вот за такое и по рукам надо
с чего вдруг? данная форма записи констант определена расширением GNU. и она абсолютно наглядна для новичка.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
7seg
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

Re: Как написать программу по алгоритму?

Сообщение 7seg »

@ARV, конечно наверно это все таки больше дело вкуса. Но как по мне у вас в данном примере все свалено в одну кучу, и не удобно для дальнейшего расширения и редактирования.

Даже та же задержка _delay_ms(15); написанная в обработчике дребезга, при 8MHz это все таки не меньше 120000 тактов простоя процессора. (и да у меня тоже есть где я применил _delay_ms(); , но он легко убирается т.к уже реализовано прерывание 1 раз в ms.)



PS:Хотя это лишь мое субъективное мнение которое не обязано быть истинной, и смайл в конце моего прошлого поста как бы намекает о том что мое заявление не серьезно.
@ARV,И да я видел вы умете писать красивый код.
andrei23061996@gmail.com
.................................................................................................................
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Re: Как написать программу по алгоритму?

Сообщение Ivanoff-iv »

ещё можно так:
Спойлер

Код: Выделить всё

#include <mega8.h>
#include <delay.h>
#define PinButt (~PINB)
#define PortLed PORTD
#define AddLed  PortLed=(PortLed<<1)|1
unsigned char   ButtBuff=0;

void main(void)
{
PORTB=0xFF;
DDRB=0x00;
PORTD=0x00;
DDRD=0xFF;

while (1)
      {
      if (PortLed<ButtBuff) AddLed;
      if ((PinButt)&&(PinButt!=ButtBuff))
        {
        ButtBuff=PinButt;
        PortLed=0;
        };
      delay_ms(200); 
      }
}
при желании перезапуск можно и на прерывании таймера сделать и Дела`я не будет...

Добавлено after 6 minutes 57 seconds:
ПС: комментариев специально не сделал :)
ПС: чуть подправил - так смотрится лучше...
Последний раз редактировалось Ivanoff-iv Ср мар 13, 2019 09:53:35, всего редактировалось 1 раз.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Аватара пользователя
GoldenAndy
Поставщик валерьянки для Кота
Сообщения: 1925
Зарегистрирован: Чт июл 28, 2016 07:58:37
Откуда: Kyiv, UA
Контактная информация:

Re: Как написать программу по алгоритму?

Сообщение GoldenAndy »

Ну вот...
Накидали примеров кода..... Теперь студент-двоешник в них запутается, аки в трех соснах...
Сдаст первый попавшийся вариант (не проверив даже в протеусе), а потом не сможет объяснить преподу, что значит служебное слово #define....

Добавлено after 35 seconds:
ЗЫ. Не нашел кнопочки в редакторе ответов, которая проставляет тэг "сарказм"

Добавлено after 11 minutes 8 seconds:
ARV писал(а):static uint8_t get_button_num(void)

Мой компилятор ругается, если функция не возвращает ничего....
В конце я бы дописал return 0;
ИзображениеИзображение
Изображение
 
Telegram               Лучшая благодарность ->
[+]
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Как написать программу по алгоритму?

Сообщение ARV »

7seg писал(а):И да я видел вы умете писать красивый код
спасибо.
но чтобы вы еще лучше поняли мои мотивы, я дам некоторые пояснения "почему так" - надеюсь, никто не будет на меня в обиде за этот неболшой оффтоп.
что такое "читаемый код" с моей точки зрения? это код, фактический алгоритм котрого виден сразу с первого, максимум, со второго взгляда. причем наличие комментариев не является необходимым для понимания общего алгоритма. поэтому читаемым я называю код, который удовлетворяет хотя бы следующим нехитрым условиям:
1. функции имеют размер, позволяющий рассмотреть их от начала до закрывающей скобки за один раз без прокручивания текста. в качестве альтернативы, когда скроллинг не препятствует пониманию алгоритма функции, я допускаю "шаблонный" код, например, длинные switch или длинную цепочку if - else if. в этом случае важно, чтобы "шаблонный" участок умещался сразу на экране для обзора (т.е. ветка case - break как минимум). чтобы поняв, как работает один кусочек, уже можно было считать, что "дальше все так же однотипно".
2. функции, переменные, константы и макросы имеют "говорящие" идентификаторы.
3. алгоритмы реализованы наиболее понятным способом. опять же, поясню, что я имею ввиду сразу на примере:

Код: Выделить всё

uint8_t myfunc(uint8_t v){
  v^=v>>4;
  return(0x6>>((v^(v>>2))&3)&1);
}
легко ли понять, что делает эта функция? лично мне пришлось запустить её в цикле с передачей ей чисел от 0 до 255, чтобы по результату понять смысл. маловероятно, что найдутся гении (не читавшие Д.Кнута), которые только по этому выражению смогут восстановить алгоритм и смысл функции. альтернатива выглядит совсем не так оригинально, потребляет больше процессорного времени и совсем не так оптимальна, но зато на 100% понятна с первого взгляда (максимум, со второго). особенно, если записана с "говорящими" переменными. код приводить не буду.

применяю ли я сам подобные "перлы"? иногда. эта "ручная" оптимизация на высоком уровне действительно необходима крайне редко, и я в подобных ситуациях оказывался нечасто. а в обычных ситуациях я всегда пишу "просто" - на то и быстродействие МК и оптимизатор компилятора, чтобы я меньше мучил свою голову.

поэтому я вижу свой вышеприведенный код абсолютно читабельным. с учетом того, что он ориентирован на "полного нуля" в программировании, отступление от "правил хорошего тона" (магические числа, нетипичные константы и т.п.) ради упрощения восприятия считаю оправданными

goldenandy писал(а):Мой компилятор ругается, если функция не возвращает ничего....
В конце я бы дописал return 0;
мой тоже, но это его личные половые проблемы. если он настолько туп, что не замечает "безвыходность" функции, кроме как из switch-а с перебором всех комбинаций, то это меня не сильно волнует.

Добавлено after 5 minutes 5 seconds:
Ivanoff-iv писал(а):#define AddLed  PortLed=(PortLed<<1)|1
а вот так я никогда не делаю. потому как вот это
Ivanoff-iv писал(а):if (PortLed<ButtBuff) AddLed;
с первого взгляда не может быть прочитао сразу без усилий. и со второго тоже. если не видеть первой цитаты, что можно сказать увиденной впервые второй? AddLed - это volatile переменная. почему вдруг надо СЧИТЫВАТЬ её по условию, не используя результат - абсолютно не понятно.
Последний раз редактировалось ARV Ср мар 13, 2019 11:38:59, всего редактировалось 2 раза.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Re: Как написать программу по алгоритму?

Сообщение Ivanoff-iv »

[uquote="ARV",url="/forum/viewtopic.php?p=3589887#p3589887"]"безвыходность" функции, кроме как из switch-а с перебором всех комбинаций...[/uquote] :)) :)) :)) а если я 2 кнопки разом нажму?

Добавлено after 1 minute 50 seconds:
AddLed - это не переменная, а процедура зажигания ещё одного светодиода...

Добавлено after 1 minute 32 seconds:
ну, можно было её и не обособлять... тк. тут она использовалась единожды, но дав ей имя я пояснил её действие
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Как написать программу по алгоритму?

Сообщение ARV »

Ivanoff-iv писал(а):а если я 2 кнопки разом нажму?
ARV писал(а):            default:
               // если нажато несколько кнопок - игнорируем
               break;
хоть три
Ivanoff-iv писал(а):AddLed - это не переменная, а процедура зажигания ещё одного светодиода
ага. чтобы это понять, мало увидеть ВТОРОЙ кусок кода (являющийся основной реализацией алгоритма), надо увидеть ПЕРВЫЙ. для конкретно этого "учебного" проекта ситуация не выглядит плхо, но если допустить на миг, что макрос определен "где-то" в другом файле-заголовке? все заголовки просматривать в поисках?

а по внешнему виду этого идетификатора невозможно сделать вывод о его внутренней сути. для процедур (то есть функций) обязательно наличие круглых скобок. макросы-константы обычно пишутся ЗАГЛАВНЫМИ... если предположить, что вы решили макросы писать, делая заглавной ТолькоПервуюБуквуСлова, так у вас и переменные точно так же обозначаются...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Re: Как написать программу по алгоритму?

Сообщение Ivanoff-iv »

[uquote="ARV",url="/forum/viewtopic.php?p=3589898#p3589898"]
ARV писал(а):            default:
               // если нажато несколько кнопок - игнорируем
               break;
хоть три[/uquote] но из функции выйдет без "return"а...
по поводу заглавных буков с вами согласен.

Добавлено after 3 minutes 49 seconds:
но переписывать тот код (с заглавными или вообще без макроса) на данный момент считаю излишним...
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Как написать программу по алгоритму?

Сообщение ARV »

Ivanoff-iv писал(а):но из функции выйдет без "return"а...
с чего это оно из while(1) выйдет вообще?!

Добавлено after 1 minute 40 seconds:
Ivanoff-iv писал(а):но переписывать тот код (с заглавными или вообще без макроса) на данный момент считаю излишним...
проблема решается гораздо проще: надо привести ваш макрос к виду макроса-функции без параметров :) и это будет только плюсом, т.к. по сути вы именно определенное ДЕЙСТВИЕ (т.е. функцию) возлагаете на макрос
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Re: Как написать программу по алгоритму?

Сообщение Ivanoff-iv »

я не про майн, я про ф-ю static uint8_t get_button_num(void){ кейс ведь в ней...
кстати...
ARV писал(а):

Код: Выделить всё

 btn = PIND;
      if(btn != 0){
      // если хоть какая-то нажата
при // кнопки на PORTD (замыкают на общий)
гдето здесь должна быть инверсия?
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Ответить

Вернуться в «AVR»