при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Но, применительно к AVR (насчет остального Си не знаю), результат выражения не имеет типа, так как является не математическим выражением, а результатом выполнения ветвления, которое, в зависимости от типа результата, может принимать разный вид. Посмотрите ассемблерный код присвоения этого выражения байтовой переменной и отдельному биту в байте. Кстати, во втором случае ассемблерный код выглядит довольно странно.COKPOWEHEU писал(а):Само по себе оно не имеет типа (в ассемблерном виде обрабатывается как блок if с присвоением 1 либо 0), но по логике языка тип тот же, что у аргументов, тем более что по факту операция сравнения - вычисление разности без записи результата.
Код: Выделить всё
void function1 (void)
{
if (...)
{..... return;
.....PORTA.1=1;
}
if (...)
{
}
void function2(void)
{}
}Наконец то вы мне помоглиARV писал(а):после исполнения return никакие нижеидущие операторы в функции не выполняются
Код: Выделить всё
#include <mega8.h>
#define BTN_LOCK_TIME 30
#define BTN_LONG_TIME 1000
#define BTN_PORT PORTB
#define BTN_PIN PINB
#define BTN_LINE (1<<0)
#define BTN_SHRT (1<<0)
#define BTN_LONG (1<<4)
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
static unsigned char LockCoun;
static unsigned char LongCoun;
static unsigned char LastState;
static unsigned char BtnLockBit;
char mask = 0;
if (! (BTN_PIN & BTN_LINE)) mask = BTN_SHRT;
if (mask){
if (LockCoun < (BTN_LOCK_TIME/10)){
LockCoun++;
return;
}
LastState = mask;
BtnLockBit =1;
if (LongCoun >= (BTN_LONG_TIME/10))
return;
if (++LongCoun >= (BTN_LONG_TIME/10))
BtnFlags |= (LastState<<4);
}
else{
if ( LockCoun --;) {
return;
}
if (! BtnLockBit)
return;
if (LongCoun < (BTN_LONG_TIME/10))
BtnFlags |= LastState;
BtnLockBit =0;
LongCoun = 0;
}
}
void BtnInit (void)
{
BTN_PORT |= BTN_LINE;
}
unsigned char BtnGet (void)
{
char temp;
#asm("cli")
temp = BtnFlags;
BtnFlags = 0;
#asm("sei")
return temp;
}
void main(void)
{
ASSR=0x00;
TCCR2=0x0F;
TCNT2=0x00;
OCR2=0x4e;
TIMSK=0x80;
BtnInit ();
DDRB = 0x06;
#asm("sei")
while (1)
{
button = BtnGet ();
if (button == BTN_SHRT) PORTB ^= 0x02;
if (button == BTN_LONG) PORTB ^= 0x04;
}
}
Код: Выделить всё
#include <mega8.h>Код: Выделить всё
#define BTN_LOCK_TIME 30
Код: Выделить всё
#define BTN_LONG_TIME 1000Код: Выделить всё
#define BTN_PORT PORTBКод: Выделить всё
#define BTN_PIN PINBКод: Выделить всё
#define BTN_LINE (1<<0)Код: Выделить всё
#define BTN_SHRT (1<<0)Код: Выделить всё
#define BTN_LONG (1<<4)правдо что именно включается еще я не знаю
обязательно надо подстебнуть))),а если серьезно?Pink-Pank писал(а):понИл правильно.
Особенно в частиправдо что именно включается еще я не знаю
хочу через прерыванияARV писал(а):а если серьезно, ответьте на вопрос: вам кнопку обязательно через прерывния
обязательно надо подстебнуть))),а если серьезно?Pink-Pank писал(а):понИл правильно.
Особенно в частиправдо что именно включается еще я не знаю
Код: Выделить всё
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{}
void main(void)
{TCCR2=0x0F;
OCR2=0x4e;
TIMSK=0x80;
BtnInit ();
DDRB = 0x06;
#asm("sei")
}Код: Выделить всё
TCCR2=0x0F;Код: Выделить всё
OCR2=0x4E;Код: Выделить всё
BtnInit ();Код: Выделить всё
DDRB = 0x06;Код: Выделить всё
#asm("sei")
Pink-Pank писал(а):..ять!!!! (здесь должен быть трехэтажный мат)
Кто разрешать прерывания будет?
.?
Код: Выделить всё
static unsigned char LockCoun;
static unsigned char LongCoun;
static unsigned char LastState;
static unsigned char BtnLockBit;
Код: Выделить всё
if (mask){
if (LockCoun < (BTN_LOCK_TIME/10)){
LockCoun++;
return;
}Код: Выделить всё
unsigned char LockCoun;Код: Выделить всё
static unsigned char LockCoun;Код: Выделить всё
static unsigned charКод: Выделить всё
char mask = 0;Код: Выделить всё
unsigned char BtnGet (void)
{
....
}