BonTens86

Подключение тактовой кнопки к PIC

3 сообщения в этой теме

BonTens86    0

Доброго времени суток господа!) Вопрос к знатокам, начал изучать С++, писать начал на PIC16F628A, по мере изучения столкнулся с несколькими проблемами, первая это нужна помощь с подключением тактовой кнопки к PIC, суть проблемы в том, что при нажатии кнопки светодиод загорается, если нажать еще раз, то ничего не происходит.... Вопрос в том, как сделать выключение на эту же кнопку???? 



unsigned char CheckButton(void)
{
unsigned char result=0;
unsigned int butcount=0;
while(!RB2)
{
if(butcount < 10000)
{
butcount++;
}
else
{
result = 1;
break;
}
}
return result;
}


void kkk2 (void)
{
if(CheckButton ())
{
RB3 = 1;
{
//__delay_ms(100);
}
return;
}
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Grig96    71

a) кидайте полный код

б) навскидку (код особо не смотрел) - сделайте инверсию вывода 

в) изучайте лучше мк авр

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
BonTens86    0
8 минут назад, Grig96 сказал:

a) кидайте полный код

б) навскидку (код особо не смотрел) - сделайте инверсию вывода 

в) изучайте лучше мк авр

Да как раз это и помогло, попробовал сделать инверсию, тут же все заработало) И да решил все таки через if else делать
Щас другая проблема возникла, почему то работает только одна кнопка и все.... Остальные просто загораться не хотят, что ни так, ума не приложу

Как то С больше понравился))

 

#include <pic.h>
__CONFIG (INTIO & UNPROTECT & LVPDIS & BOREN & MCLRDIS & PWRTEN & WDTDIS );

#define uph1 RB0 // Вверх щуп
#define pump RA0 // Помпа
#define auto1 RA1 // Клапан автоподкачки
#define downh2 RB1 // Низ щуп
#define head RA2 // Тен
#define kk1 RB2 // Кнопка 1 - Эспрессо мал
#define kk2 RB3 // Кнопка 2 - Эспрессо большой
#define kk3 RB4 // Кнопка 3 - Американо мал
#define kk4 RB5 // Кнопка 4 - Американо большой 
#define kk5 RB6 // Кнопка 5 - Горячая вода
#define kk6 RB7 // Кнопка 6 - Программирование времени работы кнопок - ???
#define exitkk1 RA3 // Выход кнопки 1 
#define exitkk2 RA4 // Выход кнопки 2
#define exitkk3 RA5 // Выход кнопки 3
#define exitkk4 RA6 // Выход кнопки 4
#define exitkk5 RA7 // Выход кнопки 5
#define _XTAL_FREQ 4000000

void podgot (void); // Подготовка МК
void down (void); // Щуп низ 
void up (void); // Щуп вверх
void kkk1 (void); // Программа кнопки 1 - Эспрессо мал
void kkk2 (void); // Программа кнопки 2 - Эспрессо большой 
//void kkk3 (void); // Программа кнопки 3 - Американо мал
// void kkk4 (void); // Программа кнопки 4 - Американо большой
// void kkk5 (void); // Программа кнопки 5 - Горячая вода
// void kkk6 (void); // Программирование времени работы кнопок - ???

bit NAG;
int counter;

void main (void)
{
podgot();
while(1)
{
up (); //Функция Вверх щупа
down (); //Функция Низ щупа
kkk1 (); //Функция Кнопки 1
kkk2 (); //Функция Кнопки 2 
}
} 

void kkk1 (void) // Программа кнопки 1
{
if (kk1==0)	// тестируем состояние порта
{
__delay_ms(100); // ожидаем 10 мс, пропускаем дребезг
if (kk1==0&&NAG==0) // снова тестируем состояние порта и флага "кнопка была нажата"
{  // если уровень низкий и клавиша, до этого не была нажата" выполняем код в скобках
NAG=1; // устанавливаем флаг кнопка нажата
exitkk1=!exitkk1; // переключаем свечение светодиода
counter++;
}
}	
else if (kk1==0)	// тестируем состояние порта
{
__delay_ms(100); // ожидаем 10 мс, пропускаем дребезг
if (kk1==0&&NAG==0) // снова тестируем состояние порта и флага "кнопка была нажата"
{  // если уровень низкий и клавиша, до этого не была нажата" выполняем код в скобках
NAG=1; // устанавливаем флаг кнопка нажата
exitkk1=!exitkk1; // переключаем свечение светодиода
counter--;
}
}
else
{
NAG=0; // сбросить флаг "кнопка нажата" - исходя из логики
}
}

