Я прошу Вас помочь мне разобраться, как остановить цикл при удержании кнопки? Есть три тэны которые будут управляться релюшками, одна кнопка при каждом нажатии будет включать дополнительную тэну, а вторая кнопка в обратном порядке будет отключать тэны. Есть также и кнопка "СТОП", которая одним нажатием выключает все тэны.
Так вот, вопрос в следующем, как сделать так чтобы при долгом нажатии все тэны сразу не включились? В интернете находил информацию, что как то это можно через таймер реализовать...но у меня с этим ничего не получилось...
Спойлер
Код: Выделить всё
/*
* Project name:
|<A...y> (PIC12F675)
* Copyright:
(c) <A...7,
v.1.0 - (Start(21.07.2015) and Finish(25.07.2015))>
* Revision History:
<versionNo> - 1.0
*/
#include <pic.h>
//PIC12F675
#include <htc.h>
#include <delay.c>
#ifndef _XTAL_FREQ
#define _XTAL_FREQ 4000000
#endif
#define OpenTR3 TRIS0 //Открытие тр-ра #3(7-ая нога МК(GP0/AN0)).
#define OpenTR2 TRIS1 //Открытие тр-ра #2(6-ая нога МК(GP1/AN1/VREF)).
#define OpenTR1 TRIS2 //Открытие тр-ра #1(5-ая нога МК(GP2/T0CKI/INT/AN2)).
#define KnopkaStop GPIO3 //Аварийное отключение(4-ая нога МК(GP3/$MCLR$)).
#define KnopkaDown GPIO4 //Понижение темперетуры(3-ья нога МК(GP4/$T1G$/OSC2/AN3))).
#define KnopkaUp GPIO5 //Повышение темперетуры(2-ая нога МК(GP5/T1CKI/OSC1)).
__CONFIG (INTIO & UNPROTECT & BOREN & MCLRDIS & PWRTEN & WDTDIS);
//----------------------------------------------------------------
//unsigned int g,k,s;
unsigned char i;
//----------------------------------------------------------------
void ZX1(void) //Подготовка МК.
{
TRISIO = 0b111111;//Направление работы ножек порта(1-вход, 0-выход).
CMCON = 0x07; //Отключение компараторов.
GPIO = 0b000111; //Очищаем порт(0-приём напряж., 1-подача напряж.).
WPU4 = 1; //Подтягивающий резистор(1-вкл., 0-откл.).
WPU5 = 1; //Подтягивающий резистор(1-вкл., 0-откл.).
ANSEL = 0b000101; //Настройка аналогового входа.
i = 1;
}
//----------------------------------------------------------------
void main(void)//Начало программы.
{
ZX1(); //Вызов функции подготовки МК.
while(1) //Бесконечный цикл.
{
MT: if (KnopkaUp==1)//Повышение темперетуры.
{
if(i==1)//1
{
i=2;
OpenTR2=1;
OpenTR3=1;
OpenTR1=0;
DelayMs(500);
goto MT;
}
if(i==2)//2
{
i=3;
OpenTR1=1;
OpenTR3=1;
OpenTR2=0;
DelayMs(500);
goto MT;
}
if(i==3)//3
{
OpenTR1=1;
OpenTR2=0;
OpenTR3=0;
DelayMs(500);
goto MT;
}
}
if(KnopkaDown==1)//Понижение темперетуры.
{
if(i==3)//2
{
i=2;
OpenTR1=1;
OpenTR3=1;
OpenTR2=0;
DelayMs(500);
goto MT;
}
if(i==2)//1
{
i=1;
OpenTR2=1;
OpenTR3=1;
OpenTR1=0;
DelayMs(500);
goto MT;
}
if(i==1)//OFF
{
OpenTR1=1;
OpenTR3=1;
OpenTR2=1;
DelayMs(500);
goto MT;
}
}
if(KnopkaStop==1)//Аварийное отключение.
{
i=1;
TRISIO = 0b111111;
DelayMs(1);
return;
}
DelayMs(5);//Задержка 0,005 сек.
}
}

