ругается на LastState
как будто CVAVR не знает такой команды
Так это же переменная
Код: Выделить всё
<mega16a.h>
<alcd.h>
<stdio.h>
<delay.h>
char LastState;ругается на LastState
как будто CVAVR не знает такой команды
Код: Выделить всё
<mega16a.h>
<alcd.h>
<stdio.h>
<delay.h>
char LastState;Код: Выделить всё
// для случая если в порте 0 при ненажатых кнопках
unsigned char laststate = 0;
while(1)
{
if(PINA ! = 0) //если любая кнопка нажата
{
if(laststate == PINA) //сравниваем с прошлым состоянием
; //если без изменений ничего не делаем
else
{
laststate = PINA; //иначе сохраняем новое состояние
dosomething(laststate); //и делаем что нам нужно
}
}
else laststate = 0;
}Ну во первых, говнокодом Ваш код никто не называл, а во вторых, фразу "неудачный код" я прикрепил указанием его недостатков. Если Вы так и не поняли суть моих постов, то мне жаль моё потраченное время на это. Если чем-то Вас огорчил - прошу прощения.unalex писал(а):критику своего говнокода воспринимаю адекватно(я ж не профи, а только учусь), но фразы "неудачный код" без предоставления удачного кода звучат несколько некорректно, и почему бы не привести пример правильного кода, чтобы я смог увидеть как надо делать правильно
Код: Выделить всё
void menu(void)
{
while(1==1)
{
// if( (PINA & (1<<PINA0) ) == 0 )
if( PINA.0 == 0 )
{
if(laststate == PINA.0);
else
{
laststate = PINA.0;
menu_p=0;
menu1();
}
}
else laststate = 1;
}
};
void next(void)
{
while(1==1)
{
if(PINA.1 == 0 )
{
if(laststate == PINA.1);
else
{
laststate = PINA.1;
menu_p=menu_p+1;
menu1();
}
}
else laststate = 1;
}
};
void prev(void)
{
while(1==1)
{
if( PINA.2 == 0 )
{
if(laststate == PINA.2);
else
{
laststate = PINA.2;
menu_p=menu_p-1;
menu1();
}
}
else laststate = 1;
}
};
void entr(void)
{
while(1==1)
{
if( PINA.3 == 0 )
{
if(laststate == PINA.3);
else
{
laststate = PINA.3;
menu_p=0;
menu_paint("enter");
}
}
else laststate = 1;
}
};
void main(void)
{
DDRA=0x00;
lcd_init(16);
loadm();
while(1)
{
menu();
next();
prev();
entr();
}
}
Код: Выделить всё
void main (void)
{
// тут объявление переменных
while(1==1)
{
//тут ваша программа без while(1==1)
}//конец while(1==1)
}//конец main Аlex писал(а):Ну во первых, говнокодом Ваш код никто не называл
Аlex писал(а):Если Вы так и не поняли суть моих постов, то мне жаль моё потраченное время на это
Аlex писал(а):Если чем-то Вас огорчил - прошу прощения.
Код: Выделить всё
char cur_pin=0, prev_pin=0;
........
........
cur_pin = PORT & (1<<PIN); // Читаем текущее значение ПИНа
if(cur_pin && !prev_pin){ // Состояние уровня изменилось с 0 на 1
...
}
if(!cur_pin && prev_pin){ // Состояние уровня изменилось с 1 на 0
...
}
if(cur_pin != prev_pin){ // Было любое изменение уровня на ПИНе
...
}
prev_pin=cur_pin; // Сохраняем текущее значение
Аlex писал(а):нужно его сначала сохранить в временную переменную
epemka писал(а):Бред написал, да?
Код: Выделить всё
for (a = 0; a < 3; a++)
{
PORTB.7=1;
delay_ms(200);
PORTB.7=0;
delay_ms(200);
};Код: Выделить всё
a = 0;
while (a < 3)
{
PORTB.7=1;
delay_ms(200);
PORTB.7=0;
delay_ms(200);
a++;
};
Чуть-чуть уточню. Это касается не только языка Си, но так же и всех других языков программирования, и позиционных систем исчисления. Для лучшего понимания как это работает, представьте, допустим, 8-битное двоичное число. Количество всевозможных значений этого числа численно равно основанию системы счисления возведённому в степень количества разрядов или 2^8=256. Теперь представим, что каждому значению мы присваиваем по одной бумажной карточке. Всего берём 256 карточек, на первой записываем наименьшее возможное значение - "0" и у нас остаётся 255 карточек для записи "1", "2", "3", ... "254" и "255".unalex писал(а):1 приучите себя к тому что в С счет идет от 0 до MAX-1