void kkk2 (void) // Программа кнопки 2
{
if (kk2==0)	// тестируем состояние порта
{
__delay_ms(100); // ожидаем 10 мс, пропускаем дребезг
if (kk2==0&&NAG==0) // снова тестируем состояние порта и флага "кнопка была нажата"
{  // если уровень низкий и клавиша, до этого не была нажата" выполняем код в скобках
NAG=1; // устанавливаем флаг кнопка нажата
exitkk2=!exitkk2; // переключаем свечение светодиода
counter++;
}
}	
else if (kk2==0)	// тестируем состояние порта
{
__delay_ms(100); // ожидаем 10 мс, пропускаем дребезг
if (kk2==0&&NAG==0) // снова тестируем состояние порта и флага "кнопка была нажата"
{  // если уровень низкий и клавиша, до этого не была нажата" выполняем код в скобках
NAG=1; // устанавливаем флаг кнопка нажата
exitkk2=!exitkk2; // переключаем свечение светодиода
counter--;
}
}
else
{
NAG=0; // сбросить флаг "кнопка нажата" - исходя из логики
}
}

void up (void) //Программа вверх щупа
{
if (uph1 = 0) //Если, щуп не замкнут на землю, то
{
pump = 1; //Включение помпы
auto1 = 1; //Включение клапана автоподкачки
}
else //Если, уровень воды достиг до щупа и замкнул цепь на землю, то
{
pump = 0; //Выключение помпы
auto1 = 0; //Выключение клапана автоподкачки
}
}

void down (void)//Программа низ щупа
{
if (downh2 = 1) //Если, щуп замкнут на землю
{
head = 0; //Выключение тена
}
else //Если, вода наже уровня, то
{
head = 1; //Включение тена
}
}

void podgot (void) //Подготовка МК
{
TRISA = 0b00000000; // направление работы ножек порта А
TRISB = 0b11111111; // направление работы ножек порта В
CMCON = 0x07; // отключение компараторов
PORTA = 0b00000000; // очищаем порт А
PORTB = 0b00000000; // очищаем порт Б
RBPU = 0;  // подтягивающие R (0-вкл, 1-выкл)
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Похожие публикации

    • Автор: Александр Липатов
       
       Нужна кнопка с импульсным принципом работы на 12В. Т.е При нажатии кнопки контакт замкнулся "I" и отщелкнулся обратно в "0" а кнопка осталась вдавленной пальцем . . Этакая кнопка-щелкунчик. Как технически правильно называется КНОПКА не знаю. 
    • Автор: Vanyok_333
      Уважаемые форумчане, хотел бы задать вам задачку. Условие такое надо кнопкой без фиксации включать и выключать питание прикуривателя. Питание 12вольт, сила тока на прикуриватель 10ампер. После выключения авто питание на прикуриватель должно пропадать, а после включения  авто должно оставаться выключенным, до тех пор пока снова его не включишь кнопкой. Желательно сделать схему надежную, чтобы сделать и к этому вопросу не возвращаться(чтобы элементы были надёжный). На схему нужно добавить индикацию включённого прикуривателя (когда на него подается питание). Ну и конечно по возможности простое и компактное. Заранее говорю Спасибо, умным головам)
    • Автор: Arseniy Popov
      Добрый день! Необходимо подобрать микроконтроллер, который будет получать команды по serial от esp8266 и димировать RGBW светодиод по следующему алгоритму: 
      https://docs.google.com/document/d/1FkPLiIgxleuDQn8pjihICQGRrMPXbwFzqCt6StQZjhU/edit?usp=sharing
      а также написать для него прошивку на си.
      Отвечать можете в телеграм arsenicum32 или сюда.
      Пишите цену / сроки, находитесь ли в МСК и/или в области.
    • Автор: Krokodil007
      Продам:
      ПКН-150-1, новые, в упаковках, 13 тыс.шт. по 3,5 руб/шт.
      ПКН-125, новые, в упаковках, 10 тыс.шт. по 7 руб/шт.
      Продажа от 100 шт. и более.
      При покупке всего количества возможна небольшая скидка.
      Саратовская обл.
      Возможна отправка почтой.




       



    • Автор: Evgeny Shevchenko
      Здравствуйте.  Прошу помощи!  задача такая,  есть одна кнопка и три светодиода, как сделать так чтобы при каждом нажатии на кнопку загорался один из светодиодов, или по очереди или рандомно.  Но самое главное! как это сделать БЕЗ микроконтроллера.